diff options
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index c707622c6dc..a0ea1a0e3f0 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -2089,13 +2089,18 @@ class CGDefineProxyHandler(CGAbstractMethod): customDefineProperty = 'defineProperty_' if self.descriptor.operations['IndexedSetter'] or self.descriptor.operations['NamedSetter']: customDefineProperty = 'defineProperty' + + customDelete = 'delete_' + if self.descriptor.operations['NamedDeleter']: + customDelete = 'delete' + body = """\ let traps = ProxyTraps { getPropertyDescriptor: Some(getPropertyDescriptor), getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor), defineProperty: Some(%s), getOwnPropertyNames: Some(getOwnPropertyNames_), - delete_: Some(delete_), + delete_: Some(%s), enumerate: Some(enumerate_), has: None, @@ -2123,7 +2128,7 @@ let traps = ProxyTraps { }; CreateProxyHandler(&traps, &Class as *const _ as *const _) -""" % (customDefineProperty, FINALIZE_HOOK_NAME, +""" % (customDefineProperty, customDelete, FINALIZE_HOOK_NAME, TRACE_HOOK_NAME) return CGGeneric(body) @@ -3580,6 +3585,14 @@ class CGProxyNamedSetter(CGProxySpecialOperation): def __init__(self, descriptor): CGProxySpecialOperation.__init__(self, descriptor, 'NamedSetter') +class CGProxyNamedDeleter(CGProxySpecialOperation): + """ + Class to generate a call to a named deleter. + """ + def __init__(self, descriptor): + CGProxySpecialOperation.__init__(self, descriptor, 'NamedDeleter') + + class CGProxyUnwrap(CGAbstractMethod): def __init__(self, descriptor): args = [Argument('*mut JSObject', 'obj')] @@ -3748,6 +3761,28 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): def definition_body(self): return CGGeneric(self.getBody()) +class CGDOMJSProxyHandler_delete(CGAbstractExternMethod): + def __init__(self, descriptor): + args = [Argument('*mut JSContext', 'cx'), Argument('*mut JSObject', 'proxy'), + Argument('jsid', 'id'), + Argument('*mut bool', 'bp')] + CGAbstractExternMethod.__init__(self, descriptor, "delete", "bool", args) + self.descriptor = descriptor + + def getBody(self): + set = "" + if self.descriptor.operations['NamedDeleter']: + set += ("let name = jsid_to_str(cx, id);\n" + + "let this = UnwrapProxy(proxy);\n" + + "let this = JS::from_raw(this);\n" + + "let this = this.root();\n" + + "%s") % (CGProxyNamedDeleter(self.descriptor).define()) + set += "return proxyhandler::delete_(%s);" % ", ".join(a.name for a in self.args) + return set + + def definition_body(self): + return CGGeneric(self.getBody()) + class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): def __init__(self, descriptor): args = [Argument('*mut JSContext', 'cx'), Argument('*mut JSObject', 'proxy'), @@ -4164,6 +4199,12 @@ class CGDescriptor(CGThing): if descriptor.operations['IndexedSetter'] or descriptor.operations['NamedSetter']: cgThings.append(CGDOMJSProxyHandler_defineProperty(descriptor)) + # We want to prevent indexed deleters from compiling at all. + assert not descriptor.operations['IndexedDeleter'] + + if descriptor.operations['NamedDeleter']: + cgThings.append(CGDOMJSProxyHandler_delete(descriptor)) + #cgThings.append(CGDOMJSProxyHandler(descriptor)) #cgThings.append(CGIsMethod(descriptor)) pass |