in reply to Calling PERL from C code - How to "build" a hash on the PERL stack before calling the function?
Perl subs take a list of scalars for argument. You cannot pass a hash to a Perl sub as an argument. You may pass a reference
sub foo { my ($foo) = @_; print($foo->{bar}, "\n"); }
or you may pass the values needed to be build a hash
sub foo { my %foo = @_; print($foo{bar}, "\n"); }
but you cannot pass a hash. You probably want the former, as the latter is quite inefficient.
The sub expects a single scalar, so it probably expects a reference to a hash.
HV* hv = newHV(); SV* rv = newRV_noinc(hv); /* noinc to abandon our ref to the HV */ ... populate the hash using hv_store ... ... XPUSHs(sv_2mortal(rv)); /* Mortalize to abandon our ref to the RV */ ...
If you want both the RV and the HV to outlive the sub call, you'd use XPUSHs(rv). You'd also need to ensure the RV is freed later.
If you want the HV (but not the RV) to outlive the sub call, you'd use newRV_inc. You'd also need to ensure the HV is freed later.
Note that the name of the language is Perl (not PERL). It's not an acronym.
|
|---|