День второй |
Jul. 30th, 2018|08:49 pm |
Наконец-то появился повод, что-нибудь написать. Вернулся к старой идее ("Recompiling the metamorphism", 2012). Всё как водится упиралось в лень и нежелание писать полноценный парсер. Лёд тронулся, господа присяжные заседатели. Фронтэнд парсит и сериализует abstract syntax tree, а бэкенд его успешно загружает и превращает в код. Теперь займусь кодогенератором, уберу gas. Байтоёбством давно не занимался, но ассемблирование и линковка - это уж совсем просто. Потом можно начинать развлекаться: constant unfolding, перемешивание top level declarations, криптостроки, издевательства над CFG. И всё это в качестве сайд-эффекта. :-) Сериализация вот в таком вод виде, довольно идиотический, зато простой и не заморочливый:
static void *copy_dict(void *v, void *(*ele)(void*))
{
Dict *r = NULL;
if (v == NULL || ((r = hash_get(v)) != NULL))
return r;
r = store(v, sizeof(Dict));
r->map = copy_map(r->map, ele);
r->key = copy_vector(r->key, copy_string);
return r;
}
static void *copy_type(void *v)
{
Type *r = NULL;
if (v == NULL || ((r = hash_get(v)) != NULL))
return r;
r = store(v, sizeof(Type));
r->ptr = copy_type(r->ptr);
r->fields = copy_dict(r->fields, copy_type);
r->rettype = copy_type(r->rettype);
r->params = copy_vector(r->params, copy_type);
return r;
}
|
|