Как создать расширение Ruby с Objective-C, используя новые исключения (@ throw…)? - PullRequest
1 голос
/ 14 сентября 2010

Я собрал расширение для Ruby в Objective-C. Теперь я хочу использовать @ throw / @ catch и т. Д. Вместо обработки исключений на основе макросов и самостоятельной обработки ошибок.

Я использую среду выполнения GNU, поставляемую с GCC.
Когда я запускаю свое приложение Ruby с моим расширением, оно сбрасывает ядро, как только возникает исключение. Прерывание () происходит из среды выполнения GNU Objective-C (libobjc / exception.c: 375):

void
objc_exception_throw (id value)
{
  struct ObjcException *header = calloc (1, sizeof (*header));
  header->base.exception_class = __objc_exception_class;
  header->base.exception_cleanup = __objc_exception_cleanup;
  header->value = value;

#ifdef SJLJ_EXCEPTIONS
  _Unwind_SjLj_RaiseException (&header->base);
#else
  _Unwind_RaiseException (&header->base);
#endif

  /* Some sort of unwinding error.  */
  abort ();
}

Так как я скомпилировал с -fobjc-exceptions, я думаю, _Unwind_RaiseException вызывается.

Есть ли способ использовать исключения Objective-C в расширении Ruby?

1 Ответ

0 голосов
/ 15 сентября 2010

Проблема решена:

Среда выполнения GNU Objective-C не обрабатывает результат _Unwind_(SjLj_)RaiseException (см. Код выше). В моем случае он вернул 5, что означает «конец стека» и означает, что я забыл блок @ try / @ catch.

Там действительно должны быть какие-то записи или ловушка, чтобы сделать это самостоятельно.

Обновление:

Если кто-то не скомпилирует Ruby с -fobjc-exceptions, обработка исключений Objective C не сможет отследить стек через код Ruby. Поэтому вы должны знать, что нужно перехватить, перевернуть или перевести любое исключение Objective C перед тем, как передать управление Ruby.

...