diff options
author | Josh Matthews <josh@joshmatthews.net> | 2016-08-11 11:21:47 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2016-08-24 11:25:58 -0400 |
commit | 221bc846935a321747fff30689218de7543c964b (patch) | |
tree | 6f701bc79c674b122a1c84bbcedcad16b5e4171c /components/script/dom | |
parent | 49d483590e2e1b070271927132413e2078afe27f (diff) | |
download | servo-221bc846935a321747fff30689218de7543c964b.tar.gz servo-221bc846935a321747fff30689218de7543c964b.zip |
Support multiple WebIDL interfaces being generated in the same output binding file.
Each interface gets its own module named ${Interface}Binding. Structs, enums, and callbacks
continue to use the root module of the binding file. If there is only one interface in the
file, we generate reexports for several public APIs and types so that existing DOM implementations
don't need any modifications. When multiple interfaces exist, the reexported names get the interface
name prepended (eg. FooWrap instead of Wrap).
As part of this work, stop glob-importing all DOM types in every generated binding and start generating
more targeted lists of relevant types based on the methods, members, etc. of WebIDL types that are in use.
Diffstat (limited to 'components/script/dom')
5 files changed, 239 insertions, 135 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 6b23e485e25..56a20677691 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -21,6 +21,7 @@ from WebIDL import ( IDLType, IDLInterfaceMember, IDLUndefinedValue, + IDLWrapperType, ) from Configuration import ( @@ -942,7 +943,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, assert not type.treatNonObjectAsNull() or not type.treatNonCallableAsNull() callback = type.unroll().callback - declType = CGGeneric('%s::%s' % (getModuleFromObject(callback), callback.identifier.name)) + declType = CGGeneric(callback.identifier.name) finalDeclType = CGTemplatedType("Rc", declType) conversion = CGCallbackTempRoot(declType.define()) @@ -1738,7 +1739,7 @@ class CGImports(CGWrapper): """ Generates the appropriate import/use statements. """ - def __init__(self, child, descriptors, callbacks, imports, config, ignored_warnings=None): + def __init__(self, child, descriptors, callbacks, dictionaries, enums, imports, config, ignored_warnings=None): """ Adds a set of imports. """ @@ -1752,17 +1753,19 @@ class CGImports(CGWrapper): ] def componentTypes(type): - if type.nullable(): + if type.isType() and type.nullable(): type = type.unroll() if type.isUnion(): return type.flatMemberTypes + if type.isDictionary(): + return [type] + getTypesFromDictionary(type) return [type] def isImportable(type): if not type.isType(): - assert type.isInterface() - return not type.isCallback() - return type.isNonCallbackInterface() and not type.builtin + assert type.isInterface() or type.isDictionary() or type.isEnum() + return True + return not (type.builtin or type.isSequence() or type.isUnion()) def relatedTypesForSignatures(method): types = [] @@ -1774,13 +1777,27 @@ class CGImports(CGWrapper): def getIdentifier(t): if t.isType(): - return t.inner.identifier - assert t.isInterface() + if t.nullable(): + t = t.inner + if t.isCallback(): + return t.callback.identifier + return t.identifier + assert t.isInterface() or t.isDictionary() or t.isEnum() return t.identifier + def removeWrapperAndNullableTypes(types): + normalized = [] + for t in types: + while (t.isType() and t.nullable()) or isinstance(t, IDLWrapperType): + t = t.inner + if isImportable(t): + normalized += [t] + return normalized + types = [] for d in descriptors: - types += [d.interface] + if not d.interface.isCallback(): + types += [d.interface] members = d.interface.members + d.interface.namedConstructors constructor = d.interface.ctor() @@ -1796,19 +1813,39 @@ class CGImports(CGWrapper): elif m.isAttr(): types += componentTypes(m.type) + # Import the type names used in the callbacks that are being defined. for c in callbacks: types += relatedTypesForSignatures(c) + # Import the type names used in the dictionaries that are being defined. + for d in dictionaries: + types += componentTypes(d) + + # Normalize the types we've collected and remove any ones which can't be imported. + types = removeWrapperAndNullableTypes(types) + descriptorProvider = config.getDescriptorProvider() + extras = [] for t in types: - if isImportable(t): + # Importing these types in the same module that defines them is an error. + if t in dictionaries or t in enums: + continue + if t.isInterface(): descriptor = descriptorProvider.getDescriptor(getIdentifier(t).name) - imports += ['%s' % descriptor.path] + extras += [descriptor.path] + if descriptor.interface.parent: + parentName = getIdentifier(descriptor.interface.parent).name + descriptor = descriptorProvider.getDescriptor(parentName) + extras += [descriptor.path, descriptor.bindingPath] + else: + if t.isEnum(): + extras += [getModuleFromObject(t) + '::' + getIdentifier(t).name + 'Values'] + extras += [getModuleFromObject(t) + '::' + getIdentifier(t).name] statements = [] if len(ignored_warnings) > 0: statements.append('#![allow(%s)]' % ','.join(ignored_warnings)) - statements.extend('use %s;' % i for i in sorted(set(imports))) + statements.extend('use %s;' % i for i in sorted(set(imports + extras))) CGWrapper.__init__(self, child, pre='\n'.join(statements) + '\n\n') @@ -2111,7 +2148,7 @@ def UnionTypes(descriptors, dictionaries, callbacks, config): # Sort unionStructs by key, retrieve value unionStructs = (i[1] for i in sorted(unionStructs.items(), key=operator.itemgetter(0))) - return CGImports(CGList(unionStructs, "\n\n"), [], [], imports, config, ignored_warnings=[]) + return CGImports(CGList(unionStructs, "\n\n"), [], [], [], [], imports, config, ignored_warnings=[]) class Argument(): @@ -2709,7 +2746,7 @@ class CGGetProtoObjectMethod(CGGetPerInterfaceObject): """ def __init__(self, descriptor): CGGetPerInterfaceObject.__init__(self, descriptor, "GetProtoObject", - "PrototypeList::ID", pub=descriptor.hasDescendants()) + "PrototypeList::ID", pub=True) def definition_body(self): return CGList([ @@ -2727,7 +2764,7 @@ class CGGetConstructorObjectMethod(CGGetPerInterfaceObject): def __init__(self, descriptor): CGGetPerInterfaceObject.__init__(self, descriptor, "GetConstructorObject", "PrototypeList::Constructor", - pub=descriptor.hasDescendants()) + pub=True) def definition_body(self): return CGList([ @@ -5067,6 +5104,7 @@ class CGInterfaceTrait(CGThing): post="}") else: self.cgRoot = CGGeneric("") + self.empty = not methods def define(self): return self.cgRoot.define() @@ -5082,18 +5120,135 @@ class CGWeakReferenceableTrait(CGThing): return self.code +def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries=None, enums=None): + if not callbacks: + callbacks = [] + if not dictionaries: + dictionaries = [] + if not enums: + enums = [] + + return CGImports(cgthings, descriptors, callbacks, dictionaries, enums, [ + 'js', + 'js::{JS_CALLEE, JSCLASS_GLOBAL_SLOT_COUNT}', + 'js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL, JSCLASS_RESERVED_SLOTS_MASK}', + 'js::error::throw_type_error', + 'js::jsapi::{JSJitInfo_AliasSet, JSJitInfo_ArgType, AutoIdVector, CallArgs, FreeOp}', + 'js::jsapi::{JSITER_SYMBOLS, JSPROP_ENUMERATE, JSPROP_PERMANENT, JSPROP_READONLY, JSPROP_SHARED}', + 'js::jsapi::{JSCLASS_RESERVED_SLOTS_SHIFT, JSITER_HIDDEN, JSITER_OWNONLY}', + 'js::jsapi::{GetPropertyKeys, Handle}', + 'js::jsapi::{HandleId, HandleObject, HandleValue, HandleValueArray}', + 'js::jsapi::{INTERNED_STRING_TO_JSID, IsCallable, JS_CallFunctionValue}', + 'js::jsapi::{JS_CopyPropertiesFrom, JS_ForwardGetPropertyTo}', + 'js::jsapi::{JS_GetClass, JS_GetErrorPrototype, JS_GetFunctionPrototype}', + 'js::jsapi::{JS_GetGlobalForObject, JS_GetObjectPrototype, JS_GetProperty}', + 'js::jsapi::{JS_GetPropertyById, JS_GetPropertyDescriptorById, JS_GetReservedSlot}', + 'js::jsapi::{JS_HasProperty, JS_HasPropertyById, JS_InitializePropertiesFromCompatibleNativeObject}', + 'js::jsapi::{JS_AtomizeAndPinString, JS_NewObject, JS_NewObjectWithGivenProto}', + 'js::jsapi::{JS_NewObjectWithoutMetadata, JS_SetProperty}', + 'js::jsapi::{JS_SplicePrototype, JS_SetReservedSlot, JSAutoCompartment}', + 'js::jsapi::{JSContext, JSClass, JSFreeOp, JSFunctionSpec}', + 'js::jsapi::{JSJitGetterCallArgs, JSJitInfo, JSJitMethodCallArgs, JSJitSetterCallArgs}', + 'js::jsapi::{JSNative, JSObject, JSNativeWrapper, JSPropertySpec}', + 'js::jsapi::{JSString, JSTracer, JSType, JSTypedMethodJitInfo, JSValueType}', + 'js::jsapi::{ObjectOpResult, JSJitInfo_OpType, MutableHandle, MutableHandleObject}', + 'js::jsapi::{MutableHandleValue, PropertyDescriptor, RootedObject}', + 'js::jsapi::{SymbolCode, jsid}', + 'js::jsval::JSVal', + 'js::jsval::{ObjectValue, ObjectOrNullValue, PrivateValue}', + 'js::jsval::{NullValue, UndefinedValue}', + 'js::glue::{CallJitMethodOp, CallJitGetterOp, CallJitSetterOp, CreateProxyHandler}', + 'js::glue::{GetProxyPrivate, NewProxyObject, ProxyTraps}', + 'js::glue::{RUST_JSID_IS_STRING, int_to_jsid}', + 'js::glue::AppendToAutoIdVector', + 'js::rust::{GCMethods, define_methods, define_properties}', + 'dom', + 'dom::bindings', + 'dom::bindings::codegen::InterfaceObjectMap', + 'dom::bindings::global::{GlobalRef, global_root_from_object, global_root_from_reflector}', + 'dom::bindings::interface::{InterfaceConstructorBehavior, NonCallbackInterfaceObjectClass}', + 'dom::bindings::interface::{create_callback_interface_object, create_interface_prototype_object}', + 'dom::bindings::interface::{create_named_constructors, create_noncallback_interface_object}', + 'dom::bindings::interface::{define_guarded_methods, define_guarded_properties}', + 'dom::bindings::interface::{ConstantSpec, NonNullJSNative}', + 'dom::bindings::interface::ConstantVal::{IntVal, UintVal}', + 'dom::bindings::interface::is_exposed_in', + 'dom::bindings::js::{JS, Root, RootedReference}', + 'dom::bindings::js::{OptionalRootedReference}', + 'dom::bindings::reflector::{Reflectable}', + 'dom::bindings::utils::{DOMClass, DOMJSClass}', + 'dom::bindings::utils::{DOM_PROTO_UNFORGEABLE_HOLDER_SLOT, JSCLASS_DOM_GLOBAL}', + 'dom::bindings::utils::{ProtoOrIfaceArray, create_dom_global}', + 'dom::bindings::utils::{enumerate_global, finalize_global, find_enum_string_index}', + 'dom::bindings::utils::{generic_getter, generic_lenient_getter, generic_lenient_setter}', + 'dom::bindings::utils::{generic_method, generic_setter, get_array_index_from_id}', + 'dom::bindings::utils::{get_dictionary_property, get_property_on_prototype}', + 'dom::bindings::utils::{get_proto_or_iface_array, has_property_on_prototype}', + 'dom::bindings::utils::{is_platform_object, resolve_global, set_dictionary_property, trace_global}', + 'dom::bindings::trace::{JSTraceable, RootedTraceable}', + 'dom::bindings::callback::{CallbackContainer,CallbackInterface,CallbackFunction}', + 'dom::bindings::callback::{CallSetup,ExceptionHandling}', + 'dom::bindings::callback::wrap_call_this_object', + 'dom::bindings::conversions::{ConversionBehavior, ConversionResult, DOM_OBJECT_SLOT}', + 'dom::bindings::conversions::{IDLInterface, is_array_like}', + 'dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior}', + 'dom::bindings::conversions::{ToJSValConvertible, jsid_to_str, native_from_handlevalue}', + 'dom::bindings::conversions::{native_from_object, private_from_object, root_from_object}', + 'dom::bindings::conversions::{root_from_handleobject, root_from_handlevalue}', + 'dom::bindings::codegen::{PrototypeList, RegisterBindings, UnionTypes}', + 'dom::bindings::error::{Fallible, Error, ErrorResult}', + 'dom::bindings::error::Error::JSFailed', + 'dom::bindings::error::throw_dom_exception', + 'dom::bindings::guard::{Condition, Guard}', + 'dom::bindings::proxyhandler', + 'dom::bindings::proxyhandler::{ensure_expando_object, fill_property_descriptor}', + 'dom::bindings::proxyhandler::{get_expando_object, get_property_descriptor}', + 'dom::bindings::num::Finite', + 'dom::bindings::str::{ByteString, DOMString, USVString}', + 'dom::bindings::weakref::{DOM_WEAK_SLOT, WeakBox, WeakReferenceable}', + 'dom::browsingcontext::BrowsingContext', + 'mem::heap_size_of_raw_self_and_children', + 'libc', + 'util::prefs::PREFS', + 'script_runtime::{store_panic_result, maybe_take_panic_result}', + 'std::borrow::ToOwned', + 'std::cmp', + 'std::mem', + 'std::num', + 'std::os', + 'std::panic::{self, AssertUnwindSafe}', + 'std::ptr', + 'std::str', + 'std::rc', + 'std::rc::Rc', + 'std::default::Default', + 'std::ffi::CString', + ], config) + + class CGDescriptor(CGThing): - def __init__(self, descriptor): + def __init__(self, descriptor, config, soleDescriptor): CGThing.__init__(self) assert not descriptor.concrete or not descriptor.interface.isCallback() + reexports = [] + + def reexportedName(name): + if name.startswith(descriptor.name): + return name + if not soleDescriptor: + return '%s as %s%s' % (name, descriptor.name, name) + return name + cgThings = [] if not descriptor.interface.isCallback(): cgThings.append(CGGetProtoObjectMethod(descriptor)) + reexports.append('GetProtoObject') if (descriptor.interface.hasInterfaceObject() and descriptor.shouldHaveGetConstructorObjectMethod()): cgThings.append(CGGetConstructorObjectMethod(descriptor)) + reexports.append('GetConstructorObject') unscopableNames = [] for m in descriptor.interface.members: @@ -5155,9 +5310,11 @@ class CGDescriptor(CGThing): cgThings.append(CGNamespace.build([descriptor.name + "Constants"], CGConstant(constMembers), public=True)) + reexports.append(descriptor.name + 'Constants') if descriptor.interface.hasInterfaceObject(): cgThings.append(CGDefineDOMInterfaceMethod(descriptor)) + reexports.append('DefineDOMInterface') cgThings.append(CGConstructorEnabled(descriptor)) if descriptor.proxy: @@ -5193,6 +5350,7 @@ class CGDescriptor(CGThing): pass cgThings.append(CGWrapMethod(descriptor)) + reexports.append('Wrap') haveUnscopables = False if not descriptor.interface.isCallback(): @@ -5205,7 +5363,12 @@ class CGDescriptor(CGThing): CGGeneric("];\n")], "\n")) if descriptor.concrete or descriptor.hasDescendants(): cgThings.append(CGIDLInterface(descriptor)) - cgThings.append(CGInterfaceTrait(descriptor)) + + interfaceTrait = CGInterfaceTrait(descriptor) + cgThings.append(interfaceTrait) + if not interfaceTrait.empty: + reexports.append('%sMethods' % descriptor.name) + if descriptor.weakReferenceable: cgThings.append(CGWeakReferenceableTrait(descriptor)) @@ -5213,11 +5376,13 @@ class CGDescriptor(CGThing): cgThings.append(CGGeneric(str(properties))) cgThings.append(CGCreateInterfaceObjectsMethod(descriptor, properties, haveUnscopables)) - cgThings = CGList(cgThings, "\n") - # self.cgRoot = CGWrapper(CGNamespace(toBindingNamespace(descriptor.name), - # cgThings), - # post='\n') - self.cgRoot = cgThings + cgThings = generate_imports(config, CGList(cgThings, '\n'), [descriptor]) + cgThings = CGWrapper(CGNamespace(toBindingNamespace(descriptor.name), + cgThings, public=True), + post='\n') + reexports = ', '.join(map(lambda name: reexportedName(name), reexports)) + self.cgRoot = CGList([CGGeneric('pub use self::%sBinding::{%s};' % (descriptor.name, reexports)), + cgThings], '\n') def define(self): return self.cgRoot.define() @@ -5467,8 +5632,8 @@ class CGRegisterProxyHandlersMethod(CGAbstractMethod): def definition_body(self): return CGList([ - CGGeneric("proxy_handlers[Proxies::%s as usize] = codegen::Bindings::%sBinding::DefineProxyHandler();" - % (desc.name, desc.name)) + CGGeneric("proxy_handlers[Proxies::%s as usize] = Bindings::%s::DefineProxyHandler();" + % (desc.name, '::'.join([desc.name + 'Binding'] * 2))) for desc in self.descriptors ], "\n") @@ -5541,7 +5706,7 @@ class CGBindingRoot(CGThing): for c in mainCallbacks) # Do codegen for all the descriptors - cgthings.extend([CGDescriptor(x) for x in descriptors]) + cgthings.extend([CGDescriptor(x, config, len(descriptors) == 1) for x in descriptors]) # Do codegen for all the callback interfaces. cgthings.extend(CGList([CGCallbackInterface(x), @@ -5552,102 +5717,8 @@ class CGBindingRoot(CGThing): curr = CGWrapper(CGList(cgthings, "\n\n"), post="\n\n") # Add imports - curr = CGImports(curr, descriptors + callbackDescriptors, mainCallbacks, [ - 'js', - 'js::{JS_CALLEE, JSCLASS_GLOBAL_SLOT_COUNT}', - 'js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL, JSCLASS_RESERVED_SLOTS_MASK}', - 'js::error::throw_type_error', - 'js::jsapi::{JSJitInfo_AliasSet, JSJitInfo_ArgType, AutoIdVector, CallArgs, FreeOp}', - 'js::jsapi::{JSITER_SYMBOLS, JSPROP_ENUMERATE, JSPROP_PERMANENT, JSPROP_READONLY, JSPROP_SHARED}', - 'js::jsapi::{JSCLASS_RESERVED_SLOTS_SHIFT, JSITER_HIDDEN, JSITER_OWNONLY}', - 'js::jsapi::{GetPropertyKeys, Handle}', - 'js::jsapi::{HandleId, HandleObject, HandleValue, HandleValueArray}', - 'js::jsapi::{INTERNED_STRING_TO_JSID, IsCallable, JS_CallFunctionValue}', - 'js::jsapi::{JS_CopyPropertiesFrom, JS_ForwardGetPropertyTo}', - 'js::jsapi::{JS_GetClass, JS_GetErrorPrototype, JS_GetFunctionPrototype}', - 'js::jsapi::{JS_GetGlobalForObject, JS_GetObjectPrototype, JS_GetProperty}', - 'js::jsapi::{JS_GetPropertyById, JS_GetPropertyDescriptorById, JS_GetReservedSlot}', - 'js::jsapi::{JS_HasProperty, JS_HasPropertyById, JS_InitializePropertiesFromCompatibleNativeObject}', - 'js::jsapi::{JS_AtomizeAndPinString, JS_NewObject, JS_NewObjectWithGivenProto}', - 'js::jsapi::{JS_NewObjectWithoutMetadata, JS_SetProperty}', - 'js::jsapi::{JS_SplicePrototype, JS_SetReservedSlot, JSAutoCompartment}', - 'js::jsapi::{JSContext, JSClass, JSFreeOp, JSFunctionSpec}', - 'js::jsapi::{JSJitGetterCallArgs, JSJitInfo, JSJitMethodCallArgs, JSJitSetterCallArgs}', - 'js::jsapi::{JSNative, JSObject, JSNativeWrapper, JSPropertySpec}', - 'js::jsapi::{JSString, JSTracer, JSType, JSTypedMethodJitInfo, JSValueType}', - 'js::jsapi::{ObjectOpResult, JSJitInfo_OpType, MutableHandle, MutableHandleObject}', - 'js::jsapi::{MutableHandleValue, PropertyDescriptor, RootedObject}', - 'js::jsapi::{SymbolCode, jsid}', - 'js::jsval::JSVal', - 'js::jsval::{ObjectValue, ObjectOrNullValue, PrivateValue}', - 'js::jsval::{NullValue, UndefinedValue}', - 'js::glue::{CallJitMethodOp, CallJitGetterOp, CallJitSetterOp, CreateProxyHandler}', - 'js::glue::{GetProxyPrivate, NewProxyObject, ProxyTraps}', - 'js::glue::{RUST_JSID_IS_STRING, int_to_jsid}', - 'js::glue::AppendToAutoIdVector', - 'js::rust::{GCMethods, define_methods, define_properties}', - 'dom::bindings', - 'dom::bindings::codegen::InterfaceObjectMap', - 'dom::bindings::global::{GlobalRef, global_root_from_object, global_root_from_reflector}', - 'dom::bindings::interface::{InterfaceConstructorBehavior, NonCallbackInterfaceObjectClass}', - 'dom::bindings::interface::{create_callback_interface_object, create_interface_prototype_object}', - 'dom::bindings::interface::{create_named_constructors, create_noncallback_interface_object}', - 'dom::bindings::interface::{define_guarded_methods, define_guarded_properties}', - 'dom::bindings::interface::{ConstantSpec, NonNullJSNative}', - 'dom::bindings::interface::ConstantVal::{IntVal, UintVal}', - 'dom::bindings::interface::is_exposed_in', - 'dom::bindings::js::{JS, Root, RootedReference}', - 'dom::bindings::js::{OptionalRootedReference}', - 'dom::bindings::reflector::{Reflectable}', - 'dom::bindings::utils::{DOMClass, DOMJSClass}', - 'dom::bindings::utils::{DOM_PROTO_UNFORGEABLE_HOLDER_SLOT, JSCLASS_DOM_GLOBAL}', - 'dom::bindings::utils::{ProtoOrIfaceArray, create_dom_global}', - 'dom::bindings::utils::{enumerate_global, finalize_global, find_enum_string_index}', - 'dom::bindings::utils::{generic_getter, generic_lenient_getter, generic_lenient_setter}', - 'dom::bindings::utils::{generic_method, generic_setter, get_array_index_from_id}', - 'dom::bindings::utils::{get_dictionary_property, get_property_on_prototype}', - 'dom::bindings::utils::{get_proto_or_iface_array, has_property_on_prototype}', - 'dom::bindings::utils::{is_platform_object, resolve_global, set_dictionary_property, trace_global}', - 'dom::bindings::trace::{JSTraceable, RootedTraceable}', - 'dom::bindings::callback::{CallbackContainer,CallbackInterface,CallbackFunction}', - 'dom::bindings::callback::{CallSetup,ExceptionHandling}', - 'dom::bindings::callback::wrap_call_this_object', - 'dom::bindings::conversions::{ConversionBehavior, ConversionResult, DOM_OBJECT_SLOT}', - 'dom::bindings::conversions::{IDLInterface, is_array_like}', - 'dom::bindings::conversions::{FromJSValConvertible, StringificationBehavior}', - 'dom::bindings::conversions::{ToJSValConvertible, jsid_to_str, native_from_handlevalue}', - 'dom::bindings::conversions::{native_from_object, private_from_object, root_from_object}', - 'dom::bindings::conversions::{root_from_handleobject, root_from_handlevalue}', - 'dom::bindings::codegen::{PrototypeList, RegisterBindings, UnionTypes}', - 'dom::bindings::codegen::Bindings::*', - 'dom::bindings::error::{Fallible, Error, ErrorResult}', - 'dom::bindings::error::Error::JSFailed', - 'dom::bindings::error::throw_dom_exception', - 'dom::bindings::guard::{Condition, Guard}', - 'dom::bindings::proxyhandler', - 'dom::bindings::proxyhandler::{ensure_expando_object, fill_property_descriptor}', - 'dom::bindings::proxyhandler::{get_expando_object, get_property_descriptor}', - 'dom::bindings::num::Finite', - 'dom::bindings::str::{ByteString, DOMString, USVString}', - 'dom::bindings::weakref::{DOM_WEAK_SLOT, WeakBox, WeakReferenceable}', - 'dom::browsingcontext::BrowsingContext', - 'mem::heap_size_of_raw_self_and_children', - 'libc', - 'util::prefs::PREFS', - 'script_runtime::{store_panic_result, maybe_take_panic_result}', - 'std::borrow::ToOwned', - 'std::cmp', - 'std::mem', - 'std::num', - 'std::os', - 'std::panic::{self, AssertUnwindSafe}', - 'std::ptr', - 'std::str', - 'std::rc', - 'std::rc::Rc', - 'std::default::Default', - 'std::ffi::CString', - ], config) + curr = generate_imports(config, curr, callbackDescriptors, mainCallbacks, + dictionaries, enums) # Add the auto-generated comment. curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT) @@ -6285,12 +6356,12 @@ class GlobalGenRoots(): pairs = [] for d in config.getDescriptors(hasInterfaceObject=True): binding = toBindingNamespace(d.name) - pairs.append((d.name, binding)) + pairs.append((d.name, binding, binding)) for ctor in d.interface.namedConstructors: - pairs.append((ctor.identifier.name, binding)) + pairs.append((ctor.identifier.name, binding, binding)) pairs.sort(key=operator.itemgetter(0)) mappings = [ - CGGeneric('b"%s" => codegen::Bindings::%s::DefineDOMInterface as unsafe fn(_, _),' % pair) + CGGeneric('b"%s" => codegen::Bindings::%s::%s::DefineDOMInterface as unsafe fn(_, _),' % pair) for pair in pairs ] mapType = "phf::Map<&'static [u8], unsafe fn(*mut JSContext, HandleObject)>" @@ -6339,8 +6410,8 @@ class GlobalGenRoots(): CGRegisterProxyHandlers(config), ], "\n") - return CGImports(code, [], [], [ - 'dom::bindings::codegen', + return CGImports(code, [], [], [], [], [ + 'dom::bindings::codegen::Bindings', 'dom::bindings::codegen::PrototypeList::Proxies', 'libc', ], config, ignored_warnings=[]) @@ -6355,9 +6426,13 @@ class GlobalGenRoots(): @staticmethod def Bindings(config): - descriptors = (set(d.name + "Binding" for d in config.getDescriptors(register=True)) | - set(getModuleFromObject(d) for d in config.callbacks) | - set(getModuleFromObject(d) for d in config.getDictionaries())) + def leafModule(d): + return getModuleFromObject(d).split('::')[-1] + + descriptors = config.getDescriptors(register=True) + descriptors = (set(d.name + "Binding" for d in descriptors) | + set(leafModule(d) for d in config.callbacks) | + set(leafModule(d) for d in config.getDictionaries())) curr = CGList([CGGeneric("pub mod %s;\n" % name) for name in sorted(descriptors)]) curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT) return curr diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 4074736a462..fd005bc6e05 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -4,7 +4,7 @@ import os -from WebIDL import IDLExternalInterface, IDLInterface, WebIDLError +from WebIDL import IDLExternalInterface, IDLInterface, IDLWrapperType, WebIDLError class Configuration: @@ -183,7 +183,8 @@ class Descriptor(DescriptorProvider): # built-in rooting mechanisms for them. if self.interface.isCallback(): self.needsRooting = False - ty = "%sBinding::%s" % (ifaceName, ifaceName) + ty = 'dom::bindings::codegen::Bindings::%sBinding::%s' % (ifaceName, ifaceName) + pathDefault = ty self.returnType = "Rc<%s>" % ty self.argumentType = "???" self.nativeType = ty @@ -192,10 +193,12 @@ class Descriptor(DescriptorProvider): self.returnType = "Root<%s>" % typeName self.argumentType = "&%s" % typeName self.nativeType = "*const %s" % typeName + pathDefault = 'dom::types::%s' % typeName self.concreteType = typeName self.register = desc.get('register', True) - self.path = desc.get('path', 'dom::types::%s' % typeName) + self.path = desc.get('path', pathDefault) + self.bindingPath = 'dom::bindings::codegen::Bindings::%s' % ('::'.join([ifaceName + 'Binding'] * 2)) self.outerObjectHook = desc.get('outerObjectHook', 'None') self.proxy = False self.weakReferenceable = desc.get('weakReferenceable', False) @@ -377,7 +380,8 @@ class Descriptor(DescriptorProvider): # Some utility methods def getModuleFromObject(object): - return os.path.basename(object.location.filename()).split('.webidl')[0] + 'Binding' + return ('dom::bindings::codegen::Bindings::' + + os.path.basename(object.location.filename()).split('.webidl')[0] + 'Binding') def getTypesFromDescriptor(descriptor): @@ -404,6 +408,8 @@ def getTypesFromDictionary(dictionary): """ Get all member types for this dictionary """ + if isinstance(dictionary, IDLWrapperType): + dictionary = dictionary.inner types = [] curDict = dictionary while curDict: diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index 54d510781a1..f3195050908 100644 --- a/components/script/dom/bindings/codegen/parser/WebIDL.py +++ b/components/script/dom/bindings/codegen/parser/WebIDL.py @@ -2170,7 +2170,7 @@ class IDLUnresolvedType(IDLType): return typedefType.complete(scope) elif obj.isCallback() and not obj.isInterface(): assert self.name.name == obj.identifier.name - return IDLCallbackType(self.location, obj) + return IDLCallbackType(obj.location, obj) if self._promiseInnerType and not self._promiseInnerType.isComplete(): self._promiseInnerType = self._promiseInnerType.complete(scope) @@ -6534,7 +6534,7 @@ class Parser(Tokenizer): type = IDLTypedefType(self.getLocation(p, 1), obj.innerType, obj.identifier.name) elif obj.isCallback() and not obj.isInterface(): - type = IDLCallbackType(self.getLocation(p, 1), obj) + type = IDLCallbackType(obj.location, obj) else: type = IDLWrapperType(self.getLocation(p, 1), p[1]) p[0] = self.handleModifiers(type, p[2]) diff --git a/components/script/dom/bindings/codegen/parser/callback-location.patch b/components/script/dom/bindings/codegen/parser/callback-location.patch new file mode 100644 index 00000000000..ab6b0ae9b9b --- /dev/null +++ b/components/script/dom/bindings/codegen/parser/callback-location.patch @@ -0,0 +1,22 @@ +diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py +index da32340..81c52b7 100644 +--- a/components/script/dom/bindings/codegen/parser/WebIDL.py ++++ b/components/script/dom/bindings/codegen/parser/WebIDL.py +@@ -2170,7 +2170,7 @@ class IDLUnresolvedType(IDLType): + return typedefType.complete(scope) + elif obj.isCallback() and not obj.isInterface(): + assert self.name.name == obj.identifier.name +- return IDLCallbackType(self.location, obj) ++ return IDLCallbackType(obj.location, obj) + + if self._promiseInnerType and not self._promiseInnerType.isComplete(): + self._promiseInnerType = self._promiseInnerType.complete(scope) +@@ -6521,7 +6521,7 @@ class Parser(Tokenizer): + type = IDLTypedefType(self.getLocation(p, 1), obj.innerType, + obj.identifier.name) + elif obj.isCallback() and not obj.isInterface(): +- type = IDLCallbackType(self.getLocation(p, 1), obj) ++ type = IDLCallbackType(obj.location, obj) + else: + type = IDLWrapperType(self.getLocation(p, 1), p[1]) + p[0] = self.handleModifiers(type, p[2])
\ No newline at end of file diff --git a/components/script/dom/bindings/codegen/parser/update.sh b/components/script/dom/bindings/codegen/parser/update.sh index 76a99d9cecb..25aeefc5830 100755 --- a/components/script/dom/bindings/codegen/parser/update.sh +++ b/components/script/dom/bindings/codegen/parser/update.sh @@ -2,6 +2,7 @@ wget https://hg.mozilla.org/mozilla-central/raw-file/tip/dom/bindings/parser/Web patch < abstract.patch patch < debug.patch patch < pref-main-thread.patch +patch < callback-location.patch wget https://hg.mozilla.org/mozilla-central/archive/tip.tar.gz/dom/bindings/parser/tests/ -O tests.tar.gz rm -r tests |