diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-04-13 14:34:39 -0500 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-04-13 14:34:39 -0500 |
commit | 1f9c2f9b34dede8182f45655b03380f8c26f3475 (patch) | |
tree | 307f2ee1ea15bc8fc8ce418650bf4bef10f43516 | |
parent | 74c847a17fb560dd4cd62069778776f6f06df19f (diff) | |
parent | d2b0d5e04084c936a457d0718f98f860c380026b (diff) | |
download | servo-1f9c2f9b34dede8182f45655b03380f8c26f3475.tar.gz servo-1f9c2f9b34dede8182f45655b03380f8c26f3475.zip |
Auto merge of #3726 - ChrisParis:callback-constants, r=jdm
This addresses https://github.com/servo/servo/issues/3149. The immediate purpose is to support the constants in NodeFilter. The changes mostly follow the current Gecko Codegen.py. The main gist is that the generation of certain code artifacts is now gated by hasInterfaceObject() or hasInterfacePrototypeObject(), rather than by isCallback().
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 60 | ||||
-rw-r--r-- | components/script/dom/bindings/codegen/Configuration.py | 5 | ||||
-rw-r--r-- | components/script/dom/bindings/utils.rs | 34 |
3 files changed, 62 insertions, 37 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index fa48578f3a3..960a84b1717 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1240,9 +1240,14 @@ class MethodDefiner(PropertyDefiner): # FIXME https://bugzilla.mozilla.org/show_bug.cgi?id=772822 # We should be able to check for special operations without an # identifier. For now we check if the name starts with __ - methods = [m for m in descriptor.interface.members if - m.isMethod() and m.isStatic() == static and - not m.isIdentifierLess()] + + # Ignore non-static methods for callback interfaces + if not descriptor.interface.isCallback() or static: + methods = [m for m in descriptor.interface.members if + m.isMethod() and m.isStatic() == static and + not m.isIdentifierLess()] + else: + methods = [] self.regular = [{"name": m.identifier.name, "methodInfo": not m.isStatic(), "length": methodLength(m), @@ -2095,7 +2100,6 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod): properties should be a PropertyArrays instance. """ def __init__(self, descriptor, properties): - assert not descriptor.interface.isCallback() args = [Argument('*mut JSContext', 'cx'), Argument('*mut JSObject', 'global'), Argument('*mut JSObject', 'receiver')] CGAbstractMethod.__init__(self, descriptor, 'CreateInterfaceObjects', '*mut JSObject', args) @@ -2112,6 +2116,11 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod): getParentProto = ("let parent_proto: *mut JSObject = %s;\n" "assert!(!parent_proto.is_null());\n") % getParentProto + if self.descriptor.interface.isCallback(): + protoClass = "None" + else: + protoClass = "Some(&PrototypeClass)" + if self.descriptor.concrete: if self.descriptor.proxy: domClass = "&Class" @@ -2136,9 +2145,9 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod): call = """\ return do_create_interface_objects(cx, global, receiver, parent_proto, - &PrototypeClass, %s, + %s, %s, %s, - &sNativeProperties);""" % (constructor, domClass) + &sNativeProperties);""" % (protoClass, constructor, domClass) return CGList([ CGGeneric(getParentProto), @@ -2286,9 +2295,11 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): return CGAbstractMethod.define(self) def definition_body(self): - return CGGeneric("""\ -assert!(!global.is_null()); -assert!(!GetProtoObject(cx, global, global).is_null());""") + if self.descriptor.interface.isCallback(): + code = "CreateInterfaceObjects(cx, global, global);" + else: + code = "assert!(!GetProtoObject(cx, global, global).is_null());" + return CGGeneric("assert!(!global.is_null());\n" + code) def needCx(returnType, arguments, considerTypes): return (considerTypes and @@ -4268,10 +4279,11 @@ class CGDescriptor(CGThing): def __init__(self, descriptor): CGThing.__init__(self) - assert not descriptor.interface.isCallback() + assert not descriptor.concrete or not descriptor.interface.isCallback() cgThings = [] - cgThings.append(CGGetProtoObjectMethod(descriptor)) + if not descriptor.interface.isCallback(): + cgThings.append(CGGetProtoObjectMethod(descriptor)) if descriptor.interface.hasInterfaceObject(): # https://github.com/mozilla/servo/issues/2665 # cgThings.append(CGGetConstructorObjectMethod(descriptor)) @@ -4285,7 +4297,7 @@ class CGDescriptor(CGThing): if m.isStatic(): assert descriptor.interface.hasInterfaceObject() cgThings.append(CGStaticMethod(descriptor, m)) - else: + elif not descriptor.interface.isCallback(): cgThings.append(CGSpecializedMethod(descriptor, m)) cgThings.append(CGMemberJITInfo(descriptor, m)) hasMethod = True @@ -4298,7 +4310,7 @@ class CGDescriptor(CGThing): if m.isStatic(): assert descriptor.interface.hasInterfaceObject() cgThings.append(CGStaticGetter(descriptor, m)) - else: + elif not descriptor.interface.isCallback(): cgThings.append(CGSpecializedGetter(descriptor, m)) if m.hasLenientThis(): hasLenientGetter = True @@ -4309,14 +4321,15 @@ class CGDescriptor(CGThing): if m.isStatic(): assert descriptor.interface.hasInterfaceObject() cgThings.append(CGStaticSetter(descriptor, m)) - else: + elif not descriptor.interface.isCallback(): cgThings.append(CGSpecializedSetter(descriptor, m)) if m.hasLenientThis(): hasLenientSetter = True else: hasSetter = True - if not m.isStatic(): + if (not m.isStatic() and + not descriptor.interface.isCallback()): cgThings.append(CGMemberJITInfo(descriptor, m)) if hasMethod: cgThings.append(CGGenericMethod(descriptor)) @@ -4337,7 +4350,8 @@ class CGDescriptor(CGThing): cgThings.append(CGClassConstructHook(descriptor)) cgThings.append(CGInterfaceObjectJSClass(descriptor)) - cgThings.append(CGPrototypeJSClass(descriptor)) + if not descriptor.interface.isCallback(): + cgThings.append(CGPrototypeJSClass(descriptor)) properties = PropertyArrays(descriptor) cgThings.append(CGGeneric(str(properties))) @@ -4383,8 +4397,9 @@ class CGDescriptor(CGThing): cgThings.append(CGWrapMethod(descriptor)) - cgThings.append(CGIDLInterface(descriptor)) - cgThings.append(CGInterfaceTrait(descriptor)) + if not descriptor.interface.isCallback(): + cgThings.append(CGIDLInterface(descriptor)) + cgThings.append(CGInterfaceTrait(descriptor)) cgThings = CGList(cgThings, "\n") #self.cgRoot = CGWrapper(CGNamespace(toBindingNamespace(descriptor.name), @@ -4638,7 +4653,14 @@ class CGBindingRoot(CGThing): """ def __init__(self, config, prefix, webIDLFile): descriptors = config.getDescriptors(webIDLFile=webIDLFile, - isCallback=False) + hasInterfaceObject=True) + # We also want descriptors that have an interface prototype object + # (isCallback=False), but we don't want to include a second copy + # of descriptors that we also matched in the previous line + # (hence hasInterfaceObject=False). + descriptors.extend(config.getDescriptors(webIDLFile=webIDLFile, + hasInterfaceObject=False, + isCallback=False)) dictionaries = config.getDictionaries(webIDLFile=webIDLFile) cgthings = [] diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index e6712357d35..5ea521e15b8 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -162,10 +162,12 @@ class Descriptor(DescriptorProvider): self.concreteType = ifaceName self.register = desc.get('register', True) self.outerObjectHook = desc.get('outerObjectHook', 'None') + self.proxy = False # If we're concrete, we need to crawl our ancestor interfaces and mark # them as having a concrete descendant. - self.concrete = desc.get('concrete', True) + self.concrete = (not self.interface.isCallback() and + desc.get('concrete', True)) self.operations = { 'IndexedGetter': None, @@ -190,7 +192,6 @@ class Descriptor(DescriptorProvider): addOperation('Stringifier', m) if self.concrete: - self.proxy = False iface = self.interface while iface: for m in iface.members: diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index c8a4e6a9da7..7d4bf9b88c7 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -180,36 +180,38 @@ unsafe impl Sync for NativeProperties {} pub type NonNullJSNative = unsafe extern "C" fn (arg1: *mut JSContext, arg2: c_uint, arg3: *mut JSVal) -> JSBool; -/// Creates the *interface prototype object* and the *interface object* (if -/// needed). +/// Creates the *interface prototype object* (if a `proto_class` is given) +/// and the *interface object* (if a `constructor` is given). /// Fails on JSAPI failure. pub fn do_create_interface_objects(cx: *mut JSContext, global: *mut JSObject, receiver: *mut JSObject, proto_proto: *mut JSObject, - proto_class: &'static JSClass, + proto_class: Option<&'static JSClass>, constructor: Option<(NonNullJSNative, &'static str, u32)>, dom_class: *const DOMClass, members: &'static NativeProperties) -> *mut JSObject { - let proto = create_interface_prototype_object(cx, global, proto_proto, - proto_class, members); - unsafe { - JS_SetReservedSlot(proto, DOM_PROTO_INSTANCE_CLASS_SLOT, - PrivateValue(dom_class as *const libc::c_void)); - } - - match constructor { - Some((native, name, nargs)) => { + let proto = match proto_class { + Some(proto_class) => { + let proto = create_interface_prototype_object(cx, global, proto_proto, + proto_class, members); + JS_SetReservedSlot(proto, DOM_PROTO_INSTANCE_CLASS_SLOT, + PrivateValue(dom_class as *const libc::c_void)); + proto + }, + None => ptr::null_mut() + }; + + if let Some((native, name, nargs)) = constructor { let s = CString::new(name).unwrap(); create_interface_object(cx, global, receiver, native, nargs, proto, members, s.as_ptr()) - }, - None => (), - } + } - proto + proto + } } /// Creates the *interface object*. |