diff --git a/src/servo/content/content_task.rs b/src/servo/content/content_task.rs index fe005db9a3c..242a799eb08 100644 --- a/src/servo/content/content_task.rs +++ b/src/servo/content/content_task.rs @@ -143,22 +143,22 @@ impl Content { } fn handle_msg(+msg: Either) -> bool { - match msg { - Left(control_msg) => self.handle_control_msg(control_msg), - Right(event) => self.handle_event(event) + match move msg { + Left(move control_msg) => self.handle_control_msg(control_msg), + Right(move event) => self.handle_event(event) } } fn handle_control_msg(+control_msg: ControlMsg) -> bool { - match control_msg { - ParseMsg(url) => { + match move control_msg { + ParseMsg(move url) => { debug!("content: Received url `%s` to parse", url_to_str(copy url)); // Note: we can parse the next document in parallel // with any previous documents. let result = html::hubbub_html_parser::parse_html(self.scope, - url, + copy url, self.resource_task, self.image_cache_task); @@ -184,8 +184,8 @@ impl Content { option::get(&self.document), option::get(&self.window)); - for vec::each(js_scripts) |bytes| { - self.cx.evaluate_script(compartment.global_obj, *bytes, ~"???", 1u); + do vec::consume(js_scripts) |_i, bytes| { + self.cx.evaluate_script(compartment.global_obj, bytes, ~"???", 1u); } return true; @@ -214,10 +214,10 @@ impl Content { Err(msg) => { println(fmt!("Error opening %s: %s", url_to_str(copy url), msg)); } - Ok(bytes) => { + Ok(move bytes) => { let compartment = option::expect(&self.compartment, ~"TODO error checking"); compartment.define_functions(debug_fns); - self.cx.evaluate_script(compartment.global_obj, bytes, url.path, 1u); + self.cx.evaluate_script(compartment.global_obj, bytes, copy url.path, 1u); } } return true; diff --git a/src/servo/css/resolve/apply.rs b/src/servo/css/resolve/apply.rs index e3cc05c84e7..aa7c2e830f9 100644 --- a/src/servo/css/resolve/apply.rs +++ b/src/servo/css/resolve/apply.rs @@ -107,8 +107,8 @@ impl StyleApplicator { fn apply_css_style(layout_ctx: &LayoutContext) { let reflow = copy self.reflow; - do NodeTree.each_child(&self.node) |child| { - inheritance_wrapper(layout_ctx, *child, reflow); true + for NodeTree.each_child(&self.node) |child| { + inheritance_wrapper(layout_ctx, *child, copy reflow) } } diff --git a/src/servo/dom/bindings/utils.rs b/src/servo/dom/bindings/utils.rs index a6ccf0dd29b..4bac8d29d50 100644 --- a/src/servo/dom/bindings/utils.rs +++ b/src/servo/dom/bindings/utils.rs @@ -96,7 +96,7 @@ extern fn has_instance(_cx: *JSContext, obj: **JSObject, v: *jsval, bp: *mut JSB pub fn prototype_jsclass(+name: ~str) -> fn(+compartment: bare_compartment) -> JSClass { |+compartment: bare_compartment| { - {name: compartment.add_name(name), + {name: compartment.add_name(copy name), flags: 0, addProperty: GetJSClassHookStubPointer(PROPERTY_STUB) as *u8, delProperty: GetJSClassHookStubPointer(PROPERTY_STUB) as *u8, @@ -125,7 +125,7 @@ pub fn prototype_jsclass(+name: ~str) -> fn(+compartment: bare_compartment) -> J pub fn instance_jsclass(+name: ~str, finalize: *u8) -> fn(+compartment: bare_compartment) -> JSClass { |+compartment: bare_compartment| { - {name: compartment.add_name(name), + {name: compartment.add_name(copy name), flags: JSCLASS_HAS_RESERVED_SLOTS(1), addProperty: GetJSClassHookStubPointer(PROPERTY_STUB) as *u8, delProperty: GetJSClassHookStubPointer(PROPERTY_STUB) as *u8, @@ -151,19 +151,20 @@ pub fn instance_jsclass(+name: ~str, finalize: *u8) } } +// FIXME: A lot of string copies here pub fn define_empty_prototype(+name: ~str, +proto: Option<~str>, compartment: &bare_compartment) -> js::rust::jsobj { - compartment.register_class(utils::prototype_jsclass(name)); + compartment.register_class(utils::prototype_jsclass(copy name)); //TODO error checking let obj = result::unwrap( - match proto { - Some(s) => compartment.new_object_with_proto(name, s, - compartment.global_obj.ptr), - None => compartment.new_object(name, null(), compartment.global_obj.ptr) + match move proto { + Some(move s) => compartment.new_object_with_proto(copy name, s, + compartment.global_obj.ptr), + None => compartment.new_object(copy name, null(), compartment.global_obj.ptr) }); - compartment.define_property(name, RUST_OBJECT_TO_JSVAL(obj.ptr), + compartment.define_property(copy name, RUST_OBJECT_TO_JSVAL(obj.ptr), GetJSClassHookStubPointer(PROPERTY_STUB) as *u8, GetJSClassHookStubPointer(STRICT_PROPERTY_STUB) as *u8, JSPROP_ENUMERATE); diff --git a/src/servo/dom/node.rs b/src/servo/dom/node.rs index 6f7f580dc00..034e0e2c5a3 100644 --- a/src/servo/dom/node.rs +++ b/src/servo/dom/node.rs @@ -53,8 +53,8 @@ impl Node { with a generic implementation of rcu::Handle */ impl Node : cmp::Eq { pure fn eq(other : &Node) -> bool unsafe { - let my_data : @LayoutData = @self.aux(|a| *a); - let ot_data : @LayoutData = @other.aux(|a| *a); + let my_data : @LayoutData = @self.aux(|a| copy *a); + let ot_data : @LayoutData = @other.aux(|a| copy *a); core::box::ptr_eq(my_data, ot_data) } pure fn ne(other : &Node) -> bool unsafe { diff --git a/src/servo/html/hubbub_html_parser.rs b/src/servo/html/hubbub_html_parser.rs index ac43e3e8282..5f62cb53154 100644 --- a/src/servo/html/hubbub_html_parser.rs +++ b/src/servo/html/hubbub_html_parser.rs @@ -228,9 +228,11 @@ pub fn parse_html(scope: NodeScope, //Handle CSS style sheets from elements ~HTMLLinkElement => { match (elem.get_attr(~"rel"), elem.get_attr(~"href")) { - (Some(rel), Some(href)) if rel == ~"stylesheet" => { - debug!("found CSS stylesheet: %s", href); - css_chan.send(CSSTaskNewFile(make_url(href, Some(copy *url)))); + (Some(move rel), Some(move href)) => { + if rel == ~"stylesheet" { + debug!("found CSS stylesheet: %s", href); + css_chan.send(CSSTaskNewFile(make_url(href, Some(copy *url)))); + } } _ => {} } @@ -298,22 +300,27 @@ pub fn parse_html(scope: NodeScope, encoding_change: |_encname| { debug!("encoding change"); }, - complete_script: |script| unsafe { - do scope.read(reinterpret_cast(&script)) |node_contents| { - match *node_contents.kind { - Element(element) if element.tag_name == ~"script" => { - match element.get_attr(~"src") { - Some(src) => { - debug!("found script: %s", src); - let new_url = make_url(src, Some(copy *url)); - js_chan.send(JSTaskNewFile(new_url)); + complete_script: |script| { + // 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| { + match *node_contents.kind { + Element(element) if element.tag_name == ~"script" => { + match element.get_attr(~"src") { + Some(move src) => { + debug!("found script: %s", src); + let new_url = make_url(src, Some(copy *url)); + js_chan.send(JSTaskNewFile(new_url)); + } + None => {} } - None => {} } + _ => {} } - _ => {} } } + complete_script(scope, script, url, &js_chan); debug!("complete script"); } }); diff --git a/src/servo/image/holder.rs b/src/servo/image/holder.rs index a6c52b0ebac..5749a2dbd8b 100644 --- a/src/servo/image/holder.rs +++ b/src/servo/image/holder.rs @@ -19,10 +19,10 @@ pub struct ImageHolder { } -fn ImageHolder(url : &Url, image_cache_task: ImageCacheTask, +cb: fn~()) -> ImageHolder { +fn ImageHolder(+url : Url, image_cache_task: ImageCacheTask, +cb: fn~()) -> ImageHolder { debug!("ImageHolder() %?", url.to_str()); let holder = ImageHolder { - url : Some(copy *url), + url : Some(copy url), image : None, cached_size : Size2D(0,0), image_cache_task : image_cache_task, @@ -34,8 +34,8 @@ fn ImageHolder(url : &Url, image_cache_task: ImageCacheTask, +cb: fn~()) -> Imag // but they are intended to be spread out in time. Ideally prefetch // should be done as early as possible and decode only once we // are sure that the image will be used. - image_cache_task.send(image_cache_task::Prefetch(copy *url)); - image_cache_task.send(image_cache_task::Decode(copy *url)); + image_cache_task.send(image_cache_task::Prefetch(copy url)); + image_cache_task.send(image_cache_task::Decode(move url)); holder } @@ -73,8 +73,10 @@ impl ImageHolder { // If this is the first time we've called this function, load // the image and store it for the future if self.image.is_none() { - assert self.url.is_some(); - let url = copy self.url.get(); + let url = match copy self.url { + Some(move url) => url, + None => fail ~"expected to have a url" + }; let response_port = Port(); self.image_cache_task.send(image_cache_task::GetImage(copy url, response_port.chan())); diff --git a/src/servo/layout/box_builder.rs b/src/servo/layout/box_builder.rs index 4e21459ff48..251344e0fdb 100644 --- a/src/servo/layout/box_builder.rs +++ b/src/servo/layout/box_builder.rs @@ -221,7 +221,7 @@ impl LayoutTreeBuilder { // TODO: this could be written as a pattern guard, but it triggers // an ICE (mozilla/rust issue #3601) if d.image.is_some() { - let holder = ImageHolder(&d.image.get(), + let holder = ImageHolder({copy *d.image.get_ref()}, layout_ctx.image_cache, copy layout_ctx.reflow_cb); @@ -254,7 +254,8 @@ impl LayoutTreeBuilder { ~Doctype(*) | ~Comment(*) => fail ~"Hey, doctypes and comments shouldn't get here! They are display:none!", ~Text(*) => RenderBox_Text, ~Element(element) => { - match (element.kind, display) { + // FIXME: Bad copy + match (copy element.kind, display) { (~HTMLImageElement(d), _) if d.image.is_some() => RenderBox_Image, // (_, Specified(_)) => GenericBox, (_, _) => RenderBox_Generic // TODO: replace this with the commented lines diff --git a/src/servo/layout/inline.rs b/src/servo/layout/inline.rs index 44325a4f10f..074ba0105ed 100644 --- a/src/servo/layout/inline.rs +++ b/src/servo/layout/inline.rs @@ -140,9 +140,10 @@ impl TextRunScanner { (true, false) => { temp_boxes.push(in_boxes[self.clump_start]); } (true, true) => { let text = in_boxes[self.clump_start].raw_text(); + let text_len = text.len(); // TODO: use actual font for corresponding DOM node to create text run. - let run = TextRun(&*ctx.font_cache.get_test_font(), text); - let box_guts = TextBoxData(@run, 0, text.len()); + let run = @TextRun(&*ctx.font_cache.get_test_font(), move text); + let box_guts = TextBoxData(run, 0, text_len); debug!("pushing when start=%?,end=%?", self.clump_start, self.clump_end); temp_boxes.push(@TextBox(copy *in_boxes[self.clump_start].d(), box_guts)); }, diff --git a/src/servo/layout/layout_task.rs b/src/servo/layout/layout_task.rs index 1616de10d6a..cac26f00b03 100644 --- a/src/servo/layout/layout_task.rs +++ b/src/servo/layout/layout_task.rs @@ -86,7 +86,7 @@ impl Layout { match query { ContentBox(node) => { // TODO: extract me to a method when I get sibling arms - let response = match node.aux(|a| *a).flow { + let response = match node.aux(|a| copy *a).flow { None => Err(()), Some(flow) => { let start_val : Option> = None; @@ -146,7 +146,7 @@ impl Layout { node.initialize_style_for_subtree(&layout_ctx, &self.layout_refs); node.recompute_style_for_subtree(&layout_ctx, &styles); /* resolve styles (convert relative values) down the node tree */ - apply_style(&layout_ctx, node, layout_ctx.reflow_cb); + apply_style(&layout_ctx, node, copy layout_ctx.reflow_cb); let builder = LayoutTreeBuilder(); let layout_root: @FlowContext = match builder.construct_trees(&layout_ctx, node) { diff --git a/src/servo/text/text_run.rs b/src/servo/text/text_run.rs index ad5acc0fe57..8cf82853714 100644 --- a/src/servo/text/text_run.rs +++ b/src/servo/text/text_run.rs @@ -126,7 +126,7 @@ impl TextRun { } } -fn TextRun(font: &Font, text: ~str) -> TextRun { +fn TextRun(font: &Font, +text: ~str) -> TextRun { let glyph_store = GlyphStore(text.len()); let run = TextRun { text: text,