Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, c-smile, Вы писали:
Ш>Я не вполне понял, как твоя механика работает, но можно было бы ввести два типа -- один для свободных объектов, а второй для приколотых.
Ш>И сделать доступ к приколотым объектам через RAII. Тогда не будешь ошибаться.
А как тогда сигнатура такой функции должна выглядеть?
value csf_native_function(VM* c, value obj, value p1, value p2) {
if( !cs_is_string(p1) )
p1 = cs_allocate_string(c, ' ', 256); // may cause GC()
// obj, p1, p2 could be wrong at this point due to GC in the line above
return csf_other_func(c, obj, p1, p2);
}
проблема в том что VM может быть несколько. Т.е. чтобы сконструировать raii holder нужно VM* и само value:
struct managed_value {
VM* c;
value v;
managed_value(VM* ct, value va): c(ct), v(va) { c->push_address(&v); }
~managed_value(): c(ct), v(va) { c->pop_address(); }
}
Передавать managed_values в параметрах как бы накладно, да и неудобно.
В качестве дикой идеи пробовал тупо сканировать C стек на предмет чего-то похожего на value-address, но в отличии от Boehm collector
у меня compacting GC. Т.е. нужно не только сканировать стек но и модифицировать его грязными руками.
Предварительные тесты показали жуткие результаты. Особенно с включенными оптимизациями и все такое.
Эх, что-то мне говорит что так и придется это всё руками продолжать делать...