Merge pull request #2693 from Ms2ger/fix-indentation

Clean up the indentation of generated code.
This commit is contained in:
Josh Matthews 2014-06-22 13:04:32 +02:00
commit f6294a67c5

View file

@ -168,7 +168,7 @@ class CGMethodCall(CGThing):
# here for our one signature and not worry about switching # here for our one signature and not worry about switching
# on anything. # on anything.
signature = signatures[0] signature = signatures[0]
self.cgRoot = CGList([ CGIndenter(getPerSignatureCall(signature)) ]) self.cgRoot = CGList([getPerSignatureCall(signature)])
requiredArgs = requiredArgCount(signature) requiredArgs = requiredArgCount(signature)
@ -179,7 +179,7 @@ class CGMethodCall(CGThing):
" return 0;\n" " return 0;\n"
"}" % (requiredArgs, methodName)) "}" % (requiredArgs, methodName))
self.cgRoot.prepend( self.cgRoot.prepend(
CGWrapper(CGIndenter(CGGeneric(code)), pre="\n", post="\n")) CGWrapper(CGGeneric(code), pre="\n", post="\n"))
return return
@ -359,7 +359,7 @@ class CGMethodCall(CGThing):
#overloadCGThings.append( #overloadCGThings.append(
# CGGeneric('fail!("We have an always-returning default case");\n' # CGGeneric('fail!("We have an always-returning default case");\n'
# 'return 0;')) # 'return 0;'))
self.cgRoot = CGWrapper(CGIndenter(CGList(overloadCGThings, "\n")), self.cgRoot = CGWrapper(CGList(overloadCGThings, "\n"),
pre="\n") pre="\n")
def define(self): def define(self):
@ -1709,50 +1709,52 @@ class CGAbstractMethod(CGThing):
def _returnType(self): def _returnType(self):
return (" -> %s" % self.returnType) if self.returnType != "void" else "" return (" -> %s" % self.returnType) if self.returnType != "void" else ""
def _unsafe_open(self):
return "\n unsafe {\n" if self.unsafe else ""
def _unsafe_close(self):
return "\n }\n" if self.unsafe else ""
def define(self): def define(self):
return self.definition_prologue() + "\n" + self.definition_body() + self.definition_epilogue() body = self.definition_body()
if self.unsafe:
body = CGWrapper(body, pre="unsafe {\n", post="\n}")
return CGWrapper(CGIndenter(body),
pre=self.definition_prologue(),
post=self.definition_epilogue()).define()
def definition_prologue(self): def definition_prologue(self):
return "%sfn %s%s(%s)%s {%s" % (self._decorators(), self.name, self._template(), return "%sfn %s%s(%s)%s {\n" % (self._decorators(), self.name, self._template(),
self._argstring(), self._returnType(), self._unsafe_open()) self._argstring(), self._returnType())
def definition_epilogue(self): def definition_epilogue(self):
return "%s}\n" % self._unsafe_close() return "\n}\n"
def definition_body(self): def definition_body(self):
assert(False) # Override me! assert(False) # Override me!
def CreateBindingJSObject(descriptor, parent=None): def CreateBindingJSObject(descriptor, parent=None):
create = " let mut raw: JS<%s> = JS::from_raw(&*aObject);\n" % descriptor.concreteType create = "let mut raw: JS<%s> = JS::from_raw(&*aObject);\n" % descriptor.concreteType
if descriptor.proxy: if descriptor.proxy:
assert not descriptor.createGlobal assert not descriptor.createGlobal
create += """ create += """
let js_info = aScope.deref().page().js_info(); let js_info = aScope.deref().page().js_info();
let handler = js_info.get_ref().dom_static.proxy_handlers.deref().get(&(PrototypeList::id::%s as uint)); let handler = js_info.get_ref().dom_static.proxy_handlers.deref().get(&(PrototypeList::id::%s as uint));
let mut private = PrivateValue(squirrel_away_unique(aObject) as *libc::c_void); let mut private = PrivateValue(squirrel_away_unique(aObject) as *libc::c_void);
let obj = with_compartment(aCx, proto, || { let obj = with_compartment(aCx, proto, || {
NewProxyObject(aCx, *handler, NewProxyObject(aCx, *handler,
&private, &private,
proto, %s, proto, %s,
ptr::mut_null(), ptr::mut_null()) ptr::mut_null(), ptr::mut_null())
}); });
assert!(obj.is_not_null()); assert!(obj.is_not_null());
""" % (descriptor.name, parent) """ % (descriptor.name, parent)
else: else:
if descriptor.createGlobal: if descriptor.createGlobal:
create += " let obj = CreateDOMGlobal(aCx, &Class.base as *js::Class as *JSClass);\n" create += "let obj = CreateDOMGlobal(aCx, &Class.base as *js::Class as *JSClass);\n"
else: else:
create += (" let obj = with_compartment(aCx, proto, || {\n" create += ("let obj = with_compartment(aCx, proto, || {\n"
" JS_NewObject(aCx, &Class.base as *js::Class as *JSClass, proto, %s)\n" " JS_NewObject(aCx, &Class.base as *js::Class as *JSClass, proto, %s)\n"
" });\n" % parent) "});\n" % parent)
create += """ assert!(obj.is_not_null()); create += """assert!(obj.is_not_null());
JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32, JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32,
PrivateValue(squirrel_away_unique(aObject) as *libc::c_void)); PrivateValue(squirrel_away_unique(aObject) as *libc::c_void));
""" """
return create return create
@ -1770,28 +1772,28 @@ class CGWrapMethod(CGAbstractMethod):
def definition_body(self): def definition_body(self):
if not self.descriptor.createGlobal: if not self.descriptor.createGlobal:
return """ return CGGeneric("""\
let scope = aScope.reflector().get_jsobject(); let scope = aScope.reflector().get_jsobject();
assert!(scope.is_not_null()); assert!(scope.is_not_null());
assert!(((*JS_GetClass(scope)).flags & JSCLASS_IS_GLOBAL) != 0); assert!(((*JS_GetClass(scope)).flags & JSCLASS_IS_GLOBAL) != 0);
let proto = with_compartment(aCx, scope, || GetProtoObject(aCx, scope, scope)); let proto = with_compartment(aCx, scope, || GetProtoObject(aCx, scope, scope));
assert!(proto.is_not_null()); assert!(proto.is_not_null());
%s %s
raw.reflector().set_jsobject(obj); raw.reflector().set_jsobject(obj);
return raw;""" % CreateBindingJSObject(self.descriptor, "scope") return raw;""" % CreateBindingJSObject(self.descriptor, "scope"))
else: else:
return """ return CGGeneric("""\
%s %s
with_compartment(aCx, obj, || { with_compartment(aCx, obj, || {
let proto = GetProtoObject(aCx, obj, obj); let proto = GetProtoObject(aCx, obj, obj);
JS_SetPrototype(aCx, obj, proto); JS_SetPrototype(aCx, obj, proto);
}); });
raw.reflector().set_jsobject(obj); raw.reflector().set_jsobject(obj);
return raw;""" % CreateBindingJSObject(self.descriptor) return raw;""" % CreateBindingJSObject(self.descriptor))
class CGIDLInterface(CGThing): class CGIDLInterface(CGThing):
@ -1920,12 +1922,10 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
arrayPtr("methods"), arrayPtr("attrs"), arrayPtr("methods"), arrayPtr("attrs"),
arrayPtr("consts"), arrayPtr("staticMethods")) arrayPtr("consts"), arrayPtr("staticMethods"))
functionBody = CGList( return CGList([
[CGGeneric(getParentProto), CGGeneric(getParentProto),
CGGeneric(call % self.properties.variableNames())], CGGeneric(call % self.properties.variableNames())
"\n\n") ], "\n")
#return CGIndenter(CGWrapper(functionBody, pre="/*", post="*/return ptr::null()")).define()
return CGIndenter(functionBody).define()
class CGGetPerInterfaceObject(CGAbstractMethod): class CGGetPerInterfaceObject(CGAbstractMethod):
""" """
@ -1939,27 +1939,27 @@ class CGGetPerInterfaceObject(CGAbstractMethod):
'*mut JSObject', args, pub=pub) '*mut JSObject', args, pub=pub)
self.id = idPrefix + "id::" + self.descriptor.name self.id = idPrefix + "id::" + self.descriptor.name
def definition_body(self): def definition_body(self):
return """ return CGGeneric("""
/* aGlobal and aReceiver are usually the same, but they can be different /* aGlobal and aReceiver are usually the same, but they can be different
too. For example a sandbox often has an xray wrapper for a window as the too. For example a sandbox often has an xray wrapper for a window as the
prototype of the sandbox's global. In that case aReceiver is the xray prototype of the sandbox's global. In that case aReceiver is the xray
wrapper and aGlobal is the sandbox's global. wrapper and aGlobal is the sandbox's global.
*/ */
assert!(((*JS_GetClass(aGlobal)).flags & JSCLASS_DOM_GLOBAL) != 0); assert!(((*JS_GetClass(aGlobal)).flags & JSCLASS_DOM_GLOBAL) != 0);
/* Check to see whether the interface objects are already installed */ /* Check to see whether the interface objects are already installed */
let protoOrIfaceArray = GetProtoOrIfaceArray(aGlobal); let protoOrIfaceArray = GetProtoOrIfaceArray(aGlobal);
let cachedObject: *mut JSObject = *protoOrIfaceArray.offset(%s as int); let cachedObject: *mut JSObject = *protoOrIfaceArray.offset(%s as int);
if cachedObject.is_null() { if cachedObject.is_null() {
let tmp: *mut JSObject = CreateInterfaceObjects(aCx, aGlobal, aReceiver); let tmp: *mut JSObject = CreateInterfaceObjects(aCx, aGlobal, aReceiver);
assert!(tmp.is_not_null()); assert!(tmp.is_not_null());
*protoOrIfaceArray.offset(%s as int) = tmp; *protoOrIfaceArray.offset(%s as int) = tmp;
tmp tmp
} else { } else {
cachedObject cachedObject
}""" % (self.id, self.id) }""" % (self.id, self.id))
class CGGetProtoObjectMethod(CGGetPerInterfaceObject): class CGGetProtoObjectMethod(CGGetPerInterfaceObject):
""" """
@ -1969,9 +1969,12 @@ class CGGetProtoObjectMethod(CGGetPerInterfaceObject):
CGGetPerInterfaceObject.__init__(self, descriptor, "GetProtoObject", CGGetPerInterfaceObject.__init__(self, descriptor, "GetProtoObject",
"PrototypeList::", pub=True) "PrototypeList::", pub=True)
def definition_body(self): def definition_body(self):
return """ return CGList([
/* Get the interface prototype object for this class. This will create the CGGeneric("""\
object as needed. */""" + CGGetPerInterfaceObject.definition_body(self) /* Get the interface prototype object for this class. This will create the
object as needed. */"""),
CGGetPerInterfaceObject.definition_body(self),
])
class CGGetConstructorObjectMethod(CGGetPerInterfaceObject): class CGGetConstructorObjectMethod(CGGetPerInterfaceObject):
""" """
@ -1981,9 +1984,12 @@ class CGGetConstructorObjectMethod(CGGetPerInterfaceObject):
CGGetPerInterfaceObject.__init__(self, descriptor, "GetConstructorObject", CGGetPerInterfaceObject.__init__(self, descriptor, "GetConstructorObject",
"constructors::") "constructors::")
def definition_body(self): def definition_body(self):
return """ return CGList([
/* Get the interface object for this class. This will create the object as CGGeneric("""\
needed. */""" + CGGetPerInterfaceObject.definition_body(self) /* Get the interface object for this class. This will create the object as
needed. */"""),
CGGetPerInterfaceObject.definition_body(self),
])
class CGDefineDOMInterfaceMethod(CGAbstractMethod): class CGDefineDOMInterfaceMethod(CGAbstractMethod):
""" """
@ -2001,52 +2007,52 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod):
return CGAbstractMethod.define(self) return CGAbstractMethod.define(self)
def definition_body(self): def definition_body(self):
body = "" body = CGList([])
#XXXjdm This self.descriptor.concrete check shouldn't be necessary #XXXjdm This self.descriptor.concrete check shouldn't be necessary
if not self.descriptor.concrete or self.descriptor.proxy: if not self.descriptor.concrete or self.descriptor.proxy:
body += """ let traps = ProxyTraps { body.append(CGGeneric("""let traps = ProxyTraps {
getPropertyDescriptor: Some(getPropertyDescriptor), getPropertyDescriptor: Some(getPropertyDescriptor),
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor), getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor),
defineProperty: Some(defineProperty), defineProperty: Some(defineProperty),
getOwnPropertyNames: ptr::null(), getOwnPropertyNames: ptr::null(),
delete_: None, delete_: None,
enumerate: ptr::null(), enumerate: ptr::null(),
has: None, has: None,
hasOwn: Some(hasOwn), hasOwn: Some(hasOwn),
get: Some(get), get: Some(get),
set: None, set: None,
keys: ptr::null(), keys: ptr::null(),
iterate: None, iterate: None,
call: None, call: None,
construct: None, construct: None,
nativeCall: ptr::null(), nativeCall: ptr::null(),
hasInstance: None, hasInstance: None,
typeOf: None, typeOf: None,
objectClassIs: None, objectClassIs: None,
obj_toString: Some(obj_toString), obj_toString: Some(obj_toString),
fun_toString: None, fun_toString: None,
//regexp_toShared: ptr::null(), //regexp_toShared: ptr::null(),
defaultValue: None, defaultValue: None,
iteratorNext: None, iteratorNext: None,
finalize: Some(%s), finalize: Some(%s),
getElementIfPresent: None, getElementIfPresent: None,
getPrototypeOf: None, getPrototypeOf: None,
trace: Some(%s) trace: Some(%s)
}; };
js_info.dom_static.proxy_handlers.insert(PrototypeList::id::%s as uint, js_info.dom_static.proxy_handlers.insert(PrototypeList::id::%s as uint,
CreateProxyHandler(&traps, &Class as *_ as *_)); CreateProxyHandler(&traps, &Class as *_ as *_));
""" % (FINALIZE_HOOK_NAME, """ % (FINALIZE_HOOK_NAME,
TRACE_HOOK_NAME, TRACE_HOOK_NAME,
self.descriptor.name) self.descriptor.name)))
if self.descriptor.interface.hasInterfaceObject(): if self.descriptor.interface.hasInterfaceObject():
body += """ let cx = (**js_info.js_context).ptr; body.append(CGGeneric("""let cx = (**js_info.js_context).ptr;
let global = window.reflector().get_jsobject(); let global = window.reflector().get_jsobject();
assert!(global.is_not_null()); assert!(global.is_not_null());
assert!(GetProtoObject(cx, global, global).is_not_null());""" assert!(GetProtoObject(cx, global, global).is_not_null());"""))
return body return body
@ -2337,14 +2343,14 @@ class CGAbstractBindingMethod(CGAbstractExternMethod):
unwrapThis = str(CastableObjectUnwrapper( unwrapThis = str(CastableObjectUnwrapper(
FakeCastableDescriptor(self.descriptor), FakeCastableDescriptor(self.descriptor),
"obj", self.unwrapFailureCode)) "obj", self.unwrapFailureCode))
unwrapThis = CGIndenter( unwrapThis = CGGeneric(
CGGeneric("let obj: *mut JSObject = JS_THIS_OBJECT(cx, vp as *mut JSVal);\n" "let obj: *mut JSObject = JS_THIS_OBJECT(cx, vp as *mut JSVal);\n"
"if obj.is_null() {\n" "if obj.is_null() {\n"
" return false as JSBool;\n" " return false as JSBool;\n"
"}\n" "}\n"
"\n" "\n"
"let this: JS<%s> = %s;\n" % (self.descriptor.concreteType, unwrapThis))) "let this: JS<%s> = %s;\n" % (self.descriptor.concreteType, unwrapThis))
return CGList([ unwrapThis, self.generate_code() ], "\n").define() return CGList([ unwrapThis, self.generate_code() ], "\n")
def generate_code(self): def generate_code(self):
assert(False) # Override me assert(False) # Override me
@ -2359,9 +2365,9 @@ class CGGenericMethod(CGAbstractBindingMethod):
CGAbstractBindingMethod.__init__(self, descriptor, 'genericMethod', args) CGAbstractBindingMethod.__init__(self, descriptor, 'genericMethod', args)
def generate_code(self): def generate_code(self):
return CGIndenter(CGGeneric( return CGGeneric(
"let _info: *JSJitInfo = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp));\n" "let _info: *JSJitInfo = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp));\n"
"return CallJitMethodOp(_info, cx, obj, this.unsafe_get() as *libc::c_void, argc, vp);")) "return CallJitMethodOp(_info, cx, obj, this.unsafe_get() as *libc::c_void, argc, vp);")
class CGSpecializedMethod(CGAbstractExternMethod): class CGSpecializedMethod(CGAbstractExternMethod):
""" """
@ -2380,8 +2386,8 @@ class CGSpecializedMethod(CGAbstractExternMethod):
name = self.method.identifier.name name = self.method.identifier.name
return CGWrapper(CGMethodCall([], MakeNativeName(name), self.method.isStatic(), return CGWrapper(CGMethodCall([], MakeNativeName(name), self.method.isStatic(),
self.descriptor, self.method), self.descriptor, self.method),
pre=" let this = JS::from_raw(this);\n" + pre="let this = JS::from_raw(this);\n"
" let mut this = this.root();\n").define() "let mut this = this.root();\n")
class CGGenericGetter(CGAbstractBindingMethod): class CGGenericGetter(CGAbstractBindingMethod):
""" """
@ -2403,9 +2409,9 @@ class CGGenericGetter(CGAbstractBindingMethod):
unwrapFailureCode) unwrapFailureCode)
def generate_code(self): def generate_code(self):
return CGIndenter(CGGeneric( return CGGeneric(
"let info: *JSJitInfo = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp));\n" "let info: *JSJitInfo = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp));\n"
"return CallJitPropertyOp(info, cx, obj, this.unsafe_get() as *libc::c_void, vp);\n")) "return CallJitPropertyOp(info, cx, obj, this.unsafe_get() as *libc::c_void, vp);\n")
class CGSpecializedGetter(CGAbstractExternMethod): class CGSpecializedGetter(CGAbstractExternMethod):
""" """
@ -2429,10 +2435,10 @@ class CGSpecializedGetter(CGAbstractExternMethod):
getter=True)) getter=True))
if self.attr.type.nullable() or not infallible: if self.attr.type.nullable() or not infallible:
nativeName = "Get" + nativeName nativeName = "Get" + nativeName
return CGWrapper(CGIndenter(CGGetterCall([], self.attr.type, nativeName, return CGWrapper(CGGetterCall([], self.attr.type, nativeName,
self.descriptor, self.attr)), self.descriptor, self.attr),
pre=" let this = JS::from_raw(this);\n" + pre="let this = JS::from_raw(this);\n"
" let mut this = this.root();\n").define() "let mut this = this.root();\n")
class CGGenericSetter(CGAbstractBindingMethod): class CGGenericSetter(CGAbstractBindingMethod):
""" """
@ -2453,7 +2459,7 @@ class CGGenericSetter(CGAbstractBindingMethod):
unwrapFailureCode) unwrapFailureCode)
def generate_code(self): def generate_code(self):
return CGIndenter(CGGeneric( return CGGeneric(
"let mut undef = UndefinedValue();\n" "let mut undef = UndefinedValue();\n"
"let argv: *mut JSVal = if argc != 0 { JS_ARGV(cx, vp) } else { &mut undef as *mut JSVal };\n" "let argv: *mut JSVal = if argc != 0 { JS_ARGV(cx, vp) } else { &mut undef as *mut JSVal };\n"
"let info: *JSJitInfo = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp));\n" "let info: *JSJitInfo = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp));\n"
@ -2461,7 +2467,7 @@ class CGGenericSetter(CGAbstractBindingMethod):
" return 0;\n" " return 0;\n"
"}\n" "}\n"
"*vp = UndefinedValue();\n" "*vp = UndefinedValue();\n"
"return 1;")) "return 1;")
class CGSpecializedSetter(CGAbstractExternMethod): class CGSpecializedSetter(CGAbstractExternMethod):
""" """
@ -2479,11 +2485,11 @@ class CGSpecializedSetter(CGAbstractExternMethod):
def definition_body(self): def definition_body(self):
name = self.attr.identifier.name name = self.attr.identifier.name
return CGWrapper(CGIndenter(CGSetterCall([], self.attr.type, return CGWrapper(CGSetterCall([], self.attr.type,
"Set" + MakeNativeName(name), "Set" + MakeNativeName(name),
self.descriptor, self.attr)), self.descriptor, self.attr),
pre=" let this = JS::from_raw(this);\n" + pre="let this = JS::from_raw(this);\n"
" let mut this = this.root();\n").define() "let mut this = this.root();\n")
class CGMemberJITInfo(CGThing): class CGMemberJITInfo(CGThing):
@ -3388,12 +3394,12 @@ class CGProxyUnwrap(CGAbstractMethod):
CGAbstractMethod.__init__(self, descriptor, "UnwrapProxy", '*' + descriptor.concreteType, args, alwaysInline=True) CGAbstractMethod.__init__(self, descriptor, "UnwrapProxy", '*' + descriptor.concreteType, args, alwaysInline=True)
def definition_body(self): def definition_body(self):
return """ /*if (xpc::WrapperFactory::IsXrayWrapper(obj)) { return CGGeneric("""/*if (xpc::WrapperFactory::IsXrayWrapper(obj)) {
obj = js::UnwrapObject(obj); obj = js::UnwrapObject(obj);
}*/ }*/
//MOZ_ASSERT(IsProxy(obj)); //MOZ_ASSERT(IsProxy(obj));
let box_ = GetProxyPrivate(obj).to_private() as *%s; let box_ = GetProxyPrivate(obj).to_private() as *%s;
return box_;""" % (self.descriptor.concreteType) return box_;""" % self.descriptor.concreteType)
class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
def __init__(self, descriptor): def __init__(self, descriptor):
@ -3490,7 +3496,7 @@ if expando.is_not_null() {
return 1;""" return 1;"""
def definition_body(self): def definition_body(self):
return self.getBody() return CGGeneric(self.getBody())
class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
def __init__(self, descriptor): def __init__(self, descriptor):
@ -3548,7 +3554,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
return set + """return proxyhandler::defineProperty_(%s);""" % ", ".join(a.name for a in self.args) return set + """return proxyhandler::defineProperty_(%s);""" % ", ".join(a.name for a in self.args)
def definition_body(self): def definition_body(self):
return self.getBody() return CGGeneric(self.getBody())
class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
def __init__(self, descriptor): def __init__(self, descriptor):
@ -3601,7 +3607,7 @@ if expando.is_not_null() {
return 1;""" return 1;"""
def definition_body(self): def definition_body(self):
return self.getBody() return CGGeneric(self.getBody())
class CGDOMJSProxyHandler_get(CGAbstractExternMethod): class CGDOMJSProxyHandler_get(CGAbstractExternMethod):
def __init__(self, descriptor): def __init__(self, descriptor):
@ -3673,7 +3679,7 @@ if found {
return 1;""" % (getIndexedOrExpando, getNamed) return 1;""" % (getIndexedOrExpando, getNamed)
def definition_body(self): def definition_body(self):
return self.getBody() return CGGeneric(self.getBody())
class CGDOMJSProxyHandler_obj_toString(CGAbstractExternMethod): class CGDOMJSProxyHandler_obj_toString(CGAbstractExternMethod):
def __init__(self, descriptor): def __init__(self, descriptor):
@ -3700,12 +3706,12 @@ class CGDOMJSProxyHandler_obj_toString(CGAbstractExternMethod):
JSString* jsresult; JSString* jsresult;
return xpc_qsStringToJsstring(cx, result, &jsresult) ? jsresult : NULL;""" return xpc_qsStringToJsstring(cx, result, &jsresult) ? jsresult : NULL;"""
return """ "%s".to_c_str().with_ref(|s| { return """"%s".to_c_str().with_ref(|s| {
_obj_toString(cx, s) _obj_toString(cx, s)
})""" % self.descriptor.name })""" % self.descriptor.name
def definition_body(self): def definition_body(self):
return self.getBody() return CGGeneric(self.getBody())
class CGAbstractClassHook(CGAbstractExternMethod): class CGAbstractClassHook(CGAbstractExternMethod):
""" """
@ -3717,12 +3723,15 @@ class CGAbstractClassHook(CGAbstractExternMethod):
args) args)
def definition_body_prologue(self): def definition_body_prologue(self):
return """ return CGGeneric("""\
let this: *%s = unwrap::<%s>(obj); let this: *%s = unwrap::<%s>(obj);
""" % (self.descriptor.concreteType, self.descriptor.concreteType) """ % (self.descriptor.concreteType, self.descriptor.concreteType))
def definition_body(self): def definition_body(self):
return self.definition_body_prologue() + self.generate_code() return CGList([
self.definition_body_prologue(),
self.generate_code(),
])
def generate_code(self): def generate_code(self):
# Override me # Override me
@ -3745,7 +3754,7 @@ class CGClassTraceHook(CGAbstractClassHook):
args) args)
def generate_code(self): def generate_code(self):
return " (*this).trace(%s);" % self.args[0].name return CGGeneric("(*this).trace(%s);" % self.args[0].name)
class CGClassConstructHook(CGAbstractExternMethod): class CGClassConstructHook(CGAbstractExternMethod):
""" """
@ -3763,17 +3772,14 @@ class CGClassConstructHook(CGAbstractExternMethod):
return CGAbstractExternMethod.define(self) return CGAbstractExternMethod.define(self)
def definition_body(self): def definition_body(self):
return self.generate_code() preamble = CGGeneric("""\
let global = global_object_for_js_object(JS_CALLEE(cx, vp).to_object()).root();
def generate_code(self): let obj = global.deref().reflector().get_jsobject();
preamble = """ """)
let global = global_object_for_js_object(JS_CALLEE(cx, vp).to_object()).root();
let obj = global.deref().reflector().get_jsobject();
"""
nativeName = MakeNativeName(self._ctor.identifier.name) nativeName = MakeNativeName(self._ctor.identifier.name)
callGenerator = CGMethodCall(["&global.root_ref()"], nativeName, True, callGenerator = CGMethodCall(["&global.root_ref()"], nativeName, True,
self.descriptor, self._ctor) self.descriptor, self._ctor)
return preamble + callGenerator.define(); return CGList([preamble, callGenerator])
class CGClassFinalizeHook(CGAbstractClassHook): class CGClassFinalizeHook(CGAbstractClassHook):
""" """
@ -3785,7 +3791,7 @@ class CGClassFinalizeHook(CGAbstractClassHook):
'void', args) 'void', args)
def generate_code(self): def generate_code(self):
return CGIndenter(CGGeneric(finalizeHook(self.descriptor, self.name, self.args[0].name))).define() return CGGeneric(finalizeHook(self.descriptor, self.name, self.args[0].name))
class CGDOMJSProxyHandlerDOMClass(CGThing): class CGDOMJSProxyHandlerDOMClass(CGThing):
def __init__(self, descriptor): def __init__(self, descriptor):
@ -4107,13 +4113,11 @@ class CGRegisterProtos(CGAbstractMethod):
unsafe=False, pub=True) unsafe=False, pub=True)
self.config = config self.config = config
def _registerProtos(self):
lines = [" codegen::Bindings::%sBinding::DefineDOMInterface(window, js_info);" % desc.name
for desc in self.config.getDescriptors(isCallback=False,
register=True)]
return '\n'.join(lines) + '\n'
def definition_body(self): def definition_body(self):
return self._registerProtos() return CGList([
CGGeneric("codegen::Bindings::%sBinding::DefineDOMInterface(window, js_info);" % desc.name)
for desc in self.config.getDescriptors(isCallback=False, register=True)
], "\n")
class CGBindingRoot(CGThing): class CGBindingRoot(CGThing):
""" """