Merge branch 'spiderup'

This commit is contained in:
Josh Matthews 2012-08-24 10:37:31 -07:00
commit 04d18d128a
10 changed files with 107 additions and 53 deletions

View file

@ -21,7 +21,7 @@ mkdir -p src/rust-hubbub || exit $?
mkdir -p src/test/ref || 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-opengles && sh ${SRCDIR}/src/rust-opengles/configure) || exit $?
(cd src/rust-harfbuzz && sh ${SRCDIR}/src/rust-harfbuzz/configure) || exit $? (cd src/rust-harfbuzz && sh ${SRCDIR}/src/rust-harfbuzz/configure) || exit $?
(cd src/rust-mozjs && sh ${SRCDIR}/src/rust-mozjs/configure) || exit $? (cd src/rust-mozjs && sh ${SRCDIR}/src/rust-mozjs/configure) || exit $?

@ -1 +1 @@
Subproject commit 8cf5c9b76a84e1304acd09523facaa1a30e3ba57 Subproject commit 4fc39c96b0f121f1b61c7541aaa3de2a84246aad

@ -1 +1 @@
Subproject commit 9bf630c5f2035a29e7ccee0ca94e9c4568815f7b Subproject commit 1dbbc2ee587634bda13d4c32957c2b1a0ce167cc

View file

