in reply to How to keep C variables "alive" between invocations with Inline::C
{ package Node; use strict; use warnings; use Inline C => <<'__EOI__'; typedef struct { // ... } Node; Node* new_node() { Node* node; warn("new_node\n"); // DEBUG Newx(node, 1, Node); // node->... = ...; return node; } void DESTROY(Node* node) { warn("DESTROY\n"); // DEBUG Safefree(node); } __EOI__ } { use strict; use warnings; my $x = Node::new_node(); }
typemap:
Node* T_OBJECT INPUT T_OBJECT if (sv_derived_from($arg, \"${subtype}\")) { IV tmp = SvIV((SV*)SvRV($arg)); $var = INT2PTR($type,tmp); } else Perl_croak(aTHX_ \"%s: %s is not of type %s\", ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, \"$var\", \"$subtype\") OUTPUT T_OBJECT sv_setref_pv($arg, \"${subtype}\", (void*)$var);
I was going to use the T_PTROBJ map for Node*, but it was blessing the objects into NodePtr instead of Node. T_OBJECT is just T_PTROBJ that uses $subtype instead of $type.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: How to keep C variables "alive" between invocations with Inline::C
by BrowserUk (Patriarch) on Sep 28, 2010 at 00:49 UTC | |
by ikegami (Patriarch) on Sep 28, 2010 at 00:52 UTC | |
by BrowserUk (Patriarch) on Sep 28, 2010 at 01:26 UTC | |
by ikegami (Patriarch) on Sep 28, 2010 at 01:41 UTC | |
by BrowserUk (Patriarch) on Sep 28, 2010 at 02:16 UTC |