<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>.gitignore</filename>
    </added>
    <added>
      <filename>ez_setup.py</filename>
    </added>
    <added>
      <filename>tests/unicode_test.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -20,6 +20,7 @@ cdef extern from &quot;stdio.h&quot;:
 
 cdef extern from &quot;string.h&quot;:
     cdef char* strcpy(char* restrict, char* restrict)
+    cdef void* memcpy(void* dest, void* src, size_t num)
 
 cdef extern from &quot;stdlib.h&quot;:
     cdef void* malloc(size_t size)
@@ -27,6 +28,9 @@ cdef extern from &quot;stdlib.h&quot;:
 
 cdef extern from &quot;Python.h&quot;:
     cdef struct PyObject
+    cdef void Py_DECREF(PyObject* o)
+    cdef PyObject* PyString_FromStringAndSize(char* buf, size_t length)
+    cdef int PyString_AsStringAndSize(PyObject* str, char** buf, int* length)
 
 cdef extern from &quot;jsapi.h&quot;:
     cdef struct JSClass
@@ -225,14 +229,15 @@ cdef extern from &quot;jsapi.h&quot;:
     cdef JSBool JS_SetPrivate(JSContext* cx, JSObject* obj, void* data)
 
     # Property Methods
-    cdef JSBool JS_GetProperty(JSContext* cx, JSObject* obj, char* name, jsval* vp)
-    cdef JSBool JS_SetProperty(JSContext* cx, JSObject* obj, char* name, jsval* vp)
-    cdef JSBool JS_DeleteProperty(JSContext* cx, JSObject* obj, char* name)
+    cdef JSBool JS_GetUCProperty(JSContext* cx, JSObject* obj, jschar* name, size_t slen, jsval* vp)
+    cdef JSBool JS_SetUCProperty(JSContext* cx, JSObject* obj, jschar* name, size_t slen, jsval* vp)
+    cdef JSBool JS_DeleteUCProperty2(JSContext* cx, JSObject* obj, jschar* name, size_t slen, jsval* vp)
 
