1 #include "yobaperl/perl.hpp" 2 #include "yobaperl/perl_stack.hpp" 11 EXTERN_C
void boot_DynaLoader (pTHX_ CV * cv);
12 EXTERN_C
void XS_YobaPerl_call(pTHX_ CV * cv);
14 EXTERN_C
void xs_init(pTHX)
19 newXS(
"DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
20 newXS(
"YobaPerl::call", XS_YobaPerl_call, __FILE__);
23 Callbacks::Context determineContext(
const U32 gimme,
const bool has_param)
27 case G_VOID:
return has_param ? Callbacks::ScalarToVoid : Callbacks::VoidToVoid;
29 case G_ARRAY:
return has_param ? Callbacks::ScalarToScalar : Callbacks::VoidToScalar;
31 default:
return Callbacks::VoidToVoid;
35 extern void XS_YobaPerl_call(PerlInterpreter * my_perl, CV * cv)
44 if(perl.isExceptionsEnabled())
47 if(perl.isWarningsEnabled())
48 warn(
"YobaPerl::call(): Missing callback name");
54 const char * ptr = SvPVx(ST(0), len);
55 std::string callback_name(ptr, len);
57 switch(determineContext(GIMME_V, items > 1))
59 case Callbacks::VoidToVoid:
61 perl.getCallbacks().getVoidToVoid(callback_name)();
65 case Callbacks::ScalarToVoid:
67 perl.getCallbacks().getScalarToVoid(callback_name)(
Scalar(perl, ST(1),
true));
71 case Callbacks::VoidToScalar:
73 ST(0) = perl.getCallbacks().getVoidToScalar(callback_name)().detachSV();
77 case Callbacks::ScalarToScalar:
79 ST(0) = perl.getCallbacks().getScalarToScalar(callback_name)(
Scalar(perl, ST(1),
true)).detachSV();
static Perl & getInstance(PerlInterpreter *_interpreter)
Get Perl instance by associated interpreter.
int getId() const
Perl object id.