diff --git a/configure.in b/configure.in
index c65db83c24e..a5caa2066b6 100755
--- a/configure.in
+++ b/configure.in
@@ -21,7 +21,7 @@ mkdir -p src/rust-hubbub || exit $?
 
 mkdir -p src/test/ref || exit $?
 
-(cd src/mozjs && sh ${SRCDIR}/src/mozjs/js/src/configure --enable-debug --disable-optimize) || exit $?
+(cd src/mozjs && sh ${SRCDIR}/src/mozjs/js/src/configure) || exit $?
 (cd src/rust-opengles && sh ${SRCDIR}/src/rust-opengles/configure) || exit $?
 (cd src/rust-harfbuzz && sh ${SRCDIR}/src/rust-harfbuzz/configure) || exit $?
 (cd src/rust-mozjs && sh ${SRCDIR}/src/rust-mozjs/configure) || exit $?
diff --git a/src/mozjs b/src/mozjs
index 8cf5c9b76a8..4fc39c96b0f 160000
--- a/src/mozjs
+++ b/src/mozjs
@@ -1 +1 @@
-Subproject commit 8cf5c9b76a84e1304acd09523facaa1a30e3ba57
+Subproject commit 4fc39c96b0f121f1b61c7541aaa3de2a84246aad
diff --git a/src/rust-mozjs b/src/rust-mozjs
index 9bf630c5f20..1dbbc2ee587 160000
--- a/src/rust-mozjs
+++ b/src/rust-mozjs
@@ -1 +1 @@
-Subproject commit 9bf630c5f2035a29e7ccee0ca94e9c4568815f7b
+Subproject commit 1dbbc2ee587634bda13d4c32957c2b1a0ce167cc
diff --git a/src/servo/dom/bindings/document.rs b/src/servo/dom/bindings/document.rs
index a034e10ab21..fd9dbfd829b 100644
--- a/src/servo/dom/bindings/document.rs
+++ b/src/servo/dom/bindings/document.rs
@@ -1,6 +1,6 @@
 import js::rust::{compartment, bare_compartment, methods, jsobj};
-import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL, JS_THIS_OBJECT,
-            JS_SET_RVAL};
+import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED,
+            JSVAL_NULL, JS_THIS_OBJECT, JS_SET_RVAL, JSPROP_NATIVE_ACCESSORS};
 import js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp};
 import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
                             JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
@@ -60,11 +60,17 @@ enum Element = int;
     return 1;
 }*/
 
-extern fn getDocumentElement(cx: *JSContext, obj: *JSObject, _id: jsid, rval: *mut jsval) -> JSBool unsafe {
+extern fn getDocumentElement(cx: *JSContext, _argc: c_uint, vp: *mut jsval)
+    -> JSBool unsafe {
+    let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+    if obj.is_null() {
+        return 0;
+    }
+
     let box = unwrap(obj);
     let node = (*box).payload.root;
     let scope = (*box).payload.scope;
-    *rval = RUST_OBJECT_TO_JSVAL(node::create(cx, node, scope).ptr);
+    *vp = RUST_OBJECT_TO_JSVAL(node::create(cx, node, scope).ptr);
     return 1;
 }
 
@@ -88,12 +94,12 @@ fn init(compartment: bare_compartment, doc: @Document) {
     let attrs = @~[
         {name: compartment.add_name(~"documentElement"),
          tinyid: 0,
-         flags: 0,
-         getter: getDocumentElement,
-         setter: null()}];
+         flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
+         getter: {op: getDocumentElement, info: null()},
+         setter: {op: null(), info: null()}}];
     vec::push(compartment.global_props, attrs);
     vec::as_buf(*attrs, |specs, _len| {
-        JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs);
+        assert JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs) == 1;
     });
 
     compartment.register_class(utils::instance_jsclass(~"DocumentInstance", finalize));
diff --git a/src/servo/dom/bindings/element.rs b/src/servo/dom/bindings/element.rs
index 6f90c79a051..3172d29c1e5 100644
--- a/src/servo/dom/bindings/element.rs
+++ b/src/servo/dom/bindings/element.rs
@@ -1,6 +1,6 @@
 import js::rust::{bare_compartment, methods, jsobj};
 import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL,
-            JS_THIS_OBJECT, JS_SET_RVAL};
+            JS_THIS_OBJECT, JS_SET_RVAL, JSPROP_NATIVE_ACCESSORS};
 import js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSPropertySpec};
 import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
                             JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
@@ -32,9 +32,9 @@ fn init(compartment: bare_compartment) {
     let attrs = @~[
         {name: compartment.add_name(~"tagName"),
          tinyid: 0,
-         flags: 0,
-         getter: getTagName,
-         setter: null()}];
+         flags: (JSPROP_ENUMERATE | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS) as u8,
+         getter: {op: getTagName, info: null()},
+         setter: {op: null(), info: null()}}];
     vec::push(compartment.global_props, attrs);
     vec::as_buf(*attrs, |specs, _len| {
         JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs);
@@ -52,17 +52,22 @@ fn init(compartment: bare_compartment) {
     let attrs = @~[
         {name: compartment.add_name(~"width"),
          tinyid: 0,
-         flags: (JSPROP_SHARED | JSPROP_ENUMERATE) as u8,
-         getter: HTMLImageElement_getWidth,
-         setter: HTMLImageElement_setWidth}];
+         flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
+         getter: {op: HTMLImageElement_getWidth, info: null()},
+         setter: {op: HTMLImageElement_setWidth, info: null()}}];
     vec::push(compartment.global_props, attrs);
     vec::as_buf(*attrs, |specs, _len| {
         JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs);
     });
 }
 
-extern fn HTMLImageElement_getWidth(_cx: *JSContext, obj: *JSObject, _id: jsid,
-                                    rval: *mut jsval) -> JSBool unsafe {
+extern fn HTMLImageElement_getWidth(cx: *JSContext, _argc: c_uint, vp: *mut jsval)
+    -> JSBool unsafe {
+    let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+    if obj.is_null() {
+        return 0;
+    }
+
     let bundle = unwrap(obj);
     let width = (*bundle).payload.scope.write((*bundle).payload.node, |nd| {
         match nd.kind {
@@ -75,13 +80,18 @@ extern fn HTMLImageElement_getWidth(_cx: *JSContext, obj: *JSObject, _id: jsid,
           _ => fail ~"why is this not an element?"
         }
     });
-    *rval = RUST_INT_TO_JSVAL(
+    *vp = RUST_INT_TO_JSVAL(
               (au_to_px(width) & (i32::max_value as int)) as libc::c_int);
     return 1;
 }
 
-extern fn HTMLImageElement_setWidth(_cx: *JSContext, obj: *JSObject, _id: jsid,
-                                    _strict: JSBool, vp: *jsval) -> JSBool unsafe {
+extern fn HTMLImageElement_setWidth(cx: *JSContext, _argc: c_uint, vp: *mut jsval)
+    -> JSBool unsafe {
+    let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+    if obj.is_null() {
+        return 0;
+    }
+
     let bundle = unwrap(obj);
     do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
         match nd.kind {
@@ -98,19 +108,24 @@ extern fn HTMLImageElement_setWidth(_cx: *JSContext, obj: *JSObject, _id: jsid,
     return 1;
 }
 
-extern fn getTagName(cx: *JSContext, obj: *JSObject, _id: jsid, rval: *mut jsval)
+extern fn getTagName(cx: *JSContext, _argc: c_uint, vp: *mut jsval)
     -> JSBool {
     unsafe {
+        let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+        if obj.is_null() {
+            return 0;
+        }
+
         let bundle = unwrap(obj);
         do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
             match nd.kind {
               ~Element(ed) => {
                 let s = str(copy ed.tag_name);
-                *rval = domstring_to_jsval(cx, s);
+                *vp = domstring_to_jsval(cx, s);
               }
               _ => {
                 //XXXjdm should probably read the spec to figure out what to do here
-                *rval = JSVAL_NULL;
+                *vp = JSVAL_NULL;
               }
             }
         };
diff --git a/src/servo/dom/bindings/node.rs b/src/servo/dom/bindings/node.rs
index 138535054f7..47e7cfa3834 100644
--- a/src/servo/dom/bindings/node.rs
+++ b/src/servo/dom/bindings/node.rs
@@ -1,6 +1,6 @@
 import js::rust::{bare_compartment, methods, jsobj};
 import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL,
-            JS_THIS_OBJECT, JS_SET_RVAL};
+            JS_THIS_OBJECT, JS_SET_RVAL, JSPROP_NATIVE_ACCESSORS};
 import js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSPropertySpec};
 import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
                             JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
@@ -20,15 +20,15 @@ fn init(compartment: bare_compartment) {
     let attrs = @~[
         {name: compartment.add_name(~"firstChild"),
          tinyid: 0,
-         flags: 0,
-         getter: getFirstChild,
-         setter: null()},
+         flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
+         getter: {op: getFirstChild, info: null()},
+         setter: {op: null(), info: null()}},
 
         {name: compartment.add_name(~"nextSibling"),
          tinyid: 0,
-         flags: 0,
-         getter: getNextSibling,
-         setter: null()}];
+         flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
+         getter: {op: getNextSibling, info: null()},
+         setter: {op: null(), info: null()}}];
     vec::push(compartment.global_props, attrs);
     vec::as_buf(*attrs, |specs, _len| {
         JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs);
@@ -64,17 +64,22 @@ unsafe fn unwrap(obj: *JSObject) -> *rust_box<NodeBundle> {
     unsafe::reinterpret_cast(RUST_JSVAL_TO_PRIVATE(val))
 }
 
-extern fn getFirstChild(cx: *JSContext, obj: *JSObject, _id: jsid, rval: *mut jsval) -> JSBool {
+extern fn getFirstChild(cx: *JSContext, _argc: c_uint, vp: *mut jsval) -> JSBool {
     unsafe {
+        let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+        if obj.is_null() {
+            return 0;
+        }
+
         let bundle = unwrap(obj);
         do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
             match nd.tree.first_child {
               some(n) => {
                 let obj = create(cx, n, (*bundle).payload.scope).ptr;
-                *rval = RUST_OBJECT_TO_JSVAL(obj);
+                *vp = RUST_OBJECT_TO_JSVAL(obj);
               }
               none => {
-                *rval = JSVAL_NULL;
+                *vp = JSVAL_NULL;
               }
             }
         };
@@ -82,20 +87,44 @@ extern fn getFirstChild(cx: *JSContext, obj: *JSObject, _id: jsid, rval: *mut js
     return 1;
 }
 
-extern fn getNextSibling(cx: *JSContext, obj: *JSObject, _id: jsid, rval: *mut jsval) -> JSBool {
+extern fn getNextSibling(cx: *JSContext, _argc: c_uint, vp: *mut jsval) -> JSBool {
     unsafe {
+        let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+        if obj.is_null() {
+            return 0;
+        }
+
         let bundle = unwrap(obj);
         do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
             match nd.tree.next_sibling {
               some(n) => {
                 let obj = create(cx, n, (*bundle).payload.scope).ptr;
-                *rval = RUST_OBJECT_TO_JSVAL(obj);
+                *vp = RUST_OBJECT_TO_JSVAL(obj);
               }
               none => {
-                *rval = JSVAL_NULL;
+                *vp = JSVAL_NULL;
               }
             }
         };
     }
     return 1;
 }
+
+extern fn getNodeType(cx: *JSContext, _argc: c_uint, vp: *mut jsval) -> JSBool {
+    unsafe {
+        let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
+        if obj.is_null() {
+            return 0;
+        }
+
+        let bundle = unwrap(obj);
+        let nodeType = do (*bundle).payload.node.read |nd| {
+            match nd.kind {
+              ~Element(*) => 1,
+              ~Text(*) => 3
+            }
+        };
+        *vp = RUST_INT_TO_JSVAL(nodeType);
+    }
+    return 1;
+}
diff --git a/src/servo/dom/bindings/utils.rs b/src/servo/dom/bindings/utils.rs
index 64437aa24fd..da902d090f5 100644
--- a/src/servo/dom/bindings/utils.rs
+++ b/src/servo/dom/bindings/utils.rs
@@ -109,8 +109,8 @@ fn prototype_jsclass(name: ~str) -> fn(bare_compartment) -> JSClass {
          finalize: null(),
          checkAccess: null(),
          call: null(),
-         construct: null(),
          hasInstance: has_instance,
+         construct: null(),
          trace: null(),
          reserved: (null(), null(), null(), null(), null(),  // 05
                     null(), null(), null(), null(), null(),  // 10
@@ -138,8 +138,8 @@ fn instance_jsclass(name: ~str, finalize: *u8)
          finalize: finalize,
          checkAccess: null(),
          call: null(),
-         construct: null(),
          hasInstance: has_instance,
+         construct: null(),
          trace: null(),
          reserved: (null(), null(), null(), null(), null(),  // 05
                     null(), null(), null(), null(), null(),  // 10
diff --git a/src/servo/dom/bindings/window.rs b/src/servo/dom/bindings/window.rs
index eac0ca75e1e..938e3d57e45 100644
--- a/src/servo/dom/bindings/window.rs
+++ b/src/servo/dom/bindings/window.rs
@@ -87,17 +87,19 @@ fn init(compartment: bare_compartment, win: @Window) {
 
     /* Define methods on a window */
     let methods = ~[{name: compartment.add_name(~"alert"),
-                     call: alert,
+                     call: {op: alert, info: null()},
                      nargs: 1,
-                     flags: 0},
+                     flags: 0,
+                     selfHostedName: null()},
                     {name: compartment.add_name(~"setTimeout"),
-                     call: setTimeout,
+                     call: {op: setTimeout, info: null()},
                      nargs: 2,
-                     flags: 0}];
+                     flags: 0,
+                     selfHostedName: null()}];
 
     vec::as_buf(methods, |fns, _len| {
         JS_DefineFunctions(compartment.cx.ptr, proto.ptr, fns);
-      });
+    });
 
     unsafe {
         let raw_ptr: *libc::c_void = unsafe::reinterpret_cast(squirrel_away(win));
diff --git a/src/test/test_getter_time.html b/src/test/test_getter_time.html
index 568aab5d138..733f78e91b5 100644
--- a/src/test/test_getter_time.html
+++ b/src/test/test_getter_time.html
@@ -1,2 +1,2 @@
-<img src="test.jpeg"></img>
+<div></div>
 <script src="test_getter_time.js"></script>
diff --git a/src/test/test_getter_time.js b/src/test/test_getter_time.js
index fe02739bd60..aa784bb0aad 100644
--- a/src/test/test_getter_time.js
+++ b/src/test/test_getter_time.js
@@ -1,9 +1,11 @@
 var elem = document.documentElement.firstChild;
-var start = new Date().getTime();
-for (var i = 0; i < 10000; i++)
-  var a = elem.width;
-window.alert(new Date().getTime() - start);
-start = new Date().getTime();
+
+var start = (new Date()).getTime();
+for (var i = 0; i < 100000; i++)
+  var a = elem.nodeType;
+window.alert((new Date()).getTime() - start);
+
+/*start = new Date().getTime();
 for (i = 0; i < 10000; i++)
   elem.width = i;
-window.alert(new Date().getTime() - start);
\ No newline at end of file
+window.alert(new Date().getTime() - start);*/
\ No newline at end of file