Yoba Perl
xs.cpp
1 #include "yobaperl/perl.hpp"
2 #include "yobaperl/perl_stack.hpp"
3 
4 using namespace yoba;
5 using namespace yoba::priv;
6 
7 #include <XSUB.h>
8 #include "ppport.h"
9 
10 
11 EXTERN_C void boot_DynaLoader (pTHX_ CV * cv);
12 EXTERN_C void XS_YobaPerl_call(pTHX_ CV * cv);
13 
14 EXTERN_C void xs_init(pTHX)
15 {
16  dXSUB_SYS;
17  PERL_UNUSED_CONTEXT;
18 
19  newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
20  newXS("YobaPerl::call", XS_YobaPerl_call, __FILE__);
21 }
22 
23 Callbacks::Context determineContext(const U32 gimme, const bool has_param)
24 {
25  switch(gimme)
26  {
27  case G_VOID: return has_param ? Callbacks::ScalarToVoid : Callbacks::VoidToVoid;
28  case G_SCALAR:
29  case G_ARRAY: return has_param ? Callbacks::ScalarToScalar : Callbacks::VoidToScalar;
30 
31  default: return Callbacks::VoidToVoid; // -Wreturn-type
32  }
33 }
34 
35 extern void XS_YobaPerl_call(PerlInterpreter * my_perl, CV * cv)
36 {
37  dVAR;
38  dXSARGS;
39 
40  Perl & perl = Perl::getInstance(my_perl);
41 
42  if(items == 0)
43  {
44  if(perl.isExceptionsEnabled())
45  throw PerlException(perl.getId(), "YobaPerl::call(): Missing callback name");
46 
47  if(perl.isWarningsEnabled())
48  warn("YobaPerl::call(): Missing callback name");
49 
50  XSRETURN_EMPTY;
51  }
52 
53  STRLEN len;
54  const char * ptr = SvPVx(ST(0), len);
55  std::string callback_name(ptr, len);
56 
57  switch(determineContext(GIMME_V, items > 1))
58  {
59  case Callbacks::VoidToVoid:
60  {
61  perl.getCallbacks().getVoidToVoid(callback_name)();
62  XSRETURN_EMPTY;
63  }
64 
65  case Callbacks::ScalarToVoid:
66  {
67  perl.getCallbacks().getScalarToVoid(callback_name)(Scalar(perl, ST(1), true));
68  XSRETURN_EMPTY;
69  }
70 
71  case Callbacks::VoidToScalar:
72  {
73  ST(0) = perl.getCallbacks().getVoidToScalar(callback_name)().detachSV();
74  XSRETURN(1);
75  }
76 
77  case Callbacks::ScalarToScalar:
78  {
79  ST(0) = perl.getCallbacks().getScalarToScalar(callback_name)(Scalar(perl, ST(1), true)).detachSV();
80  XSRETURN(1);
81  }
82  }
83 }
Definition: array.cpp:5
Main class.
Definition: perl.hpp:32
static Perl & getInstance(PerlInterpreter *_interpreter)
Get Perl instance by associated interpreter.
Definition: perl.cpp:362
int getId() const
Perl object id.
Definition: perl.cpp:298
Perl exception.
Scalar reference
Definition: scalar.hpp:24