2010-09-14 17 views
1

J'ai construit une extension Ruby en Objective-C. Maintenant, je veux utiliser @ throw/@ catch etc au lieu de la gestion des exceptions basée sur la macro et la gestion des erreurs de construction auto. J'utilise le runtime GNU livré avec le GCC.
Lorsque j'exécute mon application Ruby avec mon extension, le noyau se décharge dès qu'une exception se produit. Le abort() provient de l'exécution Objective-C GNU (libobjc/exception.c: 375):Comment construire une extension Ruby avec Objective-C en utilisant de nouvelles exceptions (@ throw ...)?

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(); 
} 

Depuis que je compilé avec -fobjc-exceptions je pense que _Unwind_RaiseException est appelé.

Existe-t-il un moyen d'utiliser les exceptions Objective-C dans une extension Ruby?

Répondre

0

Problème résolu:

Le moteur d'exécution Objective-C GNU ne gère pas le résultat de _Unwind_(SjLj_)RaiseException (voir code ci-dessus). Dans mon cas, il a retourné 5, ce qui signifie «fin de pile» et signifie que j'avais oublié un bloc de @ try/@ catch.

Il devrait vraiment y avoir un enregistrement ou un crochet pour le faire soi-même.

Update:

moins une compile Ruby avec -fobjc-exceptions la gestion des exceptions Objective-C ne peut pas tracer la pile à travers le code Ruby. Par conséquent, vous devez être conscient d'attraper et d'enrouler ou de traduire toute exception Objective-C avant de donner le contrôle à Ruby.