# from Rutger Vos # on Sunday 31 July 2005 04:36 pm: > #---------------------------------------------------------
void set_parent(SV* obj, SV* parent) { /* this ought to work, no? */ // work: yes... // good idea: ? Node* apparent = (Node*)SvIV(SvRV(parent)); printf("name: %s\n", apparent->name); ((Node*)SvIV(SvRV(obj)))->parent = apparent; } SV* get_parent(SV* obj) { Node* self = (Node*)SvIV(SvRV(obj)); printf("parent name: %s\n", self->parent->name); SV* obj_ref = newSViv(0); // duplicate large portions of code from new() without the benefit // of knowing what class the parent is in... return(obj_ref); } > #--------------------------------------------------------- The problem with your set_parent is that you have thrown away the perl object to get the pointer value and only stored that integer. If you for some reason need $parent to come from a different class, get_parent() will never be privy to that info. If that's okay, I guess you could rewrite most of your new() inside of get_parent() so that you can return a blessed ref. If you keep the whole object (SV* parent) inside your struct (can you do that? I dunno (refcount issues?)), then your C code will always have to unpack it (but I guess a macro or function could help relieve the tedium there.) If you don't, then you will always have to recreate it when your C code needs to return a blessed ref and this could get messy if you don't know the parent's class (which I guess could be part of your struct if you want to go that route.) --Eric -- Peer's Law: The solution to the problem changes the problem. --------------------------------------------- http://scratchcomputing.com ---------------------------------------------