Make generated proxy handlers and DOM object hooks generic (#35292)

* script: Make DOM proxy handlers generic over DOM types.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

* script: Make finalize and trace hooks generic over DOM types.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

---------

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
Josh Matthews 2025-02-05 07:51:34 -05:00 committed by GitHub
parent 1e164738d8
commit 2bd96633d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 72 additions and 46 deletions

View file

@ -2352,12 +2352,12 @@ class CGDOMJSClass(CGThing):
args = {
"domClass": DOMClass(self.descriptor),
"enumerateHook": "None",
"finalizeHook": FINALIZE_HOOK_NAME,
"finalizeHook": f"{FINALIZE_HOOK_NAME}::<D>",
"flags": "JSCLASS_FOREGROUND_FINALIZE",
"name": str_to_cstr_ptr(self.descriptor.interface.identifier.name),
"resolveHook": "None",
"slots": "1",
"traceHook": TRACE_HOOK_NAME,
"traceHook": f"{TRACE_HOOK_NAME}::<D>",
}
if self.descriptor.isGlobal():
assert not self.descriptor.weakReferenceable
@ -2371,7 +2371,7 @@ class CGDOMJSClass(CGThing):
return f"""
static CLASS_OPS: ThreadUnsafeOnceLock<JSClassOps> = ThreadUnsafeOnceLock::new();
pub(crate) fn init_class_ops() {{
pub(crate) fn init_class_ops<D: DomTypes>() {{
CLASS_OPS.set(JSClassOps {{
addProperty: None,
delProperty: None,
@ -2388,8 +2388,8 @@ pub(crate) fn init_class_ops() {{
static Class: ThreadUnsafeOnceLock<DOMJSClass> = ThreadUnsafeOnceLock::new();
pub(crate) fn init_domjs_class() {{
init_class_ops();
pub(crate) fn init_domjs_class<D: DomTypes>() {{
init_class_ops::<D>();
Class.set(DOMJSClass {{
base: JSClass {{
name: {args['name']},
@ -3024,7 +3024,8 @@ class CGWrapMethod(CGAbstractMethod):
retval = f'DomRoot<{descriptor.concreteType}>'
CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args,
pub=True, unsafe=True,
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'])
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'],
templateArgs=['D: DomTypes'])
def definition_body(self):
unforgeable = CopyLegacyUnforgeablePropertiesToInstance(self.descriptor)
@ -3117,7 +3118,8 @@ class CGWrapGlobalMethod(CGAbstractMethod):
retval = f'DomRoot<{descriptor.concreteType}>'
CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args,
pub=True, unsafe=True,
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'])
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'],
templateArgs=['D: DomTypes'])
self.properties = properties
def definition_body(self):
@ -3139,7 +3141,7 @@ create_global_object(
cx,
&Class.get().base,
raw.as_ptr() as *const libc::c_void,
_trace,
{TRACE_HOOK_NAME}::<D>,
obj.handle_mut(),
origin);
assert!(!obj.is_null());
@ -3216,7 +3218,7 @@ impl DomObjectWrap for {name} {{
Option<HandleObject>,
Box<Self>,
CanGc,
) -> Root<Dom<Self>> = Wrap;
) -> Root<Dom<Self>> = Wrap::<crate::DomTypeHolder>;
}}
"""
@ -3240,7 +3242,7 @@ impl DomObjectIteratorWrap for {name} {{
Option<HandleObject>,
Box<IterableIterator<Self>>,
CanGc,
) -> Root<Dom<IterableIterator<Self>>> = Wrap;
) -> Root<Dom<IterableIterator<Self>>> = Wrap::<crate::DomTypeHolder>;
}}
"""
@ -3703,11 +3705,11 @@ class CGDefineProxyHandler(CGAbstractMethod):
customDefineProperty = 'proxyhandler::define_property'
if self.descriptor.isMaybeCrossOriginObject() or self.descriptor.operations['IndexedSetter'] or \
self.descriptor.operations['NamedSetter']:
customDefineProperty = 'defineProperty'
customDefineProperty = 'defineProperty::<D>'
customDelete = 'proxyhandler::delete'
if self.descriptor.isMaybeCrossOriginObject() or self.descriptor.operations['NamedDeleter']:
customDelete = 'delete'
customDelete = 'delete::<D>'
customGetPrototypeIfOrdinary = 'Some(proxyhandler::get_prototype_if_ordinary)'
customGetPrototype = 'None'
@ -3728,17 +3730,17 @@ class CGDefineProxyHandler(CGAbstractMethod):
assert not self.descriptor.operations['NamedGetter']
customSet = 'Some(proxyhandler::maybe_cross_origin_set_rawcx)'
getOwnEnumerablePropertyKeys = "own_property_keys"
getOwnEnumerablePropertyKeys = "own_property_keys::<D>"
if self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties") or \
self.descriptor.isMaybeCrossOriginObject():
getOwnEnumerablePropertyKeys = "getOwnEnumerablePropertyKeys"
getOwnEnumerablePropertyKeys = "getOwnEnumerablePropertyKeys::<D>"
return CGGeneric(f"""
let traps = ProxyTraps {{
enter: None,
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor),
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor::<D>),
defineProperty: Some({customDefineProperty}),
ownPropertyKeys: Some(own_property_keys),
ownPropertyKeys: Some(own_property_keys::<D>),
delete_: Some({customDelete}),
enumerate: None,
getPrototypeIfOrdinary: {customGetPrototypeIfOrdinary},
@ -3748,11 +3750,11 @@ let traps = ProxyTraps {{
preventExtensions: Some(proxyhandler::prevent_extensions),
isExtensible: Some(proxyhandler::is_extensible),
has: None,
get: Some(get),
get: Some(get::<D>),
set: {customSet},
call: None,
construct: None,
hasOwn: Some(hasOwn),
hasOwn: Some(hasOwn::<D>),
getOwnEnumerablePropertyKeys: Some({getOwnEnumerablePropertyKeys}),
nativeCall: None,
objectClassIs: None,
@ -3760,8 +3762,8 @@ let traps = ProxyTraps {{
fun_toString: None,
boxedValue_unbox: None,
defaultValue: None,
trace: Some({TRACE_HOOK_NAME}),
finalize: Some({FINALIZE_HOOK_NAME}),
trace: Some({TRACE_HOOK_NAME}::<D>),
finalize: Some({FINALIZE_HOOK_NAME}::<D>),
objectMoved: None,
isCallable: None,
isConstructor: None,
@ -5708,7 +5710,7 @@ class CGProxyNamedOperation(CGProxySpecialOperation):
# Our first argument is the id we're getting.
argName = self.arguments[0].identifier.name
return (f'let {argName} = jsid_to_string(*cx, Handle::from_raw(id)).expect("Not a string-convertible JSID?");\n'
"let this = UnwrapProxy(proxy);\n"
"let this = UnwrapProxy::<D>(proxy);\n"
"let this = &*this;\n"
f"{CGProxySpecialOperation.define(self)}")
@ -5758,7 +5760,7 @@ class CGProxyNamedDeleter(CGProxyNamedOperation):
" return false;\n"
" }\n"
" };\n"
" let this = UnwrapProxy(proxy);\n"
" let this = UnwrapProxy::<D>(proxy);\n"
" let this = &*this;\n"
f" {CGProxySpecialOperation.define(self)}"
"}\n")
@ -5768,14 +5770,15 @@ class CGProxyUnwrap(CGAbstractMethod):
def __init__(self, descriptor):
args = [Argument('RawHandleObject', 'obj')]
CGAbstractMethod.__init__(self, descriptor, "UnwrapProxy",
f'*const {descriptor.concreteType}', args,
alwaysInline=True, unsafe=True)
f'*const D::{descriptor.concreteType}', args,
alwaysInline=True, unsafe=True,
templateArgs=['D: DomTypes'])
def definition_body(self):
return CGGeneric(f"""
let mut slot = UndefinedValue();
GetProxyReservedSlot(obj.get(), 0, &mut slot);
let box_ = slot.to_private() as *const {self.descriptor.concreteType};
let box_ = slot.to_private() as *const D::{self.descriptor.concreteType};
return box_;""")
@ -5786,7 +5789,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
Argument('RawMutableHandle<PropertyDescriptor>', 'mut desc'),
Argument('*mut bool', 'is_none')]
CGAbstractExternMethod.__init__(self, descriptor, "getOwnPropertyDescriptor",
"bool", args)
"bool", args, templateArgs=['D: DomTypes'])
self.descriptor = descriptor
# https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
@ -5833,7 +5836,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
'pre': 'rooted!(in(*cx) let mut rval = UndefinedValue());'
}
get += ("if let Some(index) = index {\n"
" let this = UnwrapProxy(proxy);\n"
" let this = UnwrapProxy::<D>(proxy);\n"
" let this = &*this;\n"
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()}\n"
"}\n")
@ -5911,7 +5914,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
Argument('RawHandleId', 'id'),
Argument('RawHandle<PropertyDescriptor>', 'desc'),
Argument('*mut ObjectOpResult', 'opresult')]
CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "bool", args)
CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "bool", args, templateArgs=['D: DomTypes'])
self.descriptor = descriptor
def getBody(self):
@ -5932,7 +5935,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
if indexedSetter:
set += ("let index = get_array_index_from_id(*cx, Handle::from_raw(id));\n"
"if let Some(index) = index {\n"
" let this = UnwrapProxy(proxy);\n"
" let this = UnwrapProxy::<D>(proxy);\n"
" let this = &*this;\n"
f"{CGIndenter(CGProxyIndexedSetter(self.descriptor)).define()}"
" return (*opresult).succeed();\n"
@ -5970,7 +5973,7 @@ class CGDOMJSProxyHandler_delete(CGAbstractExternMethod):
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
Argument('RawHandleId', 'id'),
Argument('*mut ObjectOpResult', 'res')]
CGAbstractExternMethod.__init__(self, descriptor, "delete", "bool", args)
CGAbstractExternMethod.__init__(self, descriptor, "delete", "bool", args, templateArgs=['D: DomTypes'])
self.descriptor = descriptor
def getBody(self):
@ -6004,14 +6007,15 @@ class CGDOMJSProxyHandler_ownPropertyKeys(CGAbstractExternMethod):
args = [Argument('*mut JSContext', 'cx'),
Argument('RawHandleObject', 'proxy'),
Argument('RawMutableHandleIdVector', 'props')]
CGAbstractExternMethod.__init__(self, descriptor, "own_property_keys", "bool", args)
CGAbstractExternMethod.__init__(self, descriptor, "own_property_keys", "bool", args,
templateArgs=['D: DomTypes'])
self.descriptor = descriptor
def getBody(self):
body = dedent(
"""
let cx = SafeJSContext::from_ptr(cx);
let unwrapped_proxy = UnwrapProxy(proxy);
let unwrapped_proxy = UnwrapProxy::<D>(proxy);
""")
if self.descriptor.isMaybeCrossOriginObject():
@ -6077,14 +6081,14 @@ class CGDOMJSProxyHandler_getOwnEnumerablePropertyKeys(CGAbstractExternMethod):
Argument('RawHandleObject', 'proxy'),
Argument('RawMutableHandleIdVector', 'props')]
CGAbstractExternMethod.__init__(self, descriptor,
"getOwnEnumerablePropertyKeys", "bool", args)
"getOwnEnumerablePropertyKeys", "bool", args, templateArgs=['D: DomTypes'])
self.descriptor = descriptor
def getBody(self):
body = dedent(
"""
let cx = SafeJSContext::from_ptr(cx);
let unwrapped_proxy = UnwrapProxy(proxy);
let unwrapped_proxy = UnwrapProxy::<D>(proxy);
""")
if self.descriptor.isMaybeCrossOriginObject():
@ -6131,7 +6135,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
Argument('RawHandleId', 'id'), Argument('*mut bool', 'bp')]
CGAbstractExternMethod.__init__(self, descriptor, "hasOwn", "bool", args)
CGAbstractExternMethod.__init__(self, descriptor, "hasOwn", "bool", args, templateArgs=['D: DomTypes'])
self.descriptor = descriptor
def getBody(self):
@ -6154,7 +6158,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
if indexedGetter:
indexed += ("let index = get_array_index_from_id(*cx, Handle::from_raw(id));\n"
"if let Some(index) = index {\n"
" let this = UnwrapProxy(proxy);\n"
" let this = UnwrapProxy::<D>(proxy);\n"
" let this = &*this;\n"
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor)).define()}\n"
" *bp = result.is_some();\n"
@ -6206,7 +6210,7 @@ class CGDOMJSProxyHandler_get(CGAbstractExternMethod):
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
Argument('RawHandleValue', 'receiver'), Argument('RawHandleId', 'id'),
Argument('RawMutableHandleValue', 'vp')]
CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args)
CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args, templateArgs=['D: DomTypes'])
self.descriptor = descriptor
# https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
@ -6246,7 +6250,7 @@ if !expando.is_null() {
if indexedGetter:
getIndexedOrExpando = ("let index = get_array_index_from_id(*cx, id_lt);\n"
"if let Some(index) = index {\n"
" let this = UnwrapProxy(proxy);\n"
" let this = UnwrapProxy::<D>(proxy);\n"
" let this = &*this;\n"
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()}")
trimmedGetFromExpando = stripTrailingWhitespace(getFromExpando.replace('\n', '\n '))
@ -6341,7 +6345,7 @@ class CGAbstractClassHook(CGAbstractExternMethod):
"""
def __init__(self, descriptor, name, returnType, args, doesNotPanic=False):
CGAbstractExternMethod.__init__(self, descriptor, name, returnType,
args)
args, templateArgs=['D: DomTypes'])
def definition_body_prologue(self):
return CGGeneric(f"""
@ -6725,7 +6729,7 @@ class CGInitStatics(CGThing):
else ""
)
nonproxy = (
"init_domjs_class();"
"init_domjs_class::<D>();"
if not descriptor.proxy
and descriptor.concrete
else ""