-
Notifications
You must be signed in to change notification settings - Fork 15
/
p5embed.c
61 lines (48 loc) · 1.1 KB
/
p5embed.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <EXTERN.h>
#include <perl.h>
/* So that we can load XS using modules from our perl */
EXTERN_C void xs_init (pTHX);
EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
EXTERN_C void
xs_init(pTHX)
{
char *file = __FILE__;
dXSUB_SYS;
/* DynaLoader is a special case */
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
}
static PerlInterpreter *my_perl;
void p5embed_initialize()
{
PERL_SYS_INIT3(0,NULL,NULL);
PerlInterpreter* my_perl = perl_alloc();
PERL_SET_CONTEXT(my_perl);
perl_construct(my_perl);
char *embedding[] = { "", "-e", "0" };
perl_parse(my_perl, xs_init, 3, embedding, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
eval_pv("use lib 'perl5';use Niecza::Interoperability",TRUE);
}
SV* p5embed_eval(char* code) {
return eval_pv(code,TRUE);
}
void p5embed_dispose()
{
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
void p5method_call(char* name,int* args,int n) {
dSP;
/*ENTER;
SAVETMPS;*/
PUSHMARK(SP);
int i;
for (i=0;i<n;i++) {
XPUSHs(args[i]);
}
PUTBACK;
call_method(name,G_DISCARD);
/*FREETMPS;
LEAVE;*/
}