aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2013-09-06 11:34:02 -0400
committerJosh Matthews <josh@joshmatthews.net>2013-09-09 10:25:39 -0700
commitda599c6ccf86a936f0603d832535cc18a7447cc8 (patch)
tree1e8a3e9cd57df04c13fc17bd324bbf1dda421247 /src/components/script/dom/bindings/codegen/CodegenRust.py
parent2d3a4d7e1d847a9e1d57ca2c00664953f17e239a (diff)
downloadservo-da599c6ccf86a936f0603d832535cc18a7447cc8.tar.gz
servo-da599c6ccf86a936f0603d832535cc18a7447cc8.zip
Make the global object be the Window object. Fixes #833.
Diffstat (limited to 'src/components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py32
1 files changed, 25 insertions, 7 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index 00e4736bca7..0e01fcef059 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -2210,11 +2210,17 @@ class CGDOMJSClass(CGThing):
return ""
def define(self):
traceHook = "Some(%s)" % TRACE_HOOK_NAME if self.descriptor.customTrace else 'None'
+ if self.descriptor.createGlobal:
+ flags = "JSCLASS_IS_GLOBAL"
+ slots = "JSCLASS_GLOBAL_SLOT_COUNT + 1"
+ else:
+ flags = "0"
+ slots = "1"
return """
static Class_name: [u8, ..%i] = %s;
static Class: DOMJSClass = DOMJSClass {
base: JSClass { name: &Class_name as *u8 as *libc::c_char,
- flags: JSCLASS_IS_DOMJSCLASS | ((1 & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), //JSCLASS_HAS_RESERVED_SLOTS(1),
+ flags: JSCLASS_IS_DOMJSCLASS | %s | (((%s) & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), //JSCLASS_HAS_RESERVED_SLOTS(%s),
addProperty: %s, /* addProperty */
delProperty: crust::JS_PropertyStub, /* delProperty */
getProperty: crust::JS_PropertyStub, /* getProperty */
@@ -2241,6 +2247,7 @@ static Class: DOMJSClass = DOMJSClass {
};
""" % (len(self.descriptor.interface.identifier.name) + 1,
str_to_const_array(self.descriptor.interface.identifier.name),
+ flags, slots, slots,
#ADDPROPERTY_HOOK_NAME if self.descriptor.concrete and not self.descriptor.workers and self.descriptor.wrapperCache else 'crust::JS_PropertyStub',
'crust::JS_PropertyStub',
FINALIZE_HOOK_NAME, traceHook,
@@ -2455,7 +2462,7 @@ class CGAbstractMethod(CGThing):
def definition_body(self):
assert(False) # Override me!
-def CreateBindingJSObject(descriptor, parent):
+def CreateBindingJSObject(descriptor, parent=None):
if descriptor.proxy:
handler = """ //let cache = ptr::to_unsafe_ptr(aObject.get_wrappercache());
@@ -2470,17 +2477,20 @@ def CreateBindingJSObject(descriptor, parent):
return ptr::null();
}
-"""
+""" % parent
else:
- create = """ let obj = JS_NewObject(aCx, &Class.base, proto, %s);
- if obj.is_null() {
+ if descriptor.createGlobal:
+ create = " let obj = CreateDOMGlobal(aCx, &Class.base);\n"
+ else:
+ create = " let obj = JS_NewObject(aCx, &Class.base, proto, %s);\n" % parent
+ create += """ if obj.is_null() {
return ptr::null();
}
JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32,
RUST_PRIVATE_TO_JSVAL(squirrel_away(aObject) as *libc::c_void));
"""
- return create % parent
+ return create
class CGWrapWithCacheMethod(CGAbstractMethod):
def __init__(self, descriptor):
@@ -2495,7 +2505,8 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
return """ *aTriedToWrap = true;
return aObject->GetJSObject();"""
- return """ *aTriedToWrap = true;
+ if not self.descriptor.createGlobal:
+ return """ *aTriedToWrap = true;
let mut parent = aObject.GetParentObject(aCx);
let parent = WrapNativeParent(aCx, aScope, parent);
if parent.is_null() {
@@ -2517,6 +2528,13 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
(*cache).set_wrapper(obj);
return obj;""" % (CreateBindingJSObject(self.descriptor, "parent"))
+ else:
+ return """ let cache = ptr::to_mut_unsafe_ptr(aObject.get_wrappercache());
+%s
+ let proto = GetProtoObject(aCx, obj, obj);
+ JS_SetPrototype(aCx, obj, proto);
+ (*cache).set_wrapper(obj);
+ return obj;""" % CreateBindingJSObject(self.descriptor)
class CGWrapMethod(CGAbstractMethod):
def __init__(self, descriptor):