aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index a6c984d2e02..4429298f5a4 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1755,22 +1755,26 @@ def CreateBindingJSObject(descriptor, parent=None):
create = " let mut raw: JS<%s> = JS::from_raw(&mut *aObject);\n" % descriptor.concreteType
if descriptor.proxy:
assert not descriptor.createGlobal
- handler = """
+ create += """
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));
-""" % descriptor.name
- create += handler + """ let obj = NewProxyObject(aCx, *handler,
- &PrivateValue(squirrel_away_unique(aObject) as *libc::c_void),
- proto, %s,
- ptr::null(), ptr::null());
+ let private = PrivateValue(squirrel_away_unique(aObject) as *libc::c_void);
+ let obj = with_compartment(aCx, proto, || {
+ NewProxyObject(aCx, *handler,
+ &private,
+ proto, %s,
+ ptr::null(), ptr::null())
+ });
assert!(obj.is_not_null());
-""" % (parent)
+""" % (descriptor.name, parent)
else:
if descriptor.createGlobal:
create += " let obj = CreateDOMGlobal(aCx, &Class.base as *js::Class as *JSClass);\n"
else:
- create += " let obj = JS_NewObject(aCx, &Class.base as *js::Class as *JSClass, proto, %s);\n" % parent
+ create += (" let obj = with_compartment(aCx, proto, || {\n"
+ " JS_NewObject(aCx, &Class.base as *js::Class as *JSClass, proto, %s)\n"
+ " });\n" % parent)
create += """ assert!(obj.is_not_null());
JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32,
@@ -1797,8 +1801,7 @@ class CGWrapMethod(CGAbstractMethod):
assert!(scope.is_not_null());
assert!(((*JS_GetClass(scope)).flags & JSCLASS_IS_GLOBAL) != 0);
- //JSAutoCompartment ac(aCx, scope);
- let proto = GetProtoObject(aCx, scope, scope);
+ let proto = with_compartment(aCx, scope, || GetProtoObject(aCx, scope, scope));
assert!(proto.is_not_null());
%s
@@ -1809,8 +1812,10 @@ class CGWrapMethod(CGAbstractMethod):
else:
return """
%s
- let proto = GetProtoObject(aCx, obj, obj);
- JS_SetPrototype(aCx, obj, proto);
+ with_compartment(aCx, obj, || {
+ let proto = GetProtoObject(aCx, obj, obj);
+ JS_SetPrototype(aCx, obj, proto);
+ });
raw.mut_reflector().set_jsobject(obj);
return raw;""" % CreateBindingJSObject(self.descriptor)
@@ -4241,6 +4246,7 @@ class CGBindingRoot(CGThing):
'js::glue::{GetProxyPrivate, NewProxyObject, ProxyTraps}',
'js::glue::{RUST_FUNCTION_VALUE_TO_JITINFO}',
'js::glue::{RUST_JS_NumberValue, RUST_JSID_IS_STRING}',
+ 'js::rust::with_compartment',
'dom::types::*',
'dom::bindings',
'dom::bindings::js::{JS, JSRef, Root, RootedReference, Temporary}',
@@ -4853,14 +4859,21 @@ class CallbackMember(CGNativeMember):
# Avoid weird 0-sized arrays
replacements["argvDecl"] = ""
- return string.Template(
- # Newlines and semicolons are in the values
+ # Newlines and semicolons are in the values
+ pre = string.Template(
"${setupCall}"
"${declRval}"
- "${argvDecl}"
+ "${argvDecl}").substitute(replacements)
+ body = string.Template(
"${convertArgs}"
"${doCall}"
"${returnResult}").substitute(replacements)
+ return CGList([
+ CGGeneric(pre),
+ CGWrapper(CGIndenter(CGGeneric(body)),
+ pre="with_compartment(cx, self.parent.callback, || {\n",
+ post="})")
+ ], "\n").define()
def getResultConversion(self):
replacements = {
@@ -4883,7 +4896,7 @@ class CallbackMember(CGNativeMember):
assignRetval = string.Template(
self.getRetvalInfo(self.retvalType,
False)[2]).substitute(replacements)
- return convertType.define() + "\n" + assignRetval
+ return convertType.define() + "\n" + assignRetval + "\n"
def getArgConversions(self):
# Just reget the arglist from self.originalSig, because our superclasses