-    cdef JSBool JS_DefineProperty(
+    cdef JSBool JS_DefineUCProperty(
         JSContext* cx,
         JSObject* obj,
-        char* name,
+        jschar* name,
+        size_t slen,
         jsval value,
         JSPropertyOp getter,
         JSPropertyOp setter,
@@ -267,12 +272,11 @@ cdef extern from &quot;jsapi.h&quot;:
     JSBool JS_GetReservedSlot(JSContext* cx, JSObject* obj, uint32 index, jsval* vp)
     JSBool JS_SetReservedSlot(JSContext* cx, JSObject* obj, uint32 index, jsval v)
     
-    
     # Set a list of functions on an object
     cdef JSBool JS_DefineFunctions(JSContext* cx, JSObject* obj, JSFunctionSpec* fs)
     
     # Create a function property
-    cdef JSFunction* JS_DefineFunction(
+    cdef JSFunction* JS_DefineUCFunction(
         JSContext* cx,
         JSObject* obj,
         char* name,
@@ -312,8 +316,9 @@ cdef extern from &quot;jsapi.h&quot;:
     ) except *
 
     # String Functions
-    cdef JSString* JS_NewStringCopyN(JSContext* cx, char* s, size_t n)
+    cdef JSString* JS_NewUCStringCopyN(JSContext* cx, jschar* s, size_t n)
     cdef char* JS_GetStringBytes(JSString* str)
+    cdef jschar* JS_GetStringChars(JSString* str)
     cdef size_t JS_GetStringLength(JSString* str)
 
     # Double Functions
@@ -341,10 +346,10 @@ cdef extern from &quot;jsapi.h&quot;:
     cdef void JS_ReportError(JSContext* cx, char* format, ...)
 
     # Main Entry Functions
-    cdef JSBool JS_EvaluateScript(
+    cdef JSBool JS_EvaluateUCScript(
         JSContext* cx,
         JSObject* obj,
-        char* bytes,
+        jschar* bytes,
         uintN length,
         char* filename,
         uintN lineno,
@@ -370,13 +375,31 @@ cdef extern from &quot;jshelpers.c&quot;:
     cdef object js_function_fetch(JSContext* cx, JSObject* js_obj)
     cdef object js_function_destroy(JSContext* cx, JSObject* js_obj)
 
-cdef void *xmalloc(size_t size) except NULL:
-    cdef void *mem
+    cdef JSString* py2js_jsstring_c(JSContext* cx, PyObject* str)
+    cdef PyObject* js2py_jsstring_c(JSString* str)
+
+cdef void* xmalloc(size_t size) except NULL:
+    cdef void* mem
     mem = malloc(size)
     if &lt;int&gt;mem == 0:
         raise MemoryError()
     return mem
 
+cdef JSString* py2js_jsstring(JSContext* cx, object str):
+    cdef JSString* ret
+    ret = py2js_jsstring_c(cx, &lt;PyObject*&gt; str)
+    return ret
+
+cdef object js2py_jsstring(JSString* str):
+    cdef PyObject* ret
+    cdef object var
+    if str == NULL:
+        raise TypeError(&quot;Unable to convert a NULL JSString.&quot;)
+    ret = js2py_jsstring_c(str)
+    if ret != NULL:
+        var = &lt;object&gt; ret
+    return var
+
 # JavaScript -&gt; Python
 cdef class Context
 cdef class Function
@@ -389,6 +412,9 @@ cdef class ClassAdapter
 cdef class ObjectAdapter
 cdef class FunctionAdapter
 
+def test_utf_16_round_trip(Context cx, data):
+    return js2py_jsstring(py2js_jsstring(cx.cx, data))
+
 import inspect
 import sys
 import traceback
@@ -400,5 +426,5 @@ class JSError(Exception):
     def __str__(self):
         return repr(self)
     def __repr__(self):
-        return &quot;JavaScript Error: %s&quot; % self.mesg
+        return self.mesg
 </diff>
      <filename>spidermonkey/jsapi.pxi</filename>
    </modified>
    <modified>
      <diff>@@ -24,7 +24,7 @@ cdef JSBool __constructor_callback__(JSContext* cx, JSObject* js_obj, uintN argc
         for i from 0 &lt;= i &lt; argc:
             args.append(js2py(pycx, argv[i]))
 
-        if hasattr(adapter.py_class, &quot;__jsinit__&quot;):
+        if hasattr(adapter.py_class, unicode(&quot;__jsinit__&quot;)):
             py_rval = adapter.py_class.__jsinit__(pycx, *args)
         else:
             py_rval = adapter.py_class(*args)
@@ -55,16 +55,14 @@ cdef JSBool __resolve_global_callback__(JSContext* cx, JSObject* js_obj, jsval j
 
         pycx = js_context_fetch(cx)
         key = js2py(pycx, jsv)
-                    
+
         if not js_object_has_data(cx, js_obj):
             return JS_TRUE;
-        
+                
         adapter = js_object_fetch(cx, js_obj)
         py_obj = adapter.py_obj
-        
-        if isinstance(key, types.StringTypes) and hasattr(py_obj, key):
-            # Bind to root object.
-            # Will ref the obj so it doesn't get discarded.
+                
+        if isinstance(key, types.UnicodeType) and hasattr(py_obj, key):
             pycx.bind(key, getattr(py_obj, key))
 
         return JS_TRUE
@@ -79,13 +77,14 @@ cdef JSBool __get_property_callback__(JSContext* cx, JSObject* js_obj, jsval jsv
     cdef object key
     cdef object attr
 
+
     try:
         if not js_context_has_data(cx):
             raise JSError(&quot;Unknown JSContext object.&quot;)
 
         pycx = js_context_fetch(cx)
         key = js2py(pycx, jsv)
-        
+                
         if not js_object_has_data(cx, js_obj):
             return JS_TRUE
         
@@ -99,8 +98,8 @@ cdef JSBool __get_property_callback__(JSContext* cx, JSObject* js_obj, jsval jsv
                 pass
             else:
                 rval[0] = py2js(pycx, attr, NULL)
-        elif isinstance(key, types.StringTypes):
-            if key[:1] != &quot;_&quot;:
+        elif isinstance(key, types.UnicodeType):
+            if key[:1] != unicode(&quot;_&quot;):
                 try:
                     attr = getattr(py_obj, key)
                 except:
@@ -131,7 +130,7 @@ cdef JSBool __set_property_callback__(JSContext* cx, JSObject* js_obj, jsval jsv
         pycx = js_context_fetch(cx)
         key = js2py(pycx, jsv)
         value = js2py(pycx, rval[0])
-        
+                
         if not js_object_has_data(cx, js_obj):
             return JS_TRUE
         
@@ -140,8 +139,8 @@ cdef JSBool __set_property_callback__(JSContext* cx, JSObject* js_obj, jsval jsv
 
         if isinstance(key, (types.IntType, types.LongType)):
             py_obj[key] = value
-        elif isinstance(key, types.StringTypes):
-            if key[:1] != &quot;_&quot; and hasattr(py_obj, key):
+        elif isinstance(key, types.UnicodeType):
+            if key[:1] != unicode(&quot;_&quot;) and hasattr(py_obj, key):
                 attr = getattr(py_obj, key)
                 if not callable(attr):
                     setattr(py_obj, key, value)</diff>
      <filename>spidermonkey/jsclass.pxi</filename>
    </modified>
    <modified>
      <diff>@@ -83,34 +83,62 @@ cdef class Context:
         &quot;&quot;&quot;
         cdef ClassAdapter ca
         cdef jsval jsv
+        cdef JSString* converted
+        cdef jschar* data
+        cdef size_t length
 
-        if not isinstance(name, types.StringTypes):
-            raise TypeError(&quot;Name must be a string.&quot;)
+        converted = py2js_jsstring(self.cx, name)
+        if converted == NULL:
+            raise TypeError(&quot;Name to bind must be in unicode.&quot;)
+
+        data = JS_GetStringChars(converted)
+        length = JS_GetStringLength(converted)
 
         ca = self.install_class(obj.__class__)
         jsv = py2js(self, obj, self.root.js_obj)
-        if not JS_DefineProperty(self.cx, self.root.js_obj, name, jsv,
+        if not JS_DefineUCProperty(self.cx, self.root.js_obj, data, length, jsv,
                                     __get_property_callback__, __set_property_callback__, 0):
             raise JSError(&quot;Failed to bind Python object to the global object.&quot;)
 
     def unbind(Context self, name):
-        ret = self.execute(&quot;%s;&quot; % name)
-        if not JS_DeleteProperty(self.cx, self.root.js_obj, name):
+        cdef jsval rval
+        cdef JSString* converted
+        cdef jschar* data
+        cdef size_t length
+
+        converted = py2js_jsstring(self.cx, name)
+        if converted == NULL:
+            raise TypeError(&quot;Name to unbind must be in unicode.&quot;)
+
+        data = JS_GetStringChars(converted)
+        length = JS_GetStringLength(converted)
+        
+        ret = self.execute(name + unicode(&quot;;&quot;)) # yeah yeah, I know.
+        if not JS_DeleteUCProperty2(self.cx, self.root.js_obj, data, length, &amp;rval):
             raise JSError(&quot;Failed to unbind property: %s&quot; % name)
+        # This always returns True for some reason
+        #return js2py(self, rval)
         return ret
 
-    def execute(Context self, object script):
+    def execute(Context self, script):
         &quot;&quot;&quot;\
         Execute JavaScript source code.
         &quot;&quot;&quot;
         cdef jsval rval
-        try:
-            if not isinstance(script, types.StringTypes):
-                raise TypeError(&quot;Script must be a string.&quot;)
+        cdef JSString* converted
+        cdef jschar* data
+        cdef size_t length
 
-            if not JS_EvaluateScript(self.cx, self.root.js_obj, script, len(script), &quot;Python&quot;, 0, &amp;rval):
-                raise JSError(self.error)
+        converted = py2js_jsstring(self.cx, script)
+        if converted == NULL:
+            raise TypeError(&quot;Script must be in unicode.&quot;)
+        
+        data = JS_GetStringChars(converted)
+        length = JS_GetStringLength(converted)
         
+        try:
+            if not JS_EvaluateUCScript(self.cx, self.root.js_obj, data, length, &quot;Python&quot;, 0, &amp;rval):
+                raise JSError(self.error)
             return js2py(self, rval)
         finally:
             self.gc.run_maybe()</diff>
      <filename>spidermonkey/jscontext.pxi</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ cdef void __report_error_callback__(JSContext* cx, char* message, JSErrorReport*
     
     try:
         if not js_context_has_data(cx):
-            sys.stderr.write(&quot;Attempting to report error for an unknown JSContext.&quot;)
+            sys.stderr.write(&quot;Attempting to report error for an unknown JSContext.\n&quot;)
             return
         pycx = js_context_fetch(cx)
         </diff>
      <filename>spidermonkey/jserror.pxi</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,9 @@ cdef object js2py_hash(Context cx, jsval v):
     cdef jsval jsv
     cdef int i
     cdef dict ret
+    cdef JSString* converted
+    cdef jschar* data
+    cdef size_t length
 
     hash = JSVAL_TO_OBJECT(v)
 
@@ -29,7 +32,12 @@ cdef object js2py_hash(Context cx, jsval v):
         
             if js_is_string(cx, jskey):
                 key = js2py_string(cx, jskey)
-                if not JS_GetProperty(cx.cx, hash, key, &amp;jsv):
+                
+                converted = py2js_jsstring(cx.cx, key)
+                data = JS_GetStringChars(converted)
+                length = JS_GetStringLength(converted)
+                
+                if not JS_GetUCProperty(cx.cx, hash, data, length, &amp;jsv):
                     raise JSError(&quot;Faield to retrieve textual hash property.&quot;)
             elif js_is_int(cx, jskey):
                 key = js2py_int(cx, jskey)
@@ -48,14 +56,25 @@ cdef object js2py_hash(Context cx, jsval v):
 cdef jsval py2js_hash(Context cx, dict py_obj, JSObject* parent):
     cdef JSObject* obj
     cdef jsval elem
+    cdef JSString* converted
+    cdef jschar* data
+    cdef size_t length
     
     obj = JS_NewObject(cx.cx, NULL, NULL, parent)
     if obj == NULL:
         raise JSError(&quot;Failed to create new JavaScript object for dict instance.&quot;)
 
     for k, v in py_obj.iteritems():
+        
+        converted = py2js_jsstring(cx.cx, k)
+        data = JS_GetStringChars(converted)
+        length = JS_GetStringLength(converted)
+        
         elem = py2js(cx, v, obj)
-        if not JS_SetProperty(cx.cx, obj, k, &amp;elem):
+        if elem is None:
+            sys.stderr.write(&quot;\nNONE HERE HERE HERE: %s\n\n&quot; % k)
+            
+        if not JS_SetUCProperty(cx.cx, obj, data, length, &amp;elem):
             raise JSError(&quot;Failed to set JavaScript property for dict instance.&quot;)
 
     return OBJECT_TO_JSVAL(obj)</diff>
      <filename>spidermonkey/jshash.pxi</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,50 @@
+JSString* py2js_jsstring_c(JSContext* cx, PyObject* str)
+{
+    PyObject* encoded = NULL;
+    char* bytes;
+    Py_ssize_t len;
+    
+    if(!PyUnicode_Check(str))
+    {
+        return NULL;
+    }
+        
+    encoded = PyUnicode_AsEncodedString(str, &quot;utf-16&quot;, &quot;strict&quot;);
+    if(encoded == NULL)
+    {
+        return NULL;
+    }
+        
+    if(PyString_AsStringAndSize(encoded, &amp;bytes, &amp;len) &lt; 0)
+    {
+        return NULL;
+    }
+
+    if(len &lt; 4)
+    {
+        return NULL;
+    }
+
+    // No idea why python adds FFFE to encoded UTF-16 data.
+    return JS_NewUCStringCopyN(cx, bytes+2, (len/2)-1);
+}
+
+PyObject* js2py_jsstring_c(JSString* str)
+{
+    jschar* bytes;
+    size_t len;
+        
+    if(str == NULL)
+    {
+        return NULL;
+    }
+    
+    len = JS_GetStringLength(str);
+    bytes = JS_GetStringChars(str);
+
+    return PyUnicode_Decode((const char*) bytes, (size_t) (len * 2), &quot;utf-16&quot;, &quot;strict&quot;);
+}
+
 void
 js_context_attach(JSContext* cx, PyObject* obj)
 {</diff>
      <filename>spidermonkey/jshelpers.c</filename>
    </modified>
    <modified>
      <diff>@@ -5,17 +5,12 @@ def js_is_string(Context cx, jsval jsv):
     return JSVAL_IS_STRING(jsv)
 
 def py_is_string(Context cx, object py_obj):
-    return isinstance(py_obj, types.StringTypes)
+    return isinstance(py_obj, types.UnicodeType)
 
-cdef object js2py_string(Context cx, jsval jsv):
-    cdef JSString* s
-    s = JSVAL_TO_STRING(jsv)
-    return JS_GetStringBytes(s)
-
-#################################################
-# NEEED TO REWWRITE TO USE JS_NewExternalString #
-#################################################
 cdef jsval py2js_string(Context cx, object py_obj, JSObject* parent):
-    cdef JSString* s
-    s = JS_NewStringCopyN(cx.cx, py_obj, len(py_obj))
-    return STRING_TO_JSVAL(s)
+    cdef JSString* conv
+    conv = py2js_jsstring(cx.cx, py_obj)
+    return STRING_TO_JSVAL(conv)
+
+cdef object js2py_string(Context cx, jsval jsv):
+    return js2py_jsstring(JSVAL_TO_STRING(jsv))</diff>
      <filename>spidermonkey/jsstring.pxi</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-/* Generated by Pyrex 0.9.8.5 on Wed Jan 28 06:18:02 2009 */
+/* Generated by Pyrex 0.9.8.5 on Fri Jan 30 03:27:19 2009 */
 
 #define PY_SSIZE_T_CLEAN
 #include &quot;Python.h&quot;
@@ -44,6 +44,8 @@ static char **__pyx_f;
 
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
 
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name); /*proto*/
+
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
 static void __Pyx_WriteUnraisable(char *name); /*proto*/
@@ -52,8 +54,6 @@ static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name); /*proto*/
-
 static int __Pyx_GetStarArgs(PyObject **args, PyObject **kwds, char *kwd_list[],     Py_ssize_t nargs, PyObject **args2, PyObject **kwds2, char rqd_kwds[]); /*proto*/
 
 static int __Pyx_SetItemInt(PyObject *o, Py_ssize_t i, PyObject *v); /*proto*/
@@ -185,6 +185,8 @@ static PyTypeObject *__pyx_ptype_12spidermonkey_ClassAdapter = 0;
 static PyTypeObject *__pyx_ptype_12spidermonkey_ObjectAdapter = 0;
 static PyTypeObject *__pyx_ptype_12spidermonkey_FunctionAdapter = 0;
 static void *__pyx_f_12spidermonkey_xmalloc(__pyx_t_12spidermonkey_size_t); /*proto*/
+static struct JSString *__pyx_f_12spidermonkey_py2js_jsstring(struct JSContext *,PyObject *); /*proto*/
+static PyObject *__pyx_f_12spidermonkey_js2py_jsstring(struct JSString *); /*proto*/
 static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey_report_python_error(struct JSContext *); /*proto*/
 static void __pyx_f_12spidermonkey___report_error_callback__(struct JSContext *,char *,struct JSErrorReport *); /*proto*/
 static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___constructor_callback__(struct JSContext *,struct JSObject *,__pyx_t_12spidermonkey_uintN,__pyx_t_12spidermonkey_jsval *,__pyx_t_12spidermonkey_jsval *); /*proto*/
@@ -209,22 +211,22 @@ static PyObject *__pyx_f_12spidermonkey_js2py_hash(struct __pyx_obj_12spidermonk
 static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_hash(struct __pyx_obj_12spidermonkey_Context *,PyDictObject *,struct JSObject *); /*proto*/
 static PyObject *__pyx_f_12spidermonkey_js2py_int(struct __pyx_obj_12spidermonkey_Context *,__pyx_t_12spidermonkey_jsval); /*proto*/
 static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_int(struct __pyx_obj_12spidermonkey_Context *,__pyx_t_12spidermonkey_jsint,struct JSObject *); /*proto*/
-static PyObject *__pyx_f_12spidermonkey_js2py_string(struct __pyx_obj_12spidermonkey_Context *,__pyx_t_12spidermonkey_jsval); /*proto*/
 static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_string(struct __pyx_obj_12spidermonkey_Context *,PyObject *,struct JSObject *); /*proto*/
+static PyObject *__pyx_f_12spidermonkey_js2py_string(struct __pyx_obj_12spidermonkey_Context *,__pyx_t_12spidermonkey_jsval); /*proto*/
 static PyObject *__pyx_f_12spidermonkey_js2py_void(struct __pyx_obj_12spidermonkey_Context *,__pyx_t_12spidermonkey_jsval); /*proto*/
 static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_void(struct __pyx_obj_12spidermonkey_Context *,PyObject *,struct JSObject *); /*proto*/
 static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js(struct __pyx_obj_12spidermonkey_Context *,PyObject *,struct JSObject *); /*proto*/
 static PyObject *__pyx_f_12spidermonkey_js2py(struct __pyx_obj_12spidermonkey_Context *,__pyx_t_12spidermonkey_jsval); /*proto*/
 static struct __pyx_obj_12spidermonkey_Value *__pyx_f_12spidermonkey_js_create_value(__pyx_t_12spidermonkey_jsval); /*proto*/
 
-static char __pyx_k1[] = &quot;mesg&quot;;
-static char __pyx_k2[] = &quot;JavaScript Error: %s&quot;;
+static char __pyx_k1[] = &quot;Unable to convert a NULL JSString.&quot;;
+static char __pyx_k2[] = &quot;mesg&quot;;
 static char __pyx_k3[] = &quot;traceback&quot;;
 static char __pyx_k4[] = &quot;format_exc&quot;;
 static char __pyx_k5[] = &quot;sys&quot;;
 static char __pyx_k6[] = &quot;stderr&quot;;
 static char __pyx_k7[] = &quot;write&quot;;
-static char __pyx_k8[] = &quot;Attempting to report error for an unknown JSContext.&quot;;
+static char __pyx_k8[] = &quot;Attempting to report error for an unknown JSContext.\n&quot;;
 static char __pyx_k9[] = &quot;Unknown&quot;;
 static char __pyx_k10[] = &quot;set_error&quot;;
 static char __pyx_k11[] = &quot;%s(%d): %s&quot;;
@@ -248,86 +250,89 @@ static char __pyx_k28[] = &quot;types&quot;;
 static char __pyx_k29[] = &quot;IntType&quot;;
 static char __pyx_k30[] = &quot;LongType&quot;;
 static char __pyx_k31[] = &quot;Flags is not an integer.&quot;;
-static char __pyx_k32[] = &quot;StringTypes&quot;;
-static char __pyx_k33[] = &quot;Name must be a string.&quot;;
-static char __pyx_k34[] = &quot;Failed to bind Python object to the global object.&quot;;
+static char __pyx_k32[] = &quot;Name to bind must be in unicode.&quot;;
+static char __pyx_k33[] = &quot;Failed to bind Python object to the global object.&quot;;
+static char __pyx_k34[] = &quot;Name to unbind must be in unicode.&quot;;
 static char __pyx_k35[] = &quot;execute&quot;;
-static char __pyx_k36[] = &quot;%s;&quot;;
-static char __pyx_k37[] = &quot;Failed to unbind property: %s&quot;;
-static char __pyx_k38[] = &quot;Script must be a string.&quot;;
-static char __pyx_k39[] = &quot;Python&quot;;
-static char __pyx_k40[] = &quot;Unknown JSContext object.&quot;;
-static char __pyx_k41[] = &quot;Object has no prototype.&quot;;
-static char __pyx_k42[] = &quot;Unknown constructor callback.&quot;;
-static char __pyx_k43[] = &quot;append&quot;;
-static char __pyx_k44[] = &quot;__jsinit__&quot;;
-static char __pyx_k45[] = &quot;bind&quot;;
-static char __pyx_k46[] = &quot;_&quot;;
-static char __pyx_k47[] = &quot;JS_VOID&quot;;
-static char __pyx_k48[] = &quot;Invalid key: %r&quot;;
-static char __pyx_k49[] = &quot;callable&quot;;
-static char __pyx_k50[] = &quot;Unknown JSObject.&quot;;
-static char __pyx_k51[] = &quot;__name__&quot;;
-static char __pyx_k52[] = &quot;__jsname__&quot;;
-static char __pyx_k53[] = &quot;js_classname&quot;;
-static char __pyx_k54[] = &quot;Failed to bind Python adapter class.&quot;;
-static char __pyx_k55[] = &quot;&lt;spidermonkey.ClassAdapter: %r&gt;&quot;;
-static char __pyx_k56[] = &quot;&lt;spidermonkey.ObjectAdapter: %r&gt;&quot;;
-static char __pyx_k57[] = &quot;TypeType&quot;;
-static char __pyx_k58[] = &quot;py_obj&quot;;
-static char __pyx_k59[] = &quot;Failed to unwrap Python object.&quot;;
-static char __pyx_k60[] = &quot;Failed to create object.&quot;;
-static char __pyx_k61[] = &quot;&lt;spidermonkey.FunctionAdapter: %r&gt;&quot;;
-static char __pyx_k62[] = &quot;Function call back without attached functor.&quot;;
-static char __pyx_k63[] = &quot;FunctionType&quot;;
-static char __pyx_k64[] = &quot;LambdaType&quot;;
-static char __pyx_k65[] = &quot;MethodType&quot;;
-static char __pyx_k66[] = &quot;func_name&quot;;
-static char __pyx_k67[] = &quot;im_fun&quot;;
-static char __pyx_k68[] = &quot;Failed to find function name.&quot;;
-static char __pyx_k69[] = &quot;ListType&quot;;
-static char __pyx_k70[] = &quot;TupleType&quot;;
-static char __pyx_k71[] = &quot;Failed to convert JavaScript array to Python.&quot;;
-static char __pyx_k72[] = &quot;Failed to convert Python sequence type to JavaScript.&quot;;
-static char __pyx_k73[] = &quot;BooleanType&quot;;
-static char __pyx_k74[] = &quot;FloatType&quot;;
-static char __pyx_k75[] = &quot;Failed to convert double.&quot;;
-static char __pyx_k76[] = &quot;DictionaryType&quot;;
-static char __pyx_k77[] = &quot;DictType&quot;;
-static char __pyx_k78[] = &quot;Failed to enumerate hash properties.&quot;;
-static char __pyx_k79[] = &quot;Failed to convert dict to JavaScript.&quot;;
-static char __pyx_k80[] = &quot;js_is_string&quot;;
-static char __pyx_k81[] = &quot;Faield to retrieve textual hash property.&quot;;
-static char __pyx_k82[] = &quot;js_is_int&quot;;
-static char __pyx_k83[] = &quot;Failed to retrive numeric hash property.&quot;;
-static char __pyx_k84[] = &quot;Invalid JavaScript property.&quot;;
-static char __pyx_k85[] = &quot;Failed to create new JavaScript object for dict instance.&quot;;
-static char __pyx_k86[] = &quot;iteritems&quot;;
-static char __pyx_k87[] = &quot;Failed to set JavaScript property for dict instance.&quot;;
-static char __pyx_k88[] = &quot;NoneType&quot;;
-static char __pyx_k89[] = &quot;py_is_void&quot;;
-static char __pyx_k90[] = &quot;py_is_bool&quot;;
-static char __pyx_k91[] = &quot;py_is_int&quot;;
-static char __pyx_k92[] = &quot;py_is_double&quot;;
-static char __pyx_k93[] = &quot;py_is_string&quot;;
-static char __pyx_k94[] = &quot;py_is_array&quot;;
-static char __pyx_k95[] = &quot;py_is_hash&quot;;
-static char __pyx_k96[] = &quot;py_is_bound_method&quot;;
-static char __pyx_k97[] = &quot;py_is_function&quot;;
-static char __pyx_k98[] = &quot;py_is_object&quot;;
-static char __pyx_k99[] = &quot;Unable to convert Python value to JavaScript: %r&quot;;
-static char __pyx_k100[] = &quot;js_is_void&quot;;
-static char __pyx_k101[] = &quot;js_is_bool&quot;;
-static char __pyx_k102[] = &quot;js_is_double&quot;;
-static char __pyx_k103[] = &quot;js_is_array&quot;;
-static char __pyx_k104[] = &quot;js_is_function&quot;;
-static char __pyx_k105[] = &quot;js_is_object&quot;;
-static char __pyx_k106[] = &quot;js_is_hash&quot;;
-static char __pyx_k107[] = &quot;Unable to convert JavaScript value to Python: %r&quot;;
-static char __pyx_k108[] = &quot;__init__&quot;;
-static char __pyx_k109[] = &quot;__str__&quot;;
-static char __pyx_k110[] = &quot;__repr__&quot;;
-static char __pyx_k111[] = &quot;object&quot;;
+static char __pyx_k36[] = &quot;unicode&quot;;
+static char __pyx_k37[] = &quot;;&quot;;
+static char __pyx_k38[] = &quot;Failed to unbind property: %s&quot;;
+static char __pyx_k39[] = &quot;Script must be in unicode.&quot;;
+static char __pyx_k40[] = &quot;Python&quot;;
+static char __pyx_k41[] = &quot;Unknown JSContext object.&quot;;
+static char __pyx_k42[] = &quot;Object has no prototype.&quot;;
+static char __pyx_k43[] = &quot;Unknown constructor callback.&quot;;
+static char __pyx_k44[] = &quot;append&quot;;
+static char __pyx_k45[] = &quot;__jsinit__&quot;;
+static char __pyx_k46[] = &quot;UnicodeType&quot;;
+static char __pyx_k47[] = &quot;bind&quot;;
+static char __pyx_k48[] = &quot;_&quot;;
+static char __pyx_k49[] = &quot;JS_VOID&quot;;
+static char __pyx_k50[] = &quot;Invalid key: %r&quot;;
+static char __pyx_k51[] = &quot;callable&quot;;
+static char __pyx_k52[] = &quot;Unknown JSObject.&quot;;
+static char __pyx_k53[] = &quot;__name__&quot;;
+static char __pyx_k54[] = &quot;__jsname__&quot;;
+static char __pyx_k55[] = &quot;js_classname&quot;;
+static char __pyx_k56[] = &quot;Failed to bind Python adapter class.&quot;;
+static char __pyx_k57[] = &quot;&lt;spidermonkey.ClassAdapter: %r&gt;&quot;;
+static char __pyx_k58[] = &quot;&lt;spidermonkey.ObjectAdapter: %r&gt;&quot;;
+static char __pyx_k59[] = &quot;TypeType&quot;;
+static char __pyx_k60[] = &quot;py_obj&quot;;
+static char __pyx_k61[] = &quot;Failed to unwrap Python object.&quot;;
+static char __pyx_k62[] = &quot;Failed to create object.&quot;;
+static char __pyx_k63[] = &quot;&lt;spidermonkey.FunctionAdapter: %r&gt;&quot;;
+static char __pyx_k64[] = &quot;Function call back without attached functor.&quot;;
+static char __pyx_k65[] = &quot;FunctionType&quot;;
+static char __pyx_k66[] = &quot;LambdaType&quot;;
+static char __pyx_k67[] = &quot;MethodType&quot;;
+static char __pyx_k68[] = &quot;func_name&quot;;
+static char __pyx_k69[] = &quot;im_fun&quot;;
+static char __pyx_k70[] = &quot;Failed to find function name.&quot;;
+static char __pyx_k71[] = &quot;ListType&quot;;
+static char __pyx_k72[] = &quot;TupleType&quot;;
+static char __pyx_k73[] = &quot;Failed to convert JavaScript array to Python.&quot;;
+static char __pyx_k74[] = &quot;Failed to convert Python sequence type to JavaScript.&quot;;
+static char __pyx_k75[] = &quot;BooleanType&quot;;
+static char __pyx_k76[] = &quot;FloatType&quot;;
+static char __pyx_k77[] = &quot;Failed to convert double.&quot;;
+static char __pyx_k78[] = &quot;DictionaryType&quot;;
+static char __pyx_k79[] = &quot;DictType&quot;;
+static char __pyx_k80[] = &quot;Failed to enumerate hash properties.&quot;;
+static char __pyx_k81[] = &quot;Failed to convert dict to JavaScript.&quot;;
+static char __pyx_k82[] = &quot;js_is_string&quot;;
+static char __pyx_k83[] = &quot;Faield to retrieve textual hash property.&quot;;
+static char __pyx_k84[] = &quot;js_is_int&quot;;
+static char __pyx_k85[] = &quot;Failed to retrive numeric hash property.&quot;;
+static char __pyx_k86[] = &quot;Invalid JavaScript property.&quot;;
+static char __pyx_k87[] = &quot;Failed to create new JavaScript object for dict instance.&quot;;
+static char __pyx_k88[] = &quot;iteritems&quot;;
+static char __pyx_k89[] = &quot;\nNONE HERE HERE HERE: %s\n\n&quot;;
+static char __pyx_k90[] = &quot;Failed to set JavaScript property for dict instance.&quot;;
+static char __pyx_k91[] = &quot;NoneType&quot;;
+static char __pyx_k92[] = &quot;py_is_void&quot;;
+static char __pyx_k93[] = &quot;py_is_bool&quot;;
+static char __pyx_k94[] = &quot;py_is_int&quot;;
+static char __pyx_k95[] = &quot;py_is_double&quot;;
+static char __pyx_k96[] = &quot;py_is_string&quot;;
+static char __pyx_k97[] = &quot;py_is_array&quot;;
+static char __pyx_k98[] = &quot;py_is_hash&quot;;
+static char __pyx_k99[] = &quot;py_is_bound_method&quot;;
+static char __pyx_k100[] = &quot;py_is_function&quot;;
+static char __pyx_k101[] = &quot;py_is_object&quot;;
+static char __pyx_k102[] = &quot;Unable to convert Python value to JavaScript: %r&quot;;
+static char __pyx_k103[] = &quot;js_is_void&quot;;
+static char __pyx_k104[] = &quot;js_is_bool&quot;;
+static char __pyx_k105[] = &quot;js_is_double&quot;;
+static char __pyx_k106[] = &quot;js_is_array&quot;;
+static char __pyx_k107[] = &quot;js_is_function&quot;;
+static char __pyx_k108[] = &quot;js_is_object&quot;;
+static char __pyx_k109[] = &quot;js_is_hash&quot;;
+static char __pyx_k110[] = &quot;Unable to convert JavaScript value to Python: %r&quot;;
+static char __pyx_k111[] = &quot;__init__&quot;;
+static char __pyx_k112[] = &quot;__str__&quot;;
+static char __pyx_k113[] = &quot;__repr__&quot;;
+static char __pyx_k114[] = &quot;object&quot;;
 
 static PyObject *__pyx_n_BooleanType;
 static PyObject *__pyx_n_DictType;
@@ -343,9 +348,9 @@ static PyObject *__pyx_n_ListType;
 static PyObject *__pyx_n_LongType;
 static PyObject *__pyx_n_MethodType;
 static PyObject *__pyx_n_NoneType;
-static PyObject *__pyx_n_StringTypes;
 static PyObject *__pyx_n_TupleType;
 static PyObject *__pyx_n_TypeType;
+static PyObject *__pyx_n_UnicodeType;
 static PyObject *__pyx_n_Unknown;
 static PyObject *__pyx_n__;
 static PyObject *__pyx_n___class__;
@@ -395,9 +400,10 @@ static PyObject *__pyx_n_stderr;
 static PyObject *__pyx_n_sys;
 static PyObject *__pyx_n_traceback;
 static PyObject *__pyx_n_types;
+static PyObject *__pyx_n_unicode;
 static PyObject *__pyx_n_write;
 
-static PyObject *__pyx_k2p;
+static PyObject *__pyx_k1p;
 static PyObject *__pyx_k8p;
 static PyObject *__pyx_k11p;
 static PyObject *__pyx_k14p;
@@ -410,106 +416,109 @@ static PyObject *__pyx_k23p;
 static PyObject *__pyx_k24p;
 static PyObject *__pyx_k27p;
 static PyObject *__pyx_k31p;
+static PyObject *__pyx_k32p;
 static PyObject *__pyx_k33p;
 static PyObject *__pyx_k34p;
-static PyObject *__pyx_k36p;
 static PyObject *__pyx_k37p;
 static PyObject *__pyx_k38p;
-static PyObject *__pyx_k40p;
+static PyObject *__pyx_k39p;
 static PyObject *__pyx_k41p;
 static PyObject *__pyx_k42p;
-static PyObject *__pyx_k48p;
+static PyObject *__pyx_k43p;
 static PyObject *__pyx_k50p;
-static PyObject *__pyx_k54p;
-static PyObject *__pyx_k55p;
+static PyObject *__pyx_k52p;
 static PyObject *__pyx_k56p;
-static PyObject *__pyx_k59p;
-static PyObject *__pyx_k60p;
+static PyObject *__pyx_k57p;
+static PyObject *__pyx_k58p;
 static PyObject *__pyx_k61p;
 static PyObject *__pyx_k62p;
-static PyObject *__pyx_k68p;
-static PyObject *__pyx_k71p;
-static PyObject *__pyx_k72p;
-static PyObject *__pyx_k75p;
-static PyObject *__pyx_k78p;
-static PyObject *__pyx_k79p;
+static PyObject *__pyx_k63p;
+static PyObject *__pyx_k64p;
+static PyObject *__pyx_k70p;
+static PyObject *__pyx_k73p;
+static PyObject *__pyx_k74p;
+static PyObject *__pyx_k77p;
+static PyObject *__pyx_k80p;
 static PyObject *__pyx_k81p;
 static PyObject *__pyx_k83p;
-static PyObject *__pyx_k84p;
 static PyObject *__pyx_k85p;
+static PyObject *__pyx_k86p;
 static PyObject *__pyx_k87p;
-static PyObject *__pyx_k99p;
-static PyObject *__pyx_k107p;
+static PyObject *__pyx_k89p;
+static PyObject *__pyx_k90p;
+static PyObject *__pyx_k102p;
+static PyObject *__pyx_k110p;
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&amp;__pyx_n_BooleanType, 1, __pyx_k73, sizeof(__pyx_k73)},
-  {&amp;__pyx_n_DictType, 1, __pyx_k77, sizeof(__pyx_k77)},
-  {&amp;__pyx_n_DictionaryType, 1, __pyx_k76, sizeof(__pyx_k76)},
-  {&amp;__pyx_n_FloatType, 1, __pyx_k74, sizeof(__pyx_k74)},
-  {&amp;__pyx_n_FunctionType, 1, __pyx_k63, sizeof(__pyx_k63)},
+  {&amp;__pyx_n_BooleanType, 1, __pyx_k75, sizeof(__pyx_k75)},
+  {&amp;__pyx_n_DictType, 1, __pyx_k79, sizeof(__pyx_k79)},
+  {&amp;__pyx_n_DictionaryType, 1, __pyx_k78, sizeof(__pyx_k78)},
+  {&amp;__pyx_n_FloatType, 1, __pyx_k76, sizeof(__pyx_k76)},
+  {&amp;__pyx_n_FunctionType, 1, __pyx_k65, sizeof(__pyx_k65)},
   {&amp;__pyx_n_IntType, 1, __pyx_k29, sizeof(__pyx_k29)},
   {&amp;__pyx_n_JSError, 1, __pyx_k13, sizeof(__pyx_k13)},
   {&amp;__pyx_n_JSRootObject, 1, __pyx_k20, sizeof(__pyx_k20)},
-  {&amp;__pyx_n_JS_VOID, 1, __pyx_k47, sizeof(__pyx_k47)},
-  {&amp;__pyx_n_LambdaType, 1, __pyx_k64, sizeof(__pyx_k64)},
-  {&amp;__pyx_n_ListType, 1, __pyx_k69, sizeof(__pyx_k69)},
+  {&amp;__pyx_n_JS_VOID, 1, __pyx_k49, sizeof(__pyx_k49)},
+  {&amp;__pyx_n_LambdaType, 1, __pyx_k66, sizeof(__pyx_k66)},
+  {&amp;__pyx_n_ListType, 1, __pyx_k71, sizeof(__pyx_k71)},
   {&amp;__pyx_n_LongType, 1, __pyx_k30, sizeof(__pyx_k30)},
-  {&amp;__pyx_n_MethodType, 1, __pyx_k65, sizeof(__pyx_k65)},
-  {&amp;__pyx_n_NoneType, 1, __pyx_k88, sizeof(__pyx_k88)},
-  {&amp;__pyx_n_StringTypes, 1, __pyx_k32, sizeof(__pyx_k32)},
-  {&amp;__pyx_n_TupleType, 1, __pyx_k70, sizeof(__pyx_k70)},
-  {&amp;__pyx_n_TypeType, 1, __pyx_k57, sizeof(__pyx_k57)},
+  {&amp;__pyx_n_MethodType, 1, __pyx_k67, sizeof(__pyx_k67)},
+  {&amp;__pyx_n_NoneType, 1, __pyx_k91, sizeof(__pyx_k91)},
+  {&amp;__pyx_n_TupleType, 1, __pyx_k72, sizeof(__pyx_k72)},
+  {&amp;__pyx_n_TypeType, 1, __pyx_k59, sizeof(__pyx_k59)},
+  {&amp;__pyx_n_UnicodeType, 1, __pyx_k46, sizeof(__pyx_k46)},
   {&amp;__pyx_n_Unknown, 1, __pyx_k9, sizeof(__pyx_k9)},
-  {&amp;__pyx_n__, 1, __pyx_k46, sizeof(__pyx_k46)},
+  {&amp;__pyx_n__, 1, __pyx_k48, sizeof(__pyx_k48)},
   {&amp;__pyx_n___class__, 1, __pyx_k22, sizeof(__pyx_k22)},
-  {&amp;__pyx_n___init__, 1, __pyx_k108, sizeof(__pyx_k108)},
-  {&amp;__pyx_n___jsinit__, 1, __pyx_k44, sizeof(__pyx_k44)},
-  {&amp;__pyx_n___jsname__, 1, __pyx_k52, sizeof(__pyx_k52)},
-  {&amp;__pyx_n___name__, 1, __pyx_k51, sizeof(__pyx_k51)},
-  {&amp;__pyx_n___repr__, 1, __pyx_k110, sizeof(__pyx_k110)},
-  {&amp;__pyx_n___str__, 1, __pyx_k109, sizeof(__pyx_k109)},
-  {&amp;__pyx_n_append, 1, __pyx_k43, sizeof(__pyx_k43)},
-  {&amp;__pyx_n_bind, 1, __pyx_k45, sizeof(__pyx_k45)},
-  {&amp;__pyx_n_callable, 1, __pyx_k49, sizeof(__pyx_k49)},
+  {&amp;__pyx_n___init__, 1, __pyx_k111, sizeof(__pyx_k111)},
+  {&amp;__pyx_n___jsinit__, 1, __pyx_k45, sizeof(__pyx_k45)},
+  {&amp;__pyx_n___jsname__, 1, __pyx_k54, sizeof(__pyx_k54)},
+  {&amp;__pyx_n___name__, 1, __pyx_k53, sizeof(__pyx_k53)},
+  {&amp;__pyx_n___repr__, 1, __pyx_k113, sizeof(__pyx_k113)},
+  {&amp;__pyx_n___str__, 1, __pyx_k112, sizeof(__pyx_k112)},
+  {&amp;__pyx_n_append, 1, __pyx_k44, sizeof(__pyx_k44)},
+  {&amp;__pyx_n_bind, 1, __pyx_k47, sizeof(__pyx_k47)},
+  {&amp;__pyx_n_callable, 1, __pyx_k51, sizeof(__pyx_k51)},
   {&amp;__pyx_n_execute, 1, __pyx_k35, sizeof(__pyx_k35)},
   {&amp;__pyx_n_format_exc, 1, __pyx_k4, sizeof(__pyx_k4)},
-  {&amp;__pyx_n_func_name, 1, __pyx_k66, sizeof(__pyx_k66)},
-  {&amp;__pyx_n_im_fun, 1, __pyx_k67, sizeof(__pyx_k67)},
+  {&amp;__pyx_n_func_name, 1, __pyx_k68, sizeof(__pyx_k68)},
+  {&amp;__pyx_n_im_fun, 1, __pyx_k69, sizeof(__pyx_k69)},
   {&amp;__pyx_n_inspect, 1, __pyx_k25, sizeof(__pyx_k25)},
   {&amp;__pyx_n_install_class, 1, __pyx_k21, sizeof(__pyx_k21)},
   {&amp;__pyx_n_isclass, 1, __pyx_k26, sizeof(__pyx_k26)},
-  {&amp;__pyx_n_iteritems, 1, __pyx_k86, sizeof(__pyx_k86)},
-  {&amp;__pyx_n_js_classname, 1, __pyx_k53, sizeof(__pyx_k53)},
-  {&amp;__pyx_n_js_is_array, 1, __pyx_k103, sizeof(__pyx_k103)},
-  {&amp;__pyx_n_js_is_bool, 1, __pyx_k101, sizeof(__pyx_k101)},
-  {&amp;__pyx_n_js_is_double, 1, __pyx_k102, sizeof(__pyx_k102)},
-  {&amp;__pyx_n_js_is_function, 1, __pyx_k104, sizeof(__pyx_k104)},
-  {&amp;__pyx_n_js_is_hash, 1, __pyx_k106, sizeof(__pyx_k106)},
-  {&amp;__pyx_n_js_is_int, 1, __pyx_k82, sizeof(__pyx_k82)},
-  {&amp;__pyx_n_js_is_object, 1, __pyx_k105, sizeof(__pyx_k105)},
-  {&amp;__pyx_n_js_is_string, 1, __pyx_k80, sizeof(__pyx_k80)},
-  {&amp;__pyx_n_js_is_void, 1, __pyx_k100, sizeof(__pyx_k100)},
-  {&amp;__pyx_n_mesg, 1, __pyx_k1, sizeof(__pyx_k1)},
-  {&amp;__pyx_n_object, 1, __pyx_k111, sizeof(__pyx_k111)},
+  {&amp;__pyx_n_iteritems, 1, __pyx_k88, sizeof(__pyx_k88)},
+  {&amp;__pyx_n_js_classname, 1, __pyx_k55, sizeof(__pyx_k55)},
+  {&amp;__pyx_n_js_is_array, 1, __pyx_k106, sizeof(__pyx_k106)},
+  {&amp;__pyx_n_js_is_bool, 1, __pyx_k104, sizeof(__pyx_k104)},
+  {&amp;__pyx_n_js_is_double, 1, __pyx_k105, sizeof(__pyx_k105)},
+  {&amp;__pyx_n_js_is_function, 1, __pyx_k107, sizeof(__pyx_k107)},
+  {&amp;__pyx_n_js_is_hash, 1, __pyx_k109, sizeof(__pyx_k109)},
+  {&amp;__pyx_n_js_is_int, 1, __pyx_k84, sizeof(__pyx_k84)},
+  {&amp;__pyx_n_js_is_object, 1, __pyx_k108, sizeof(__pyx_k108)},
+  {&amp;__pyx_n_js_is_string, 1, __pyx_k82, sizeof(__pyx_k82)},
+  {&amp;__pyx_n_js_is_void, 1, __pyx_k103, sizeof(__pyx_k103)},
+  {&amp;__pyx_n_mesg, 1, __pyx_k2, sizeof(__pyx_k2)},
+  {&amp;__pyx_n_object, 1, __pyx_k114, sizeof(__pyx_k114)},
   {&amp;__pyx_n_print_exc, 1, __pyx_k12, sizeof(__pyx_k12)},
-  {&amp;__pyx_n_py_is_array, 1, __pyx_k94, sizeof(__pyx_k94)},
-  {&amp;__pyx_n_py_is_bool, 1, __pyx_k90, sizeof(__pyx_k90)},
-  {&amp;__pyx_n_py_is_bound_method, 1, __pyx_k96, sizeof(__pyx_k96)},
-  {&amp;__pyx_n_py_is_double, 1, __pyx_k92, sizeof(__pyx_k92)},
-  {&amp;__pyx_n_py_is_function, 1, __pyx_k97, sizeof(__pyx_k97)},
-  {&amp;__pyx_n_py_is_hash, 1, __pyx_k95, sizeof(__pyx_k95)},
-  {&amp;__pyx_n_py_is_int, 1, __pyx_k91, sizeof(__pyx_k91)},
-  {&amp;__pyx_n_py_is_object, 1, __pyx_k98, sizeof(__pyx_k98)},
-  {&amp;__pyx_n_py_is_string, 1, __pyx_k93, sizeof(__pyx_k93)},
-  {&amp;__pyx_n_py_is_void, 1, __pyx_k89, sizeof(__pyx_k89)},
-  {&amp;__pyx_n_py_obj, 1, __pyx_k58, sizeof(__pyx_k58)},
+  {&amp;__pyx_n_py_is_array, 1, __pyx_k97, sizeof(__pyx_k97)},
+  {&amp;__pyx_n_py_is_bool, 1, __pyx_k93, sizeof(__pyx_k93)},
+  {&amp;__pyx_n_py_is_bound_method, 1, __pyx_k99, sizeof(__pyx_k99)},
+  {&amp;__pyx_n_py_is_double, 1, __pyx_k95, sizeof(__pyx_k95)},
+  {&amp;__pyx_n_py_is_function, 1, __pyx_k100, sizeof(__pyx_k100)},
+  {&amp;__pyx_n_py_is_hash, 1, __pyx_k98, sizeof(__pyx_k98)},
+  {&amp;__pyx_n_py_is_int, 1, __pyx_k94, sizeof(__pyx_k94)},
+  {&amp;__pyx_n_py_is_object, 1, __pyx_k101, sizeof(__pyx_k101)},
+  {&amp;__pyx_n_py_is_string, 1, __pyx_k96, sizeof(__pyx_k96)},
+  {&amp;__pyx_n_py_is_void, 1, __pyx_k92, sizeof(__pyx_k92)},
+  {&amp;__pyx_n_py_obj, 1, __pyx_k60, sizeof(__pyx_k60)},
   {&amp;__pyx_n_set_error, 1, __pyx_k10, sizeof(__pyx_k10)},
   {&amp;__pyx_n_stderr, 1, __pyx_k6, sizeof(__pyx_k6)},
   {&amp;__pyx_n_sys, 1, __pyx_k5, sizeof(__pyx_k5)},
   {&amp;__pyx_n_traceback, 1, __pyx_k3, sizeof(__pyx_k3)},
   {&amp;__pyx_n_types, 1, __pyx_k28, sizeof(__pyx_k28)},
+  {&amp;__pyx_n_unicode, 1, __pyx_k36, sizeof(__pyx_k36)},
   {&amp;__pyx_n_write, 1, __pyx_k7, sizeof(__pyx_k7)},
-  {&amp;__pyx_k2p, 0, __pyx_k2, sizeof(__pyx_k2)},
+  {&amp;__pyx_k1p, 0, __pyx_k1, sizeof(__pyx_k1)},
   {&amp;__pyx_k8p, 0, __pyx_k8, sizeof(__pyx_k8)},
   {&amp;__pyx_k11p, 0, __pyx_k11, sizeof(__pyx_k11)},
   {&amp;__pyx_k14p, 0, __pyx_k14, sizeof(__pyx_k14)},
@@ -522,36 +531,38 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&amp;__pyx_k24p, 0, __pyx_k24, sizeof(__pyx_k24)},
   {&amp;__pyx_k27p, 0, __pyx_k27, sizeof(__pyx_k27)},
   {&amp;__pyx_k31p, 0, __pyx_k31, sizeof(__pyx_k31)},
+  {&amp;__pyx_k32p, 0, __pyx_k32, sizeof(__pyx_k32)},
   {&amp;__pyx_k33p, 0, __pyx_k33, sizeof(__pyx_k33)},
   {&amp;__pyx_k34p, 0, __pyx_k34, sizeof(__pyx_k34)},
-  {&amp;__pyx_k36p, 0, __pyx_k36, sizeof(__pyx_k36)},
   {&amp;__pyx_k37p, 0, __pyx_k37, sizeof(__pyx_k37)},
   {&amp;__pyx_k38p, 0, __pyx_k38, sizeof(__pyx_k38)},
-  {&amp;__pyx_k40p, 0, __pyx_k40, sizeof(__pyx_k40)},
+  {&amp;__pyx_k39p, 0, __pyx_k39, sizeof(__pyx_k39)},
   {&amp;__pyx_k41p, 0, __pyx_k41, sizeof(__pyx_k41)},
   {&amp;__pyx_k42p, 0, __pyx_k42, sizeof(__pyx_k42)},
-  {&amp;__pyx_k48p, 0, __pyx_k48, sizeof(__pyx_k48)},
+  {&amp;__pyx_k43p, 0, __pyx_k43, sizeof(__pyx_k43)},
   {&amp;__pyx_k50p, 0, __pyx_k50, sizeof(__pyx_k50)},
-  {&amp;__pyx_k54p, 0, __pyx_k54, sizeof(__pyx_k54)},
-  {&amp;__pyx_k55p, 0, __pyx_k55, sizeof(__pyx_k55)},
+  {&amp;__pyx_k52p, 0, __pyx_k52, sizeof(__pyx_k52)},
   {&amp;__pyx_k56p, 0, __pyx_k56, sizeof(__pyx_k56)},
-  {&amp;__pyx_k59p, 0, __pyx_k59, sizeof(__pyx_k59)},
-  {&amp;__pyx_k60p, 0, __pyx_k60, sizeof(__pyx_k60)},
+  {&amp;__pyx_k57p, 0, __pyx_k57, sizeof(__pyx_k57)},
+  {&amp;__pyx_k58p, 0, __pyx_k58, sizeof(__pyx_k58)},
   {&amp;__pyx_k61p, 0, __pyx_k61, sizeof(__pyx_k61)},
   {&amp;__pyx_k62p, 0, __pyx_k62, sizeof(__pyx_k62)},
-  {&amp;__pyx_k68p, 0, __pyx_k68, sizeof(__pyx_k68)},
-  {&amp;__pyx_k71p, 0, __pyx_k71, sizeof(__pyx_k71)},
-  {&amp;__pyx_k72p, 0, __pyx_k72, sizeof(__pyx_k72)},
-  {&amp;__pyx_k75p, 0, __pyx_k75, sizeof(__pyx_k75)},
-  {&amp;__pyx_k78p, 0, __pyx_k78, sizeof(__pyx_k78)},
-  {&amp;__pyx_k79p, 0, __pyx_k79, sizeof(__pyx_k79)},
+  {&amp;__pyx_k63p, 0, __pyx_k63, sizeof(__pyx_k63)},
+  {&amp;__pyx_k64p, 0, __pyx_k64, sizeof(__pyx_k64)},
+  {&amp;__pyx_k70p, 0, __pyx_k70, sizeof(__pyx_k70)},
+  {&amp;__pyx_k73p, 0, __pyx_k73, sizeof(__pyx_k73)},
+  {&amp;__pyx_k74p, 0, __pyx_k74, sizeof(__pyx_k74)},
+  {&amp;__pyx_k77p, 0, __pyx_k77, sizeof(__pyx_k77)},
+  {&amp;__pyx_k80p, 0, __pyx_k80, sizeof(__pyx_k80)},
   {&amp;__pyx_k81p, 0, __pyx_k81, sizeof(__pyx_k81)},
   {&amp;__pyx_k83p, 0, __pyx_k83, sizeof(__pyx_k83)},
-  {&amp;__pyx_k84p, 0, __pyx_k84, sizeof(__pyx_k84)},
   {&amp;__pyx_k85p, 0, __pyx_k85, sizeof(__pyx_k85)},
+  {&amp;__pyx_k86p, 0, __pyx_k86, sizeof(__pyx_k86)},
   {&amp;__pyx_k87p, 0, __pyx_k87, sizeof(__pyx_k87)},
-  {&amp;__pyx_k99p, 0, __pyx_k99, sizeof(__pyx_k99)},
-  {&amp;__pyx_k107p, 0, __pyx_k107, sizeof(__pyx_k107)},
+  {&amp;__pyx_k89p, 0, __pyx_k89, sizeof(__pyx_k89)},
+  {&amp;__pyx_k90p, 0, __pyx_k90, sizeof(__pyx_k90)},
+  {&amp;__pyx_k102p, 0, __pyx_k102, sizeof(__pyx_k102)},
+  {&amp;__pyx_k110p, 0, __pyx_k110, sizeof(__pyx_k110)},
   {0, 0, 0, 0}
 };
 
@@ -569,21 +580,21 @@ static void *__pyx_f_12spidermonkey_xmalloc(__pyx_t_12spidermonkey_size_t __pyx_
   int __pyx_1;
   PyObject *__pyx_2 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:375 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:383 */
   __pyx_v_mem = malloc(__pyx_v_size);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:376 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:384 */
   __pyx_1 = (((int)__pyx_v_mem) == 0);
   if (__pyx_1) {
-    __pyx_2 = PyObject_CallObject(PyExc_MemoryError, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; goto __pyx_L1;}
+    __pyx_2 = PyObject_CallObject(PyExc_MemoryError, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; goto __pyx_L1;}
     __Pyx_Raise(__pyx_2, 0, 0);
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:378 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:386 */
   __pyx_r = __pyx_v_mem;
   goto __pyx_L0;
 
@@ -597,6 +608,106 @@ static void *__pyx_f_12spidermonkey_xmalloc(__pyx_t_12spidermonkey_size_t __pyx_
   return __pyx_r;
 }
 
+static struct JSString *__pyx_f_12spidermonkey_py2js_jsstring(struct JSContext *__pyx_v_cx,PyObject *__pyx_v_str) {
+  struct JSString *__pyx_v_ret;
+  struct JSString *__pyx_r;
+  Py_INCREF(__pyx_v_str);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:390 */
+  __pyx_v_ret = py2js_jsstring_c(__pyx_v_cx,((struct PyObject *)__pyx_v_str));
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:391 */
+  __pyx_r = __pyx_v_ret;
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_str);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_12spidermonkey_js2py_jsstring(struct JSString *__pyx_v_str) {
+  struct PyObject *__pyx_v_ret;
+  PyObject *__pyx_v_var;
+  PyObject *__pyx_r;
+  int __pyx_1;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  __pyx_v_var = Py_None; Py_INCREF(Py_None);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:396 */
+  __pyx_1 = (__pyx_v_str == NULL);
+  if (__pyx_1) {
+    __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
+    Py_INCREF(__pyx_k1p);
+    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k1p);
+    __pyx_3 = PyObject_CallObject(PyExc_TypeError, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:398 */
+  __pyx_v_ret = js2py_jsstring_c(__pyx_v_str);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:399 */
+  __pyx_1 = (__pyx_v_ret != NULL);
+  if (__pyx_1) {
+    Py_INCREF(((PyObject *)__pyx_v_ret));
+    Py_DECREF(__pyx_v_var);
+    __pyx_v_var = ((PyObject *)__pyx_v_ret);
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:401 */
+  Py_INCREF(__pyx_v_var);
+  __pyx_r = __pyx_v_var;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  __Pyx_AddTraceback(&quot;spidermonkey.js2py_jsstring&quot;);
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_var);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_12spidermonkey_test_utf_16_round_trip(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_12spidermonkey_test_utf_16_round_trip(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  struct __pyx_obj_12spidermonkey_Context *__pyx_v_cx = 0;
+  PyObject *__pyx_v_data = 0;
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  static char *__pyx_argnames[] = {&quot;cx&quot;,&quot;data&quot;,0};
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;OO&quot;, __pyx_argnames, &amp;__pyx_v_cx, &amp;__pyx_v_data)) return 0;
+  Py_INCREF(__pyx_v_cx);
+  Py_INCREF(__pyx_v_data);
+  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cx), __pyx_ptype_12spidermonkey_Context, 1, &quot;cx&quot;)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; goto __pyx_L1;}
+  __pyx_1 = __pyx_f_12spidermonkey_js2py_jsstring(__pyx_f_12spidermonkey_py2js_jsstring(__pyx_v_cx-&gt;cx,__pyx_v_data)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback(&quot;spidermonkey.test_utf_16_round_trip&quot;);
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_cx);
+  Py_DECREF(__pyx_v_data);
+  return __pyx_r;
+}
+
 static PyObject *__pyx_f_12spidermonkey_7JSError___init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyMethodDef __pyx_mdef_12spidermonkey_7JSError___init__ = {&quot;__init__&quot;, (PyCFunction)__pyx_f_12spidermonkey_7JSError___init__, METH_VARARGS|METH_KEYWORDS, 0};
 static PyObject *__pyx_f_12spidermonkey_7JSError___init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -607,7 +718,7 @@ static PyObject *__pyx_f_12spidermonkey_7JSError___init__(PyObject *__pyx_self,
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;OO&quot;, __pyx_argnames, &amp;__pyx_v_self, &amp;__pyx_v_mesg)) return 0;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_mesg);
-  if (PyObject_SetAttr(__pyx_v_self, __pyx_n_mesg, __pyx_v_mesg) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_v_self, __pyx_n_mesg, __pyx_v_mesg) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; goto __pyx_L1;}
 
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
@@ -629,7 +740,7 @@ static PyObject *__pyx_f_12spidermonkey_7JSError___str__(PyObject *__pyx_self, P
   static char *__pyx_argnames[] = {&quot;self&quot;,0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;O&quot;, __pyx_argnames, &amp;__pyx_v_self)) return 0;
   Py_INCREF(__pyx_v_self);
-  __pyx_1 = PyObject_Repr(__pyx_v_self); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; goto __pyx_L1;}
+  __pyx_1 = PyObject_Repr(__pyx_v_self); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -651,22 +762,18 @@ static PyObject *__pyx_f_12spidermonkey_7JSError___repr__(PyObject *__pyx_self,
   PyObject *__pyx_v_self = 0;
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
-  PyObject *__pyx_2 = 0;
   static char *__pyx_argnames[] = {&quot;self&quot;,0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;O&quot;, __pyx_argnames, &amp;__pyx_v_self)) return 0;
   Py_INCREF(__pyx_v_self);
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_mesg); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k2p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_r = __pyx_2;
-  __pyx_2 = 0;
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_mesg); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
   goto __pyx_L0;
 
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1:;
   Py_XDECREF(__pyx_1);
-  Py_XDECREF(__pyx_2);
   __Pyx_AddTraceback(&quot;spidermonkey.JSError.__repr__&quot;);
   __pyx_r = 0;
   __pyx_L0:;
@@ -1510,14 +1617,15 @@ static PyObject *__pyx_f_12spidermonkey_7Context_bind(PyObject *__pyx_v_self, Py
   PyObject *__pyx_v_obj = 0;
   struct __pyx_obj_12spidermonkey_ClassAdapter *__pyx_v_ca;
   __pyx_t_12spidermonkey_jsval __pyx_v_jsv;
+  struct JSString *__pyx_v_converted;
+  __pyx_t_12spidermonkey_jschar *__pyx_v_data;
+  __pyx_t_12spidermonkey_size_t __pyx_v_length;
   PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
+  int __pyx_1;
   PyObject *__pyx_2 = 0;
-  int __pyx_3;
-  int __pyx_4;
-  PyObject *__pyx_5 = 0;
-  __pyx_t_12spidermonkey_jsval __pyx_6;
-  char *__pyx_7;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
+  __pyx_t_12spidermonkey_jsval __pyx_5;
   static char *__pyx_argnames[] = {&quot;name&quot;,&quot;obj&quot;,0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;OO&quot;, __pyx_argnames, &amp;__pyx_v_name, &amp;__pyx_v_obj)) return 0;
   Py_INCREF(__pyx_v_self);
@@ -1525,58 +1633,61 @@ static PyObject *__pyx_f_12spidermonkey_7Context_bind(PyObject *__pyx_v_self, Py
   Py_INCREF(__pyx_v_obj);
   __pyx_v_ca = ((struct __pyx_obj_12spidermonkey_ClassAdapter *)Py_None); Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:87 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_StringTypes); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_3 = PyObject_IsInstance(__pyx_v_name,__pyx_2); if (__pyx_3 == -1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 87; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_4 = (!__pyx_3);
-  if (__pyx_4) {
-    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; goto __pyx_L1;}
-    Py_INCREF(__pyx_k33p);
-    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k33p);
-    __pyx_2 = PyObject_CallObject(PyExc_TypeError, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; goto __pyx_L1;}
-    Py_DECREF(__pyx_1); __pyx_1 = 0;
-    __Pyx_Raise(__pyx_2, 0, 0);
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:90 */
+  __pyx_v_converted = __pyx_f_12spidermonkey_py2js_jsstring(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,__pyx_v_name);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:91 */
+  __pyx_1 = (__pyx_v_converted == NULL);
+  if (__pyx_1) {
+    __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; goto __pyx_L1;}
+    Py_INCREF(__pyx_k32p);
+    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k32p);
+    __pyx_3 = PyObject_CallObject(PyExc_TypeError, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 88; goto __pyx_L1;}
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:90 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_install_class); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_v_obj, __pyx_n___class__); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; goto __pyx_L1;}
-  __pyx_5 = PyTuple_New(1); if (!__pyx_5) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_5, 0, __pyx_2);
-  __pyx_2 = 0;
-  __pyx_2 = PyObject_CallObject(__pyx_1, __pyx_5); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_5); __pyx_5 = 0;
-  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_ClassAdapter)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 90; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:94 */
+  __pyx_v_data = JS_GetStringChars(__pyx_v_converted);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:95 */
+  __pyx_v_length = JS_GetStringLength(__pyx_v_converted);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:97 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_install_class); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
+  __pyx_3 = PyObject_GetAttr(__pyx_v_obj, __pyx_n___class__); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+  __pyx_3 = 0;
+  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_12spidermonkey_ClassAdapter)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_ca));
-  __pyx_v_ca = ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_2);
-  __pyx_2 = 0;
+  __pyx_v_ca = ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_3);
+  __pyx_3 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:91 */
-  __pyx_6 = __pyx_f_12spidermonkey_py2js(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self),__pyx_v_obj,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj); if (__pyx_6 == 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 91; goto __pyx_L1;}
-  __pyx_v_jsv = __pyx_6;
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:98 */
+  __pyx_5 = __pyx_f_12spidermonkey_py2js(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self),__pyx_v_obj,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 98; goto __pyx_L1;}
+  __pyx_v_jsv = __pyx_5;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:92 */
-  __pyx_7 = PyString_AsString(__pyx_v_name); if (!__pyx_7) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 92; goto __pyx_L1;}
-  __pyx_3 = (!JS_DefineProperty(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj,__pyx_7,__pyx_v_jsv,__pyx_f_12spidermonkey___get_property_callback__,__pyx_f_12spidermonkey___set_property_callback__,0));
-  if (__pyx_3) {
-    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; goto __pyx_L1;}
-    __pyx_5 = PyTuple_New(1); if (!__pyx_5) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; goto __pyx_L1;}
-    Py_INCREF(__pyx_k34p);
-    PyTuple_SET_ITEM(__pyx_5, 0, __pyx_k34p);
-    __pyx_2 = PyObject_CallObject(__pyx_1, __pyx_5); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; goto __pyx_L1;}
-    Py_DECREF(__pyx_1); __pyx_1 = 0;
-    Py_DECREF(__pyx_5); __pyx_5 = 0;
-    __Pyx_Raise(__pyx_2, 0, 0);
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:99 */
+  __pyx_1 = (!JS_DefineUCProperty(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj,__pyx_v_data,__pyx_v_length,__pyx_v_jsv,__pyx_f_12spidermonkey___get_property_callback__,__pyx_f_12spidermonkey___set_property_callback__,0));
+  if (__pyx_1) {
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; goto __pyx_L1;}
+    Py_INCREF(__pyx_k33p);
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k33p);
+    __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 94; goto __pyx_L1;}
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 101; goto __pyx_L1;}
     goto __pyx_L3;
   }
   __pyx_L3:;
