diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 305a53a8096..cb9dd703604 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2060,7 +2060,7 @@ def DOMObjectPointerArg(descriptor): return DOMObjectPointerType(descriptor) + descriptor.concreteType def CreateBindingJSObject(descriptor, parent=None): - create = " let raw: *mut %s = &mut *aObject;\n" % descriptor.concreteType; + create = " let mut raw: JS<%s> = JS::from_raw(&mut *aObject);\n" % descriptor.concreteType if descriptor.proxy: assert not descriptor.createGlobal handler = """ @@ -2071,9 +2071,7 @@ def CreateBindingJSObject(descriptor, parent=None): &PrivateValue(squirrel_away_unboxed(aObject) as *libc::c_void), proto, %s, ptr::null(), ptr::null()); - if obj.is_null() { - return ptr::null(); - } + assert!(obj.is_not_null()); """ % (parent) else: @@ -2081,9 +2079,7 @@ def CreateBindingJSObject(descriptor, parent=None): create += " let obj = CreateDOMGlobal(aCx, &Class.base);\n" else: create += " let obj = JS_NewObject(aCx, &Class.base, proto, %s);\n" % parent - create += """ if obj.is_null() { - return ptr::null(); - } + create += """ assert!(obj.is_not_null()); JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32, PrivateValue(squirrel_away_unboxed(aObject) as *libc::c_void)); @@ -2099,7 +2095,8 @@ class CGWrapMethod(CGAbstractMethod): else: args = [Argument('*JSContext', 'aCx'), Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)] - CGAbstractMethod.__init__(self, descriptor, 'Wrap', '*JSObject', args, pub=True) + retval = 'JS<%s>' % descriptor.concreteType + CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args, pub=True) def definition_body(self): if not self.descriptor.createGlobal: @@ -2110,22 +2107,20 @@ class CGWrapMethod(CGAbstractMethod): //JSAutoCompartment ac(aCx, scope); let proto = GetProtoObject(aCx, scope, scope); - if proto.is_null() { - return ptr::null(); - } + assert!(proto.is_not_null()); %s - (*raw).mut_reflector().set_jsobject(obj); + raw.mut_reflector().set_jsobject(obj); - return obj;""" % CreateBindingJSObject(self.descriptor, "scope") + return raw;""" % CreateBindingJSObject(self.descriptor, "scope") else: return """ %s let proto = GetProtoObject(aCx, obj, obj); JS_SetPrototype(aCx, obj, proto); - (*raw).mut_reflector().set_jsobject(obj); - return obj;""" % CreateBindingJSObject(self.descriptor) + raw.mut_reflector().set_jsobject(obj); + return raw;""" % CreateBindingJSObject(self.descriptor) class CGAbstractExternMethod(CGAbstractMethod): """ diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs index 69758f2980a..c8607f58990 100644 --- a/src/components/script/dom/bindings/js.rs +++ b/src/components/script/dom/bindings/js.rs @@ -4,7 +4,7 @@ use dom::bindings::utils::{Reflector, Reflectable}; use dom::window::Window; -use js::jsapi::{JSContext, JSObject}; +use js::jsapi::JSContext; use layout_interface::TrustedNodeAddress; use std::cast; @@ -29,17 +29,10 @@ impl Clone for JS { } impl JS { - pub fn new(mut obj: ~T, + pub fn new(obj: ~T, window: &JS, - wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> *JSObject) -> JS { - let cx = window.get().get_cx(); - let raw: *mut T = &mut *obj; - if wrap_fn(cx, window, obj).is_null() { - fail!("Could not eagerly wrap object"); - } - JS { - ptr: RefCell::new(raw) - } + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> JS) -> JS { + wrap_fn(window.get().get_cx(), window, obj) } pub unsafe fn from_raw(raw: *mut T) -> JS { diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index e7385fc1ddd..04a0ddf5d0a 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -424,7 +424,7 @@ pub trait Reflectable { pub fn reflect_dom_object (obj: ~T, window: &JS, - wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> *JSObject) + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~T) -> JS) -> JS { JS::new(obj, window, wrap_fn) } diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 3cf1d35459a..a07c0c7e191 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -40,7 +40,7 @@ use servo_util::str::DOMString; use collections::hashmap::HashMap; use extra::url::{Url, from_str}; -use js::jsapi::{JSObject, JSContext}; +use js::jsapi::JSContext; use std::ascii::StrAsciiExt; use serialize::{Encoder, Encodable}; @@ -87,7 +87,7 @@ impl Document { pub fn reflect_document (document: ~D, window: &JS, - wrap_fn: extern "Rust" fn(*JSContext, &JS, ~D) -> *JSObject) + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~D) -> JS) -> JS { assert!(document.reflector().get_jsobject().is_null()); let raw_doc = reflect_dom_object(document, window, wrap_fn); diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 71b2b121136..08732836dbc 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -769,7 +769,7 @@ impl Node { pub fn reflect_node (node: ~N, document: &JS, - wrap_fn: extern "Rust" fn(*JSContext, &JS, ~N) -> *JSObject) + wrap_fn: extern "Rust" fn(*JSContext, &JS, ~N) -> JS) -> JS { assert!(node.reflector().get_jsobject().is_null()); let node = reflect_dom_object(node, &document.get().window, wrap_fn); diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 2ef70b0eac7..18a7fd73059 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -284,7 +284,7 @@ impl Window { compositor: ~ScriptListener, image_cache_task: ImageCacheTask) -> JS { - let mut win = ~Window { + let win = ~Window { eventtarget: EventTarget::new_inherited(WindowTypeId), script_chan: script_chan.clone(), console: None, @@ -314,23 +314,22 @@ impl Window { next_timer_handle: 0 }; - let raw: *mut Window = &mut *win; let global = WindowBinding::Wrap(cx, win); - assert!(global.is_not_null()); - unsafe { - let fn_names = ["window","self"]; - for str in fn_names.iter() { - (*str).to_c_str().with_ref(|name| { - JS_DefineProperty(cx, global, name, - ObjectValue(&*global), + let fn_names = ["window", "self"]; + for str in fn_names.iter() { + (*str).to_c_str().with_ref(|name| { + let object = global.reflector().get_jsobject(); + assert!(object.is_not_null()); + unsafe { + JS_DefineProperty(cx, object, name, + ObjectValue(&*object), Some(cast::transmute(GetJSClassHookStubPointer(PROPERTY_STUB))), Some(cast::transmute(GetJSClassHookStubPointer(STRICT_PROPERTY_STUB))), JSPROP_ENUMERATE); - }) + } + }) - } - - JS::from_raw(raw) } + global } }