@ -1,6 +1,6 @@
import js::rust::{compartment, bare_compartment, methods, jsobj}; 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, import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED,
JS_SET_RVAL}; JSVAL_NULL, JS_THIS_OBJECT, JS_SET_RVAL, JSPROP_NATIVE_ACCESSORS};
import js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp}; import js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp};
import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError, import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN, JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
@ -60,11 +60,17 @@ enum Element = int;
return 1; 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 box = unwrap(obj);
let node = (*box).payload.root; let node = (*box).payload.root;
let scope = (*box).payload.scope; 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; return 1;
} }
@ -88,12 +94,12 @@ fn init(compartment: bare_compartment, doc: @Document) {
let attrs = @~[ let attrs = @~[
{name: compartment.add_name(~"documentElement"), {name: compartment.add_name(~"documentElement"),
tinyid: 0, tinyid: 0,
flags: 0, flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
getter: getDocumentElement, getter: {op: getDocumentElement, info: null()},
setter: null()}]; setter: {op: null(), info: null()}}];
vec::push(compartment.global_props, attrs); vec::push(compartment.global_props, attrs);
vec::as_buf(*attrs, |specs, _len| { 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)); compartment.register_class(utils::instance_jsclass(~"DocumentInstance", finalize));

View file

@ -1,6 +1,6 @@
import js::rust::{bare_compartment, methods, jsobj}; import js::rust::{bare_compartment, methods, jsobj};
import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL, 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::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSPropertySpec};
import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError, import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN, JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
@ -32,9 +32,9 @@ fn init(compartment: bare_compartment) {
let attrs = @~[ let attrs = @~[
{name: compartment.add_name(~"tagName"), {name: compartment.add_name(~"tagName"),
tinyid: 0, tinyid: 0,
flags: 0, flags: (JSPROP_ENUMERATE | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS) as u8,
getter: getTagName, getter: {op: getTagName, info: null()},
setter: null()}]; setter: {op: null(), info: null()}}];
vec::push(compartment.global_props, attrs); vec::push(compartment.global_props, attrs);
vec::as_buf(*attrs, |specs, _len| { vec::as_buf(*attrs, |specs, _len| {
JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs); JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs);
@ -52,17 +52,22 @@ fn init(compartment: bare_compartment) {
let attrs = @~[ let attrs = @~[
{name: compartment.add_name(~"width"), {name: compartment.add_name(~"width"),
tinyid: 0, tinyid: 0,
flags: (JSPROP_SHARED | JSPROP_ENUMERATE) as u8, flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
getter: HTMLImageElement_getWidth, getter: {op: HTMLImageElement_getWidth, info: null()},
setter: HTMLImageElement_setWidth}]; setter: {op: HTMLImageElement_setWidth, info: null()}}];
vec::push(compartment.global_props, attrs); vec::push(compartment.global_props, attrs);
vec::as_buf(*attrs, |specs, _len| { vec::as_buf(*attrs, |specs, _len| {
JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs); JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs);
}); });
} }
extern fn HTMLImageElement_getWidth(_cx: *JSContext, obj: *JSObject, _id: jsid, extern fn HTMLImageElement_getWidth(cx: *JSContext, _argc: c_uint, vp: *mut jsval)
rval: *mut jsval) -> JSBool unsafe { -> JSBool unsafe {
let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
if obj.is_null() {
return 0;
}
let bundle = unwrap(obj); let bundle = unwrap(obj);
let width = (*bundle).payload.scope.write((*bundle).payload.node, |nd| { let width = (*bundle).payload.scope.write((*bundle).payload.node, |nd| {
match nd.kind { match nd.kind {
@ -75,13 +80,18 @@ extern fn HTMLImageElement_getWidth(_cx: *JSContext, obj: *JSObject, _id: jsid,
_ => fail ~"why is this not an element?" _ => 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); (au_to_px(width) & (i32::max_value as int)) as libc::c_int);
return 1; return 1;
} }
extern fn HTMLImageElement_setWidth(_cx: *JSContext, obj: *JSObject, _id: jsid, extern fn HTMLImageElement_setWidth(cx: *JSContext, _argc: c_uint, vp: *mut jsval)
_strict: JSBool, vp: *jsval) -> JSBool unsafe { -> JSBool unsafe {
let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
if obj.is_null() {
return 0;
}
let bundle = unwrap(obj); let bundle = unwrap(obj);
do (*bundle).payload.scope.write((*bundle).payload.node) |nd| { do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
match nd.kind { match nd.kind {
@ -98,19 +108,24 @@ extern fn HTMLImageElement_setWidth(_cx: *JSContext, obj: *JSObject, _id: jsid,
return 1; 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 { -> JSBool {
unsafe { unsafe {
let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
if obj.is_null() {
return 0;
}
let bundle = unwrap(obj); let bundle = unwrap(obj);
do (*bundle).payload.scope.write((*bundle).payload.node) |nd| { do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
match nd.kind { match nd.kind {
~Element(ed) => { ~Element(ed) => {
let s = str(copy ed.tag_name); 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 //XXXjdm should probably read the spec to figure out what to do here
*rval = JSVAL_NULL; *vp = JSVAL_NULL;
} }
} }
}; };

View file

@ -1,6 +1,6 @@
import js::rust::{bare_compartment, methods, jsobj}; import js::rust::{bare_compartment, methods, jsobj};
import js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL, 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::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSPropertySpec};
import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError, import js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN, JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
@ -20,15 +20,15 @@ fn init(compartment: bare_compartment) {
let attrs = @~[ let attrs = @~[
{name: compartment.add_name(~"firstChild"), {name: compartment.add_name(~"firstChild"),
tinyid: 0, tinyid: 0,
flags: 0, flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
getter: getFirstChild, getter: {op: getFirstChild, info: null()},
setter: null()}, setter: {op: null(), info: null()}},
{name: compartment.add_name(~"nextSibling"), {name: compartment.add_name(~"nextSibling"),
tinyid: 0, tinyid: 0,
flags: 0, flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
getter: getNextSibling, getter: {op: getNextSibling, info: null()},
setter: null()}]; setter: {op: null(), info: null()}}];
vec::push(compartment.global_props, attrs); vec::push(compartment.global_props, attrs);
vec::as_buf(*attrs, |specs, _len| { vec::as_buf(*attrs, |specs, _len| {
JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs); 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)) 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 { unsafe {
let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
if obj.is_null() {
return 0;
}
let bundle = unwrap(obj); let bundle = unwrap(obj);
do (*bundle).payload.scope.write((*bundle).payload.node) |nd| { do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
match nd.tree.first_child { match nd.tree.first_child {
some(n) => { some(n) => {
let obj = create(cx, n, (*bundle).payload.scope).ptr; let obj = create(cx, n, (*bundle).payload.scope).ptr;
*rval = RUST_OBJECT_TO_JSVAL(obj); *vp = RUST_OBJECT_TO_JSVAL(obj);
} }
none => { 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; 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 { unsafe {
let obj = JS_THIS_OBJECT(cx, unsafe::reinterpret_cast(vp));
if obj.is_null() {
return 0;
}
let bundle = unwrap(obj); let bundle = unwrap(obj);
do (*bundle).payload.scope.write((*bundle).payload.node) |nd| { do (*bundle).payload.scope.write((*bundle).payload.node) |nd| {
match nd.tree.next_sibling { match nd.tree.next_sibling {
some(n) => { some(n) => {
let obj = create(cx, n, (*bundle).payload.scope).ptr; let obj = create(cx, n, (*bundle).payload.scope).ptr;
*rval = RUST_OBJECT_TO_JSVAL(obj); *vp = RUST_OBJECT_TO_JSVAL(obj);
} }
none => { none => {
*rval = JSVAL_NULL; *vp = JSVAL_NULL;
} }
} }
}; };
} }
return 1; 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;
}

View file

@ -109,8 +109,8 @@ fn prototype_jsclass(name: ~str) -> fn(bare_compartment) -> JSClass {
finalize: null(), finalize: null(),
checkAccess: null(), checkAccess: null(),
call: null(), call: null(),
construct: null(),
hasInstance: has_instance, hasInstance: has_instance,
construct: null(),
trace: null(), trace: null(),
reserved: (null(), null(), null(), null(), null(), // 05 reserved: (null(), null(), null(), null(), null(), // 05
null(), null(), null(), null(), null(), // 10 null(), null(), null(), null(), null(), // 10
@ -138,8 +138,8 @@ fn instance_jsclass(name: ~str, finalize: *u8)
finalize: finalize, finalize: finalize,
checkAccess: null(), checkAccess: null(),
call: null(), call: null(),
construct: null(),
hasInstance: has_instance, hasInstance: has_instance,
construct: null(),
trace: null(), trace: null(),
reserved: (null(), null(), null(), null(), null(), // 05 reserved: (null(), null(), null(), null(), null(), // 05
null(), null(), null(), null(), null(), // 10 null(), null(), null(), null(), null(), // 10

View file

@ -87,17 +87,19 @@ fn init(compartment: bare_compartment, win: @Window) {
/* Define methods on a window */ /* Define methods on a window */
let methods = ~[{name: compartment.add_name(~"alert"), let methods = ~[{name: compartment.add_name(~"alert"),
call: alert, call: {op: alert, info: null()},
nargs: 1, nargs: 1,
flags: 0}, flags: 0,
selfHostedName: null()},
{name: compartment.add_name(~"setTimeout"), {name: compartment.add_name(~"setTimeout"),
call: setTimeout, call: {op: setTimeout, info: null()},
nargs: 2, nargs: 2,
flags: 0}]; flags: 0,
selfHostedName: null()}];
vec::as_buf(methods, |fns, _len| { vec::as_buf(methods, |fns, _len| {
JS_DefineFunctions(compartment.cx.ptr, proto.ptr, fns); JS_DefineFunctions(compartment.cx.ptr, proto.ptr, fns);
}); });
unsafe { unsafe {
let raw_ptr: *libc::c_void = unsafe::reinterpret_cast(squirrel_away(win)); let raw_ptr: *libc::c_void = unsafe::reinterpret_cast(squirrel_away(win));

View file

@ -1,2 +1,2 @@
<img src="test.jpeg"></img> <div></div>
<script src="test_getter_time.js"></script> <script src="test_getter_time.js"></script>

View file

@ -1,9 +1,11 @@
var elem = document.documentElement.firstChild; var elem = document.documentElement.firstChild;
var start = new Date().getTime();
for (var i = 0; i < 10000; i++) var start = (new Date()).getTime();
var a = elem.width; for (var i = 0; i < 100000; i++)
window.alert(new Date().getTime() - start); var a = elem.nodeType;
start = new Date().getTime(); window.alert((new Date()).getTime() - start);
/*start = new Date().getTime();
for (i = 0; i < 10000; i++) for (i = 0; i < 10000; i++)
elem.width = i; elem.width = i;
window.alert(new Date().getTime() - start); window.alert(new Date().getTime() - start);*/