diff options
author | Josh Matthews <josh@joshmatthews.net> | 2023-05-26 01:21:31 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2023-05-26 01:21:31 -0400 |
commit | 7d9dc458afca1b1931c33fd18c7ba5937dc8732e (patch) | |
tree | 87e5820984b1b453f125ab57366adcc0b0d0eb42 | |
parent | 747a99d3f6ddc1f3e3cf539cf873120efd69ef46 (diff) | |
download | servo-7d9dc458afca1b1931c33fd18c7ba5937dc8732e.tar.gz servo-7d9dc458afca1b1931c33fd18c7ba5937dc8732e.zip |
Use an enum to pass the index value for interfaces/protos.
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 13 | ||||
-rw-r--r-- | components/script/dom/bindings/interface.rs | 23 |
2 files changed, 27 insertions, 9 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 828a0e380c0..24cf71d8820 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -3490,11 +3490,12 @@ class CGGetPerInterfaceObject(CGAbstractMethod): CGAbstractMethod.__init__(self, descriptor, name, 'void', args, pub=pub) self.id = idPrefix + "::" + MakeNativeName(self.descriptor.name) + self.variant = self.id.split('::')[-2] def definition_body(self): return CGGeneric(""" - get_per_interface_object_handle(cx, global, %s as usize, CreateInterfaceObjects, rval) - """ % self.id) + get_per_interface_object_handle(cx, global, ProtoOrIfaceIndex::%s(%s), CreateInterfaceObjects, rval) + """ % (self.variant, self.id)) class CGGetProtoObjectMethod(CGGetPerInterfaceObject): @@ -3647,14 +3648,15 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): else: idPrefix = "PrototypeList::ID" self.id = idPrefix + "::" + MakeNativeName(self.descriptor.name) + self.variant = self.id.split('::')[-2] def define(self): return CGAbstractMethod.define(self) def definition_body(self): return CGGeneric(""" - define_dom_interface(cx, global, %s as usize, CreateInterfaceObjects, ConstructorEnabled) - """ % self.id) + define_dom_interface(cx, global, ProtoOrIfaceIndex::%s(%s), CreateInterfaceObjects, ConstructorEnabled) + """ % (self.variant, self.id)) def needCx(returnType, arguments, considerTypes): @@ -6425,17 +6427,18 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'crate::dom::bindings::interface::ConstructorClassHook', 'crate::dom::bindings::interface::InterfaceConstructorBehavior', 'crate::dom::bindings::interface::NonCallbackInterfaceObjectClass', + 'crate::dom::bindings::interface::ProtoOrIfaceIndex', 'crate::dom::bindings::interface::create_global_object', 'crate::dom::bindings::interface::create_callback_interface_object', 'crate::dom::bindings::interface::create_interface_prototype_object', 'crate::dom::bindings::interface::create_named_constructors', 'crate::dom::bindings::interface::create_noncallback_interface_object', + 'crate::dom::bindings::interface::define_dom_interface', 'crate::dom::bindings::interface::define_guarded_constants', 'crate::dom::bindings::interface::define_guarded_methods', 'crate::dom::bindings::interface::define_guarded_properties', 'crate::dom::bindings::interface::is_exposed_in', 'crate::dom::bindings::interface::get_per_interface_object_handle', - 'crate::dom::bindings::interface::define_dom_interface', 'crate::dom::bindings::htmlconstructor::pop_current_element_queue', 'crate::dom::bindings::htmlconstructor::push_new_element_queue', 'crate::dom::bindings::iterable::Iterable', diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index fbab9bfcf32..bf14d8ef496 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -537,10 +537,24 @@ unsafe extern "C" fn non_new_constructor( false } +pub enum ProtoOrIfaceIndex { + ID(PrototypeList::ID), + Constructor(PrototypeList::Constructor), +} + +impl Into<usize> for ProtoOrIfaceIndex { + fn into(self) -> usize { + match self { + ProtoOrIfaceIndex::ID(id) => id as usize, + ProtoOrIfaceIndex::Constructor(constructor) => constructor as usize, + } + } +} + pub fn get_per_interface_object_handle( cx: SafeJSContext, global: HandleObject, - id: usize, + id: ProtoOrIfaceIndex, creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray), mut rval: MutableHandleObject, ) { @@ -549,13 +563,14 @@ pub fn get_per_interface_object_handle( /* Check to see whether the interface objects are already installed */ let proto_or_iface_array = get_proto_or_iface_array(global.get()); - rval.set((*proto_or_iface_array)[id]); + let index: usize = id.into(); + rval.set((*proto_or_iface_array)[index]); if !rval.get().is_null() { return; } creator(cx, global, proto_or_iface_array); - rval.set((*proto_or_iface_array)[id]); + rval.set((*proto_or_iface_array)[index]); assert!(!rval.get().is_null()); } } @@ -563,7 +578,7 @@ pub fn get_per_interface_object_handle( pub fn define_dom_interface( cx: SafeJSContext, global: HandleObject, - id: usize, + id: ProtoOrIfaceIndex, creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray), enabled: fn(SafeJSContext, HandleObject) -> bool, ) { |