Mercurial > pymonkey
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()