@@ -1584,9 +1695,9 @@ static PyObject *__pyx_f_12spidermonkey_7Context_bind(PyObject *__pyx_v_self, Py
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1:;
-  Py_XDECREF(__pyx_1);
   Py_XDECREF(__pyx_2);
-  Py_XDECREF(__pyx_5);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
   __Pyx_AddTraceback(&quot;spidermonkey.Context.bind&quot;);
   __pyx_r = 0;
   __pyx_L0:;
@@ -1600,52 +1711,87 @@ static PyObject *__pyx_f_12spidermonkey_7Context_bind(PyObject *__pyx_v_self, Py
 static PyObject *__pyx_f_12spidermonkey_7Context_unbind(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_f_12spidermonkey_7Context_unbind(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_name = 0;
+  __pyx_t_12spidermonkey_jsval __pyx_v_rval;
+  struct JSString *__pyx_v_converted;
+  __pyx_t_12spidermonkey_jschar *__pyx_v_data;
+  __pyx_t_12spidermonkey_size_t __pyx_v_length;
   PyObject *__pyx_v_ret;
   PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
+  int __pyx_1;
   PyObject *__pyx_2 = 0;
   PyObject *__pyx_3 = 0;
-  char *__pyx_4;
-  int __pyx_5;
+  PyObject *__pyx_4 = 0;
+  PyObject *__pyx_5 = 0;
   static char *__pyx_argnames[] = {&quot;name&quot;,0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;O&quot;, __pyx_argnames, &amp;__pyx_v_name)) return 0;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_name);
   __pyx_v_ret = Py_None; Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:97 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_execute); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k36p, __pyx_v_name); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_2);
