#include "perl_sysfs.h"
SV*
perl_sysfs_new_sv_from_ptr(void* ptr, const char* class) {
SV* obj;
SV* sv;
HV* stash;
obj = (SV*)newHV();
sv_magic(obj, 0, PERL_MAGIC_ext, (const char*)ptr, 0);
sv = newRV_noinc(obj);
stash = gv_stashpv(class, 0);
sv_bless(sv, stash);
return sv;
}
void*
perl_sysfs_get_ptr_from_sv(SV* sv, const char* class) {
MAGIC* mg;
if (!sv || !SvOK(sv) || !SvROK(sv) || !sv_derived_from(sv, class) || !(mg = mg_find(SvRV(sv), PERL_MAGIC_ext)))
return NULL;
return (void*)mg->mg_ptr;
}
void
perl_sysfs_call_xs(pTHX_ void (*subaddr) (pTHX_ CV*), CV* cv, SV** mark) {
dSP;
PUSHMARK(mark);
(*subaddr) (aTHX_ cv);
PUTBACK;
}