# Please fill in all missing code and fix the bugs below ;-) #--------------------------------------------------------- #!/usr/bin/perl use strict; use warnings; my $node = Node->new('Homo_sapiens', 'Hominid', 1.234); my $parent = Node->new('Homo_neanderthalensis', 'Hominid', 5.02); $node->set_parent($parent); # $node->get_parent; #--------------------------------------------------------- package Node; use Inline Config => BUILD_NOISY => 1; use Inline C => 'DATA', NAME => 'Node'; __DATA__ __C__ typedef struct treeNode { char* name; char* desc; double branch_length; struct treeNode *parent; } Node; SV* new(char* class, char* name, char* desc, double branch_length) { Node* node = malloc(sizeof(Node)); SV* obj_ref = newSViv(0); SV* obj = newSVrv(obj_ref, class); node->name = savepv(name); node->desc = savepv(desc); node->branch_length = branch_length; sv_setiv(obj, (IV)node); SvREADONLY_on(obj); return obj_ref; } void set_parent(SV* obj, SV* parent) { /* this ought to work, no? */ ((Node*)SvIV(SvRV(obj)))->parent = (Node*)SvIV(SvRV(parent)); } SV* get_parent(SV* obj) { /* ...erm...? */ } void DESTROY(SV* obj) { Node* node = (Node*)SvIV(SvRV(obj)); Safefree(node->name); Safefree(node); }