> -----Original Message----- > From: Mik Firestone [mailto:[EMAIL PROTECTED] > Sent: Thursday, July 29, 2004 9:00 AM > To: [EMAIL PROTECTED] > Subject: Returning reference to C structures > > > I am just looking for a URL or an example of how to return a > reference to a C > structure to perl. I have read the Cookbook, and I can get > my code to work if > I actually create a blessed reference. I would prefer to > bless it - I just > want a reference that I can later pass to other C functions.
Here's how I do it. I've got a perl object that I want to store some C context in (so it can maintain state between calls), so I create a "_context" slot in the $self object like so: HV *self_hash = (HV*) SvRV(self); SV **fetched = hv_fetch(self_hash, "_context", 8, 1); if (fetched == NULL) croak("Couldn't create the _context slot in $self"); sv_setiv(*fetched, (IV) my_struct_pointer); SvREADONLY_on(*fetched); The SvREADONLY_on() call is important because I want this thing to be immutable in perl-land. Then when I want to retrieve the context struct again, I use a little helper function: /* A pure-c function, not visible from perl */ context_struct *get_context_struct (SV *self) { HV *self_hash = (HV*) SvRV(self); SV **fetched = hv_fetch(self_hash, "_context", 8, 0); if (fetched == NULL) croak("Couldn't fetch the _context slot in $self"); return (context_struct *) SvIV(*fetched); } ... /* An XS function visible to perl */ void foo( self ) SV * self CODE: { context_struct *c = get_context_struct(self); ... } Theoretically I could put this helper function in a typemap too, to make things look a little cleaner. -Ken