Как вызвать ObjectSpace.each_object с C API без rb_string_eval?

В настоящее время я пытаюсь получить все экземпляры класса, и я хотел использовать ObjectSpace.each_object чтобы достичь этого.

Вот мой фактический код на C:

ruby_init();
int ruby_state = 0;
rb_string_eval_protect("def my_func ; ObjectSpace.each_object(Klass) { |x| x.do_something } ; end", &ruby_state);
ruby_cleanup(ruby_state);

Однако я не знаю, действительно ли это хорошо. Я хотел использовать rb_funcall вместо этого, что может быть более чистый способ сделать это.

Мои вопросы:

  • Это лучше использовать rb_funcall чем string_eval? (Я так думаю из-за парсера)
  • Как я могу получить ObjectSpace модуль в C API, так как rb_mObjectSpace не существует?

1 ответ

Решение

Я нашел, как это сделать. Он использует rb_const_get,

Вот код сейчас:

VALUE rb_mObjSpace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));

Модуль уже был определен в gc.c но не был публичным. Единственный способ получить доступ к модулю - это rb_const_get (или изменить gc.c и собрать ruby, но никто не хочет этого делать).

Другие вопросы по тегам