diff --git a/src/servo/content/content_task.rs b/src/servo/content/content_task.rs index 88256029d1a..7526cd47171 100644 --- a/src/servo/content/content_task.rs +++ b/src/servo/content/content_task.rs @@ -93,8 +93,8 @@ struct Content { fn Content(layout_task: LayoutTask, from_master: Port, resource_task: ResourceTask, - img_cache_task: ImageCacheTask) -> Content { - + img_cache_task: ImageCacheTask) -> @Content { + let jsrt = jsrt(); let cx = jsrt.cx(); let event_port = Port(); @@ -107,7 +107,7 @@ fn Content(layout_task: LayoutTask, Err(()) => None }; - let content = Content { + let content = @Content { layout_task : layout_task, image_cache_task : img_cache_task, from_master : from_master, @@ -125,12 +125,12 @@ fn Content(layout_task: LayoutTask, compartment : compartment }; - cx.set_cx_private(ptr::to_unsafe_ptr(&content) as *()); + cx.set_cx_private(ptr::to_unsafe_ptr(&*content) as *()); content } -fn task_from_context(cx: *JSContext) -> &Content unsafe { +fn task_from_context(cx: *JSContext) -> *Content unsafe { cast::reinterpret_cast(&JS_GetContextPrivate(cx)) } diff --git a/src/servo/dom/bindings/element.rs b/src/servo/dom/bindings/element.rs index f04933ede2a..e1f65d0baf4 100644 --- a/src/servo/dom/bindings/element.rs +++ b/src/servo/dom/bindings/element.rs @@ -80,8 +80,8 @@ extern fn HTMLImageElement_getWidth(cx: *JSContext, _argc: c_uint, vp: *mut jsva ~Element(ed) => { match ed.kind { ~HTMLImageElement(*) => { - let content : &Content = task_from_context(cx); - match content.query_layout(layout_task::ContentBox(node)) { + let content = task_from_context(cx); + match (*content).query_layout(layout_task::ContentBox(node)) { Ok(rect) => rect.width, Err(()) => 0, } @@ -171,8 +171,8 @@ pub fn create(cx: *JSContext, node: Node, scope: NodeScope) -> jsobj unsafe { //TODO error checking let compartment = utils::get_compartment(cx); let obj = result::unwrap( - (*compartment).new_object_with_proto(~"GenericElementInstance", proto, - (*compartment).global_obj.ptr)); + compartment.new_object_with_proto(~"GenericElementInstance", proto, + compartment.global_obj.ptr)); unsafe { let raw_ptr: *libc::c_void = diff --git a/src/servo/dom/bindings/utils.rs b/src/servo/dom/bindings/utils.rs index cfc56744616..7c090965450 100644 --- a/src/servo/dom/bindings/utils.rs +++ b/src/servo/dom/bindings/utils.rs @@ -10,6 +10,7 @@ use js::glue::{PROPERTY_STUB, STRICT_PROPERTY_STUB, ENUMERATE_STUB, CONVERT_STUB RESOLVE_STUB}; use js::glue::bindgen::*; use ptr::null; +use content::content_task::{Content, task_from_context}; enum DOMString { str(~str), @@ -24,8 +25,6 @@ unsafe fn squirrel_away(x: @T) -> *rust_box { y } -type rust_unique = {payload: T}; - unsafe fn squirrel_away_unique(x: ~T) -> *rust_box { let y: *rust_box = cast::reinterpret_cast(&x); cast::forget(x); @@ -70,11 +69,13 @@ unsafe fn domstring_to_jsval(cx: *JSContext, str: &DOMString) -> jsval { } } -pub fn get_compartment(cx: *JSContext) -> *bare_compartment { +pub fn get_compartment(cx: *JSContext) -> compartment { unsafe { - let privptr: *libc::c_void = JS_GetContextPrivate(cx); - let compartment: *bare_compartment = cast::reinterpret_cast(&privptr); - assert cx == (*compartment).cx.ptr; + let content = task_from_context(cx); + let compartment = option::expect(&(*content).compartment, + ~"Should always have compartment when \ + executing JS code"); + assert cx == compartment.cx.ptr; compartment } } diff --git a/src/servo/html/hubbub_html_parser.rs b/src/servo/html/hubbub_html_parser.rs index 65b4f832be1..d642d8f4742 100644 --- a/src/servo/html/hubbub_html_parser.rs +++ b/src/servo/html/hubbub_html_parser.rs @@ -304,7 +304,7 @@ pub fn parse_html(scope: NodeScope, // A little function for holding this lint attr #[allow(non_implicitly_copyable_typarams)] fn complete_script(scope: &NodeScope, script: hubbub::Node, url: &Url, js_chan: &comm::Chan) unsafe { - do scope.read(reinterpret_cast(&script)) |node_contents| { + do scope.read(&reinterpret_cast(&script)) |node_contents| { match *node_contents.kind { Element(element) if element.tag_name == ~"script" => { match element.get_attr(~"src") {