Use an enum to pass the index value for interfaces/protos.

This commit is contained in:
Josh Matthews 2023-05-26 01:21:31 -04:00
parent 747a99d3f6
commit 7d9dc458af
2 changed files with 27 additions and 9 deletions

View file

@ -3490,11 +3490,12 @@ class CGGetPerInterfaceObject(CGAbstractMethod):
CGAbstractMethod.__init__(self, descriptor, name, CGAbstractMethod.__init__(self, descriptor, name,
'void', args, pub=pub) 'void', args, pub=pub)
self.id = idPrefix + "::" + MakeNativeName(self.descriptor.name) self.id = idPrefix + "::" + MakeNativeName(self.descriptor.name)
self.variant = self.id.split('::')[-2]
def definition_body(self): def definition_body(self):
return CGGeneric(""" return CGGeneric("""
get_per_interface_object_handle(cx, global, %s as usize, CreateInterfaceObjects, rval) get_per_interface_object_handle(cx, global, ProtoOrIfaceIndex::%s(%s), CreateInterfaceObjects, rval)
""" % self.id) """ % (self.variant, self.id))
class CGGetProtoObjectMethod(CGGetPerInterfaceObject): class CGGetProtoObjectMethod(CGGetPerInterfaceObject):
@ -3647,14 +3648,15 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod):
else: else:
idPrefix = "PrototypeList::ID" idPrefix = "PrototypeList::ID"
self.id = idPrefix + "::" + MakeNativeName(self.descriptor.name) self.id = idPrefix + "::" + MakeNativeName(self.descriptor.name)
self.variant = self.id.split('::')[-2]
def define(self): def define(self):
return CGAbstractMethod.define(self) return CGAbstractMethod.define(self)
def definition_body(self): def definition_body(self):
return CGGeneric(""" return CGGeneric("""
define_dom_interface(cx, global, %s as usize, CreateInterfaceObjects, ConstructorEnabled) define_dom_interface(cx, global, ProtoOrIfaceIndex::%s(%s), CreateInterfaceObjects, ConstructorEnabled)
""" % self.id) """ % (self.variant, self.id))
def needCx(returnType, arguments, considerTypes): 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::ConstructorClassHook',
'crate::dom::bindings::interface::InterfaceConstructorBehavior', 'crate::dom::bindings::interface::InterfaceConstructorBehavior',
'crate::dom::bindings::interface::NonCallbackInterfaceObjectClass', 'crate::dom::bindings::interface::NonCallbackInterfaceObjectClass',
'crate::dom::bindings::interface::ProtoOrIfaceIndex',
'crate::dom::bindings::interface::create_global_object', 'crate::dom::bindings::interface::create_global_object',
'crate::dom::bindings::interface::create_callback_interface_object', 'crate::dom::bindings::interface::create_callback_interface_object',
'crate::dom::bindings::interface::create_interface_prototype_object', 'crate::dom::bindings::interface::create_interface_prototype_object',
'crate::dom::bindings::interface::create_named_constructors', 'crate::dom::bindings::interface::create_named_constructors',
'crate::dom::bindings::interface::create_noncallback_interface_object', '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_constants',
'crate::dom::bindings::interface::define_guarded_methods', 'crate::dom::bindings::interface::define_guarded_methods',
'crate::dom::bindings::interface::define_guarded_properties', 'crate::dom::bindings::interface::define_guarded_properties',
'crate::dom::bindings::interface::is_exposed_in', 'crate::dom::bindings::interface::is_exposed_in',
'crate::dom::bindings::interface::get_per_interface_object_handle', '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::pop_current_element_queue',
'crate::dom::bindings::htmlconstructor::push_new_element_queue', 'crate::dom::bindings::htmlconstructor::push_new_element_queue',
'crate::dom::bindings::iterable::Iterable', 'crate::dom::bindings::iterable::Iterable',

View file

@ -537,10 +537,24 @@ unsafe extern "C" fn non_new_constructor(
false 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( pub fn get_per_interface_object_handle(
cx: SafeJSContext, cx: SafeJSContext,
global: HandleObject, global: HandleObject,
id: usize, id: ProtoOrIfaceIndex,
creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray), creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray),
mut rval: MutableHandleObject, mut rval: MutableHandleObject,
) { ) {
@ -549,13 +563,14 @@ pub fn get_per_interface_object_handle(
/* Check to see whether the interface objects are already installed */ /* Check to see whether the interface objects are already installed */
let proto_or_iface_array = get_proto_or_iface_array(global.get()); 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() { if !rval.get().is_null() {
return; return;
} }
creator(cx, global, proto_or_iface_array); 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()); assert!(!rval.get().is_null());
} }
} }
@ -563,7 +578,7 @@ pub fn get_per_interface_object_handle(
pub fn define_dom_interface( pub fn define_dom_interface(
cx: SafeJSContext, cx: SafeJSContext,
global: HandleObject, global: HandleObject,
id: usize, id: ProtoOrIfaceIndex,
creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray), creator: unsafe fn(SafeJSContext, HandleObject, *mut ProtoOrIfaceArray),
enabled: fn(SafeJSContext, HandleObject) -> bool, enabled: fn(SafeJSContext, HandleObject) -> bool,
) { ) {