mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Merge CGClassConstructHook and CGClassNameConstructHook (fixes #8934)
This commit is contained in:
parent
432087c0ea
commit
561fdbb150
1 changed files with 14 additions and 37 deletions
|
@ -4722,50 +4722,26 @@ class CGClassConstructHook(CGAbstractExternMethod):
|
||||||
"""
|
"""
|
||||||
JS-visible constructor for our objects
|
JS-visible constructor for our objects
|
||||||
"""
|
"""
|
||||||
def __init__(self, descriptor):
|
def __init__(self, descriptor, constructor=None):
|
||||||
args = [Argument('*mut JSContext', 'cx'), Argument('u32', 'argc'), Argument('*mut JSVal', 'vp')]
|
args = [Argument('*mut JSContext', 'cx'), Argument('u32', 'argc'), Argument('*mut JSVal', 'vp')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, CONSTRUCT_HOOK_NAME,
|
name = CONSTRUCT_HOOK_NAME
|
||||||
'bool', args)
|
if constructor:
|
||||||
self._ctor = self.descriptor.interface.ctor()
|
name += "_" + constructor.identifier.name
|
||||||
|
else:
|
||||||
def define(self):
|
constructor = descriptor.interface.ctor()
|
||||||
if not self._ctor:
|
assert constructor
|
||||||
return ""
|
CGAbstractExternMethod.__init__(self, descriptor, name, 'bool', args)
|
||||||
return CGAbstractExternMethod.define(self)
|
self.constructor = constructor
|
||||||
|
|
||||||
def definition_body(self):
|
def definition_body(self):
|
||||||
preamble = CGGeneric("""\
|
preamble = CGGeneric("""\
|
||||||
let global = global_root_from_object(JS_CALLEE(cx, vp).to_object());
|
let global = global_root_from_object(JS_CALLEE(cx, vp).to_object());
|
||||||
let args = CallArgs::from_vp(vp, argc);
|
let args = CallArgs::from_vp(vp, argc);
|
||||||
""")
|
""")
|
||||||
name = self._ctor.identifier.name
|
name = self.constructor.identifier.name
|
||||||
nativeName = MakeNativeName(self.descriptor.binaryNameFor(name))
|
nativeName = MakeNativeName(self.descriptor.binaryNameFor(name))
|
||||||
callGenerator = CGMethodCall(["global.r()"], nativeName, True,
|
callGenerator = CGMethodCall(["global.r()"], nativeName, True,
|
||||||
self.descriptor, self._ctor)
|
self.descriptor, self.constructor)
|
||||||
return CGList([preamble, callGenerator])
|
|
||||||
|
|
||||||
|
|
||||||
class CGClassNameConstructHook(CGAbstractExternMethod):
|
|
||||||
"""
|
|
||||||
JS-visible named constructor for our objects
|
|
||||||
"""
|
|
||||||
def __init__(self, descriptor, ctor):
|
|
||||||
args = [Argument('*mut JSContext', 'cx'), Argument('u32', 'argc'), Argument('*mut JSVal', 'vp')]
|
|
||||||
self._ctor = ctor
|
|
||||||
CGAbstractExternMethod.__init__(self, descriptor,
|
|
||||||
CONSTRUCT_HOOK_NAME + "_" +
|
|
||||||
self._ctor.identifier.name,
|
|
||||||
'bool', args)
|
|
||||||
|
|
||||||
def definition_body(self):
|
|
||||||
preamble = CGGeneric("""\
|
|
||||||
let global = global_root_from_object(JS_CALLEE(cx, vp).to_object());
|
|
||||||
let args = CallArgs::from_vp(vp, argc);
|
|
||||||
""")
|
|
||||||
name = self._ctor.identifier.name
|
|
||||||
nativeName = MakeNativeName(self.descriptor.binaryNameFor(name))
|
|
||||||
callGenerator = CGMethodCall(["global.r()"], nativeName, True,
|
|
||||||
self.descriptor, self._ctor)
|
|
||||||
return CGList([preamble, callGenerator])
|
return CGList([preamble, callGenerator])
|
||||||
|
|
||||||
|
|
||||||
|
@ -4932,9 +4908,10 @@ class CGDescriptor(CGThing):
|
||||||
cgThings.append(CGClassTraceHook(descriptor))
|
cgThings.append(CGClassTraceHook(descriptor))
|
||||||
|
|
||||||
if descriptor.interface.hasInterfaceObject():
|
if descriptor.interface.hasInterfaceObject():
|
||||||
|
if descriptor.interface.ctor():
|
||||||
cgThings.append(CGClassConstructHook(descriptor))
|
cgThings.append(CGClassConstructHook(descriptor))
|
||||||
for ctor in descriptor.interface.namedConstructors:
|
for ctor in descriptor.interface.namedConstructors:
|
||||||
cgThings.append(CGClassNameConstructHook(descriptor, ctor))
|
cgThings.append(CGClassConstructHook(descriptor, ctor))
|
||||||
cgThings.append(CGInterfaceObjectJSClass(descriptor))
|
cgThings.append(CGInterfaceObjectJSClass(descriptor))
|
||||||
|
|
||||||
if not descriptor.interface.isCallback():
|
if not descriptor.interface.isCallback():
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue