From 6d5dc9d6e76a56ea8e357b1bbcc074c6d37592a8 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 24 Aug 2012 09:40:36 -0700 Subject: [PATCH] Upgrade to spidermonkey tip. --- configure.in | 2 +- src/mozjs | 2 +- src/rust-mozjs | 2 +- src/servo/dom/bindings/document.rs | 22 +++++++----- src/servo/dom/bindings/element.rs | 45 ++++++++++++++++-------- src/servo/dom/bindings/node.rs | 55 +++++++++++++++++++++++------- src/servo/dom/bindings/utils.rs | 4 +-- src/servo/dom/bindings/window.rs | 12 ++++--- src/test/test_getter_time.html | 2 +- src/test/test_getter_time.js | 14 ++++---- 10 files changed, 107 insertions(+), 53 deletions(-) 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 { 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 @@ - +
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