annotate pymonkey.c @ 4:2711b636f8e6

Added support for NULL return values.
author Atul Varma <varmaa@toolness.com>
date Sun, 28 Jun 2009 12:43:02 -0700
parents d6a0819ca6ca
children aae78eac86d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1 #include "jsapi.h"
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2 #include <Python/Python.h>
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3
2
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
4 static JSClass PYM_jsGlobalClass = {
0
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
5 "PymonkeyGlobal", JSCLASS_GLOBAL_FLAGS,
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
6 JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
7 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
8 JSCLASS_NO_OPTIONAL_MEMBERS
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
9 };
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
10
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
11 static PyObject *PYM_error;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
12
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
13 static PyObject *
2
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
14 PYM_jsvalToPyObject(jsval value) {
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
15 if (JSVAL_IS_INT(value))
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
16 return PyInt_FromLong(JSVAL_TO_INT(value));
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
17
3
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
18 if (JSVAL_IS_DOUBLE(value)) {
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
19 jsdouble *doubleRef = JSVAL_TO_DOUBLE(value);
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
20 return PyFloat_FromDouble(*doubleRef);
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
21 }
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
22
4
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
23 if (JSVAL_IS_NULL(value)) {
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
24 Py_INCREF(Py_None);
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
25 return Py_None;
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
26 }
2
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
27
4
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
28 // TODO: Support more types.
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
29 PyErr_SetString(PyExc_NotImplementedError,
2711b636f8e6 Added support for NULL return values.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
30 "Data type conversion not implemented.");
2
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
31 }
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
32
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
33 static PyObject *
0
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
34 PYM_evaluate(PyObject *self, PyObject *args)
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
35 {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
36 const char *source;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
37 int sourceLen;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
38 const char *filename;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
39 int lineNo;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
40
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
41 if (!PyArg_ParseTuple(args, "s#si", &source, &sourceLen,
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
42 &filename, &lineNo))
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
43 return NULL;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
44
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
45 JSRuntime *rt = JS_NewRuntime(8L * 1024L * 1024L);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
46 if (rt == NULL) {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
47 PyErr_SetString(PYM_error, "JS_NewRuntime() failed");
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
48 return NULL;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
49 }
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
50
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
51 JSContext *cx = JS_NewContext(rt, 8192);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
52 if (cx == NULL) {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
53 PyErr_SetString(PYM_error, "JS_NewContext() failed");
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
54 JS_DestroyRuntime(rt);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
55 }
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
56
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
57 JS_SetOptions(cx, JSOPTION_VAROBJFIX);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
58 JS_SetVersion(cx, JSVERSION_LATEST);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
59
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
60 JS_BeginRequest(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
61
2
2f6bdc9f7245 pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
62 JSObject *global = JS_NewObject(cx, &PYM_jsGlobalClass, NULL, NULL);
0
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
63 if (global == NULL) {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
64 PyErr_SetString(PYM_error, "JS_NewObject() failed");
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
65 JS_EndRequest(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
66 JS_DestroyContext(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
67 JS_DestroyRuntime(rt);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
68 return NULL;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
69 }
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
70
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
71 if (!JS_InitStandardClasses(cx, global)) {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
72 PyErr_SetString(PYM_error, "JS_InitStandardClasses() failed");
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
73 JS_EndRequest(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
74 JS_DestroyContext(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
75 JS_DestroyRuntime(rt);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
76 return NULL;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
77 }
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
78
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
79 jsval rval;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
80 if (!JS_EvaluateScript(cx, global, source, sourceLen, filename,
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
81 lineNo, &rval)) {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
82 // TODO: Actually get the error that was raised.
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
83 PyErr_SetString(PYM_error, "Script failed");
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
84 JS_EndRequest(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
85 JS_DestroyContext(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
86 JS_DestroyRuntime(rt);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
87 return NULL;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
88 }
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
89
3
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
90 PyObject *pyRval = PYM_jsvalToPyObject(rval);
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
91
0
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
92 JS_EndRequest(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
93 JS_DestroyContext(cx);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
94 JS_DestroyRuntime(rt);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
95
3
d6a0819ca6ca Added return value support for doubles.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
96 return pyRval;
0
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
97 }
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
98
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
99 static PyMethodDef PYM_methods[] = {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
100 {"evaluate", PYM_evaluate, METH_VARARGS,
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
101 "Evaluate the given JavaScript code, using the given filename "
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
102 "and line number information."},
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
103 {NULL, NULL, 0, NULL}
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
104 };
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
105
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
106 PyMODINIT_FUNC
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
107 initpymonkey(void)
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
108 {
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
109 PyObject *module;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
110
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
111 module = Py_InitModule("pymonkey", PYM_methods);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
112 if (module == NULL)
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
113 return;
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
114
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
115 PYM_error = PyErr_NewException("pymonkey.error", NULL, NULL);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
116 Py_INCREF(PYM_error);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
117 PyModule_AddObject(module, "error", PYM_error);
21aa6e3abb49 Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
118 }