-  __pyx_2 = 0;
-  __pyx_2 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 97; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  Py_DECREF(__pyx_v_ret);
-  __pyx_v_ret = __pyx_2;
-  __pyx_2 = 0;
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:109 */
+  __pyx_v_converted = __pyx_f_12spidermonkey_py2js_jsstring(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,__pyx_v_name);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:98 */
-  __pyx_4 = PyString_AsString(__pyx_v_name); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 98; goto __pyx_L1;}
-  __pyx_5 = (!JS_DeleteProperty(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj,__pyx_4));
-  if (__pyx_5) {
-    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 99; goto __pyx_L1;}
-    __pyx_3 = PyNumber_Remainder(__pyx_k37p, __pyx_v_name); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 99; goto __pyx_L1;}
-    __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 99; goto __pyx_L1;}
-    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_3);
-    __pyx_3 = 0;
-    __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 99; goto __pyx_L1;}
-    Py_DECREF(__pyx_1); __pyx_1 = 0;
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:110 */
+  __pyx_1 = (__pyx_v_converted == NULL);
+  if (__pyx_1) {
+    __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 111; goto __pyx_L1;}
+    Py_INCREF(__pyx_k34p);
+    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k34p);
+    __pyx_3 = PyObject_CallObject(PyExc_TypeError, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 111; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     __Pyx_Raise(__pyx_3, 0, 0);
     Py_DECREF(__pyx_3); __pyx_3 = 0;
-    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 99; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 111; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:100 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:113 */
+  __pyx_v_data = JS_GetStringChars(__pyx_v_converted);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:114 */
+  __pyx_v_length = JS_GetStringLength(__pyx_v_converted);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:116 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_execute); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_unicode); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  Py_INCREF(__pyx_k37p);
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k37p);
+  __pyx_5 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_3 = PyNumber_Add(__pyx_v_name, __pyx_5); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  Py_DECREF(__pyx_5); __pyx_5 = 0;
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+  __pyx_3 = 0;
+  __pyx_5 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 116; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  Py_DECREF(__pyx_v_ret);
+  __pyx_v_ret = __pyx_5;
+  __pyx_5 = 0;
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:117 */
+  __pyx_1 = (!JS_DeleteUCProperty2(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj,__pyx_v_data,__pyx_v_length,(&amp;__pyx_v_rval)));
+  if (__pyx_1) {
+    __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 118; goto __pyx_L1;}
+    __pyx_2 = PyNumber_Remainder(__pyx_k38p, __pyx_v_name); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 118; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 118; goto __pyx_L1;}
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_2);
+    __pyx_2 = 0;
+    __pyx_5 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 118; goto __pyx_L1;}
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __Pyx_Raise(__pyx_5, 0, 0);
+    Py_DECREF(__pyx_5); __pyx_5 = 0;
+    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 118; goto __pyx_L1;}
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:121 */
   Py_INCREF(__pyx_v_ret);
   __pyx_r = __pyx_v_ret;
   goto __pyx_L0;
@@ -1653,9 +1799,10 @@ static PyObject *__pyx_f_12spidermonkey_7Context_unbind(PyObject *__pyx_v_self,
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1:;
-  Py_XDECREF(__pyx_1);
   Py_XDECREF(__pyx_2);
   Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
+  Py_XDECREF(__pyx_5);
   __Pyx_AddTraceback(&quot;spidermonkey.Context.unbind&quot;);
   __pyx_r = 0;
   __pyx_L0:;
@@ -1670,83 +1817,85 @@ static char __pyx_doc_12spidermonkey_7Context_execute[] = &quot;        Execute JavaS
 static PyObject *__pyx_f_12spidermonkey_7Context_execute(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_script = 0;
   __pyx_t_12spidermonkey_jsval __pyx_v_rval;
+  struct JSString *__pyx_v_converted;
+  __pyx_t_12spidermonkey_jschar *__pyx_v_data;
+  __pyx_t_12spidermonkey_size_t __pyx_v_length;
   PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
+  int __pyx_1;
   PyObject *__pyx_2 = 0;
-  int __pyx_3;
-  int __pyx_4;
-  char *__pyx_5;
-  Py_ssize_t __pyx_6;
-  PyObject *__pyx_7 = 0;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
   static char *__pyx_argnames[] = {&quot;script&quot;,0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;O&quot;, __pyx_argnames, &amp;__pyx_v_script)) return 0;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_script);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:107 */
-  /*try:*/ {
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:132 */
+  __pyx_v_converted = __pyx_f_12spidermonkey_py2js_jsstring(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,__pyx_v_script);
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:108 */
-    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 108; goto __pyx_L3;}
-    __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_StringTypes); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 108; goto __pyx_L3;}
-    Py_DECREF(__pyx_1); __pyx_1 = 0;
-    __pyx_3 = PyObject_IsInstance(__pyx_v_script,__pyx_2); if (__pyx_3 == -1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 108; goto __pyx_L3;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:133 */
+  __pyx_1 = (__pyx_v_converted == NULL);
+  if (__pyx_1) {
+    __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 134; goto __pyx_L1;}
+    Py_INCREF(__pyx_k39p);
+    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k39p);
+    __pyx_3 = PyObject_CallObject(PyExc_TypeError, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 134; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_4 = (!__pyx_3);
-    if (__pyx_4) {
-      __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 109; goto __pyx_L3;}
-      Py_INCREF(__pyx_k38p);
-      PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k38p);
-      __pyx_2 = PyObject_CallObject(PyExc_TypeError, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 109; goto __pyx_L3;}
-      Py_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_Raise(__pyx_2, 0, 0);
-      Py_DECREF(__pyx_2); __pyx_2 = 0;
-      {__pyx_filename = __pyx_f[4]; __pyx_lineno = 109; goto __pyx_L3;}
-      goto __pyx_L5;
-    }
-    __pyx_L5:;
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[4]; __pyx_lineno = 134; goto __pyx_L1;}
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:136 */
+  __pyx_v_data = JS_GetStringChars(__pyx_v_converted);
+
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:137 */
+  __pyx_v_length = JS_GetStringLength(__pyx_v_converted);
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:111 */
-    __pyx_5 = PyString_AsString(__pyx_v_script); if (!__pyx_5) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 111; goto __pyx_L3;}
-    __pyx_6 = PyObject_Length(__pyx_v_script); if (__pyx_6 == -1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 111; goto __pyx_L3;}
-    __pyx_3 = (!JS_EvaluateScript(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj,__pyx_5,__pyx_6,__pyx_k39,0,(&amp;__pyx_v_rval)));
-    if (__pyx_3) {
-      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 112; goto __pyx_L3;}
-      __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 112; goto __pyx_L3;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:139 */
+  /*try:*/ {
+
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:140 */
+    __pyx_1 = (!JS_EvaluateUCScript(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;cx,((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;root-&gt;js_obj,__pyx_v_data,__pyx_v_length,__pyx_k40,0,(&amp;__pyx_v_rval)));
+    if (__pyx_1) {
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 141; goto __pyx_L4;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 141; goto __pyx_L4;}
       Py_INCREF(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;error);
-      PyTuple_SET_ITEM(__pyx_2, 0, ((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;error);
-      __pyx_7 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_7) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 112; goto __pyx_L3;}
-      Py_DECREF(__pyx_1); __pyx_1 = 0;
+      PyTuple_SET_ITEM(__pyx_3, 0, ((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;error);
+      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 141; goto __pyx_L4;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
-      __Pyx_Raise(__pyx_7, 0, 0);
-      Py_DECREF(__pyx_7); __pyx_7 = 0;
-      {__pyx_filename = __pyx_f[4]; __pyx_lineno = 112; goto __pyx_L3;}
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      __Pyx_Raise(__pyx_4, 0, 0);
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      {__pyx_filename = __pyx_f[4]; __pyx_lineno = 141; goto __pyx_L4;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:114 */
-    __pyx_1 = __pyx_f_12spidermonkey_js2py(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self),__pyx_v_rval); if (!__pyx_1) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 114; goto __pyx_L3;}
-    __pyx_r = __pyx_1;
-    __pyx_1 = 0;
-    goto __pyx_L2;
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jscontext.pxi&quot;:142 */
+    __pyx_2 = __pyx_f_12spidermonkey_js2py(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self),__pyx_v_rval); if (!__pyx_2) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 142; goto __pyx_L4;}
+    __pyx_r = __pyx_2;
+    __pyx_2 = 0;
+    goto __pyx_L3;
   }
   /*finally:*/ {
     int __pyx_why;
     PyObject *__pyx_exc_type, *__pyx_exc_value, *__pyx_exc_tb;
     int __pyx_exc_lineno;
-    __pyx_why = 0; goto __pyx_L4;
-    __pyx_L2: __pyx_why = 3; goto __pyx_L4;
-    __pyx_L3: {
+    __pyx_why = 0; goto __pyx_L5;
+    __pyx_L3: __pyx_why = 3; goto __pyx_L5;
+    __pyx_L4: {
       __pyx_why = 4;
+      Py_XDECREF(__pyx_3); __pyx_3 = 0;
+      Py_XDECREF(__pyx_4); __pyx_4 = 0;
       Py_XDECREF(__pyx_2); __pyx_2 = 0;
-      Py_XDECREF(__pyx_7); __pyx_7 = 0;
-      Py_XDECREF(__pyx_1); __pyx_1 = 0;
       PyErr_Fetch(&amp;__pyx_exc_type, &amp;__pyx_exc_value, &amp;__pyx_exc_tb);
       __pyx_exc_lineno = __pyx_lineno;
-      goto __pyx_L4;
+      goto __pyx_L5;
     }
-    __pyx_L4:;
+    __pyx_L5:;
     ((struct __pyx_vtabstruct_12spidermonkey_GC *)((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;gc-&gt;__pyx_vtab)-&gt;run_maybe(((struct __pyx_obj_12spidermonkey_Context *)__pyx_v_self)-&gt;gc);
     switch (__pyx_why) {
       case 3: goto __pyx_L0;
@@ -1764,9 +1913,9 @@ static PyObject *__pyx_f_12spidermonkey_7Context_execute(PyObject *__pyx_v_self,
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1:;
-  Py_XDECREF(__pyx_1);
   Py_XDECREF(__pyx_2);
-  Py_XDECREF(__pyx_7);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
   __Pyx_AddTraceback(&quot;spidermonkey.Context.execute&quot;);
   __pyx_r = 0;
   __pyx_L0:;
@@ -1823,8 +1972,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___constructor_callba
     if (__pyx_1) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 11; goto __pyx_L2;}
       __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 11; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
       __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 11; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -1843,8 +1992,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___constructor_callba
     if (__pyx_1) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 15; goto __pyx_L2;}
       __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 15; goto __pyx_L2;}
-      Py_INCREF(__pyx_k41p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
+      Py_INCREF(__pyx_k42p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k42p);
       __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 15; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -1860,8 +2009,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___constructor_callba
     if (__pyx_1) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 18; goto __pyx_L2;}
       __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 18; goto __pyx_L2;}
-      Py_INCREF(__pyx_k42p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k42p);
+      Py_INCREF(__pyx_k43p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k43p);
       __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 18; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -1906,7 +2055,15 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___constructor_callba
     }
 
     /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:27 */
-    __pyx_1 = PyObject_HasAttr(__pyx_v_adapter-&gt;py_class,__pyx_n___jsinit__); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 27; goto __pyx_L2;}
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_unicode); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 27; goto __pyx_L2;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 27; goto __pyx_L2;}
+    Py_INCREF(__pyx_n___jsinit__);
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_n___jsinit__);
+    __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 27; goto __pyx_L2;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __pyx_1 = PyObject_HasAttr(__pyx_v_adapter-&gt;py_class,__pyx_3); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 27; goto __pyx_L2;}
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
     if (__pyx_1) {
       __pyx_2 = PyObject_GetAttr(__pyx_v_adapter-&gt;py_class, __pyx_n___jsinit__); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 28; goto __pyx_L2;}
       __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 28; goto __pyx_L2;}
@@ -2037,8 +2194,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___resolve_global_cal
     if (__pyx_1) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; goto __pyx_L2;}
       __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
       __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 54; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -2087,7 +2244,7 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___resolve_global_cal
 
     /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:65 */
     __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; goto __pyx_L2;}
-    __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_StringTypes); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; goto __pyx_L2;}
+    __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_UnicodeType); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; goto __pyx_L2;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_3); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; goto __pyx_L2;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -2095,14 +2252,14 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___resolve_global_cal
       __pyx_1 = PyObject_HasAttr(__pyx_v_py_obj,__pyx_v_key); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 65; goto __pyx_L2;}
     }
     if (__pyx_1) {
-      __pyx_4 = PyObject_GetAttr(((PyObject *)__pyx_v_pycx), __pyx_n_bind); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 68; goto __pyx_L2;}
-      __pyx_2 = PyObject_GetAttr(__pyx_v_py_obj,__pyx_v_key); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 68; goto __pyx_L2;}
-      __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 68; goto __pyx_L2;}
+      __pyx_4 = PyObject_GetAttr(((PyObject *)__pyx_v_pycx), __pyx_n_bind); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; goto __pyx_L2;}
+      __pyx_2 = PyObject_GetAttr(__pyx_v_py_obj,__pyx_v_key); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; goto __pyx_L2;}
       Py_INCREF(__pyx_v_key);
       PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_key);
       PyTuple_SET_ITEM(__pyx_3, 1, __pyx_2);
       __pyx_2 = 0;
-      __pyx_2 = PyObject_CallObject(__pyx_4, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 68; goto __pyx_L2;}
+      __pyx_2 = PyObject_CallObject(__pyx_4, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 66; goto __pyx_L2;}
       Py_DECREF(__pyx_4); __pyx_4 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       Py_DECREF(__pyx_2); __pyx_2 = 0;
@@ -2110,7 +2267,7 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___resolve_global_cal
     }
     __pyx_L6:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:70 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:68 */
     __pyx_r = JS_TRUE;
     goto __pyx_L0;
   }
@@ -2120,20 +2277,20 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___resolve_global_cal
   Py_XDECREF(__pyx_3); __pyx_3 = 0;
   Py_XDECREF(__pyx_2); __pyx_2 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:71 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:69 */
   /*except:*/ {
     __Pyx_AddTraceback(&quot;spidermonkey.__resolve_global_callback__&quot;);
-    if (__Pyx_GetException(&amp;__pyx_4, &amp;__pyx_3, &amp;__pyx_2) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 71; goto __pyx_L1;}
+    if (__Pyx_GetException(&amp;__pyx_4, &amp;__pyx_3, &amp;__pyx_2) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 69; goto __pyx_L1;}
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:72 */
-    __pyx_5 = __Pyx_GetName(__pyx_m, __pyx_n_traceback); if (!__pyx_5) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 72; goto __pyx_L1;}
-    __pyx_6 = PyObject_GetAttr(__pyx_5, __pyx_n_print_exc); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 72; goto __pyx_L1;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:70 */
+    __pyx_5 = __Pyx_GetName(__pyx_m, __pyx_n_traceback); if (!__pyx_5) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 70; goto __pyx_L1;}
+    __pyx_6 = PyObject_GetAttr(__pyx_5, __pyx_n_print_exc); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 70; goto __pyx_L1;}
     Py_DECREF(__pyx_5); __pyx_5 = 0;
-    __pyx_5 = PyObject_CallObject(__pyx_6, 0); if (!__pyx_5) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 72; goto __pyx_L1;}
+    __pyx_5 = PyObject_CallObject(__pyx_6, 0); if (!__pyx_5) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 70; goto __pyx_L1;}
     Py_DECREF(__pyx_6); __pyx_6 = 0;
     Py_DECREF(__pyx_5); __pyx_5 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:73 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:71 */
     __pyx_r = __pyx_f_12spidermonkey_report_python_error(__pyx_v_cx);
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -2184,40 +2341,40 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___get_property_callb
   __pyx_v_key = Py_None; Py_INCREF(Py_None);
   __pyx_v_attr = Py_None; Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:82 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:81 */
   /*try:*/ {
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:83 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:82 */
     __pyx_1 = (!js_context_has_data(__pyx_v_cx));
     if (__pyx_1) {
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 84; goto __pyx_L2;}
-      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 84; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
-      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 84; goto __pyx_L2;}
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; goto __pyx_L2;}
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
+      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       __Pyx_Raise(__pyx_4, 0, 0);
       Py_DECREF(__pyx_4); __pyx_4 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 84; goto __pyx_L2;}
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 83; goto __pyx_L2;}
       goto __pyx_L4;
     }
     __pyx_L4:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:86 */
-    __pyx_2 = js_context_fetch(__pyx_v_cx); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; goto __pyx_L2;}
-    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_Context)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:85 */
+    __pyx_2 = js_context_fetch(__pyx_v_cx); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 85; goto __pyx_L2;}
+    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_Context)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 85; goto __pyx_L2;}
     Py_DECREF(((PyObject *)__pyx_v_pycx));
     __pyx_v_pycx = ((struct __pyx_obj_12spidermonkey_Context *)__pyx_2);
     __pyx_2 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:87 */
-    __pyx_3 = __pyx_f_12spidermonkey_js2py(__pyx_v_pycx,__pyx_v_jsv); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 87; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:86 */
+    __pyx_3 = __pyx_f_12spidermonkey_js2py(__pyx_v_pycx,__pyx_v_jsv); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 86; goto __pyx_L2;}
     Py_DECREF(__pyx_v_key);
     __pyx_v_key = __pyx_3;
     __pyx_3 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:89 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:88 */
     __pyx_1 = (!js_object_has_data(__pyx_v_cx,__pyx_v_js_obj));
     if (__pyx_1) {
       __pyx_r = JS_TRUE;
@@ -2226,41 +2383,41 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___get_property_callb
     }
     __pyx_L5:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:92 */
-    __pyx_4 = js_object_fetch(__pyx_v_cx,__pyx_v_js_obj); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 92; goto __pyx_L2;}
-    if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_12spidermonkey_ObjectAdapter)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 92; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:91 */
+    __pyx_4 = js_object_fetch(__pyx_v_cx,__pyx_v_js_obj); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 91; goto __pyx_L2;}
+    if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_12spidermonkey_ObjectAdapter)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 91; goto __pyx_L2;}
     Py_DECREF(((PyObject *)__pyx_v_adapter));
     __pyx_v_adapter = ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)__pyx_4);
     __pyx_4 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:93 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:92 */
     Py_INCREF(__pyx_v_adapter-&gt;py_obj);
     Py_DECREF(__pyx_v_py_obj);
     __pyx_v_py_obj = __pyx_v_adapter-&gt;py_obj;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:95 */
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 95; goto __pyx_L2;}
-    __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_IntType); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 95; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:94 */
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 94; goto __pyx_L2;}
+    __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_IntType); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 94; goto __pyx_L2;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 95; goto __pyx_L2;}
-    __pyx_2 = PyObject_GetAttr(__pyx_4, __pyx_n_LongType); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 95; goto __pyx_L2;}
+    __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 94; goto __pyx_L2;}
+    __pyx_2 = PyObject_GetAttr(__pyx_4, __pyx_n_LongType); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 94; goto __pyx_L2;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 95; goto __pyx_L2;}
+    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 94; goto __pyx_L2;}
     PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
     PyTuple_SET_ITEM(__pyx_4, 1, __pyx_2);
     __pyx_3 = 0;
     __pyx_2 = 0;
-    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_4); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 95; goto __pyx_L2;}
+    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_4); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 94; goto __pyx_L2;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     if (__pyx_1) {
       /*try:*/ {
-        __pyx_3 = PyObject_GetItem(__pyx_v_py_obj, __pyx_v_key); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 97; goto __pyx_L7;}
+        __pyx_3 = PyObject_GetItem(__pyx_v_py_obj, __pyx_v_key); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 96; goto __pyx_L7;}
         Py_DECREF(__pyx_v_attr);
         __pyx_v_attr = __pyx_3;
         __pyx_3 = 0;
       }
       /*else:*/ {
-        __pyx_5 = __pyx_f_12spidermonkey_py2js(__pyx_v_pycx,__pyx_v_attr,NULL); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 101; goto __pyx_L2;}
+        __pyx_5 = __pyx_f_12spidermonkey_py2js(__pyx_v_pycx,__pyx_v_attr,NULL); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 100; goto __pyx_L2;}
         (__pyx_v_rval[0]) = __pyx_5;
       }
       goto __pyx_L8;
@@ -2269,10 +2426,10 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___get_property_callb
       Py_XDECREF(__pyx_4); __pyx_4 = 0;
       Py_XDECREF(__pyx_3); __pyx_3 = 0;
 
