herm1t LIVE!ng room - July 30th, 2018 [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

July 30th, 2018

День второй [Jul. 30th, 2018|08:49 pm]
[Current Mood | tired]

Наконец-то появился повод, что-нибудь написать. Вернулся к старой идее ("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;
}
Link7 comments|Leave a comment

navigation
[ viewing | July 30th, 2018 ]
[ go | Previous Day|Next Day ]