¿Cómo construir una extensión de rubí con Objective-C utilizando nuevas excepciones (@ tiro ...)?

StackOverflow https://stackoverflow.com/questions/3708537

Pregunta

Tengo construir una extensión de Ruby en Objective-C. Ahora quiero usar @ tirar / @ capturas etc., en lugar de manejo de excepciones basadas macro y manejo de errores construir uno mismo.

Estoy utilizando el tiempo de ejecución de GNU se incluye con el CCG.
Cuando ejecuto mi aplicación de Ruby con mi extensión, volcado de memoria tan pronto como se produce una excepción. La interrupción () proviene del Objetivo-C de tiempo de ejecución GNU (librería 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 ();
}

Desde que he realizado con -fobjc-exceptions Creo _Unwind_RaiseException está siendo llamado.

¿Hay alguna manera de utilizar las excepciones de Objective-C en una extensión de Ruby?

¿Fue útil?

Solución

Problema resuelto:

El objetivo-C de tiempo de ejecución GNU no maneja el resultado de _Unwind_(SjLj_)RaiseException (ver el código de seguridad). En mi caso se volvió 5 que significa “fin de la pila” y significa que me había olvidado un @ try / @ bloque catch.

En realidad debería haber algún registro o un gancho para hacerlo uno mismo.

Actualización:

A menos que uno compila rubí con -fobjc-exceptions el manejo de excepciones Objective-C no puede rastrear la pila a través de código Ruby. Por lo tanto usted debe ser consciente de atrapar y envoltura o traducir cualquier excepción de Objective-C antes de dar el control a Ruby.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top