Re[2]: protect variables
От: c-smile Канада http://terrainformatica.com
Дата: 05.03.16 20:21
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Здравствуйте, 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. Т.е. нужно не только сканировать стек но и модифицировать его грязными руками.
Предварительные тесты показали жуткие результаты. Особенно с включенными оптимизациями и все такое.

Эх, что-то мне говорит что так и придется это всё руками продолжать делать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.