-      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:98 */
+      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:97 */
       /*except:*/ {
         __Pyx_AddTraceback(&quot;spidermonkey.__get_property_callback__&quot;);
-        if (__Pyx_GetException(&amp;__pyx_2, &amp;__pyx_4, &amp;__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 98; goto __pyx_L2;}
+        if (__Pyx_GetException(&amp;__pyx_2, &amp;__pyx_4, &amp;__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 97; goto __pyx_L2;}
         Py_DECREF(__pyx_2); __pyx_2 = 0;
         Py_DECREF(__pyx_4); __pyx_4 = 0;
         Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -2281,40 +2438,49 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___get_property_callb
       __pyx_L8:;
       goto __pyx_L6;
     }
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
-    __pyx_4 = PyObject_GetAttr(__pyx_2, __pyx_n_StringTypes); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 101; goto __pyx_L2;}
+    __pyx_4 = PyObject_GetAttr(__pyx_2, __pyx_n_UnicodeType); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 101; goto __pyx_L2;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_4); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
+    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_4); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 101; goto __pyx_L2;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     if (__pyx_1) {
-      __pyx_3 = PySequence_GetSlice(__pyx_v_key, 0, 1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 103; goto __pyx_L2;}
-      if (PyObject_Cmp(__pyx_3, __pyx_n__, &amp;__pyx_1) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 103; goto __pyx_L2;}
+      __pyx_3 = PySequence_GetSlice(__pyx_v_key, 0, 1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
+      __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_unicode); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
+      __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
+      Py_INCREF(__pyx_n__);
+      PyTuple_SET_ITEM(__pyx_4, 0, __pyx_n__);
+      __pyx_6 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      if (PyObject_Cmp(__pyx_3, __pyx_6, &amp;__pyx_1) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 102; goto __pyx_L2;}
       __pyx_1 = __pyx_1 != 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
+      Py_DECREF(__pyx_6); __pyx_6 = 0;
       if (__pyx_1) {
         /*try:*/ {
-          __pyx_2 = PyObject_GetAttr(__pyx_v_py_obj,__pyx_v_key); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 105; goto __pyx_L10;}
+          __pyx_2 = PyObject_GetAttr(__pyx_v_py_obj,__pyx_v_key); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 104; goto __pyx_L10;}
           Py_DECREF(__pyx_v_attr);
           __pyx_v_attr = __pyx_2;
           __pyx_2 = 0;
         }
         /*else:*/ {
-          __pyx_5 = __pyx_f_12spidermonkey_py2js(__pyx_v_pycx,__pyx_v_attr,__pyx_v_js_obj); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 109; goto __pyx_L2;}
+          __pyx_5 = __pyx_f_12spidermonkey_py2js(__pyx_v_pycx,__pyx_v_attr,__pyx_v_js_obj); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 108; goto __pyx_L2;}
           (__pyx_v_rval[0]) = __pyx_5;
         }
         goto __pyx_L11;
         __pyx_L10:;
         Py_XDECREF(__pyx_4); __pyx_4 = 0;
         Py_XDECREF(__pyx_3); __pyx_3 = 0;
+        Py_XDECREF(__pyx_6); __pyx_6 = 0;
         Py_XDECREF(__pyx_2); __pyx_2 = 0;
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:106 */
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:105 */
         /*except:*/ {
           __Pyx_AddTraceback(&quot;spidermonkey.__get_property_callback__&quot;);
-          if (__Pyx_GetException(&amp;__pyx_4, &amp;__pyx_3, &amp;__pyx_2) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 106; goto __pyx_L2;}
+          if (__Pyx_GetException(&amp;__pyx_4, &amp;__pyx_3, &amp;__pyx_6) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 105; goto __pyx_L2;}
           Py_DECREF(__pyx_4); __pyx_4 = 0;
           Py_DECREF(__pyx_3); __pyx_3 = 0;
-          Py_DECREF(__pyx_2); __pyx_2 = 0;
+          Py_DECREF(__pyx_6); __pyx_6 = 0;
           goto __pyx_L11;
         }
         __pyx_L11:;
@@ -2325,57 +2491,58 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___get_property_callb
     }
     __pyx_1 = __pyx_v_key == Py_None;
     if (__pyx_1) {
-      __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_JS_VOID); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 111; goto __pyx_L2;}
-      __pyx_5 = PyInt_AsLong(__pyx_4); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 111; goto __pyx_L2;}
-      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_JS_VOID); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 110; goto __pyx_L2;}
+      __pyx_5 = PyInt_AsLong(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 110; goto __pyx_L2;}
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
       (__pyx_v_rval[0]) = __pyx_5;
       goto __pyx_L6;
     }
     /*else*/ {
-      __pyx_3 = PyNumber_Remainder(__pyx_k48p, __pyx_v_key); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 113; goto __pyx_L2;}
-      __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 113; goto __pyx_L2;}
-      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_3);
-      __pyx_3 = 0;
-      __pyx_4 = PyObject_CallObject(PyExc_AssertionError, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 113; goto __pyx_L2;}
-      Py_DECREF(__pyx_2); __pyx_2 = 0;
-      __Pyx_Raise(__pyx_4, 0, 0);
-      Py_DECREF(__pyx_4); __pyx_4 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 113; goto __pyx_L2;}
+      __pyx_4 = PyNumber_Remainder(__pyx_k50p, __pyx_v_key); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 112; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 112; goto __pyx_L2;}
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_4);
+      __pyx_4 = 0;
+      __pyx_6 = PyObject_CallObject(PyExc_AssertionError, __pyx_3); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 112; goto __pyx_L2;}
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      __Pyx_Raise(__pyx_6, 0, 0);
+      Py_DECREF(__pyx_6); __pyx_6 = 0;
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 112; goto __pyx_L2;}
     }
     __pyx_L6:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:115 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:114 */
     __pyx_r = JS_TRUE;
     goto __pyx_L0;
   }
   goto __pyx_L3;
   __pyx_L2:;
-  Py_XDECREF(__pyx_3); __pyx_3 = 0;
   Py_XDECREF(__pyx_2); __pyx_2 = 0;
   Py_XDECREF(__pyx_4); __pyx_4 = 0;
+  Py_XDECREF(__pyx_3); __pyx_3 = 0;
+  Py_XDECREF(__pyx_6); __pyx_6 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:116 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:115 */
   /*except:*/ {
     __Pyx_AddTraceback(&quot;spidermonkey.__get_property_callback__&quot;);
-    if (__Pyx_GetException(&amp;__pyx_3, &amp;__pyx_2, &amp;__pyx_4) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 116; goto __pyx_L1;}
+    if (__Pyx_GetException(&amp;__pyx_2, &amp;__pyx_4, &amp;__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 115; goto __pyx_L1;}
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:117 */
-    __pyx_6 = __Pyx_GetName(__pyx_m, __pyx_n_traceback); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 117; goto __pyx_L1;}
-    __pyx_7 = PyObject_GetAttr(__pyx_6, __pyx_n_print_exc); if (!__pyx_7) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 117; goto __pyx_L1;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:116 */
+    __pyx_6 = __Pyx_GetName(__pyx_m, __pyx_n_traceback); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 116; goto __pyx_L1;}
+    __pyx_7 = PyObject_GetAttr(__pyx_6, __pyx_n_print_exc); if (!__pyx_7) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 116; goto __pyx_L1;}
     Py_DECREF(__pyx_6); __pyx_6 = 0;
-    __pyx_6 = PyObject_CallObject(__pyx_7, 0); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 117; goto __pyx_L1;}
+    __pyx_6 = PyObject_CallObject(__pyx_7, 0); if (!__pyx_6) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 116; goto __pyx_L1;}
     Py_DECREF(__pyx_7); __pyx_7 = 0;
     Py_DECREF(__pyx_6); __pyx_6 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:118 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:117 */
     __pyx_r = __pyx_f_12spidermonkey_report_python_error(__pyx_v_cx);
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     goto __pyx_L0;
-    Py_DECREF(__pyx_3); __pyx_3 = 0;
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_4); __pyx_4 = 0;
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
     goto __pyx_L3;
   }
   __pyx_L3:;
@@ -2411,9 +2578,9 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___set_property_callb
   PyObject *__pyx_2 = 0;
   PyObject *__pyx_3 = 0;
   PyObject *__pyx_4 = 0;
-  int __pyx_5;
+  PyObject *__pyx_5 = 0;
   int __pyx_6;
-  PyObject *__pyx_7 = 0;
+  int __pyx_7;
   PyObject *__pyx_8 = 0;
   __pyx_v_pycx = ((struct __pyx_obj_12spidermonkey_Context *)Py_None); Py_INCREF(Py_None);
   __pyx_v_adapter = ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)Py_None); Py_INCREF(Py_None);
@@ -2422,46 +2589,46 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___set_property_callb
   __pyx_v_value = Py_None; Py_INCREF(Py_None);
   __pyx_v_attr = Py_None; Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:127 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:126 */
   /*try:*/ {
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:128 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:127 */
     __pyx_1 = (!js_context_has_data(__pyx_v_cx));
     if (__pyx_1) {
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 129; goto __pyx_L2;}
-      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 129; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
-      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 129; goto __pyx_L2;}
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 128; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 128; goto __pyx_L2;}
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
+      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 128; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       __Pyx_Raise(__pyx_4, 0, 0);
       Py_DECREF(__pyx_4); __pyx_4 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 129; goto __pyx_L2;}
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 128; goto __pyx_L2;}
       goto __pyx_L4;
     }
     __pyx_L4:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:131 */
-    __pyx_2 = js_context_fetch(__pyx_v_cx); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 131; goto __pyx_L2;}
-    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_Context)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 131; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:130 */
+    __pyx_2 = js_context_fetch(__pyx_v_cx); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 130; goto __pyx_L2;}
+    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_Context)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 130; goto __pyx_L2;}
     Py_DECREF(((PyObject *)__pyx_v_pycx));
     __pyx_v_pycx = ((struct __pyx_obj_12spidermonkey_Context *)__pyx_2);
     __pyx_2 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:132 */
-    __pyx_3 = __pyx_f_12spidermonkey_js2py(__pyx_v_pycx,__pyx_v_jsv); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 132; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:131 */
+    __pyx_3 = __pyx_f_12spidermonkey_js2py(__pyx_v_pycx,__pyx_v_jsv); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 131; goto __pyx_L2;}
     Py_DECREF(__pyx_v_key);
     __pyx_v_key = __pyx_3;
     __pyx_3 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:133 */
-    __pyx_4 = __pyx_f_12spidermonkey_js2py(__pyx_v_pycx,(__pyx_v_rval[0])); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 133; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:132 */
+    __pyx_4 = __pyx_f_12spidermonkey_js2py(__pyx_v_pycx,(__pyx_v_rval[0])); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 132; goto __pyx_L2;}
     Py_DECREF(__pyx_v_value);
     __pyx_v_value = __pyx_4;
     __pyx_4 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:135 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:134 */
     __pyx_1 = (!js_object_has_data(__pyx_v_cx,__pyx_v_js_obj));
     if (__pyx_1) {
       __pyx_r = JS_TRUE;
@@ -2470,70 +2637,78 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___set_property_callb
     }
     __pyx_L5:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:138 */
-    __pyx_2 = js_object_fetch(__pyx_v_cx,__pyx_v_js_obj); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 138; goto __pyx_L2;}
-    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_ObjectAdapter)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 138; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:137 */
+    __pyx_2 = js_object_fetch(__pyx_v_cx,__pyx_v_js_obj); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 137; goto __pyx_L2;}
+    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_ObjectAdapter)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 137; goto __pyx_L2;}
     Py_DECREF(((PyObject *)__pyx_v_adapter));
     __pyx_v_adapter = ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)__pyx_2);
     __pyx_2 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:139 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:138 */
     Py_INCREF(__pyx_v_adapter-&gt;py_obj);
     Py_DECREF(__pyx_v_py_obj);
     __pyx_v_py_obj = __pyx_v_adapter-&gt;py_obj;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:141 */
-    __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
-    __pyx_4 = PyObject_GetAttr(__pyx_3, __pyx_n_IntType); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:140 */
+    __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 140; goto __pyx_L2;}
+    __pyx_4 = PyObject_GetAttr(__pyx_3, __pyx_n_IntType); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 140; goto __pyx_L2;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
-    __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_LongType); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 140; goto __pyx_L2;}
+    __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_LongType); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 140; goto __pyx_L2;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
+    __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 140; goto __pyx_L2;}
     PyTuple_SET_ITEM(__pyx_2, 0, __pyx_4);
     PyTuple_SET_ITEM(__pyx_2, 1, __pyx_3);
     __pyx_4 = 0;
     __pyx_3 = 0;
-    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_2); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
+    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_2); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 140; goto __pyx_L2;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     if (__pyx_1) {
-      if (PyObject_SetItem(__pyx_v_py_obj, __pyx_v_key, __pyx_v_value) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 142; goto __pyx_L2;}
+      if (PyObject_SetItem(__pyx_v_py_obj, __pyx_v_key, __pyx_v_value) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 141; goto __pyx_L2;}
       goto __pyx_L6;
     }
-    __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
-    __pyx_3 = PyObject_GetAttr(__pyx_4, __pyx_n_StringTypes); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
+    __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 142; goto __pyx_L2;}
+    __pyx_3 = PyObject_GetAttr(__pyx_4, __pyx_n_UnicodeType); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 142; goto __pyx_L2;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_3); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
+    __pyx_1 = PyObject_IsInstance(__pyx_v_key,__pyx_3); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 142; goto __pyx_L2;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     if (__pyx_1) {
-      __pyx_2 = PySequence_GetSlice(__pyx_v_key, 0, 1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 144; goto __pyx_L2;}
-      if (PyObject_Cmp(__pyx_2, __pyx_n__, &amp;__pyx_1) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 144; goto __pyx_L2;}
+      __pyx_2 = PySequence_GetSlice(__pyx_v_key, 0, 1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
+      __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_unicode); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
+      Py_INCREF(__pyx_n__);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_n__);
+      __pyx_5 = PyObject_CallObject(__pyx_4, __pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      if (PyObject_Cmp(__pyx_2, __pyx_5, &amp;__pyx_1) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
       __pyx_1 = __pyx_1 != 0;
       Py_DECREF(__pyx_2); __pyx_2 = 0;
+      Py_DECREF(__pyx_5); __pyx_5 = 0;
       if (__pyx_1) {
-        __pyx_1 = PyObject_HasAttr(__pyx_v_py_obj,__pyx_v_key); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 144; goto __pyx_L2;}
+        __pyx_1 = PyObject_HasAttr(__pyx_v_py_obj,__pyx_v_key); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 143; goto __pyx_L2;}
       }
       if (__pyx_1) {
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:145 */
-        __pyx_4 = PyObject_GetAttr(__pyx_v_py_obj,__pyx_v_key); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 145; goto __pyx_L2;}
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:144 */
+        __pyx_4 = PyObject_GetAttr(__pyx_v_py_obj,__pyx_v_key); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 144; goto __pyx_L2;}
         Py_DECREF(__pyx_v_attr);
         __pyx_v_attr = __pyx_4;
         __pyx_4 = 0;
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:146 */
-        __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_callable); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 146; goto __pyx_L2;}
-        __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 146; goto __pyx_L2;}
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:145 */
+        __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_callable); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 145; goto __pyx_L2;}
+        __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 145; goto __pyx_L2;}
         Py_INCREF(__pyx_v_attr);
         PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_attr);
-        __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 146; goto __pyx_L2;}
+        __pyx_5 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_5) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 145; goto __pyx_L2;}
         Py_DECREF(__pyx_3); __pyx_3 = 0;
         Py_DECREF(__pyx_2); __pyx_2 = 0;
-        __pyx_1 = PyObject_IsTrue(__pyx_4); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 146; goto __pyx_L2;}
-        Py_DECREF(__pyx_4); __pyx_4 = 0;
-        __pyx_5 = (!__pyx_1);
-        if (__pyx_5) {
-          __pyx_6 = PyObject_SetAttr(__pyx_v_py_obj,__pyx_v_key,__pyx_v_value); if (__pyx_6 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 147; goto __pyx_L2;}
+        __pyx_1 = PyObject_IsTrue(__pyx_5); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 145; goto __pyx_L2;}
+        Py_DECREF(__pyx_5); __pyx_5 = 0;
+        __pyx_6 = (!__pyx_1);
+        if (__pyx_6) {
+          __pyx_7 = PyObject_SetAttr(__pyx_v_py_obj,__pyx_v_key,__pyx_v_value); if (__pyx_7 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 146; goto __pyx_L2;}
           goto __pyx_L8;
         }
         __pyx_L8:;
@@ -2543,50 +2718,51 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___set_property_callb
       goto __pyx_L6;
     }
     /*else*/ {
-      __pyx_3 = PyNumber_Remainder(__pyx_k48p, __pyx_v_key); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 149; goto __pyx_L2;}
-      __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 149; goto __pyx_L2;}
-      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_3);
-      __pyx_3 = 0;
-      __pyx_4 = PyObject_CallObject(PyExc_AssertionError, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 149; goto __pyx_L2;}
+      __pyx_4 = PyNumber_Remainder(__pyx_k50p, __pyx_v_key); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 148; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 148; goto __pyx_L2;}
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_4);
+      __pyx_4 = 0;
+      __pyx_2 = PyObject_CallObject(PyExc_AssertionError, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 148; goto __pyx_L2;}
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      __Pyx_Raise(__pyx_2, 0, 0);
       Py_DECREF(__pyx_2); __pyx_2 = 0;
-      __Pyx_Raise(__pyx_4, 0, 0);
-      Py_DECREF(__pyx_4); __pyx_4 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 149; goto __pyx_L2;}
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 148; goto __pyx_L2;}
     }
     __pyx_L6:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:151 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:150 */
     __pyx_r = JS_TRUE;
     goto __pyx_L0;
   }
   goto __pyx_L3;
   __pyx_L2:;
+  Py_XDECREF(__pyx_5); __pyx_5 = 0;
+  Py_XDECREF(__pyx_4); __pyx_4 = 0;
   Py_XDECREF(__pyx_3); __pyx_3 = 0;
   Py_XDECREF(__pyx_2); __pyx_2 = 0;
-  Py_XDECREF(__pyx_4); __pyx_4 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:152 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:151 */
   /*except:*/ {
     __Pyx_AddTraceback(&quot;spidermonkey.__set_property_callback__&quot;);
-    if (__Pyx_GetException(&amp;__pyx_3, &amp;__pyx_2, &amp;__pyx_4) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 152; goto __pyx_L1;}
+    if (__Pyx_GetException(&amp;__pyx_5, &amp;__pyx_4, &amp;__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 151; goto __pyx_L1;}
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:153 */
-    __pyx_7 = __Pyx_GetName(__pyx_m, __pyx_n_traceback); if (!__pyx_7) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 153; goto __pyx_L1;}
-    __pyx_8 = PyObject_GetAttr(__pyx_7, __pyx_n_print_exc); if (!__pyx_8) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 153; goto __pyx_L1;}
-    Py_DECREF(__pyx_7); __pyx_7 = 0;
-    __pyx_7 = PyObject_CallObject(__pyx_8, 0); if (!__pyx_7) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 153; goto __pyx_L1;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:152 */
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_traceback); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 152; goto __pyx_L1;}
+    __pyx_8 = PyObject_GetAttr(__pyx_2, __pyx_n_print_exc); if (!__pyx_8) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 152; goto __pyx_L1;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    __pyx_2 = PyObject_CallObject(__pyx_8, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 152; goto __pyx_L1;}
     Py_DECREF(__pyx_8); __pyx_8 = 0;
-    Py_DECREF(__pyx_7); __pyx_7 = 0;
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:154 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:153 */
     __pyx_r = __pyx_f_12spidermonkey_report_python_error(__pyx_v_cx);
-    Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     Py_DECREF(__pyx_4); __pyx_4 = 0;
+    Py_DECREF(__pyx_5); __pyx_5 = 0;
     goto __pyx_L0;
-    Py_DECREF(__pyx_3); __pyx_3 = 0;
-    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    Py_DECREF(__pyx_5); __pyx_5 = 0;
     Py_DECREF(__pyx_4); __pyx_4 = 0;
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
     goto __pyx_L3;
   }
   __pyx_L3:;
@@ -2597,7 +2773,7 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___set_property_callb
   Py_XDECREF(__pyx_2);
   Py_XDECREF(__pyx_3);
   Py_XDECREF(__pyx_4);
-  Py_XDECREF(__pyx_7);
+  Py_XDECREF(__pyx_5);
   Py_XDECREF(__pyx_8);
   __Pyx_WriteUnraisable(&quot;spidermonkey.__set_property_callback__&quot;);
   __pyx_r = 0;
@@ -2621,53 +2797,53 @@ static void __pyx_f_12spidermonkey___finalize_callback__(struct JSContext *__pyx
   __pyx_v_pycx = ((struct __pyx_obj_12spidermonkey_Context *)Py_None); Py_INCREF(Py_None);
   __pyx_v_py_obj = ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)Py_None); Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:161 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:160 */
   /*try:*/ {
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:162 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:161 */
     __pyx_1 = (!js_context_has_data(__pyx_v_cx));
     if (__pyx_1) {
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 163; goto __pyx_L2;}
-      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 163; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
-      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 163; goto __pyx_L2;}
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 162; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 162; goto __pyx_L2;}
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
+      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 162; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       __Pyx_Raise(__pyx_4, 0, 0);
       Py_DECREF(__pyx_4); __pyx_4 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 163; goto __pyx_L2;}
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 162; goto __pyx_L2;}
       goto __pyx_L4;
     }
     __pyx_L4:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:165 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:164 */
     __pyx_1 = (!js_object_has_data(__pyx_v_cx,__pyx_v_js_obj));
     if (__pyx_1) {
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 166; goto __pyx_L2;}
-      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 166; goto __pyx_L2;}
-      Py_INCREF(__pyx_k50p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k50p);
-      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 166; goto __pyx_L2;}
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 165; goto __pyx_L2;}
+      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 165; goto __pyx_L2;}
+      Py_INCREF(__pyx_k52p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k52p);
+      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 165; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       __Pyx_Raise(__pyx_4, 0, 0);
       Py_DECREF(__pyx_4); __pyx_4 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 166; goto __pyx_L2;}
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 165; goto __pyx_L2;}
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:168 */
-    __pyx_2 = js_context_fetch(__pyx_v_cx); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 168; goto __pyx_L2;}
-    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_Context)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 168; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:167 */
+    __pyx_2 = js_context_fetch(__pyx_v_cx); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 167; goto __pyx_L2;}
+    if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_12spidermonkey_Context)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 167; goto __pyx_L2;}
     Py_DECREF(((PyObject *)__pyx_v_pycx));
     __pyx_v_pycx = ((struct __pyx_obj_12spidermonkey_Context *)__pyx_2);
     __pyx_2 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:169 */
-    __pyx_3 = js_object_destroy(__pyx_v_cx,__pyx_v_js_obj); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 169; goto __pyx_L2;}
-    if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_12spidermonkey_ObjectAdapter)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 169; goto __pyx_L2;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:168 */
+    __pyx_3 = js_object_destroy(__pyx_v_cx,__pyx_v_js_obj); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 168; goto __pyx_L2;}
+    if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_12spidermonkey_ObjectAdapter)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 168; goto __pyx_L2;}
     Py_DECREF(((PyObject *)__pyx_v_py_obj));
     __pyx_v_py_obj = ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)__pyx_3);
     __pyx_3 = 0;
