changeset 122:5eda03c8e756

context.evaluate_script() can now take unicode code strings.
author Atul Varma <varmaa@toolness.com>
date Wed, 19 Aug 2009 00:47:46 -0700
parents edce6af83ee2
children 08a012e96f62
files src/context.cpp tests/test_pymonkey.py
diffstat 2 files changed, 17 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/context.cpp	Mon Aug 17 23:44:06 2009 -0700
+++ b/src/context.cpp	Wed Aug 19 00:47:46 2009 -0700
@@ -276,24 +276,31 @@
 {
   PYM_SANITY_CHECK(self->runtime);
   PYM_JSObject *object;
-  const char *source;
+  char *source = NULL;
   int sourceLen;
   const char *filename;
   int lineNo;
 
-  if (!PyArg_ParseTuple(args, "O!s#si", &PYM_JSObjectType, &object,
-                        &source, &sourceLen, &filename, &lineNo))
+  if (!PyArg_ParseTuple(args, "O!es#si", &PYM_JSObjectType, &object,
+                        "utf-16", &source, &sourceLen, &filename, &lineNo))
     return NULL;
 
-  PYM_ENSURE_RUNTIME_MATCH(self->runtime, object->runtime);
+  if (self->runtime != object->runtime) {
+    PyMem_Free(source);
+    PYM_ENSURE_RUNTIME_MATCH(self->runtime, object->runtime);
+  }
 
   jsval rval;
   JSBool result;
   Py_BEGIN_ALLOW_THREADS;
-  result = JS_EvaluateScript(self->cx, object->obj, source, sourceLen,
-                             filename, lineNo, &rval);
+  // Note that we're manipulating buffer and size here to get rid of
+  // the BOM.
+  result = JS_EvaluateUCScript(self->cx, object->obj, (jschar *) (source + 2),
+                               (sourceLen / 2) - 1, filename, lineNo, &rval);
   Py_END_ALLOW_THREADS;
 
+  PyMem_Free(source);
+
   if (!result) {
     PYM_jsExceptionToPython(self);
     return NULL;
--- a/tests/test_pymonkey.py	Mon Aug 17 23:44:06 2009 -0700
+++ b/tests/test_pymonkey.py	Wed Aug 19 00:47:46 2009 -0700
@@ -451,6 +451,10 @@
                                         self.last_exception.args[0]),
                          'ReferenceError: hai2u is not defined')
 
+    def testEvaluateTakesUnicodeCode(self):
+        self.assertEqual(self._evaljs(u"'foo\u2026'"),
+                         u"foo\u2026")
+
     def testEvaluateReturnsUndefined(self):
         retval = self._evaljs("")
         self.assertTrue(retval is pymonkey.undefined)