0
|
1 #include "jsapi.h"
|
|
2 #include <Python/Python.h>
|
|
3
|
|
4 static JSClass PYM_JSGlobalClass = {
|
|
5 "PymonkeyGlobal", JSCLASS_GLOBAL_FLAGS,
|
|
6 JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
|
|
7 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
|
|
8 JSCLASS_NO_OPTIONAL_MEMBERS
|
|
9 };
|
|
10
|
|
11 static PyObject *PYM_error;
|
|
12
|
|
13 static PyObject *
|
|
14 PYM_evaluate(PyObject *self, PyObject *args)
|
|
15 {
|
|
16 const char *source;
|
|
17 int sourceLen;
|
|
18 const char *filename;
|
|
19 int lineNo;
|
|
20
|
|
21 if (!PyArg_ParseTuple(args, "s#si", &source, &sourceLen,
|
|
22 &filename, &lineNo))
|
|
23 return NULL;
|
|
24
|
|
25 JSRuntime *rt = JS_NewRuntime(8L * 1024L * 1024L);
|
|
26 if (rt == NULL) {
|
|
27 PyErr_SetString(PYM_error, "JS_NewRuntime() failed");
|
|
28 return NULL;
|
|
29 }
|
|
30
|
|
31 JSContext *cx = JS_NewContext(rt, 8192);
|
|
32 if (cx == NULL) {
|
|
33 PyErr_SetString(PYM_error, "JS_NewContext() failed");
|
|
34 JS_DestroyRuntime(rt);
|
|
35 }
|
|
36
|
|
37 JS_SetOptions(cx, JSOPTION_VAROBJFIX);
|
|
38 JS_SetVersion(cx, JSVERSION_LATEST);
|
|
39
|
|
40 JS_BeginRequest(cx);
|
|
41
|
|
42 JSObject *global = JS_NewObject(cx, &PYM_JSGlobalClass, NULL, NULL);
|
|
43 if (global == NULL) {
|
|
44 PyErr_SetString(PYM_error, "JS_NewObject() failed");
|
|
45 JS_EndRequest(cx);
|
|
46 JS_DestroyContext(cx);
|
|
47 JS_DestroyRuntime(rt);
|
|
48 return NULL;
|
|
49 }
|
|
50
|
|
51 if (!JS_InitStandardClasses(cx, global)) {
|
|
52 PyErr_SetString(PYM_error, "JS_InitStandardClasses() failed");
|
|
53 JS_EndRequest(cx);
|
|
54 JS_DestroyContext(cx);
|
|
55 JS_DestroyRuntime(rt);
|
|
56 return NULL;
|
|
57 }
|
|
58
|
|
59 jsval rval;
|
|
60 if (!JS_EvaluateScript(cx, global, source, sourceLen, filename,
|
|
61 lineNo, &rval)) {
|
|
62 // TODO: Actually get the error that was raised.
|
|
63 PyErr_SetString(PYM_error, "Script failed");
|
|
64 JS_EndRequest(cx);
|
|
65 JS_DestroyContext(cx);
|
|
66 JS_DestroyRuntime(rt);
|
|
67 return NULL;
|
|
68 }
|
|
69
|
|
70 JS_EndRequest(cx);
|
|
71 JS_DestroyContext(cx);
|
|
72 JS_DestroyRuntime(rt);
|
|
73
|
|
74 // TODO: Get the return value of the script.
|
|
75
|
|
76 Py_INCREF(Py_None);
|
|
77 return Py_None;
|
|
78 }
|
|
79
|
|
80 static PyMethodDef PYM_methods[] = {
|
|
81 {"evaluate", PYM_evaluate, METH_VARARGS,
|
|
82 "Evaluate the given JavaScript code, using the given filename "
|
|
83 "and line number information."},
|
|
84 {NULL, NULL, 0, NULL}
|
|
85 };
|
|
86
|
|
87 PyMODINIT_FUNC
|
|
88 initpymonkey(void)
|
|
89 {
|
|
90 PyObject *module;
|
|
91
|
|
92 module = Py_InitModule("pymonkey", PYM_methods);
|
|
93 if (module == NULL)
|
|
94 return;
|
|
95
|
|
96 PYM_error = PyErr_NewException("pymonkey.error", NULL, NULL);
|
|
97 Py_INCREF(PYM_error);
|
|
98 PyModule_AddObject(module, "error", PYM_error);
|
|
99 }
|