@@ -2678,10 +2854,10 @@ static void __pyx_f_12spidermonkey___finalize_callback__(struct JSContext *__pyx
   Py_XDECREF(__pyx_2); __pyx_2 = 0;
   Py_XDECREF(__pyx_3); __pyx_3 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:170 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:169 */
   /*except:*/ {
     __Pyx_AddTraceback(&quot;spidermonkey.__finalize_callback__&quot;);
-    if (__Pyx_GetException(&amp;__pyx_4, &amp;__pyx_2, &amp;__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 170; goto __pyx_L1;}
+    if (__Pyx_GetException(&amp;__pyx_4, &amp;__pyx_2, &amp;__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 169; goto __pyx_L1;}
     __pyx_f_12spidermonkey_report_python_error(__pyx_v_cx);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     Py_DECREF(__pyx_2); __pyx_2 = 0;
@@ -2712,27 +2888,27 @@ static PyObject *__pyx_f_12spidermonkey_js_classname(PyObject *__pyx_self, PyObj
   static char *__pyx_argnames[] = {&quot;obj&quot;,0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, &quot;O&quot;, __pyx_argnames, &amp;__pyx_v_obj)) return 0;
   Py_INCREF(__pyx_v_obj);
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_inspect); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_isclass); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; goto __pyx_L1;}
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_inspect); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_isclass); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; goto __pyx_L1;}
   Py_INCREF(__pyx_v_obj);
   PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_obj);
-  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_4 = PyObject_IsTrue(__pyx_3); if (__pyx_4 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; goto __pyx_L1;}
+  __pyx_4 = PyObject_IsTrue(__pyx_3); if (__pyx_4 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 173; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   if (__pyx_4) {
-    __pyx_2 = PyObject_GetAttr(__pyx_v_obj, __pyx_n___name__); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 175; goto __pyx_L1;}
+    __pyx_2 = PyObject_GetAttr(__pyx_v_obj, __pyx_n___name__); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 174; goto __pyx_L1;}
     __pyx_r = __pyx_2;
     __pyx_2 = 0;
     goto __pyx_L0;
     goto __pyx_L2;
   }
   /*else*/ {
-    __pyx_1 = PyObject_GetAttr(__pyx_v_obj, __pyx_n___class__); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 177; goto __pyx_L1;}
-    __pyx_3 = PyObject_GetAttr(__pyx_1, __pyx_n___name__); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 177; goto __pyx_L1;}
+    __pyx_1 = PyObject_GetAttr(__pyx_v_obj, __pyx_n___class__); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 176; goto __pyx_L1;}
+    __pyx_3 = PyObject_GetAttr(__pyx_1, __pyx_n___name__); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 176; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     __pyx_r = __pyx_3;
     __pyx_3 = 0;
@@ -2782,39 +2958,39 @@ static int __pyx_f_12spidermonkey_12ClassAdapter___cinit__(PyObject *__pyx_v_sel
   Py_INCREF(__pyx_v_is_global);
   Py_INCREF(__pyx_v_flags);
   __pyx_v_name = Py_None; Py_INCREF(Py_None);
-  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cx), __pyx_ptype_12spidermonkey_Context, 1, &quot;cx&quot;)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 185; goto __pyx_L1;}
-  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_parent), __pyx_ptype_12spidermonkey_ObjectAdapter, 1, &quot;parent&quot;)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 185; goto __pyx_L1;}
+  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cx), __pyx_ptype_12spidermonkey_Context, 1, &quot;cx&quot;)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 184; goto __pyx_L1;}
+  if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_parent), __pyx_ptype_12spidermonkey_ObjectAdapter, 1, &quot;parent&quot;)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 184; goto __pyx_L1;}
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:188 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:187 */
   Py_INCREF(((PyObject *)__pyx_v_cx));
   Py_DECREF(((PyObject *)((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;cx));
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;cx = __pyx_v_cx;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:189 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:188 */
   Py_INCREF(((PyObject *)__pyx_v_parent));
   Py_DECREF(((PyObject *)((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;parent));
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;parent = __pyx_v_parent;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:190 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:189 */
   Py_INCREF(__pyx_v_py_class);
   Py_DECREF(((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;py_class);
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;py_class = __pyx_v_py_class;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:192 */
-  __pyx_1 = PyObject_HasAttr(__pyx_v_py_class,__pyx_n___jsname__); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 192; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:191 */
+  __pyx_1 = PyObject_HasAttr(__pyx_v_py_class,__pyx_n___jsname__); if (__pyx_1 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 191; goto __pyx_L1;}
   if (__pyx_1) {
-    __pyx_2 = PyObject_GetAttr(__pyx_v_py_class, __pyx_n___jsname__); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 193; goto __pyx_L1;}
+    __pyx_2 = PyObject_GetAttr(__pyx_v_py_class, __pyx_n___jsname__); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 192; goto __pyx_L1;}
     Py_DECREF(__pyx_v_name);
     __pyx_v_name = __pyx_2;
     __pyx_2 = 0;
     goto __pyx_L2;
   }
   /*else*/ {
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_js_classname); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 195; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 195; goto __pyx_L1;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_js_classname); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 194; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 194; goto __pyx_L1;}
     Py_INCREF(__pyx_v_py_class);
     PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_py_class);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 195; goto __pyx_L1;}
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 194; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     Py_DECREF(__pyx_v_name);
@@ -2823,74 +2999,74 @@ static int __pyx_f_12spidermonkey_12ClassAdapter___cinit__(PyObject *__pyx_v_sel
   }
   __pyx_L2:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:197 */
-  __pyx_5 = __pyx_f_12spidermonkey_xmalloc((sizeof(struct JSClass))); if (__pyx_5 == NULL) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 197; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:196 */
+  __pyx_5 = __pyx_f_12spidermonkey_xmalloc((sizeof(struct JSClass))); if (__pyx_5 == NULL) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 196; goto __pyx_L1;}
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class = ((struct JSClass *)__pyx_5);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:198 */
-  __pyx_6 = PyObject_Length(__pyx_v_name); if (__pyx_6 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 198; goto __pyx_L1;}
-  __pyx_5 = __pyx_f_12spidermonkey_xmalloc(((__pyx_6 + 1) * (sizeof(char)))); if (__pyx_5 == NULL) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 198; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:197 */
+  __pyx_6 = PyObject_Length(__pyx_v_name); if (__pyx_6 == -1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 197; goto __pyx_L1;}
+  __pyx_5 = __pyx_f_12spidermonkey_xmalloc(((__pyx_6 + 1) * (sizeof(char)))); if (__pyx_5 == NULL) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 197; goto __pyx_L1;}
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;name = ((char *)__pyx_5);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:199 */
-  __pyx_7 = PyString_AsString(__pyx_v_name); if (!__pyx_7) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 199; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:198 */
+  __pyx_7 = PyString_AsString(__pyx_v_name); if (!__pyx_7) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 198; goto __pyx_L1;}
   strcpy(((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;name,__pyx_7);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:201 */
-  __pyx_2 = PyInt_FromLong(JSCLASS_HAS_PRIVATE); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 201; goto __pyx_L1;}
-  __pyx_3 = PyNumber_Or(__pyx_v_flags, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 201; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:200 */
+  __pyx_2 = PyInt_FromLong(JSCLASS_HAS_PRIVATE); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 200; goto __pyx_L1;}
+  __pyx_3 = PyNumber_Or(__pyx_v_flags, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 200; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_8 = PyInt_AsLong(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 201; goto __pyx_L1;}
+  __pyx_8 = PyInt_AsLong(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 200; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;flags = __pyx_8;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:202 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:201 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;addProperty = JS_PropertyStub;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:203 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:202 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;delProperty = JS_PropertyStub;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:204 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:203 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;getProperty = __pyx_f_12spidermonkey___get_property_callback__;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:205 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:204 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;setProperty = __pyx_f_12spidermonkey___set_property_callback__;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:206 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:205 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;enumerate = JS_EnumerateStub;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:207 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:206 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;convert = JS_ConvertStub;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:208 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:207 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;finalize = __pyx_f_12spidermonkey___finalize_callback__;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:209 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:208 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;getObjectOps = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:210 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:209 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;checkAccess = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:211 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:210 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;call = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:212 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:211 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;construct = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:213 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:212 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;xdrObject = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:214 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:213 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;hasInstance = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:215 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:214 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;mark = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:216 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:215 */
   ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;reserveSlots = NULL;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:218 */
-  __pyx_1 = PyObject_IsTrue(__pyx_v_is_global); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 218; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:217 */
+  __pyx_1 = PyObject_IsTrue(__pyx_v_is_global); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 217; goto __pyx_L1;}
   if (__pyx_1) {
     ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;resolve = __pyx_f_12spidermonkey___resolve_global_callback__;
     goto __pyx_L3;
@@ -2900,31 +3076,31 @@ static int __pyx_f_12spidermonkey_12ClassAdapter___cinit__(PyObject *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:223 */
-  __pyx_1 = PyObject_IsTrue(__pyx_v_bind_constructor); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 223; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:222 */
+  __pyx_1 = PyObject_IsTrue(__pyx_v_bind_constructor); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 222; goto __pyx_L1;}
   if (__pyx_1) {
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:224 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:223 */
     __pyx_v_proto = JS_InitClass(((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;cx-&gt;cx,__pyx_v_parent-&gt;js_obj,NULL,((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class,__pyx_f_12spidermonkey___constructor_callback__,0,NULL,NULL,NULL,NULL);
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:226 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:225 */
     __pyx_1 = (__pyx_v_proto == NULL);
     if (__pyx_1) {
-      __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 227; goto __pyx_L1;}
-      __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 227; goto __pyx_L1;}
-      Py_INCREF(__pyx_k54p);
-      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k54p);
-      __pyx_3 = PyObject_CallObject(__pyx_4, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 227; goto __pyx_L1;}
+      __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_4) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 226; goto __pyx_L1;}
+      __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 226; goto __pyx_L1;}
+      Py_INCREF(__pyx_k56p);
+      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k56p);
+      __pyx_3 = PyObject_CallObject(__pyx_4, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 226; goto __pyx_L1;}
       Py_DECREF(__pyx_4); __pyx_4 = 0;
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       __Pyx_Raise(__pyx_3, 0, 0);
       Py_DECREF(__pyx_3); __pyx_3 = 0;
-      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 227; goto __pyx_L1;}
+      {__pyx_filename = __pyx_f[5]; __pyx_lineno = 226; goto __pyx_L1;}
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:228 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:227 */
     js_object_attach(__pyx_v_cx-&gt;cx,__pyx_v_proto,((struct PyObject *)__pyx_v_self));
     goto __pyx_L4;
   }
@@ -2955,7 +3131,7 @@ static PyObject *__pyx_f_12spidermonkey_12ClassAdapter___repr__(PyObject *__pyx_
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
-  __pyx_1 = PyNumber_Remainder(__pyx_k55p, ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;py_class); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 231; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Remainder(__pyx_k57p, ((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;py_class); if (!__pyx_1) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 230; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2978,7 +3154,7 @@ static void __pyx_f_12spidermonkey_12ClassAdapter___dealloc__(PyObject *__pyx_v_
   __pyx_1 = (((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class != 0);
   if (__pyx_1) {
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:235 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:234 */
     __pyx_1 = (((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;name != 0);
     if (__pyx_1) {
       free(((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class-&gt;name);
@@ -2986,7 +3162,7 @@ static void __pyx_f_12spidermonkey_12ClassAdapter___dealloc__(PyObject *__pyx_v_
     }
     __pyx_L3:;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:237 */
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsclass.pxi&quot;:236 */
     free(((struct __pyx_obj_12spidermonkey_ClassAdapter *)__pyx_v_self)-&gt;js_class);
     goto __pyx_L2;
   }
@@ -3055,7 +3231,7 @@ static PyObject *__pyx_f_12spidermonkey_13ObjectAdapter___repr__(PyObject *__pyx
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
-  __pyx_1 = PyNumber_Remainder(__pyx_k56p, ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)__pyx_v_self)-&gt;py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 17; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Remainder(__pyx_k58p, ((struct __pyx_obj_12spidermonkey_ObjectAdapter *)__pyx_v_self)-&gt;py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 17; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -3225,8 +3401,8 @@ static PyObject *__pyx_f_12spidermonkey_js2py_object(struct __pyx_obj_12spidermo
   /*else*/ {
     __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_1) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 45; goto __pyx_L1;}
     __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 45; goto __pyx_L1;}
-    Py_INCREF(__pyx_k59p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k59p);
+    Py_INCREF(__pyx_k61p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k61p);
     __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 45; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -3289,8 +3465,8 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_object(struct _
   if (__pyx_4) {
     __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_1) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 56; goto __pyx_L1;}
     __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 56; goto __pyx_L1;}
-    Py_INCREF(__pyx_k60p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k60p);
+    Py_INCREF(__pyx_k62p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k62p);
     __pyx_2 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 56; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -3574,7 +3750,7 @@ static PyObject *__pyx_f_12spidermonkey_15FunctionAdapter___repr__(PyObject *__p
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
-  __pyx_1 = PyNumber_Remainder(__pyx_k61p, ((struct __pyx_obj_12spidermonkey_FunctionAdapter *)__pyx_v_self)-&gt;py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 45; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Remainder(__pyx_k63p, ((struct __pyx_obj_12spidermonkey_FunctionAdapter *)__pyx_v_self)-&gt;py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 45; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -3620,8 +3796,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___bound_method_callb
     if (__pyx_1) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 56; goto __pyx_L2;}
       __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 56; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
       __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 56; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -3772,8 +3948,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___function_callback_
     if (__pyx_1) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 89; goto __pyx_L2;}
       __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 89; goto __pyx_L2;}
-      Py_INCREF(__pyx_k40p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k40p);
+      Py_INCREF(__pyx_k41p);
+      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k41p);
       __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 89; goto __pyx_L2;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -3802,8 +3978,8 @@ static __pyx_t_12spidermonkey_JSBool __pyx_f_12spidermonkey___function_callback_
     if (__pyx_1) {
       __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 96; goto __pyx_L2;}
       __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 96; goto __pyx_L2;}
-      Py_INCREF(__pyx_k62p);
-      PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k62p);
+      Py_INCREF(__pyx_k64p);
+      PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k64p);
       __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 96; goto __pyx_L2;}
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       Py_DECREF(__pyx_4); __pyx_4 = 0;
@@ -4085,8 +4261,8 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_bound_method(st
   /*else*/ {
     __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 137; goto __pyx_L1;}
     __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 137; goto __pyx_L1;}
-    Py_INCREF(__pyx_k68p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k68p);
+    Py_INCREF(__pyx_k70p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k70p);
     __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 137; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -4164,8 +4340,8 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_function(struct
   /*else*/ {
     __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 154; goto __pyx_L1;}
     __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 154; goto __pyx_L1;}
-    Py_INCREF(__pyx_k68p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k68p);
+    Py_INCREF(__pyx_k70p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k70p);
     __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 154; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -4347,8 +4523,8 @@ static PyObject *__pyx_f_12spidermonkey_js2py_array(struct __pyx_obj_12spidermon
     if (__pyx_4) {
       __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 25; goto __pyx_L1;}
       __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 25; goto __pyx_L1;}
-      Py_INCREF(__pyx_k71p);
-      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k71p);
+      Py_INCREF(__pyx_k73p);
+      PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k73p);
       __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 25; goto __pyx_L1;}
       Py_DECREF(__pyx_1); __pyx_1 = 0;
       Py_DECREF(__pyx_2); __pyx_2 = 0;
@@ -4420,8 +4596,8 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_array(struct __
     if (__pyx_4) {
       __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; goto __pyx_L1;}
       __pyx_5 = PyTuple_New(1); if (!__pyx_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; goto __pyx_L1;}
-      Py_INCREF(__pyx_k72p);
-      PyTuple_SET_ITEM(__pyx_5, 0, __pyx_k72p);
+      Py_INCREF(__pyx_k74p);
+      PyTuple_SET_ITEM(__pyx_5, 0, __pyx_k74p);
       __pyx_6 = PyObject_CallObject(__pyx_2, __pyx_5); if (!__pyx_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 41; goto __pyx_L1;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_5); __pyx_5 = 0;
@@ -4661,8 +4837,8 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_double(struct _
   if (__pyx_1) {
     __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; goto __pyx_L1;}
     __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; goto __pyx_L1;}
-    Py_INCREF(__pyx_k75p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k75p);
+    Py_INCREF(__pyx_k77p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k77p);
     __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 14; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
@@ -4769,6 +4945,9 @@ static PyObject *__pyx_f_12spidermonkey_js2py_hash(struct __pyx_obj_12spidermonk
   __pyx_t_12spidermonkey_jsval __pyx_v_jsv;
   int __pyx_v_i;
   PyDictObject *__pyx_v_ret;
+  struct JSString *__pyx_v_converted;
+  __pyx_t_12spidermonkey_jschar *__pyx_v_data;
+  __pyx_t_12spidermonkey_size_t __pyx_v_length;
   PyObject *__pyx_v_key;
   PyObject *__pyx_r;
   int __pyx_1;
@@ -4776,158 +4955,165 @@ static PyObject *__pyx_f_12spidermonkey_js2py_hash(struct __pyx_obj_12spidermonk
   PyObject *__pyx_3 = 0;
   PyObject *__pyx_4 = 0;
   __pyx_t_12spidermonkey_jsint __pyx_5;
-  char *__pyx_6;
-  __pyx_t_12spidermonkey_jsint __pyx_7;
+  __pyx_t_12spidermonkey_jsint __pyx_6;
   Py_INCREF(__pyx_v_cx);
   __pyx_v_ret = ((PyDictObject *)Py_None); Py_INCREF(Py_None);
   __pyx_v_key = Py_None; Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:17 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:20 */
   __pyx_v_hash = JSVAL_TO_OBJECT(__pyx_v_v);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:19 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:22 */
   __pyx_v_props = JS_Enumerate(__pyx_v_cx-&gt;cx,__pyx_v_hash);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:20 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:23 */
   __pyx_1 = (__pyx_v_props == NULL);
   if (__pyx_1) {
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 21; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 21; goto __pyx_L1;}
-    Py_INCREF(__pyx_k78p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k78p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 21; goto __pyx_L1;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 24; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 24; goto __pyx_L1;}
+    Py_INCREF(__pyx_k80p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k80p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 24; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 21; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 24; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:23 */
-  __pyx_2 = PyDict_New(); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 23; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_2, (&amp;PyDict_Type))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 23; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:26 */
+  __pyx_2 = PyDict_New(); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 26; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_2, (&amp;PyDict_Type))) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 26; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_ret));
   __pyx_v_ret = ((PyDictObject *)__pyx_2);
   __pyx_2 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:25 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:28 */
   /*try:*/ {
     __pyx_5 = __pyx_v_props-&gt;length;
     for (__pyx_v_i = 0; __pyx_v_i &lt; __pyx_5; ++__pyx_v_i) {
 
-      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:27 */
+      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:30 */
       __pyx_1 = (!JS_IdToValue(__pyx_v_cx-&gt;cx,(__pyx_v_props-&gt;vector[__pyx_v_i]),(&amp;__pyx_v_jskey)));
       if (__pyx_1) {
-        __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 28; goto __pyx_L4;}
-        __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 28; goto __pyx_L4;}
-        Py_INCREF(__pyx_k79p);
-        PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k79p);
-        __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 28; goto __pyx_L4;}
+        __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 31; goto __pyx_L4;}
+        __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 31; goto __pyx_L4;}
+        Py_INCREF(__pyx_k81p);
+        PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k81p);
+        __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 31; goto __pyx_L4;}
         Py_DECREF(__pyx_3); __pyx_3 = 0;
         Py_DECREF(__pyx_4); __pyx_4 = 0;
         __Pyx_Raise(__pyx_2, 0, 0);
         Py_DECREF(__pyx_2); __pyx_2 = 0;
-        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 28; goto __pyx_L4;}
+        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 31; goto __pyx_L4;}
         goto __pyx_L8;
       }
       __pyx_L8:;
 
-      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:30 */
-      __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_js_is_string); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 30; goto __pyx_L4;}
-      __pyx_4 = PyInt_FromLong(__pyx_v_jskey); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 30; goto __pyx_L4;}
-      __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 30; goto __pyx_L4;}
+      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:33 */
+      __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_js_is_string); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
+      __pyx_4 = PyInt_FromLong(__pyx_v_jskey); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
+      __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
       Py_INCREF(((PyObject *)__pyx_v_cx));
       PyTuple_SET_ITEM(__pyx_2, 0, ((PyObject *)__pyx_v_cx));
       PyTuple_SET_ITEM(__pyx_2, 1, __pyx_4);
       __pyx_4 = 0;
-      __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 30; goto __pyx_L4;}
+      __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
       Py_DECREF(__pyx_3); __pyx_3 = 0;
       Py_DECREF(__pyx_2); __pyx_2 = 0;
-      __pyx_1 = PyObject_IsTrue(__pyx_4); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 30; goto __pyx_L4;}
+      __pyx_1 = PyObject_IsTrue(__pyx_4); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
       Py_DECREF(__pyx_4); __pyx_4 = 0;
       if (__pyx_1) {
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:31 */
-        __pyx_3 = __pyx_f_12spidermonkey_js2py_string(__pyx_v_cx,__pyx_v_jskey); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 31; goto __pyx_L4;}
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:34 */
+        __pyx_3 = __pyx_f_12spidermonkey_js2py_string(__pyx_v_cx,__pyx_v_jskey); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 34; goto __pyx_L4;}
         Py_DECREF(__pyx_v_key);
         __pyx_v_key = __pyx_3;
         __pyx_3 = 0;
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:32 */
-        __pyx_6 = PyString_AsString(__pyx_v_key); if (!__pyx_6) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 32; goto __pyx_L4;}
-        __pyx_1 = (!JS_GetProperty(__pyx_v_cx-&gt;cx,__pyx_v_hash,__pyx_6,(&amp;__pyx_v_jsv)));
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:36 */
+        __pyx_v_converted = __pyx_f_12spidermonkey_py2js_jsstring(__pyx_v_cx-&gt;cx,__pyx_v_key);
+
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:37 */
+        __pyx_v_data = JS_GetStringChars(__pyx_v_converted);
+
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:38 */
+        __pyx_v_length = JS_GetStringLength(__pyx_v_converted);
+
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:40 */
+        __pyx_1 = (!JS_GetUCProperty(__pyx_v_cx-&gt;cx,__pyx_v_hash,__pyx_v_data,__pyx_v_length,(&amp;__pyx_v_jsv)));
         if (__pyx_1) {
-          __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
-          __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
-          Py_INCREF(__pyx_k81p);
-          PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k81p);
-          __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
+          __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 41; goto __pyx_L4;}
+          __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 41; goto __pyx_L4;}
+          Py_INCREF(__pyx_k83p);
+          PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k83p);
+          __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 41; goto __pyx_L4;}
           Py_DECREF(__pyx_2); __pyx_2 = 0;
           Py_DECREF(__pyx_4); __pyx_4 = 0;
           __Pyx_Raise(__pyx_3, 0, 0);
           Py_DECREF(__pyx_3); __pyx_3 = 0;
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 33; goto __pyx_L4;}
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 41; goto __pyx_L4;}
           goto __pyx_L10;
         }
         __pyx_L10:;
         goto __pyx_L9;
       }
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_js_is_int); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 34; goto __pyx_L4;}
-      __pyx_4 = PyInt_FromLong(__pyx_v_jskey); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 34; goto __pyx_L4;}
-      __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 34; goto __pyx_L4;}
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_js_is_int); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 42; goto __pyx_L4;}
+      __pyx_4 = PyInt_FromLong(__pyx_v_jskey); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 42; goto __pyx_L4;}
+      __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 42; goto __pyx_L4;}
       Py_INCREF(((PyObject *)__pyx_v_cx));
       PyTuple_SET_ITEM(__pyx_3, 0, ((PyObject *)__pyx_v_cx));
       PyTuple_SET_ITEM(__pyx_3, 1, __pyx_4);
       __pyx_4 = 0;
