diff options
27 files changed, 244 insertions, 185 deletions
diff --git a/README.md b/README.md index d7b7341ecc2..6a218877f7a 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,9 @@ cp servobuild.example .servobuild ## Running +Use `./mach run [url]` to run Servo. + + ### Commandline Arguments - `-p INTERVAL` turns on the profiler and dumps info to the console every diff --git a/components/net/image_cache_task.rs b/components/net/image_cache_task.rs index ddf80570d10..6a0d0832353 100644 --- a/components/net/image_cache_task.rs +++ b/components/net/image_cache_task.rs @@ -9,6 +9,7 @@ use resource_task::ProgressMsg::{Payload, Done}; use util::task::spawn_named; use util::taskpool::TaskPool; +use util::time::{self, profile, TimeProfilerChan}; use std::borrow::ToOwned; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; @@ -73,7 +74,8 @@ pub struct ImageCacheTask { } impl ImageCacheTask { - pub fn new(resource_task: ResourceTask, task_pool: TaskPool) -> ImageCacheTask { + pub fn new(resource_task: ResourceTask, task_pool: TaskPool, + time_profiler_chan: TimeProfilerChan) -> ImageCacheTask { let (chan, port) = channel(); let chan_clone = chan.clone(); @@ -86,6 +88,7 @@ impl ImageCacheTask { wait_map: HashMap::new(), need_exit: None, task_pool: task_pool, + time_profiler_chan: time_profiler_chan, }; cache.run(); }); @@ -95,11 +98,13 @@ impl ImageCacheTask { } } - pub fn new_sync(resource_task: ResourceTask, task_pool: TaskPool) -> ImageCacheTask { + pub fn new_sync(resource_task: ResourceTask, task_pool: TaskPool, + time_profiler_chan: TimeProfilerChan) -> ImageCacheTask { let (chan, port) = channel(); spawn_named("ImageCacheTask (sync)".to_owned(), move || { - let inner_cache = ImageCacheTask::new(resource_task, task_pool); + let inner_cache = ImageCacheTask::new(resource_task, task_pool, + time_profiler_chan); loop { let msg: Msg = port.recv().unwrap(); @@ -136,6 +141,7 @@ struct ImageCache { wait_map: HashMap<Url, Arc<Mutex<Vec<Sender<ImageResponseMsg>>>>>, need_exit: Option<Sender<()>>, task_pool: TaskPool, + time_profiler_chan: TimeProfilerChan, } #[derive(Clone)] @@ -303,11 +309,16 @@ impl ImageCache { ImageState::Prefetched(data) => { let to_cache = self.chan.clone(); let url_clone = url.clone(); + let time_profiler_chan = self.time_profiler_chan.clone(); self.task_pool.execute(move || { let url = url_clone; debug!("image_cache_task: started image decode for {}", url.serialize()); - let image = load_from_memory(data.as_slice()); + let image = profile(time::TimeProfilerCategory::ImageDecoding, + None, time_profiler_chan, || { + load_from_memory(data.as_slice()) + }); + let image = image.map(|image| Arc::new(box image)); to_cache.send(Msg::StoreImage(url.clone(), image)).unwrap(); debug!("image_cache_task: ended image decode for {}", url.serialize()); @@ -485,6 +496,7 @@ mod tests { use sniffer_task; use image::base::test_image_bin; use util::taskpool::TaskPool; + use util::time::{TimeProfiler, TimeProfilerChan}; use std::sync::mpsc::{Sender, channel, Receiver}; use url::Url; @@ -575,11 +587,15 @@ mod tests { }) } + fn profiler() -> TimeProfilerChan { + TimeProfiler::create(None) + } + #[test] fn should_exit_on_request() { let mock_resource_task = mock_resource_task(box DoesNothing); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); image_cache_task.exit(); mock_resource_task.send(resource_task::ControlMsg::Exit); @@ -590,7 +606,7 @@ mod tests { fn should_fail_if_unprefetched_image_is_requested() { let mock_resource_task = mock_resource_task(box DoesNothing); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let (chan, port) = channel(); @@ -604,7 +620,7 @@ mod tests { let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url)); @@ -619,7 +635,7 @@ mod tests { let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -639,7 +655,7 @@ mod tests { let mock_resource_task = mock_resource_task(box WaitSendTestImage{wait_port: wait_port}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -656,7 +672,7 @@ mod tests { fn should_return_decoded_image_data_if_data_has_arrived() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -682,7 +698,7 @@ mod tests { fn should_return_decoded_image_data_for_multiple_requests() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -736,7 +752,7 @@ mod tests { } }); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -788,7 +804,7 @@ mod tests { } }); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -817,7 +833,7 @@ mod tests { fn should_return_failed_if_image_bin_cannot_be_fetched() { let mock_resource_task = mock_resource_task(box SendTestImageErr); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store_prefetched(); @@ -843,7 +859,7 @@ mod tests { fn should_return_failed_for_multiple_get_image_requests_if_image_bin_cannot_be_fetched() { let mock_resource_task = mock_resource_task(box SendTestImageErr); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store_prefetched(); @@ -877,7 +893,7 @@ mod tests { fn should_return_failed_if_image_decode_fails() { let mock_resource_task = mock_resource_task(box SendBogusImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -905,7 +921,7 @@ mod tests { fn should_return_image_on_wait_if_image_is_already_loaded() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -933,7 +949,7 @@ mod tests { let mock_resource_task = mock_resource_task(box WaitSendTestImage {wait_port: wait_port}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -959,7 +975,7 @@ mod tests { let mock_resource_task = mock_resource_task(box WaitSendTestImageErr{wait_port: wait_port}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -983,7 +999,7 @@ mod tests { fn sync_cache_should_wait_for_images() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new_sync(mock_resource_task.clone(), TaskPool::new(4)); + let image_cache_task = ImageCacheTask::new_sync(mock_resource_task.clone(), TaskPool::new(4), profiler()); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 3ac47486fe0..c35c6b954dd 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -68,13 +68,6 @@ def stripTrailingWhitespace(text): return '\n'.join(lines) + tail def MakeNativeName(name): - # The gecko counterpart to this file uses the BinaryName machinery - # for this purpose (#4435 is the servo issue for BinaryName). - replacements = { - "__stringifier": "Stringify", - } - if name in replacements: - return replacements[name] return name[0].upper() + name[1:] builtinNames = { @@ -2569,7 +2562,8 @@ class CGSpecializedMethod(CGAbstractExternMethod): @staticmethod def makeNativeName(descriptor, method): - return MakeNativeName(method.identifier.name) + name = method.identifier.name + return MakeNativeName(descriptor.binaryNameFor(name)) class CGStaticMethod(CGAbstractStaticBindingMethod): """ @@ -2635,7 +2629,8 @@ class CGSpecializedGetter(CGAbstractExternMethod): @staticmethod def makeNativeName(descriptor, attr): - nativeName = MakeNativeName(attr.identifier.name) + name = attr.identifier.name + nativeName = MakeNativeName(descriptor.binaryNameFor(name)) infallible = ('infallible' in descriptor.getExtendedAttributes(attr, getter=True)) if attr.type.nullable() or not infallible: @@ -2713,7 +2708,8 @@ class CGSpecializedSetter(CGAbstractExternMethod): @staticmethod def makeNativeName(descriptor, attr): - return "Set" + MakeNativeName(attr.identifier.name) + name = attr.identifier.name + return "Set" + MakeNativeName(descriptor.binaryNameFor(name)) class CGStaticSetter(CGAbstractStaticBindingMethod): @@ -3569,7 +3565,7 @@ class CGProxySpecialOperation(CGPerSignatureCall): (don't use this directly, use the derived classes below). """ def __init__(self, descriptor, operation): - nativeName = MakeNativeName(operation) + nativeName = MakeNativeName(descriptor.binaryNameFor(operation)) operation = descriptor.operations[operation] assert len(operation.signatures()) == 1 signature = operation.signatures()[0] @@ -3993,7 +3989,8 @@ class CGDOMJSProxyHandler_obj_toString(CGAbstractExternMethod): def getBody(self): stringifier = self.descriptor.operations['Stringifier'] if stringifier: - nativeName = MakeNativeName(stringifier.identifier.name) + name = self.descriptor.binaryNameFor(stringifier.identifier.name) + nativeName = MakeNativeName(name) signature = stringifier.signatures()[0] returnType = signature[0] extendedAttributes = self.descriptor.getExtendedAttributes(stringifier) @@ -4077,7 +4074,8 @@ class CGClassConstructHook(CGAbstractExternMethod): let global = global_object_for_js_object(JS_CALLEE(cx, vp).to_object()); let global = global.root(); """) - nativeName = MakeNativeName(self._ctor.identifier.name) + name = self._ctor.identifier.name + nativeName = MakeNativeName(self.descriptor.binaryNameFor(name)) callGenerator = CGMethodCall(["global.r()"], nativeName, True, self.descriptor, self._ctor) return CGList([preamble, callGenerator]) @@ -4645,7 +4643,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::codegen::{PrototypeList, RegisterBindings, UnionTypes}', 'dom::bindings::codegen::Bindings::*', 'dom::bindings::error::{Fallible, Error, ErrorResult}', - 'dom::bindings::error::Error::FailureUnknown', + 'dom::bindings::error::Error::JSFailed', 'dom::bindings::error::throw_dom_exception', 'dom::bindings::error::throw_type_error', 'dom::bindings::proxyhandler', @@ -4674,9 +4672,9 @@ class CGBindingRoot(CGThing): def define(self): return stripTrailingWhitespace(self.root.define()) -def argument_type(descriptorProvdider, ty, optional=False, defaultValue=None, variadic=False): +def argument_type(descriptorProvider, ty, optional=False, defaultValue=None, variadic=False): info = getJSToNativeConversionInfo( - ty, descriptorProvdider, isArgument=True) + ty, descriptorProvider, isArgument=True) declType = info.declType if variadic: @@ -4814,14 +4812,14 @@ class CGCallback(CGClass): setupCall = ("let s = CallSetup::new(self, aExceptionHandling);\n" "if s.get_context().is_null() {\n" - " return Err(FailureUnknown);\n" + " return Err(JSFailed);\n" "}\n") bodyWithThis = string.Template( setupCall+ "let thisObjJS = wrap_call_this_object(s.get_context(), thisObj);\n" "if thisObjJS.is_null() {\n" - " return Err(FailureUnknown);\n" + " return Err(JSFailed);\n" "}\n" "return ${methodName}(${callArgs});").substitute({ "callArgs" : ", ".join(argnamesWithThis), @@ -4848,11 +4846,15 @@ class CGCallback(CGClass): return self._deps # We're always fallible -def callbackGetterName(attr): - return "Get" + MakeNativeName(attr.identifier.name) +def callbackGetterName(attr, descriptor): + return "Get" + MakeNativeName( + descriptor.binaryNameFor(attr.identifier.name)) + + +def callbackSetterName(attr, descriptor): + return "Set" + MakeNativeName( + descriptor.binaryNameFor(attr.identifier.name)) -def callbackSetterName(attr): - return "Set" + MakeNativeName(attr.identifier.name) class CGCallbackFunction(CGCallback): def __init__(self, callback, descriptorProvider): @@ -4946,7 +4948,7 @@ class CallbackMember(CGNativeMember): jsObjectsArePtr=True) # We have to do all the generation of our body now, because # the caller relies on us throwing if we can't manage it. - self.exceptionCode= "return Err(FailureUnknown);" + self.exceptionCode = "return Err(JSFailed);" self.body = self.getImpl() def getImpl(self): @@ -5076,7 +5078,7 @@ class CallbackMember(CGNativeMember): "CallSetup s(CallbackPreserveColor(), aRv, aExceptionHandling);\n" "JSContext* cx = s.get_context();\n" "if (!cx) {\n" - " return Err(FailureUnknown);\n" + " return Err(JSFailed);\n" "}\n") def getArgcDecl(self): @@ -5121,7 +5123,7 @@ class CallbackMethod(CallbackMember): " ${argc}, ${argv}, &mut rval)\n" "};\n" "if ok == 0 {\n" - " return Err(FailureUnknown);\n" + " return Err(JSFailed);\n" "}\n").substitute(replacements) class CallCallback(CallbackMethod): @@ -5158,7 +5160,7 @@ class CallbackOperationBase(CallbackMethod): } getCallableFromProp = string.Template( 'match self.parent.get_callable_property(cx, "${methodName}") {\n' - ' Err(_) => return Err(FailureUnknown),\n' + ' Err(_) => return Err(JSFailed),\n' ' Ok(callable) => callable,\n' '}').substitute(replacements) if not self.singleOperation: @@ -5179,7 +5181,8 @@ class CallbackOperation(CallbackOperationBase): self.ensureASCIIName(method) jsName = method.identifier.name CallbackOperationBase.__init__(self, signature, - jsName, MakeNativeName(jsName), + jsName, + MakeNativeName(descriptor.binaryNameFor(jsName)), descriptor, descriptor.interface.isSingleOperationInterface()) class CallbackGetter(CallbackMember): @@ -5201,7 +5204,7 @@ class CallbackGetter(CallbackMember): } return string.Template( 'if (!JS_GetProperty(cx, mCallback, "${attrName}", &rval)) {\n' - ' return Err(FailureUnknown);\n' + ' return Err(JSFailed);\n' '}\n').substitute(replacements); class CallbackSetter(CallbackMember): @@ -5227,7 +5230,7 @@ class CallbackSetter(CallbackMember): return string.Template( 'MOZ_ASSERT(argv.length() == 1);\n' 'if (!JS_SetProperty(cx, mCallback, "${attrName}", ${argv})) {\n' - ' return Err(FailureUnknown);\n' + ' return Err(JSFailed);\n' '}\n').substitute(replacements) def getArgcDecl(self): diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 8944070f09c..e6712357d35 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -251,6 +251,20 @@ class Descriptor(DescriptorProvider): else: add('all', [config], attribute) + self._binaryNames = desc.get('binaryNames', {}) + self._binaryNames.setdefault('__legacycaller', 'LegacyCall') + self._binaryNames.setdefault('__stringifier', 'Stringify') + + for member in self.interface.members: + if not member.isAttr() and not member.isMethod(): + continue + binaryName = member.getExtendedAttribute("BinaryName") + if binaryName: + assert isinstance(binaryName, list) + assert len(binaryName) == 1 + self._binaryNames.setdefault(member.identifier.name, + binaryName[0]) + # Build the prototype chain. self.prototypeChain = [] parent = interface @@ -260,6 +274,9 @@ class Descriptor(DescriptorProvider): config.maxProtoChainLength = max(config.maxProtoChainLength, len(self.prototypeChain)) + def binaryNameFor(self, name): + return self._binaryNames.get(name, name) + def getExtendedAttributes(self, member, getter=False, setter=False): def maybeAppendInfallibleToAttrs(attrs, throws): if throws is None: diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index 370ac7df7c0..7474f56baa2 100644 --- a/components/script/dom/bindings/codegen/parser/WebIDL.py +++ b/components/script/dom/bindings/codegen/parser/WebIDL.py @@ -3262,7 +3262,8 @@ class IDLAttribute(IDLInterfaceMember): identifier == "Frozen" or identifier == "AvailableIn" or identifier == "NewObject" or - identifier == "CheckPermissions"): + identifier == "CheckPermissions" or + identifier == "BinaryName"): # Known attributes that we don't need to do anything with here pass else: @@ -3861,7 +3862,8 @@ class IDLMethod(IDLInterfaceMember, IDLScope): identifier == "Pref" or identifier == "Func" or identifier == "AvailableIn" or - identifier == "CheckPermissions"): + identifier == "CheckPermissions" or + identifier == "BinaryName"): # Known attributes that we don't need to do anything with here pass else: diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 806e3c21ffe..275c498c038 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -6,7 +6,9 @@ use dom::bindings::conversions::ToJSValConvertible; use dom::bindings::global::GlobalRef; -use dom::domexception::DOMException; +use dom::domexception::{DOMException, DOMErrorName}; + +use util::str::DOMString; use js::jsapi::{JSContext, JSBool, JSObject}; use js::jsapi::{JS_IsExceptionPending, JS_SetPendingException, JS_ReportPendingException}; @@ -22,38 +24,42 @@ use std::ptr; /// DOM exceptions that can be thrown by a native DOM method. #[derive(Debug, Clone)] pub enum Error { - /// IndexSizeError + /// IndexSizeError DOMException IndexSize, - /// NotFoundError + /// NotFoundError DOMException NotFound, - /// HierarchyRequestError + /// HierarchyRequestError DOMException HierarchyRequest, - /// InvalidCharacterError + /// InvalidCharacterError DOMException InvalidCharacter, - /// NotSupportedError + /// NotSupportedError DOMException NotSupported, - /// InvalidStateError + /// InvalidStateError DOMException InvalidState, - /// SyntaxError + /// SyntaxError DOMException Syntax, - /// NamespaceError + /// NamespaceError DOMException NamespaceError, - /// InvalidAccessError + /// InvalidAccessError DOMException InvalidAccess, - /// SecurityError + /// SecurityError DOMException Security, - /// NetworkError + /// NetworkError DOMException Network, - /// AbortError + /// AbortError DOMException Abort, - /// TimeoutError + /// TimeoutError DOMException Timeout, - /// DataCloneError + /// DataCloneError DOMException DataClone, - /// NoModificationAllowedError + /// NoModificationAllowedError DOMException NoModificationAllowedError, - /// Unknown failure - FailureUnknown, + + /// TypeError JavaScript Error + TypeError(DOMString), + + /// A JavaScript exception is already pending. + JSFailed, } /// The return type for IDL operations that can throw DOM exceptions. @@ -67,7 +73,29 @@ pub type ErrorResult = Fallible<()>; pub fn throw_dom_exception(cx: *mut JSContext, global: GlobalRef, result: Error) { assert!(unsafe { JS_IsExceptionPending(cx) } == 0); - let exception = DOMException::new_from_error(global, result).root(); + let code = match result { + Error::IndexSize => DOMErrorName::IndexSizeError, + Error::NotFound => DOMErrorName::NotFoundError, + Error::HierarchyRequest => DOMErrorName::HierarchyRequestError, + Error::InvalidCharacter => DOMErrorName::InvalidCharacterError, + Error::NotSupported => DOMErrorName::NotSupportedError, + Error::InvalidState => DOMErrorName::InvalidStateError, + Error::Syntax => DOMErrorName::SyntaxError, + Error::NamespaceError => DOMErrorName::NamespaceError, + Error::InvalidAccess => DOMErrorName::InvalidAccessError, + Error::Security => DOMErrorName::SecurityError, + Error::Network => DOMErrorName::NetworkError, + Error::Abort => DOMErrorName::AbortError, + Error::Timeout => DOMErrorName::TimeoutError, + Error::DataClone => DOMErrorName::DataCloneError, + Error::NoModificationAllowedError => DOMErrorName::NoModificationAllowedError, + Error::TypeError(message) => { + throw_type_error(cx, &message); + return; + } + Error::JSFailed => panic!(), + }; + let exception = DOMException::new(global, code).root(); let thrown = exception.to_jsval(cx); unsafe { JS_SetPendingException(cx, thrown); diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 969a29216bd..d33e223bde5 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -450,14 +450,25 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { let doc = window.r().Document().root(); doc.r().begin_focus_transaction(); - let event = Event::new(GlobalRef::Window(window.r()), - "click".to_owned(), - EventBubbles::Bubbles, - EventCancelable::Cancelable).root(); + // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-type-click + let x = point.x as i32; + let y = point.y as i32; + let event = MouseEvent::new(window.r(), + "click".to_owned(), + true, + true, + Some(window.r()), + 0i32, + x, y, x, y, + false, false, false, false, + 0i16, + None).root(); + let event: JSRef<Event> = EventCast::from_ref(event.r()); + // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#trusted-events - event.r().set_trusted(true); + event.set_trusted(true); // https://html.spec.whatwg.org/multipage/interaction.html#run-authentic-click-activation-steps - el.authentic_click_activation(event.r()); + el.authentic_click_activation(event); doc.r().commit_focus_transaction(); window.r().flush_layout(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery); diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index 4509c0b5eaf..53511d4d721 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -5,7 +5,6 @@ use dom::bindings::codegen::Bindings::DOMExceptionBinding; use dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionConstants; use dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionMethods; -use dom::bindings::error::Error; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::utils::{Reflector, reflect_dom_object}; @@ -40,29 +39,6 @@ pub enum DOMErrorName { EncodingError } -impl DOMErrorName { - fn from_error(error: Error) -> DOMErrorName { - match error { - Error::IndexSize => DOMErrorName::IndexSizeError, - Error::NotFound => DOMErrorName::NotFoundError, - Error::HierarchyRequest => DOMErrorName::HierarchyRequestError, - Error::InvalidCharacter => DOMErrorName::InvalidCharacterError, - Error::NotSupported => DOMErrorName::NotSupportedError, - Error::InvalidState => DOMErrorName::InvalidStateError, - Error::Syntax => DOMErrorName::SyntaxError, - Error::NamespaceError => DOMErrorName::NamespaceError, - Error::InvalidAccess => DOMErrorName::InvalidAccessError, - Error::Security => DOMErrorName::SecurityError, - Error::Network => DOMErrorName::NetworkError, - Error::Abort => DOMErrorName::AbortError, - Error::Timeout => DOMErrorName::TimeoutError, - Error::DataClone => DOMErrorName::DataCloneError, - Error::NoModificationAllowedError => DOMErrorName::NoModificationAllowedError, - Error::FailureUnknown => panic!(), - } - } -} - #[dom_struct] pub struct DOMException { reflector_: Reflector, @@ -80,10 +56,6 @@ impl DOMException { pub fn new(global: GlobalRef, code: DOMErrorName) -> Temporary<DOMException> { reflect_dom_object(box DOMException::new_inherited(code), global, DOMExceptionBinding::Wrap) } - - pub fn new_from_error(global: GlobalRef, code: Error) -> Temporary<DOMException> { - DOMException::new(global, DOMErrorName::from_error(code)) - } } impl<'a> DOMExceptionMethods for JSRef<'a, DOMException> { diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index c33b151d9cf..91d5d96a615 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -7,7 +7,6 @@ use dom::bindings::codegen::Bindings::DOMParserBinding; use dom::bindings::codegen::Bindings::DOMParserBinding::DOMParserMethods; use dom::bindings::codegen::Bindings::DOMParserBinding::SupportedType::{Text_html, Text_xml}; use dom::bindings::error::Fallible; -use dom::bindings::error::Error::FailureUnknown; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflector, reflect_dom_object}; @@ -69,9 +68,6 @@ impl<'a> DOMParserMethods for JSRef<'a, DOMParser> { Some(content_type), DocumentSource::NotFromParser)) } - _ => { - Err(FailureUnknown) - } } } } diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 2166164babe..c6810483a88 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -98,6 +98,8 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> { fn SetByteStringAttributeNullable(self, _: Option<ByteString>) {} fn GetStringAttributeNullable(self) -> Option<DOMString> { Some("".to_owned()) } fn SetStringAttributeNullable(self, _: Option<DOMString>) {} + fn SetBinaryRenamedAttribute(self, _: DOMString) {} + fn BinaryRenamedAttribute(self) -> DOMString { "".to_owned() } fn GetEnumAttributeNullable(self) -> Option<TestEnum> { Some(_empty) } fn GetInterfaceAttributeNullable(self) -> Option<Temporary<Blob>> { let global = self.global.root(); @@ -108,6 +110,7 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> { fn SetUnionAttributeNullable(self, _: Option<HTMLElementOrLong>) {} fn GetUnion2AttributeNullable(self) -> Option<EventOrString> { Some(eString("".to_owned())) } fn SetUnion2AttributeNullable(self, _: Option<EventOrString>) {} + fn BinaryRenamedMethod(self) -> () {} fn ReceiveVoid(self) -> () {} fn ReceiveBoolean(self) -> bool { false } fn ReceiveByte(self) -> i8 { 0 } diff --git a/components/script/dom/webidls/DOMParser.webidl b/components/script/dom/webidls/DOMParser.webidl index 236fae785f2..2cb50530627 100644 --- a/components/script/dom/webidls/DOMParser.webidl +++ b/components/script/dom/webidls/DOMParser.webidl @@ -8,10 +8,10 @@ enum SupportedType { "text/html", - "text/xml", + "text/xml"/*, "application/xml", "application/xhtml+xml", - "image/svg+xml" + "image/svg+xml"*/ }; [Constructor] diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index c013e4312fa..c6bbd8fadea 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -91,7 +91,9 @@ interface TestBinding { attribute Blob? interfaceAttributeNullable; attribute (HTMLElement or long)? unionAttributeNullable; attribute (Event or DOMString)? union2AttributeNullable; + [BinaryName="BinaryRenamedAttribute"] attribute DOMString attrToBinaryRename; + [BinaryName="BinaryRenamedMethod"] void methToBinaryRename(); void receiveVoid(); boolean receiveBoolean(); byte receiveByte(); diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 5b2ff2c971e..86d93db6ce0 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::Bindings::FunctionBinding::Function; use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods; use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeCast; use dom::bindings::error::{ErrorResult, Fallible}; -use dom::bindings::error::Error::{Syntax, Network, FailureUnknown}; +use dom::bindings::error::Error::{Syntax, Network, JSFailed}; use dom::bindings::global::GlobalRef; use dom::bindings::js::{MutNullableJS, JSRef, Temporary}; use dom::bindings::utils::Reflectable; @@ -118,7 +118,7 @@ impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> { Ok(_) => (), Err(_) => { println!("evaluate_script failed"); - return Err(FailureUnknown); + return Err(JSFailed); } } } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 903beab52f3..ef2b1b320c5 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -94,9 +94,11 @@ impl<Window> Browser<Window> where Window: WindowMethods + 'static { // image load or we risk emitting an output file missing the // image. let image_cache_task = if opts.output_file.is_some() { - ImageCacheTask::new_sync(resource_task.clone(), shared_task_pool) + ImageCacheTask::new_sync(resource_task.clone(), shared_task_pool, + time_profiler_chan_clone.clone()) } else { - ImageCacheTask::new(resource_task.clone(), shared_task_pool) + ImageCacheTask::new(resource_task.clone(), shared_task_pool, + time_profiler_chan_clone.clone()) }; let font_cache_task = FontCacheTask::new(resource_task.clone()); let storage_task: StorageTask = StorageTaskFactory::new(); diff --git a/components/util/cache.rs b/components/util/cache.rs index b3f2aaf55c4..757a6d60c20 100644 --- a/components/util/cache.rs +++ b/components/util/cache.rs @@ -59,7 +59,7 @@ impl<K, V> HashCache<K,V> #[test] fn test_hashcache() { - let mut cache: HashCache<uint, Cell<&str>> = HashCache::new(); + let mut cache: HashCache<usize, Cell<&str>> = HashCache::new(); cache.insert(1, Cell::new("one")); assert!(cache.find(&1).is_some()); @@ -72,11 +72,11 @@ fn test_hashcache() { pub struct LRUCache<K, V> { entries: Vec<(K, V)>, - cache_size: uint, + cache_size: usize, } impl<K: Clone + PartialEq, V: Clone> LRUCache<K,V> { - pub fn new(size: uint) -> LRUCache<K, V> { + pub fn new(size: usize) -> LRUCache<K, V> { LRUCache { entries: vec!(), cache_size: size, @@ -84,7 +84,7 @@ impl<K: Clone + PartialEq, V: Clone> LRUCache<K,V> { } #[inline] - pub fn touch(&mut self, pos: uint) -> V { + pub fn touch(&mut self, pos: usize) -> V { let last_index = self.entries.len() - 1; if pos != last_index { let entry = self.entries.remove(pos); @@ -134,7 +134,7 @@ pub struct SimpleHashCache<K,V> { } impl<K:Clone+Eq+Hash<SipHasher>,V:Clone> SimpleHashCache<K,V> { - pub fn new(cache_size: uint) -> SimpleHashCache<K,V> { + pub fn new(cache_size: usize) -> SimpleHashCache<K,V> { let mut r = rand::thread_rng(); SimpleHashCache { entries: repeat(None).take(cache_size).collect(), @@ -144,15 +144,15 @@ impl<K:Clone+Eq+Hash<SipHasher>,V:Clone> SimpleHashCache<K,V> { } #[inline] - fn to_bucket(&self, h: uint) -> uint { + fn to_bucket(&self, h: usize) -> usize { h % self.entries.len() } #[inline] - fn bucket_for_key<Q:Hash<SipHasher>>(&self, key: &Q) -> uint { + fn bucket_for_key<Q:Hash<SipHasher>>(&self, key: &Q) -> usize { let mut hasher = SipHasher::new_with_keys(self.k0, self.k1); key.hash(&mut hasher); - self.to_bucket(hasher.finish() as uint) + self.to_bucket(hasher.finish() as usize) } pub fn insert(&mut self, key: K, value: V) { diff --git a/components/util/debug_utils.rs b/components/util/debug_utils.rs index 8d9789de029..f7c02b8068b 100644 --- a/components/util/debug_utils.rs +++ b/components/util/debug_utils.rs @@ -12,7 +12,7 @@ fn hexdump_slice(buf: &[u8]) { let mut stderr = io::stderr(); stderr.write_all(b" ").unwrap(); for (i, &v) in buf.iter().enumerate() { - let output = format!("{:02X} ", v as uint); + let output = format!("{:02X} ", v); stderr.write_all(output.as_bytes()).unwrap(); match i % 16 { 15 => { stderr.write_all(b"\n ").unwrap(); }, diff --git a/components/util/deque/mod.rs b/components/util/deque/mod.rs index 6dce728679b..089edf6bd43 100644 --- a/components/util/deque/mod.rs +++ b/components/util/deque/mod.rs @@ -57,23 +57,23 @@ use std::mem::{forget, min_align_of, size_of, transmute}; use std::ptr; use std::sync::Mutex; -use std::sync::atomic::{AtomicInt, AtomicPtr}; +use std::sync::atomic::{AtomicIsize, AtomicPtr}; use std::sync::atomic::Ordering::SeqCst; // Once the queue is less than 1/K full, then it will be downsized. Note that // the deque requires that this number be less than 2. -static K: int = 4; +static K: isize = 4; // Minimum number of bits that a buffer size should be. No buffer will resize to // under this value, and all deques will initially contain a buffer of this // size. // // The size in question is 1 << MIN_BITS -static MIN_BITS: uint = 7; +static MIN_BITS: usize = 7; struct Deque<T> { - bottom: AtomicInt, - top: AtomicInt, + bottom: AtomicIsize, + top: AtomicIsize, array: AtomicPtr<Buffer<T>>, pool: BufferPool<T>, } @@ -139,7 +139,7 @@ pub struct BufferPool<T> { /// LLVM is probably pretty good at doing this already. struct Buffer<T> { storage: *const T, - log_size: uint, + log_size: usize, } unsafe impl<T: 'static> Send for Buffer<T> { } @@ -159,7 +159,7 @@ impl<T: Send> BufferPool<T> { (Worker { deque: a }, Stealer { deque: b }) } - fn alloc(&mut self, bits: uint) -> Box<Buffer<T>> { + fn alloc(&mut self, bits: usize) -> Box<Buffer<T>> { unsafe { let mut pool = self.pool.lock().unwrap(); match pool.iter().position(|x| x.size() >= (1 << bits)) { @@ -228,8 +228,8 @@ impl<T: Send> Deque<T> { fn new(mut pool: BufferPool<T>) -> Deque<T> { let buf = pool.alloc(MIN_BITS); Deque { - bottom: AtomicInt::new(0), - top: AtomicInt::new(0), + bottom: AtomicIsize::new(0), + top: AtomicIsize::new(0), array: AtomicPtr::new(unsafe { transmute(buf) }), pool: pool, } @@ -299,7 +299,7 @@ impl<T: Send> Deque<T> { } } - unsafe fn maybe_shrink(&self, b: int, t: int) { + unsafe fn maybe_shrink(&self, b: isize, t: isize) { let a = self.array.load(SeqCst); if b - t < (*a).size() / K && b - t > (1 << MIN_BITS) { self.swap_buffer(b, a, (*a).resize(b, t, -1)); @@ -313,7 +313,7 @@ impl<T: Send> Deque<T> { // after this method has called 'free' on it. The continued usage is simply // a read followed by a forget, but we must make sure that the memory can // continue to be read after we flag this buffer for reclamation. - unsafe fn swap_buffer(&self, b: int, old: *mut Buffer<T>, + unsafe fn swap_buffer(&self, b: isize, old: *mut Buffer<T>, buf: Buffer<T>) -> *mut Buffer<T> { let newbuf: *mut Buffer<T> = transmute(box buf); self.array.store(newbuf, SeqCst); @@ -345,12 +345,12 @@ impl<T: Send> Drop for Deque<T> { } #[inline] -fn buffer_alloc_size<T>(log_size: uint) -> uint { +fn buffer_alloc_size<T>(log_size: usize) -> usize { (1 << log_size) * size_of::<T>() } impl<T: Send> Buffer<T> { - unsafe fn new(log_size: uint) -> Buffer<T> { + unsafe fn new(log_size: usize) -> Buffer<T> { let size = buffer_alloc_size::<T>(log_size); let buffer = allocate(size, min_align_of::<T>()); if buffer.is_null() { ::alloc::oom() } @@ -360,12 +360,12 @@ impl<T: Send> Buffer<T> { } } - fn size(&self) -> int { 1 << self.log_size } + fn size(&self) -> isize { 1 << self.log_size } // Apparently LLVM cannot optimize (foo % (1 << bar)) into this implicitly - fn mask(&self) -> int { (1 << self.log_size) - 1 } + fn mask(&self) -> isize { (1 << self.log_size) - 1 } - unsafe fn elem(&self, i: int) -> *const T { + unsafe fn elem(&self, i: isize) -> *const T { self.storage.offset(i & self.mask()) } @@ -373,23 +373,23 @@ impl<T: Send> Buffer<T> { // nor does this clear out the contents contained within. Hence, this is a // very unsafe method which the caller needs to treat specially in case a // race is lost. - unsafe fn get(&self, i: int) -> T { + unsafe fn get(&self, i: isize) -> T { ptr::read(self.elem(i)) } // Unsafe because this unsafely overwrites possibly uninitialized or // initialized data. - unsafe fn put(&self, i: int, t: T) { + unsafe fn put(&self, i: isize, t: T) { ptr::write(self.elem(i) as *mut T, t); } // Again, unsafe because this has incredibly dubious ownership violations. // It is assumed that this buffer is immediately dropped. - unsafe fn resize(&self, b: int, t: int, delta: int) -> Buffer<T> { + unsafe fn resize(&self, b: isize, t: isize, delta: isize) -> Buffer<T> { // NB: not entirely obvious, but thanks to 2's complement, - // casting delta to uint and then adding gives the desired + // casting delta to usize and then adding gives the desired // effect. - let buf = Buffer::new(self.log_size + delta as uint); + let buf = Buffer::new(self.log_size + delta as usize); for i in range(t, b) { buf.put(i, self.get(i)); } diff --git a/components/util/geometry.rs b/components/util/geometry.rs index 59f61c5afc0..3a165facb5c 100644 --- a/components/util/geometry.rs +++ b/components/util/geometry.rs @@ -236,7 +236,7 @@ impl Au { } #[inline] - pub fn from_px(px: int) -> Au { + pub fn from_px(px: isize) -> Au { NumCast::from(px * 60).unwrap() } @@ -246,9 +246,9 @@ impl Au { } #[inline] - pub fn to_nearest_px(&self) -> int { + pub fn to_nearest_px(&self) -> isize { let Au(s) = *self; - ((s as f64) / 60f64).round() as int + ((s as f64) / 60f64).round() as isize } #[inline] @@ -309,13 +309,13 @@ pub fn from_frac_px(px: f64) -> Au { Au((px * 60f64) as i32) } -pub fn from_px(px: int) -> Au { +pub fn from_px(px: isize) -> Au { NumCast::from(px * 60).unwrap() } -pub fn to_px(au: Au) -> int { +pub fn to_px(au: Au) -> isize { let Au(a) = au; - (a / 60) as int + (a / 60) as isize } pub fn to_frac_px(au: Au) -> f64 { @@ -325,7 +325,7 @@ pub fn to_frac_px(au: Au) -> f64 { // assumes 72 points per inch, and 96 px per inch pub fn from_pt(pt: f64) -> Au { - from_px((pt / 72f64 * 96f64) as int) + from_px((pt / 72f64 * 96f64) as isize) } // assumes 72 points per inch, and 96 px per inch diff --git a/components/util/memory.rs b/components/util/memory.rs index f895c129fea..e5e20d4cc94 100644 --- a/components/util/memory.rs +++ b/components/util/memory.rs @@ -241,7 +241,7 @@ macro_rules! option_try( ); #[cfg(target_os="linux")] -fn get_proc_self_statm_field(field: uint) -> Option<u64> { +fn get_proc_self_statm_field(field: usize) -> Option<u64> { let mut f = File::open(&Path::new("/proc/self/statm")); match f.read_to_string() { Ok(contents) => { diff --git a/components/util/opts.rs b/components/util/opts.rs index b64fe4e8f46..6bcbf694940 100644 --- a/components/util/opts.rs +++ b/components/util/opts.rs @@ -28,14 +28,14 @@ pub struct Opts { /// How many threads to use for CPU painting (`-t`). /// /// Note that painting is sequentialized when using GPU painting. - pub paint_threads: uint, + pub paint_threads: usize, /// True to use GPU painting via Skia-GL, false to use CPU painting via Skia (`-g`). Note that /// compositing is always done on the GPU. pub gpu_painting: bool, /// The maximum size of each tile in pixels (`-s`). - pub tile_size: uint, + pub tile_size: usize, /// The ratio of device pixels per px at the default scale. If unspecified, will use the /// platform default setting. @@ -54,7 +54,7 @@ pub struct Opts { /// The number of threads to use for layout (`-y`). Defaults to 1, which results in a recursive /// sequential algorithm. - pub layout_threads: uint, + pub layout_threads: usize, pub nonincremental_layout: bool, @@ -102,7 +102,7 @@ pub struct Opts { pub devtools_port: Option<u16>, /// The initial requested size of the window. - pub initial_window_size: TypedSize2D<ScreenPx, uint>, + pub initial_window_size: TypedSize2D<ScreenPx, u32>, /// An optional string allowing the user agent to be set for testing. pub user_agent: Option<String>, @@ -256,7 +256,7 @@ pub fn from_cmdline_args(args: &[String]) -> bool { opt_match.free.clone() }; - let tile_size: uint = match opt_match.opt_str("s") { + let tile_size: usize = match opt_match.opt_str("s") { Some(tile_size_str) => tile_size_str.parse().unwrap(), None => 512, }; @@ -265,7 +265,7 @@ pub fn from_cmdline_args(args: &[String]) -> bool { ScaleFactor(dppx_str.parse().unwrap()) ); - let mut paint_threads: uint = match opt_match.opt_str("t") { + let mut paint_threads: usize = match opt_match.opt_str("t") { Some(paint_threads_str) => paint_threads_str.parse().unwrap(), None => cmp::max(rt::default_sched_threads() * 3 / 4, 1), }; @@ -280,7 +280,7 @@ pub fn from_cmdline_args(args: &[String]) -> bool { let gpu_painting = !FORCE_CPU_PAINTING && opt_match.opt_present("g"); - let mut layout_threads: uint = match opt_match.opt_str("y") { + let mut layout_threads: usize = match opt_match.opt_str("y") { Some(layout_threads_str) => layout_threads_str.parse().unwrap(), None => cmp::max(rt::default_sched_threads() * 3 / 4, 1), }; @@ -301,7 +301,7 @@ pub fn from_cmdline_args(args: &[String]) -> bool { let initial_window_size = match opt_match.opt_str("resolution") { Some(res_string) => { - let res: Vec<uint> = res_string.split('x').map(|r| r.parse().unwrap()).collect(); + let res: Vec<u32> = res_string.split('x').map(|r| r.parse().unwrap()).collect(); TypedSize2D(res[0], res[1]) } None => { diff --git a/components/util/persistent_list.rs b/components/util/persistent_list.rs index f20edff3d38..e78dc3daa1e 100644 --- a/components/util/persistent_list.rs +++ b/components/util/persistent_list.rs @@ -9,7 +9,7 @@ use std::sync::Arc; pub struct PersistentList<T> { head: PersistentListLink<T>, - length: uint, + length: usize, } struct PersistentListEntry<T> { @@ -29,7 +29,7 @@ impl<T> PersistentList<T> where T: Send + Sync { } #[inline] - pub fn len(&self) -> uint { + pub fn len(&self) -> usize { self.length } diff --git a/components/util/taskpool.rs b/components/util/taskpool.rs index 5572395fc98..d3f52c5018b 100644 --- a/components/util/taskpool.rs +++ b/components/util/taskpool.rs @@ -25,7 +25,7 @@ pub struct TaskPool { } impl TaskPool { - pub fn new(tasks: uint) -> TaskPool { + pub fn new(tasks: u32) -> TaskPool { assert!(tasks > 0); let (tx, rx) = channel(); diff --git a/components/util/tid.rs b/components/util/tid.rs index 7351f85f085..9a01a19f6ce 100644 --- a/components/util/tid.rs +++ b/components/util/tid.rs @@ -8,10 +8,10 @@ use std::cell::RefCell; static mut next_tid: AtomicUsize = ATOMIC_USIZE_INIT; -thread_local!(static TASK_LOCAL_TID: Rc<RefCell<Option<uint>>> = Rc::new(RefCell::new(None))); +thread_local!(static TASK_LOCAL_TID: Rc<RefCell<Option<usize>>> = Rc::new(RefCell::new(None))); /// Every task gets one, that's unique. -pub fn tid() -> uint { +pub fn tid() -> usize { TASK_LOCAL_TID.with(|ref k| { let ret = match *k.borrow() { diff --git a/components/util/time.rs b/components/util/time.rs index 0a255f45bea..46de5abbceb 100644 --- a/components/util/time.rs +++ b/components/util/time.rs @@ -88,6 +88,7 @@ pub enum TimeProfilerCategory { PaintingPerTile, PaintingPrepBuff, Painting, + ImageDecoding, } impl Formatable for TimeProfilerCategory { @@ -125,6 +126,7 @@ impl Formatable for TimeProfilerCategory { TimeProfilerCategory::PaintingPerTile => "Painting Per Tile", TimeProfilerCategory::PaintingPrepBuff => "Buffer Prep", TimeProfilerCategory::Painting => "Painting", + TimeProfilerCategory::ImageDecoding => "Image Decoding", }; format!("{}{}", padding, name) } diff --git a/components/util/vec.rs b/components/util/vec.rs index 960e7e8db1a..a1b07126e06 100644 --- a/components/util/vec.rs +++ b/components/util/vec.rs @@ -16,11 +16,11 @@ pub trait Comparator<K,T> { pub trait BinarySearchMethods<'a, T: Ord + PartialOrd + PartialEq> { fn binary_search_(&self, key: &T) -> Option<&'a T>; - fn binary_search_index(&self, key: &T) -> Option<uint>; + fn binary_search_index(&self, key: &T) -> Option<usize>; } pub trait FullBinarySearchMethods<T> { - fn binary_search_index_by<K,C:Comparator<K,T>>(&self, key: &K, cmp: C) -> Option<uint>; + fn binary_search_index_by<K,C:Comparator<K,T>>(&self, key: &K, cmp: C) -> Option<usize>; } impl<'a, T: Ord + PartialOrd + PartialEq> BinarySearchMethods<'a, T> for &'a [T] { @@ -28,28 +28,28 @@ impl<'a, T: Ord + PartialOrd + PartialEq> BinarySearchMethods<'a, T> for &'a [T] self.binary_search_index(key).map(|i| &self[i]) } - fn binary_search_index(&self, key: &T) -> Option<uint> { + fn binary_search_index(&self, key: &T) -> Option<usize> { self.binary_search_index_by(key, DefaultComparator) } } impl<'a, T> FullBinarySearchMethods<T> for &'a [T] { - fn binary_search_index_by<K,C:Comparator<K,T>>(&self, key: &K, cmp: C) -> Option<uint> { + fn binary_search_index_by<K,C:Comparator<K,T>>(&self, key: &K, cmp: C) -> Option<usize> { if self.len() == 0 { return None; } - let mut low : int = 0; - let mut high : int = (self.len() as int) - 1; + let mut low : isize = 0; + let mut high : isize = (self.len() as isize) - 1; while low <= high { // http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html - let mid = ((low as uint) + (high as uint)) >> 1; + let mid = ((low as usize) + (high as usize)) >> 1; let midv = &self[mid]; match cmp.compare(key, midv) { - Ordering::Greater => low = (mid as int) + 1, - Ordering::Less => high = (mid as int) - 1, + Ordering::Greater => low = (mid as isize) + 1, + Ordering::Less => high = (mid as isize) - 1, Ordering::Equal => return Some(mid), } } diff --git a/components/util/workqueue.rs b/components/util/workqueue.rs index ad39b1e349f..c24f40602f9 100644 --- a/components/util/workqueue.rs +++ b/components/util/workqueue.rs @@ -13,7 +13,7 @@ use task_state; use libc::funcs::posix88::unistd::usleep; use std::mem; use rand::{Rng, weak_rng, XorShiftRng}; -use std::sync::atomic::{AtomicUint, Ordering}; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::mpsc::{channel, Sender, Receiver}; use deque::{Abort, BufferPool, Data, Empty, Stealer, Worker}; @@ -33,7 +33,7 @@ pub struct WorkUnit<QueueData, WorkData> { /// Messages from the supervisor to the worker. enum WorkerMsg<QueueData: 'static, WorkData: 'static> { /// Tells the worker to start work. - Start(Worker<WorkUnit<QueueData, WorkData>>, *mut AtomicUint, *const QueueData), + Start(Worker<WorkUnit<QueueData, WorkData>>, *mut AtomicUsize, *const QueueData), /// Tells the worker to stop. It can be restarted again with a `WorkerMsg::Start`. Stop, /// Tells the worker thread to terminate. @@ -45,7 +45,7 @@ unsafe impl<QueueData: 'static, WorkData: 'static> Send for WorkerMsg<QueueData, /// Messages to the supervisor. enum SupervisorMsg<QueueData: 'static, WorkData: 'static> { Finished, - ReturnDeque(uint, Worker<WorkUnit<QueueData, WorkData>>), + ReturnDeque(usize, Worker<WorkUnit<QueueData, WorkData>>), } unsafe impl<QueueData: 'static, WorkData: 'static> Send for SupervisorMsg<QueueData, WorkData> {} @@ -63,7 +63,7 @@ struct WorkerInfo<QueueData: 'static, WorkData: 'static> { /// Information specific to each worker thread that the thread keeps. struct WorkerThread<QueueData: 'static, WorkData: 'static> { /// The index of this worker. - index: uint, + index: usize, /// The communication port from the supervisor. port: Receiver<WorkerMsg<QueueData, WorkData>>, /// The communication channel on which messages are sent to the supervisor. @@ -110,7 +110,7 @@ impl<QueueData: Send, WorkData: Send> WorkerThread<QueueData, WorkData> { let mut i = 0; let mut should_continue = true; loop { - let victim = (self.rng.next_u32() as uint) % self.other_deques.len(); + let victim = (self.rng.next_u32() as usize) % self.other_deques.len(); match self.other_deques[victim].steal() { Empty | Abort => { // Continue. @@ -179,7 +179,7 @@ impl<QueueData: Send, WorkData: Send> WorkerThread<QueueData, WorkData> { /// A handle to the work queue that individual work units have. pub struct WorkerProxy<'a, QueueData: 'a, WorkData: 'a> { worker: &'a mut Worker<WorkUnit<QueueData, WorkData>>, - ref_count: *mut AtomicUint, + ref_count: *mut AtomicUsize, queue_data: *const QueueData, worker_index: u8, } @@ -216,7 +216,7 @@ pub struct WorkQueue<QueueData: 'static, WorkData: 'static> { /// A port on which deques can be received from the workers. port: Receiver<SupervisorMsg<QueueData, WorkData>>, /// The amount of work that has been enqueued. - work_count: uint, + work_count: usize, /// Arbitrary user data. pub data: QueueData, } @@ -226,7 +226,7 @@ impl<QueueData: Send, WorkData: Send> WorkQueue<QueueData, WorkData> { /// it. pub fn new(task_name: &'static str, state: task_state::TaskState, - thread_count: uint, + thread_count: usize, user_data: QueueData) -> WorkQueue<QueueData, WorkData> { // Set up data structures. let (supervisor_chan, supervisor_port) = channel(); @@ -295,7 +295,7 @@ impl<QueueData: Send, WorkData: Send> WorkQueue<QueueData, WorkData> { /// Synchronously runs all the enqueued tasks and waits for them to complete. pub fn run(&mut self) { // Tell the workers to start. - let mut work_count = AtomicUint::new(self.work_count); + let mut work_count = AtomicUsize::new(self.work_count); for worker in self.workers.iter_mut() { worker.chan.send(WorkerMsg::Start(worker.deque.take().unwrap(), &mut work_count, &self.data)).unwrap() } diff --git a/ports/gonk/src/lib.rs b/ports/gonk/src/lib.rs index d3d729481bb..68e0c55de1a 100644 --- a/ports/gonk/src/lib.rs +++ b/ports/gonk/src/lib.rs @@ -94,9 +94,11 @@ impl<Window> Browser<Window> where Window: WindowMethods + 'static { // image load or we risk emitting an output file missing the // image. let image_cache_task = if opts.output_file.is_some() { - ImageCacheTask::new_sync(resource_task.clone(), shared_task_pool) + ImageCacheTask::new_sync(resource_task.clone(), shared_task_pool, + time_profiler_chan_clone.clone()) } else { - ImageCacheTask::new(resource_task.clone(), shared_task_pool) + ImageCacheTask::new(resource_task.clone(), shared_task_pool, + time_profiler_chan_clone.clone()) }; let font_cache_task = FontCacheTask::new(resource_task.clone()); let storage_task = StorageTaskFactory::new(); |