Auto merge of #8991 - nox:clean-construct-hook, r=frewsxcv

Merge CGClassConstructHook and CGClassNameConstructHook (fixes #8934)

Fixes #8934.

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8991)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2015-12-16 05:13:50 +05:30
commit 59a3544279

View file

@ -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():
cgThings.append(CGClassConstructHook(descriptor)) if descriptor.interface.ctor():
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():