-      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 34; goto __pyx_L4;}
+      __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 42; goto __pyx_L4;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
       Py_DECREF(__pyx_3); __pyx_3 = 0;
-      __pyx_1 = PyObject_IsTrue(__pyx_4); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 34; goto __pyx_L4;}
+      __pyx_1 = PyObject_IsTrue(__pyx_4); if (__pyx_1 &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 42; goto __pyx_L4;}
       Py_DECREF(__pyx_4); __pyx_4 = 0;
       if (__pyx_1) {
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:35 */
-        __pyx_2 = __pyx_f_12spidermonkey_js2py_int(__pyx_v_cx,__pyx_v_jskey); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 35; goto __pyx_L4;}
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:43 */
+        __pyx_2 = __pyx_f_12spidermonkey_js2py_int(__pyx_v_cx,__pyx_v_jskey); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 43; goto __pyx_L4;}
         Py_DECREF(__pyx_v_key);
         __pyx_v_key = __pyx_2;
         __pyx_2 = 0;
 
-        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:36 */
-        __pyx_7 = PyInt_AsLong(__pyx_v_key); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 36; goto __pyx_L4;}
-        __pyx_1 = (!JS_GetElement(__pyx_v_cx-&gt;cx,__pyx_v_hash,__pyx_7,(&amp;__pyx_v_jsv)));
+        /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:44 */
+        __pyx_6 = PyInt_AsLong(__pyx_v_key); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 44; goto __pyx_L4;}
+        __pyx_1 = (!JS_GetElement(__pyx_v_cx-&gt;cx,__pyx_v_hash,__pyx_6,(&amp;__pyx_v_jsv)));
         if (__pyx_1) {
-          __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 37; goto __pyx_L4;}
-          __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 37; goto __pyx_L4;}
-          Py_INCREF(__pyx_k83p);
-          PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k83p);
-          __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 37; goto __pyx_L4;}
+          __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 45; goto __pyx_L4;}
+          __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 45; goto __pyx_L4;}
+          Py_INCREF(__pyx_k85p);
+          PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k85p);
+          __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 45; goto __pyx_L4;}
           Py_DECREF(__pyx_3); __pyx_3 = 0;
           Py_DECREF(__pyx_4); __pyx_4 = 0;
           __Pyx_Raise(__pyx_2, 0, 0);
           Py_DECREF(__pyx_2); __pyx_2 = 0;
-          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 37; goto __pyx_L4;}
+          {__pyx_filename = __pyx_f[11]; __pyx_lineno = 45; goto __pyx_L4;}
           goto __pyx_L11;
         }
         __pyx_L11:;
         goto __pyx_L9;
       }
       /*else*/ {
-        __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 39; goto __pyx_L4;}
-        Py_INCREF(__pyx_k84p);
-        PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k84p);
-        __pyx_4 = PyObject_CallObject(PyExc_AssertionError, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 39; goto __pyx_L4;}
+        __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 47; goto __pyx_L4;}
+        Py_INCREF(__pyx_k86p);
+        PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k86p);
+        __pyx_4 = PyObject_CallObject(PyExc_AssertionError, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 47; goto __pyx_L4;}
         Py_DECREF(__pyx_3); __pyx_3 = 0;
         __Pyx_Raise(__pyx_4, 0, 0);
         Py_DECREF(__pyx_4); __pyx_4 = 0;
-        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 39; goto __pyx_L4;}
+        {__pyx_filename = __pyx_f[11]; __pyx_lineno = 47; goto __pyx_L4;}
       }
       __pyx_L9:;
 
-      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:41 */
-      __pyx_2 = __pyx_f_12spidermonkey_js2py(__pyx_v_cx,__pyx_v_jsv); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 41; goto __pyx_L4;}
-      if (PyObject_SetItem(((PyObject *)__pyx_v_ret), __pyx_v_key, __pyx_2) &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 41; goto __pyx_L4;}
+      /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:49 */
+      __pyx_2 = __pyx_f_12spidermonkey_js2py(__pyx_v_cx,__pyx_v_jsv); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 49; goto __pyx_L4;}
+      if (PyObject_SetItem(((PyObject *)__pyx_v_ret), __pyx_v_key, __pyx_2) &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 49; goto __pyx_L4;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
     }
   }
@@ -4959,7 +5145,7 @@ static PyObject *__pyx_f_12spidermonkey_js2py_hash(struct __pyx_obj_12spidermonk
     }
   }
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:45 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:53 */
   Py_INCREF(((PyObject *)__pyx_v_ret));
   __pyx_r = ((PyObject *)__pyx_v_ret);
   goto __pyx_L0;
@@ -4982,6 +5168,9 @@ static PyObject *__pyx_f_12spidermonkey_js2py_hash(struct __pyx_obj_12spidermonk
 static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_hash(struct __pyx_obj_12spidermonkey_Context *__pyx_v_cx,PyDictObject *__pyx_v_py_obj,struct JSObject *__pyx_v_parent) {
   struct JSObject *__pyx_v_obj;
   __pyx_t_12spidermonkey_jsval __pyx_v_elem;
+  struct JSString *__pyx_v_converted;
+  __pyx_t_12spidermonkey_jschar *__pyx_v_data;
+  __pyx_t_12spidermonkey_size_t __pyx_v_length;
   PyObject *__pyx_v_k;
   PyObject *__pyx_v_v;
   __pyx_t_12spidermonkey_jsval __pyx_r;
@@ -4990,83 +5179,112 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_hash(struct __p
   PyObject *__pyx_3 = 0;
   PyObject *__pyx_4 = 0;
   __pyx_t_12spidermonkey_jsval __pyx_5;
-  char *__pyx_6;
-  PyObject *__pyx_7 = 0;
+  PyObject *__pyx_6 = 0;
   Py_INCREF(__pyx_v_cx);
   Py_INCREF(__pyx_v_py_obj);
   __pyx_v_k = Py_None; Py_INCREF(Py_None);
   __pyx_v_v = Py_None; Py_INCREF(Py_None);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:52 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:63 */
   __pyx_v_obj = JS_NewObject(__pyx_v_cx-&gt;cx,NULL,NULL,__pyx_v_parent);
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:53 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:64 */
   __pyx_1 = (__pyx_v_obj == NULL);
   if (__pyx_1) {
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 54; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 54; goto __pyx_L1;}
-    Py_INCREF(__pyx_k85p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k85p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 54; goto __pyx_L1;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 65; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 65; goto __pyx_L1;}
+    Py_INCREF(__pyx_k87p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k87p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 65; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 54; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[11]; __pyx_lineno = 65; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:56 */
-  __pyx_2 = PyObject_GetAttr(((PyObject *)__pyx_v_py_obj), __pyx_n_iteritems); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
-  __pyx_3 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:67 */
+  __pyx_2 = PyObject_GetAttr(((PyObject *)__pyx_v_py_obj), __pyx_n_iteritems); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_4 = PyObject_GetIter(__pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+  __pyx_4 = PyObject_GetIter(__pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   for (;;) {
     __pyx_2 = PyIter_Next(__pyx_4);
     if (!__pyx_2) {
-      if (PyErr_Occurred()) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+      if (PyErr_Occurred()) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
       break;
     }
-    __pyx_3 = PyObject_GetIter(__pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+    __pyx_3 = PyObject_GetIter(__pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_2 = __Pyx_UnpackItem(__pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+    __pyx_2 = __Pyx_UnpackItem(__pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
     Py_DECREF(__pyx_v_k);
     __pyx_v_k = __pyx_2;
     __pyx_2 = 0;
-    __pyx_2 = __Pyx_UnpackItem(__pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+    __pyx_2 = __Pyx_UnpackItem(__pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
     Py_DECREF(__pyx_v_v);
     __pyx_v_v = __pyx_2;
     __pyx_2 = 0;
-    if (__Pyx_EndUnpack(__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 56; goto __pyx_L1;}
+    if (__Pyx_EndUnpack(__pyx_3) &lt; 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 67; goto __pyx_L1;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:57 */
-    __pyx_5 = __pyx_f_12spidermonkey_py2js(__pyx_v_cx,__pyx_v_v,__pyx_v_obj); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 57; goto __pyx_L1;}
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:69 */
+    __pyx_v_converted = __pyx_f_12spidermonkey_py2js_jsstring(__pyx_v_cx-&gt;cx,__pyx_v_k);
+
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:70 */
+    __pyx_v_data = JS_GetStringChars(__pyx_v_converted);
+
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:71 */
+    __pyx_v_length = JS_GetStringLength(__pyx_v_converted);
+
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:73 */
+    __pyx_5 = __pyx_f_12spidermonkey_py2js(__pyx_v_cx,__pyx_v_v,__pyx_v_obj); if (__pyx_5 == 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 73; goto __pyx_L1;}
     __pyx_v_elem = __pyx_5;
 
-    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:58 */
-    __pyx_6 = PyString_AsString(__pyx_v_k); if (!__pyx_6) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 58; goto __pyx_L1;}
-    __pyx_1 = (!JS_SetProperty(__pyx_v_cx-&gt;cx,__pyx_v_obj,__pyx_6,(&amp;__pyx_v_elem)));
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:74 */
+    __pyx_2 = PyInt_FromLong(__pyx_v_elem); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 74; goto __pyx_L1;}
+    __pyx_1 = __pyx_2 == Py_None;
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
     if (__pyx_1) {
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 59; goto __pyx_L1;}
-      __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 59; goto __pyx_L1;}
-      Py_INCREF(__pyx_k87p);
-      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k87p);
-      __pyx_7 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_7) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 59; goto __pyx_L1;}
+      __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_sys); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 75; goto __pyx_L1;}
+      __pyx_2 = PyObject_GetAttr(__pyx_3, __pyx_n_stderr); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 75; goto __pyx_L1;}
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_write); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 75; goto __pyx_L1;}
       Py_DECREF(__pyx_2); __pyx_2 = 0;
+      __pyx_2 = PyNumber_Remainder(__pyx_k89p, __pyx_v_k); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 75; goto __pyx_L1;}
+      __pyx_6 = PyTuple_New(1); if (!__pyx_6) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 75; goto __pyx_L1;}
+      PyTuple_SET_ITEM(__pyx_6, 0, __pyx_2);
+      __pyx_2 = 0;
+      __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_6); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 75; goto __pyx_L1;}
       Py_DECREF(__pyx_3); __pyx_3 = 0;
-      __Pyx_Raise(__pyx_7, 0, 0);
-      Py_DECREF(__pyx_7); __pyx_7 = 0;
-      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 59; goto __pyx_L1;}
+      Py_DECREF(__pyx_6); __pyx_6 = 0;
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
       goto __pyx_L5;
     }
     __pyx_L5:;
+
+    /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:77 */
+    __pyx_1 = (!JS_SetUCProperty(__pyx_v_cx-&gt;cx,__pyx_v_obj,__pyx_v_data,__pyx_v_length,(&amp;__pyx_v_elem)));
+    if (__pyx_1) {
+      __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_JSError); if (!__pyx_3) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 78; goto __pyx_L1;}
+      __pyx_6 = PyTuple_New(1); if (!__pyx_6) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 78; goto __pyx_L1;}
+      Py_INCREF(__pyx_k90p);
+      PyTuple_SET_ITEM(__pyx_6, 0, __pyx_k90p);
+      __pyx_2 = PyObject_CallObject(__pyx_3, __pyx_6); if (!__pyx_2) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 78; goto __pyx_L1;}
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      Py_DECREF(__pyx_6); __pyx_6 = 0;
+      __Pyx_Raise(__pyx_2, 0, 0);
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
+      {__pyx_filename = __pyx_f[11]; __pyx_lineno = 78; goto __pyx_L1;}
+      goto __pyx_L6;
+    }
+    __pyx_L6:;
   }
   Py_DECREF(__pyx_4); __pyx_4 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:61 */
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jshash.pxi&quot;:80 */
   __pyx_r = OBJECT_TO_JSVAL(__pyx_v_obj);
   goto __pyx_L0;
 
@@ -5076,7 +5294,7 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_hash(struct __p
   Py_XDECREF(__pyx_2);
   Py_XDECREF(__pyx_3);
   Py_XDECREF(__pyx_4);
-  Py_XDECREF(__pyx_7);
+  Py_XDECREF(__pyx_6);
   __Pyx_WriteUnraisable(&quot;spidermonkey.py2js_hash&quot;);
   __pyx_r = 0;
   __pyx_L0:;
@@ -5231,7 +5449,7 @@ static PyObject *__pyx_f_12spidermonkey_py_is_string(PyObject *__pyx_self, PyObj
   Py_INCREF(__pyx_v_py_obj);
   if (!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cx), __pyx_ptype_12spidermonkey_Context, 1, &quot;cx&quot;)) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 7; goto __pyx_L1;}
   __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_types); if (!__pyx_1) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_StringTypes); if (!__pyx_2) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_UnicodeType); if (!__pyx_2) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   __pyx_3 = PyObject_IsInstance(__pyx_v_py_obj,__pyx_2); if (__pyx_3 == -1) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 8; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
@@ -5253,57 +5471,43 @@ static PyObject *__pyx_f_12spidermonkey_py_is_string(PyObject *__pyx_self, PyObj
   return __pyx_r;
 }
 
-static PyObject *__pyx_f_12spidermonkey_js2py_string(struct __pyx_obj_12spidermonkey_Context *__pyx_v_cx,__pyx_t_12spidermonkey_jsval __pyx_v_jsv) {
-  struct JSString *__pyx_v_s;
-  PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
+static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_string(struct __pyx_obj_12spidermonkey_Context *__pyx_v_cx,PyObject *__pyx_v_py_obj,struct JSObject *__pyx_v_parent) {
+  struct JSString *__pyx_v_conv;
+  __pyx_t_12spidermonkey_jsval __pyx_r;
   Py_INCREF(__pyx_v_cx);
+  Py_INCREF(__pyx_v_py_obj);
 
   /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsstring.pxi&quot;:12 */
-  __pyx_v_s = JSVAL_TO_STRING(__pyx_v_jsv);
+  __pyx_v_conv = __pyx_f_12spidermonkey_py2js_jsstring(__pyx_v_cx-&gt;cx,__pyx_v_py_obj);
 
   /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsstring.pxi&quot;:13 */
-  __pyx_1 = PyString_FromString(JS_GetStringBytes(__pyx_v_s)); if (!__pyx_1) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 13; goto __pyx_L1;}
-  __pyx_r = __pyx_1;
-  __pyx_1 = 0;
+  __pyx_r = STRING_TO_JSVAL(__pyx_v_conv);
   goto __pyx_L0;
 
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  __Pyx_AddTraceback(&quot;spidermonkey.js2py_string&quot;);
   __pyx_r = 0;
   __pyx_L0:;
   Py_DECREF(__pyx_v_cx);
+  Py_DECREF(__pyx_v_py_obj);
   return __pyx_r;
 }
 
-static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js_string(struct __pyx_obj_12spidermonkey_Context *__pyx_v_cx,PyObject *__pyx_v_py_obj,struct JSObject *__pyx_v_parent) {
-  struct JSString *__pyx_v_s;
-  __pyx_t_12spidermonkey_jsval __pyx_r;
-  char *__pyx_1;
-  Py_ssize_t __pyx_2;
+static PyObject *__pyx_f_12spidermonkey_js2py_string(struct __pyx_obj_12spidermonkey_Context *__pyx_v_cx,__pyx_t_12spidermonkey_jsval __pyx_v_jsv) {
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_cx);
-  Py_INCREF(__pyx_v_py_obj);
-
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsstring.pxi&quot;:20 */
-  __pyx_1 = PyString_AsString(__pyx_v_py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; goto __pyx_L1;}
-  __pyx_2 = PyObject_Length(__pyx_v_py_obj); if (__pyx_2 == -1) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 20; goto __pyx_L1;}
-  __pyx_v_s = JS_NewStringCopyN(__pyx_v_cx-&gt;cx,__pyx_1,__pyx_2);
-
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsstring.pxi&quot;:21 */
-  __pyx_r = STRING_TO_JSVAL(__pyx_v_s);
+  __pyx_1 = __pyx_f_12spidermonkey_js2py_jsstring(JSVAL_TO_STRING(__pyx_v_jsv)); if (!__pyx_1) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 16; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
   goto __pyx_L0;
 
-  __pyx_r = 0;
+  __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1:;
-  __Pyx_WriteUnraisable(&quot;spidermonkey.py2js_string&quot;);
+  Py_XDECREF(__pyx_1);
+  __Pyx_AddTraceback(&quot;spidermonkey.js2py_string&quot;);
   __pyx_r = 0;
   __pyx_L0:;
   Py_DECREF(__pyx_v_cx);
-  Py_DECREF(__pyx_v_py_obj);
   return __pyx_r;
 }
 
@@ -5576,7 +5780,7 @@ static __pyx_t_12spidermonkey_jsval __pyx_f_12spidermonkey_py2js(struct __pyx_ob
     goto __pyx_L2;
   }
   /*else*/ {
-    __pyx_1 = PyNumber_Remainder(__pyx_k99p, __pyx_v_py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 26; goto __pyx_L1;}
+    __pyx_1 = PyNumber_Remainder(__pyx_k102p, __pyx_v_py_obj); if (!__pyx_1) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 26; goto __pyx_L1;}
     __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 26; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_2, 0, __pyx_1);
     __pyx_1 = 0;
@@ -5782,7 +5986,7 @@ static PyObject *__pyx_f_12spidermonkey_js2py(struct __pyx_obj_12spidermonkey_Co
   }
   /*else*/ {
     __pyx_3 = PyInt_FromLong(__pyx_v_jsv); if (!__pyx_3) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 48; goto __pyx_L1;}
-    __pyx_2 = PyNumber_Remainder(__pyx_k107p, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 48; goto __pyx_L1;}
+    __pyx_2 = PyNumber_Remainder(__pyx_k110p, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 48; goto __pyx_L1;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 48; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_1, 0, __pyx_2);
@@ -7192,6 +7396,7 @@ PyTypeObject __pyx_type_12spidermonkey_FunctionAdapter = {
 };
 
 static struct PyMethodDef __pyx_methods[] = {
+  {&quot;test_utf_16_round_trip&quot;, (PyCFunction)__pyx_f_12spidermonkey_test_utf_16_round_trip, METH_VARARGS|METH_KEYWORDS, 0},
   {&quot;js_classname&quot;, (PyCFunction)__pyx_f_12spidermonkey_js_classname, METH_VARARGS|METH_KEYWORDS, 0},
   {&quot;js_is_object&quot;, (PyCFunction)__pyx_f_12spidermonkey_js_is_object, METH_VARARGS|METH_KEYWORDS, 0},
   {&quot;py_is_object&quot;, (PyCFunction)__pyx_f_12spidermonkey_py_is_object, METH_VARARGS|METH_KEYWORDS, 0},
@@ -7257,8 +7462,8 @@ PyMODINIT_FUNC initspidermonkey(void) {
   if (PyObject_SetAttrString(__pyx_m, &quot;Value&quot;, (PyObject *)&amp;__pyx_type_12spidermonkey_Value) &lt; 0) {__pyx_filename = __pyx_f[15]; __pyx_lineno = 50; goto __pyx_L1;}
   __pyx_ptype_12spidermonkey_Value = &amp;__pyx_type_12spidermonkey_Value;
   __pyx_type_12spidermonkey_ClassAdapter.tp_free = _PyObject_GC_Del;
-  if (PyType_Ready(&amp;__pyx_type_12spidermonkey_ClassAdapter) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 179; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, &quot;ClassAdapter&quot;, (PyObject *)&amp;__pyx_type_12spidermonkey_ClassAdapter) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 179; goto __pyx_L1;}
+  if (PyType_Ready(&amp;__pyx_type_12spidermonkey_ClassAdapter) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 178; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, &quot;ClassAdapter&quot;, (PyObject *)&amp;__pyx_type_12spidermonkey_ClassAdapter) &lt; 0) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 178; goto __pyx_L1;}
   __pyx_ptype_12spidermonkey_ClassAdapter = &amp;__pyx_type_12spidermonkey_ClassAdapter;
   __pyx_type_12spidermonkey_ObjectAdapter.tp_free = _PyObject_GC_Del;
   if (PyType_Ready(&amp;__pyx_type_12spidermonkey_ObjectAdapter) &lt; 0) {__pyx_filename = __pyx_f[6]; __pyx_lineno = 2; goto __pyx_L1;}
@@ -7269,55 +7474,55 @@ PyMODINIT_FUNC initspidermonkey(void) {
   if (PyObject_SetAttrString(__pyx_m, &quot;FunctionAdapter&quot;, (PyObject *)&amp;__pyx_type_12spidermonkey_FunctionAdapter) &lt; 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 35; goto __pyx_L1;}
   __pyx_ptype_12spidermonkey_FunctionAdapter = &amp;__pyx_type_12spidermonkey_FunctionAdapter;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:392 */
-  __pyx_1 = __Pyx_Import(__pyx_n_inspect, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_inspect, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:418 */
+  __pyx_1 = __Pyx_Import(__pyx_n_inspect, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_inspect, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:393 */
-  __pyx_1 = __Pyx_Import(__pyx_n_sys, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_sys, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:419 */
+  __pyx_1 = __Pyx_Import(__pyx_n_sys, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_sys, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:394 */
-  __pyx_1 = __Pyx_Import(__pyx_n_traceback, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_traceback, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:420 */
+  __pyx_1 = __Pyx_Import(__pyx_n_traceback, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_traceback, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:395 */
-  __pyx_1 = __Pyx_Import(__pyx_n_types, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; goto __pyx_L1;}
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_types, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:421 */
+  __pyx_1 = __Pyx_Import(__pyx_n_types, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_types, __pyx_1) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:397 */
-  __pyx_1 = PyDict_New(); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:423 */
+  __pyx_1 = PyDict_New(); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
   Py_INCREF(PyExc_Exception);
   PyTuple_SET_ITEM(__pyx_2, 0, PyExc_Exception);
-  __pyx_3 = __Pyx_CreateClass(__pyx_2, __pyx_1, __pyx_n_JSError, &quot;spidermonkey&quot;); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
+  __pyx_3 = __Pyx_CreateClass(__pyx_2, __pyx_1, __pyx_n_JSError, &quot;spidermonkey&quot;); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:398 */
-  __pyx_2 = PyCFunction_New(&amp;__pyx_mdef_12spidermonkey_7JSError___init__, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; goto __pyx_L1;}
-  __pyx_4 = PyMethod_New(__pyx_2, 0, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:424 */
+  __pyx_2 = PyCFunction_New(&amp;__pyx_mdef_12spidermonkey_7JSError___init__, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; goto __pyx_L1;}
+  __pyx_4 = PyMethod_New(__pyx_2, 0, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  if (PyObject_SetAttr(__pyx_3, __pyx_n___init__, __pyx_4) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_3, __pyx_n___init__, __pyx_4) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:400 */
-  __pyx_2 = PyCFunction_New(&amp;__pyx_mdef_12spidermonkey_7JSError___str__, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; goto __pyx_L1;}
-  __pyx_4 = PyMethod_New(__pyx_2, 0, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:426 */
+  __pyx_2 = PyCFunction_New(&amp;__pyx_mdef_12spidermonkey_7JSError___str__, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; goto __pyx_L1;}
+  __pyx_4 = PyMethod_New(__pyx_2, 0, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  if (PyObject_SetAttr(__pyx_3, __pyx_n___str__, __pyx_4) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_3, __pyx_n___str__, __pyx_4) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
 
-  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:402 */
-  __pyx_2 = PyCFunction_New(&amp;__pyx_mdef_12spidermonkey_7JSError___repr__, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; goto __pyx_L1;}
-  __pyx_4 = PyMethod_New(__pyx_2, 0, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; goto __pyx_L1;}
+  /* &quot;/usr/local/src/python-spidermonkey/spidermonkey/jsapi.pxi&quot;:428 */
+  __pyx_2 = PyCFunction_New(&amp;__pyx_mdef_12spidermonkey_7JSError___repr__, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; goto __pyx_L1;}
+  __pyx_4 = PyMethod_New(__pyx_2, 0, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  if (PyObject_SetAttr(__pyx_3, __pyx_n___repr__, __pyx_4) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_3, __pyx_n___repr__, __pyx_4) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_JSError, __pyx_3) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; goto __pyx_L1;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_JSError, __pyx_3) &lt; 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
@@ -7445,6 +7650,19 @@ raise_error:
     return;
 }
 
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name) {
+    if (!type) {
+        PyErr_Format(PyExc_SystemError, &quot;Missing type object&quot;);
+        return 0;
+    }
+    if ((none_allowed &amp;&amp; obj == Py_None) || PyObject_TypeCheck(obj, type))
+        return 1;
+    PyErr_Format(PyExc_TypeError,
+        &quot;Argument '%s' has incorrect type (expected %s, got %s)&quot;,
+        name, type-&gt;tp_name, obj-&gt;ob_type-&gt;tp_name);
+    return 0;
+}
+
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     PyObject *result;
     result = PyObject_GetAttr(dict, name);
@@ -7499,19 +7717,6 @@ bad:
     return -1;
 }
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name) {
-    if (!type) {
-        PyErr_Format(PyExc_SystemError, &quot;Missing type object&quot;);
-        return 0;
-    }
-    if ((none_allowed &amp;&amp; obj == Py_None) || PyObject_TypeCheck(obj, type))
-        return 1;
-    PyErr_Format(PyExc_TypeError,
-        &quot;Argument '%s' has incorrect type (expected %s, got %s)&quot;,
-        name, type-&gt;tp_name, obj-&gt;ob_type-&gt;tp_name);
-    return 0;
-}
-
 static int __Pyx_GetStarArgs(
     PyObject **args, 
     PyObject **kwds,</diff>
      <filename>spidermonkey/spidermonkey.c</filename>
    </modified>
    <modified>
      <diff>@@ -8,11 +8,11 @@ class BindTest(unittest.TestCase):
             def __init__(self):
                 self.arg = Nonce()
                 self.window = self
-                self.name = &quot;foobar&quot;
+                self.name = u&quot;foobar&quot;
                 self.val = 42
             def foo(self, arg):
                 self.arg = arg
-                return &quot;hi %s&quot; % arg
+                return u&quot;hi %s&quot; % arg
         self.window = Window()
         rt = spidermonkey.Runtime()
         self.cx = rt.create_context(self.window)
@@ -23,27 +23,30 @@ class BindTest(unittest.TestCase):
             def __init__(self):
                 self.bar = 1
         f = foo()
-        self.cx.bind(&quot;spam&quot;, f)
-        self.assertEqual(self.cx.execute(&quot;spam;&quot;), f.bar)
+        self.cx.bind(u&quot;spam&quot;, f)
+        self.assertEqual(self.cx.execute(u&quot;spam;&quot;), f.bar)
 
     def test_bind_global(self):
-        self.assertEqual(self.cx.execute('name;'), self.window.name)
-        self.assertEqual(self.cx.execute('arg;'), self.window.arg)
-        self.assertEqual(self.cx.execute('window;'), self.window)
-        self.assertEqual(self.cx.execute('window.arg;'), self.window.arg)
-        self.assertEqual(self.cx.execute('foo(12);'), &quot;hi 12&quot;)
-        self.assertEqual(self.cx.execute('arg;'), 12)
-        self.cx.execute('var spam = 13;')
-        self.assertEqual(self.cx.execute('spam;'), 13)
-        self.cx.execute('window.arg = 14;')
-        self.assertEqual(self.cx.execute('window.arg;'), 14)
+        self.assertEqual(self.cx.execute(u'name;'), self.window.name)
+        self.assertEqual(self.cx.execute(u'arg;'), self.window.arg)
+        self.assertEqual(self.cx.execute(u'window;'), self.window)
+        self.assertEqual(self.cx.execute(u'window.arg;'), self.window.arg)
+        self.assertEqual(self.cx.execute(u'foo(12);'), u&quot;hi 12&quot;)
+        self.assertEqual(self.cx.execute(u'arg;'), 12)
+        self.cx.execute(u'var spam = 13;')
+        self.assertEqual(self.cx.execute(u'spam;'), 13)
+        self.cx.execute(u'window.arg = 14;')
+        self.assertEqual(self.cx.execute(u'window.arg;'), 14)
         self.assertEqual(self.window.arg, 14)
     
     def test_referenced(self):
         def bind(cx):
-            cx.bind(&quot;data&quot;, object())
-        self.assertRaises(spidermonkey.JSError, self.cx.execute, &quot;data;&quot;)
+            cx.bind(u&quot;data&quot;, object())
+        self.assertRaises(spidermonkey.JSError, self.cx.execute, u&quot;data;&quot;)
         bind(self.cx)
-        self.assertNotEqual(self.cx.execute(&quot;data;&quot;), None)
-        self.assertEqual(self.cx.execute(&quot;data;&quot;), self.cx.unbind(&quot;data&quot;))
-        self.assertRaises(spidermonkey.JSError, self.cx.execute, &quot;data;&quot;)
\ No newline at end of file
+        self.assertNotEqual(self.cx.execute(u&quot;data;&quot;), None)
+        self.assertEqual(self.cx.execute(u&quot;data;&quot;), self.cx.unbind(u&quot;data&quot;))
+        self.assertRaises(spidermonkey.JSError, self.cx.execute, u&quot;data;&quot;)
+        
+if __name__ == &quot;__main__&quot;:
+    unittest.main()
\ No newline at end of file</diff>
      <filename>tests/bind_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ class ClassTests(unittest.TestCase):
             def __init__(self):
                 self.args = []
                 self.val = 42
-                self._private = &quot;no peeking&quot;
+                self._private = u&quot;no peeking&quot;
             def foo(self, *args):
                 self.args.append(args)
             def _private_method(self):
@@ -25,17 +25,17 @@ class ClassTests(unittest.TestCase):
                 self.val = value
         self.cx.install_class(spam)
         self.spam = spam()
-        self.cx.bind(&quot;bs&quot;, self.spam)
+        self.cx.bind(u&quot;bs&quot;, self.spam)
 
     def test_private(self):
-        self.assertEqual(self.cx.execute(&quot;bs._private;&quot;), None)
-        self.cx.execute(&quot;bs._private = 1;&quot;)
-        self.assertEqual(self.spam._private, &quot;no peeking&quot;)
-        self.assertEqual(self.cx.execute(&quot;bs._private_method;&quot;), None)
-        self.assertEqual(self.cx.execute(&quot;bs._private_method = 1;&quot;), True)
+        self.assertEqual(self.cx.execute(u&quot;bs._private;&quot;), None)
+        self.cx.execute(u&quot;bs._private = 1;&quot;)
+        self.assertEqual(self.spam._private, u&quot;no peeking&quot;)
+        self.assertEqual(self.cx.execute(u&quot;bs._private_method;&quot;), None)
+        self.assertEqual(self.cx.execute(u&quot;bs._private_method = 1;&quot;), True)
         self.assertEqual(isinstance(self.spam._private_method, types.MethodType), True)
         # in fact, even normal methods shouldn't be assignable to
-        self.assertEqual(self.cx.execute(&quot;bs.foo = 1;&quot;), True)
+        self.assertEqual(self.cx.execute(u&quot;bs.foo = 1;&quot;), True)
         self.assertEqual(isinstance(self.spam.foo, types.MethodType), True)
 
     def test_bind_module(self):
@@ -45,14 +45,14 @@ class ClassTests(unittest.TestCase):
         class foo:
             pass
         self.cx.install_class(foo, bind_constructor=False)
-        self.assertRaises(spidermonkey.JSError, self.cx.execute, &quot;var f = new foo();&quot;)
+        self.assertRaises(spidermonkey.JSError, self.cx.execute, u&quot;var f = new foo();&quot;)
         f2 = foo()
-        self.cx.bind(&quot;f2&quot;, f2)
-        self.assertEqual(self.cx.execute(&quot;f2;&quot;), f2)
+        self.cx.bind(u&quot;f2&quot;, f2)
+        self.assertEqual(self.cx.execute(u&quot;f2;&quot;), f2)
 
     def test_js_specific(self):
         class bar:
-            __jsname__ = &quot;eggs&quot;
+            __jsname__ = u&quot;eggs&quot;
             def __init__(self, arg):
                 self.arg = arg
             
@@ -60,30 +60,33 @@ class ClassTests(unittest.TestCase):
             def __jsinit__(cx):
                 return bar(42)
         self.cx.install_class(bar)
-        self.cx.execute(&quot;var e = new eggs();&quot;)
-        self.assertEqual(self.cx.execute(&quot;e.arg;&quot;), 42)
+        self.cx.execute(u&quot;var e = new eggs();&quot;)
+        self.assertEqual(self.cx.execute(u&quot;e.arg;&quot;), 42)
 
     def test_assign_new_property(self):
-        self.cx.execute(&quot;bs.xyzzy = 1;&quot;)
-        self.assertEqual(self.cx.execute(&quot;bs.xyzzy;&quot;), 1)
+        self.cx.execute(u&quot;bs.xyzzy = 1;&quot;)
+        self.assertEqual(self.cx.execute(u&quot;bs.xyzzy;&quot;), 1)
 
     def test_identity(self):
-        self.assertEqual(self.cx.execute(&quot;bs;&quot;), self.spam)
+        self.assertEqual(self.cx.execute(u&quot;bs;&quot;), self.spam)
 
     def test_call(self):
-        self.cx.execute('bs.foo(&quot;hi&quot;);')
-        self.assertEqual(self.spam.args.pop(), (&quot;hi&quot;,))
+        self.cx.execute(u'bs.foo(&quot;hi&quot;);')
+        self.assertEqual(self.spam.args.pop(), (u&quot;hi&quot;,))
 
     def test_construct(self):
-        s = self.cx.execute(&quot;&quot;&quot;\
+        s = self.cx.execute(u&quot;&quot;&quot;\
             var s = new spam();
             s.foo(1, &quot;blah&quot;, [&quot;1&quot;, 2, &quot;three&quot;]);
             s;
         &quot;&quot;&quot;)
-        self.assertEqual(s.args.pop(), (1, &quot;blah&quot;, [&quot;1&quot;, 2, &quot;three&quot;]))
+        self.assertEqual(s.args.pop(), (1, u&quot;blah&quot;, [u&quot;1&quot;, 2, u&quot;three&quot;]))
 
     def test_getsetitem(self):
         # property lookup with an integer is mapped to __get/__setitem__
-        self.assertEqual(self.cx.execute(&quot;bs[0];&quot;), 42)
-        self.cx.execute(&quot;bs[0] = 2;&quot;)
-        self.assertEqual(self.cx.execute(&quot;bs[0];&quot;), 2)
+        self.assertEqual(self.cx.execute(u&quot;bs[0];&quot;), 42)
+        self.cx.execute(u&quot;bs[0] = 2;&quot;)
+        self.assertEqual(self.cx.execute(u&quot;bs[0];&quot;), 2)
+        
+if __name__ == &quot;__main__&quot;:
+    unittest.main()</diff>
      <filename>tests/class_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -7,5 +7,8 @@ class ContextTest(unittest.TestCase):
         self.cx = rt.create_context()
 
     def test_scope(self):
-        self.cx.execute(&quot;var x = 42;&quot;)
-        self.assertEqual(self.cx.execute(&quot;x;&quot;), 42)
\ No newline at end of file
+        self.cx.execute(u&quot;var x = 42;&quot;)
+        self.assertEqual(self.cx.execute(u&quot;x;&quot;), 42)
+        
+if __name__ == &quot;__main__&quot;:
+    unittest.main()
\ No newline at end of file</diff>
      <filename>tests/context_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -7,14 +7,17 @@ class DefineFunctionTest(unittest.TestCase):
         self.cx = rt.create_context()
     
     def test_define_function(self):
-        resp = self.cx.execute(&quot;function(val) {return val * 2;}&quot;)
+        resp = self.cx.execute(u&quot;function(val) {return val * 2;}&quot;)
         self.assertEqual(resp(2), 4)
 
     def test_with_dict(self):
-        resp = self.cx.execute(&quot;function(doc) {if(doc.data) return doc.data;}&quot;)
-        self.assertEqual(resp({&quot;data&quot;: 2}), 2)
+        resp = self.cx.execute(u&quot;function(doc) {if(doc.data) return doc.data;}&quot;)
+        self.assertEqual(resp({u&quot;data&quot;: 2}), 2)
         self.assertEqual(resp({}), None)
     
     def test_throw(self):
-        resp = self.cx.execute(&quot;function(doc) {throw(\&quot;error\&quot;);}&quot;)
-        self.assertRaises(spidermonkey.JSError, resp)
\ No newline at end of file
+        resp = self.cx.execute(u&quot;function(doc) {throw(\&quot;error\&quot;);}&quot;)
+        self.assertRaises(spidermonkey.JSError, resp)
+        
+if __name__ == &quot;__main__&quot;:
+    unittest.main()
\ No newline at end of file</diff>
      <filename>tests/define_function_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -7,4 +7,7 @@ class BindTest(unittest.TestCase):
         self.cx = rt.create_context()
 
     def test_error_thrown(self):
-        self.assertRaises(spidermonkey.JSError, self.cx.execute, 'throw(&quot;foo&quot;)')
\ No newline at end of file
+        self.assertRaises(spidermonkey.JSError, self.cx.execute, u'throw(&quot;foo&quot;)')
+        
+if __name__ == &quot;__main__&quot;:
+    unittest.main()
\ No newline at end of file</diff>
      <filename>tests/error_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@ class RoundtripTest(unittest.TestCase):
         def echo(arg):
             self.x.append(arg)
             return arg
-        self.cx.bind(&quot;echo&quot;, echo)
+        self.cx.bind(u&quot;echo&quot;, echo)
 
     def check(self, script, arg):
         ret = self.cx.execute(script)
@@ -17,12 +17,15 @@ class RoundtripTest(unittest.TestCase):
         self.assertEqual(self.x.pop(), arg)
 
     def test_primitive_types(self):
-        self.check(&quot;echo(42);&quot;, 42)
-        self.check(&quot;echo(42.5);&quot;, 42.5)
-        self.check('echo(&quot;spam&quot;);', &quot;spam&quot;)
-        self.check(&quot;echo(undefined);&quot;, None)
-        self.check(&quot;echo(null);&quot;, None)
-        self.check(&quot;echo(true);&quot;, True)
-        self.check(&quot;echo(false);&quot;, False)
+        self.check(u&quot;echo(42);&quot;, 42)
+        self.check(u&quot;echo(42.5);&quot;, 42.5)
+        self.check(u'echo(&quot;spam&quot;);', u&quot;spam&quot;)
+        self.check(u&quot;echo(undefined);&quot;, None)
+        self.check(u&quot;echo(null);&quot;, None)
+        self.check(u&quot;echo(true);&quot;, True)
+        self.check(u&quot;echo(false);&quot;, False)
         #self.check(&quot;echo(Infinity);&quot;, XXX)
-        #self.check(&quot;echo(NaN);&quot;, XXX)
\ No newline at end of file
+        #self.check(&quot;echo(NaN);&quot;, XXX)
+
+if __name__ == '__main__':
+    unittest.main()</diff>
      <filename>tests/roundtrip_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -6,21 +6,24 @@ class ToPythonTest(unittest.TestCase):
         rt = spidermonkey.Runtime()
         self.cx = rt.create_context()
     def test_primitive_types(self):
-        self.assertEqual(self.cx.execute(&quot;42;&quot;), 42)
-        self.assertEqual(self.cx.execute(&quot;42.5;&quot;), 42.5)
-        self.assertEqual(self.cx.execute('&quot;spam&quot;;'), &quot;spam&quot;)
-        self.assertEqual(self.cx.execute(&quot;undefined;&quot;), None)
-        self.assertEqual(self.cx.execute(&quot;null;&quot;), None)
-        self.assertEqual(self.cx.execute(&quot;true;&quot;), True)
-        self.assertEqual(self.cx.execute(&quot;false;&quot;), False)
+        self.assertEqual(self.cx.execute(u&quot;42;&quot;), 42)
+        self.assertEqual(self.cx.execute(u&quot;42.5;&quot;), 42.5)
+        self.assertEqual(self.cx.execute(u'&quot;spam&quot;;'), u&quot;spam&quot;)
+        self.assertEqual(self.cx.execute(u&quot;undefined;&quot;), None)
+        self.assertEqual(self.cx.execute(u&quot;null;&quot;), None)
+        self.assertEqual(self.cx.execute(u&quot;true;&quot;), True)
+        self.assertEqual(self.cx.execute(u&quot;false;&quot;), False)
         #self.assert_(self.cx.execute(&quot;Infinity;&quot;) is XXX)
         #self.assert_(self.cx.execute(&quot;NaN;&quot;) is XXX)
 
     def test_container_types(self):
-        self.assertEqual(self.cx.execute(&quot;[1,2,3];&quot;), [1,2,3])
+        self.assertEqual(self.cx.execute(u&quot;[1,2,3];&quot;), [1,2,3])
         self.assertEqual(self.cx.execute(
-            'var d = {0: 0, &quot;a&quot;: 1, 2: &quot;b&quot;, &quot;c&quot;: &quot;d&quot;, &quot;blah&quot;: 2.5}; d;'),
-                     {0: 0, &quot;a&quot;: 1, 2: &quot;b&quot;, &quot;c&quot;: &quot;d&quot;, &quot;blah&quot;: 2.5})
+            u'var d = {0: 0, &quot;a&quot;: 1, 2: &quot;b&quot;, &quot;c&quot;: &quot;d&quot;, &quot;blah&quot;: 2.5}; d;'),
+                     {0: 0, u&quot;a&quot;: 1, 2: u&quot;b&quot;, u&quot;c&quot;: u&quot;d&quot;, u&quot;blah&quot;: 2.5})
         self.assertEqual(self.cx.execute(
-            '[&quot;foo&quot;, 2, {&quot;bar&quot;: 2.3, &quot;spam&quot;: [1,2,3]}];'),
-                     [&quot;foo&quot;, 2, {&quot;bar&quot;: 2.3, &quot;spam&quot;: [1,2,3]}])
\ No newline at end of file
+            u'[&quot;foo&quot;, 2, {&quot;bar&quot;: 2.3, &quot;spam&quot;: [1,2,3]}];'),
+                     [u&quot;foo&quot;, 2, {u&quot;bar&quot;: 2.3, u&quot;spam&quot;: [1,2,3]}])
+
+if __name__ == &quot;__main__&quot;:
+    unittest.main()
\ No newline at end of file</diff>
      <filename>tests/to_python_test.py</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>tests/bind_test.pyc</filename>
    </removed>
    <removed>
      <filename>tests/class_test.pyc</filename>
    </removed>
    <removed>
      <filename>tests/context_test.pyc</filename>
    </removed>
    <removed>
      <filename>tests/define_function_test.pyc</filename>
    </removed>
    <removed>
      <filename>tests/error_test.pyc</filename>
    </removed>
    <removed>
      <filename>tests/roundtrip_test.pyc</filename>
    </removed>
    <removed>
      <filename>tests/to_python_test.pyc</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>f777240d46ec91a8058163d66bccaeed4d176a6b</id>
    </parent>
  </parents>
  <author>
    <name>davisp</name>
    <email>davisp@davis2318.hsd1.ma.comcast.net</email>
  </author>
  <url>http://github.com/davisp/python-spidermonkey/commit/e57d094648fd3ccd224c68e8a04a9f0693375b6e</url>
  <id>e57d094648fd3ccd224c68e8a04a9f0693375b6e</id>
  <committed-date>2009-01-30T00:32:01-08:00</committed-date>
  <authored-date>2009-01-30T00:32:01-08:00</authored-date>
  <message>Unicode enabled python-spidermonkey.

Did I really commit *.pyc files before?</message>
  <tree>e6989a56b62fa9fbfb6d2fc7c31c328045e62980</tree>
  <committer>
    <name>davisp</name>
    <email>davisp@davis2318.hsd1.ma.comcast.net</email>
  </committer>
</commit>
