-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathPJS_Function.c
109 lines (84 loc) · 2.38 KB
/
PJS_Function.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "XSUB.h"
#include "JavaScript_Env.h"
#include "PJS_Function.h"
#include "PJS_Common.h"
#include "PJS_Context.h"
void PJS_free_JSFunctionSpec(JSFunctionSpec *fs_list) {
JSFunctionSpec *fs;
if (fs_list == NULL) {
return;
}
for (fs = fs_list; fs->name != NULL; fs++) {
Safefree(fs->name);
}
Safefree(fs_list);
}
/* Universal call back for functions */
JSBool PJS_invoke_perl_function(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
PJS_Function *callback;
PJS_Context *context;
JSFunction *fun = PJS_FUNC_SELF;
if (!(context = PJS_GET_CONTEXT(cx))) {
croak("Can't get context\n");
}
if (!(callback = PJS_GetFunctionByName(context, (const char *) JS_GetFunctionName(fun)))) {
croak("Couldn't find perl callback");
}
if (perl_call_sv_with_jsvals(cx, obj, callback->callback, NULL, argc, argv, rval) < 0) {
return JS_FALSE;
}
return JS_TRUE;
}
PJS_Function *
PJS_CreateFunction(const char *functionName, SV *perlCallback) {
dTHX;
PJS_Function *function = NULL;
/* Allocate memory for a new callback */
Newz(1, function, 1, PJS_Function);
if (function == NULL) {
return NULL;
}
/* Allocate memory for the native name */
Newz(1, function->name, strlen(functionName) + 1, char);
if (function->name == NULL) {
Safefree(function);
return NULL;
}
Copy(functionName, function->name, strlen(functionName), char);
if (SvTRUE(perlCallback)) {
function->callback = SvREFCNT_inc(perlCallback);
}
return function;
}
/*
Free memory occupied by PJS_Function structure
*/
void PJS_DestroyFunction(PJS_Function *function) {
dTHX;
if (function == NULL) {
return;
}
if (function->callback != NULL && SvTRUE(function->callback)) {
SvREFCNT_dec(function->callback);
}
if (function->name != NULL) {
Safefree(function->name);
}
if (function != NULL) {
Safefree(function);
}
}
const char *
PJS_GetFunctionName(PJS_Function *function) {
if (function != NULL) {
return (const char *) function->name;
}
return NULL;
}
const SV *
PJS_GetFunctionTarget(PJS_Function *function) {
if (function != NULL) {
return (const SV *) function->callback;
}
return NULL;
}