changeset 2:2f6bdc9f7245

pymonkey.evaluate() now returns a python-ized version of the JS return value, though it only supports integers at the moment.
author Atul Varma <varmaa@toolness.com>
date Sun, 28 Jun 2009 12:26:46 -0700
parents 5356a13ece67
children d6a0819ca6ca
files pymonkey.c test_pymonkey.py
diffstat 2 files changed, 16 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/pymonkey.c	Sun Jun 28 12:02:52 2009 -0700
+++ b/pymonkey.c	Sun Jun 28 12:26:46 2009 -0700
@@ -1,7 +1,7 @@
 #include "jsapi.h"
 #include <Python/Python.h>
 
-static JSClass PYM_JSGlobalClass = {
+static JSClass PYM_jsGlobalClass = {
   "PymonkeyGlobal", JSCLASS_GLOBAL_FLAGS,
   JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
   JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
@@ -11,6 +11,17 @@
 static PyObject *PYM_error;
 
 static PyObject *
+PYM_jsvalToPyObject(jsval value) {
+  if (JSVAL_IS_INT(value))
+    return PyInt_FromLong(JSVAL_TO_INT(value));
+
+  // TODO: Support more types.
+
+  Py_INCREF(Py_None);
+  return Py_None;
+}
+
+static PyObject *
 PYM_evaluate(PyObject *self, PyObject *args)
 {
   const char *source;
@@ -39,7 +50,7 @@
 
   JS_BeginRequest(cx);
 
-  JSObject *global = JS_NewObject(cx, &PYM_JSGlobalClass, NULL, NULL);
+  JSObject *global = JS_NewObject(cx, &PYM_jsGlobalClass, NULL, NULL);
   if (global == NULL) {
     PyErr_SetString(PYM_error, "JS_NewObject() failed");
     JS_EndRequest(cx);
@@ -71,10 +82,7 @@
   JS_DestroyContext(cx);
   JS_DestroyRuntime(rt);
 
-  // TODO: Get the return value of the script.
-
-  Py_INCREF(Py_None);
-  return Py_None;
+  return PYM_jsvalToPyObject(rval);
 }
 
 static PyMethodDef PYM_methods[] = {
--- a/test_pymonkey.py	Sun Jun 28 12:02:52 2009 -0700
+++ b/test_pymonkey.py	Sun Jun 28 12:26:46 2009 -0700
@@ -3,7 +3,8 @@
 
 class PymonkeyTests(unittest.TestCase):
     def test_evaluate(self):
-        pymonkey.evaluate('1+3', '<string>', 1)
+        self.assertEqual(pymonkey.evaluate('1+3', '<string>', 1),
+                         4)
 
 if __name__ == '__main__':
     unittest.main()