aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/bindings/codegen
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-07-11 17:03:31 +0200
committerMs2ger <ms2ger@gmail.com>2014-07-12 15:26:36 +0200
commitfd167f892285a4815bcbdb0d58fb6f9b0a28306e (patch)
treec9f12f2139b56558cbf92fb1b611affafd460a66 /src/components/script/dom/bindings/codegen
parentf47b66b0c1a90176aa037082b38559ecbe1f67de (diff)
downloadservo-fd167f892285a4815bcbdb0d58fb6f9b0a28306e.tar.gz
servo-fd167f892285a4815bcbdb0d58fb6f9b0a28306e.zip
Store proxy handlers in a static array rather than a hashtable per window.
Diffstat (limited to 'src/components/script/dom/bindings/codegen')
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py110
1 files changed, 78 insertions, 32 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index c399b80fb09..afa0bcaa9e8 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1763,12 +1763,10 @@ def CreateBindingJSObject(descriptor, parent=None):
if descriptor.proxy:
assert not descriptor.createGlobal
create += """
-let js_info = aScope.deref().page().js_info();
-let mut handlers = js_info.get_ref().dom_static.proxy_handlers.deref().borrow_mut();
-let handler = handlers.get(&(PrototypeList::id::%s as uint));
+let handler = RegisterBindings::proxy_handlers[PrototypeList::proxies::%s as uint];
let mut private = PrivateValue(squirrel_away_unique(aObject) as *libc::c_void);
let obj = with_compartment(aCx, proto, || {
- NewProxyObject(aCx, *handler,
+ NewProxyObject(aCx, handler,
&private,
proto, %s,
ptr::mut_null(), ptr::mut_null())
@@ -2039,26 +2037,21 @@ class CGGetConstructorObjectMethod(CGGetPerInterfaceObject):
CGGetPerInterfaceObject.definition_body(self),
])
-class CGDefineDOMInterfaceMethod(CGAbstractMethod):
+
+class CGDefineProxyHandler(CGAbstractMethod):
"""
- A method for resolve hooks to try to lazily define the interface object for
- a given interface.
+ A method to create and cache the proxy trap for a given interface.
"""
def __init__(self, descriptor):
- args = [
- Argument('&JSRef<Window>', 'window'),
- Argument('&mut JSPageInfo', 'js_info'),
- ]
- CGAbstractMethod.__init__(self, descriptor, 'DefineDOMInterface', 'void', args, pub=True)
+ assert descriptor.proxy
+ CGAbstractMethod.__init__(self, descriptor, 'DefineProxyHandler', '*libc::c_void', [], pub=True)
def define(self):
return CGAbstractMethod.define(self)
def definition_body(self):
- body = CGList([])
- #XXXjdm This self.descriptor.concrete check shouldn't be necessary
- if not self.descriptor.concrete or self.descriptor.proxy:
- body.append(CGGeneric("""let traps = ProxyTraps {
+ body = """\
+let traps = ProxyTraps {
getPropertyDescriptor: Some(getPropertyDescriptor),
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor),
defineProperty: Some(defineProperty),
@@ -2089,21 +2082,35 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod):
getPrototypeOf: None,
trace: Some(%s)
};
-let mut handlers = js_info.dom_static.proxy_handlers.deref().borrow_mut();
-handlers.insert(PrototypeList::id::%s as uint,
- CreateProxyHandler(&traps, &Class as *_ as *_));
+CreateProxyHandler(&traps, &Class as *_ as *_)
""" % (FINALIZE_HOOK_NAME,
- TRACE_HOOK_NAME,
- self.descriptor.name)))
+ TRACE_HOOK_NAME)
+ return CGGeneric(body)
+
+
+
+class CGDefineDOMInterfaceMethod(CGAbstractMethod):
+ """
+ A method for resolve hooks to try to lazily define the interface object for
+ a given interface.
+ """
+ def __init__(self, descriptor):
+ assert descriptor.interface.hasInterfaceObject()
+ args = [
+ Argument('&JSRef<Window>', 'window'),
+ ]
+ CGAbstractMethod.__init__(self, descriptor, 'DefineDOMInterface', 'void', args, pub=True)
+
+ def define(self):
+ return CGAbstractMethod.define(self)
- if self.descriptor.interface.hasInterfaceObject():
- body.append(CGGeneric("""let cx = (**js_info.js_context).ptr;
+ def definition_body(self):
+ return CGGeneric("""\
+let cx = window.get_cx();
let global = window.reflector().get_jsobject();
assert!(global.is_not_null());
-assert!(GetProtoObject(cx, global, global).is_not_null());"""))
-
- return body
+assert!(GetProtoObject(cx, global, global).is_not_null());""")
def needCx(returnType, arguments, extendedAttributes, considerTypes):
return (considerTypes and
@@ -4019,7 +4026,11 @@ class CGDescriptor(CGThing):
CGConstant(m for m in descriptor.interface.members if m.isConst()),
public=True))
- cgThings.append(CGDefineDOMInterfaceMethod(descriptor))
+ if descriptor.interface.hasInterfaceObject():
+ cgThings.append(CGDefineDOMInterfaceMethod(descriptor))
+
+ if descriptor.proxy:
+ cgThings.append(CGDefineProxyHandler(descriptor))
if descriptor.concrete:
if descriptor.proxy:
@@ -4257,7 +4268,6 @@ class CGRegisterProtos(CGAbstractMethod):
def __init__(self, config):
arguments = [
Argument('&JSRef<Window>', 'window'),
- Argument('&mut JSPageInfo', 'js_info'),
]
CGAbstractMethod.__init__(self, None, 'Register', 'void', arguments,
unsafe=False, pub=True)
@@ -4265,10 +4275,37 @@ class CGRegisterProtos(CGAbstractMethod):
def definition_body(self):
return CGList([
- CGGeneric("codegen::Bindings::%sBinding::DefineDOMInterface(window, js_info);" % desc.name)
- for desc in self.config.getDescriptors(isCallback=False, register=True)
+ CGGeneric("codegen::Bindings::%sBinding::DefineDOMInterface(window);" % desc.name)
+ for desc in self.config.getDescriptors(hasInterfaceObject=True, register=True)
+ ], "\n")
+
+
+class CGRegisterProxyHandlersMethod(CGAbstractMethod):
+ def __init__(self, descriptors):
+ CGAbstractMethod.__init__(self, None, 'RegisterProxyHandlers', 'void', [],
+ unsafe=True, pub=True)
+ self.descriptors = descriptors
+
+ def definition_body(self):
+ return CGList([
+ CGGeneric("proxy_handlers[proxies::%s as uint] = codegen::Bindings::%sBinding::DefineProxyHandler();" % (desc.name, desc.name))
+ for desc in self.descriptors
], "\n")
+
+class CGRegisterProxyHandlers(CGThing):
+ def __init__(self, config):
+ descriptors = config.getDescriptors(proxy=True)
+ length = len(descriptors)
+ self.root = CGList([
+ CGGeneric("pub static mut proxy_handlers: [*libc::c_void, ..%d] = [0 as *libc::c_void, ..%d];" % (length, length)),
+ CGRegisterProxyHandlersMethod(descriptors),
+ ], "\n")
+
+ def define(self):
+ return self.root.define()
+
+
class CGBindingRoot(CGThing):
"""
Root codegen class for binding generation. Instantiate the class, and call
@@ -4393,6 +4430,7 @@ class CGBindingRoot(CGThing):
'dom::bindings::conversions::{Default, Empty}',
'dom::bindings::codegen::*',
'dom::bindings::codegen::Bindings::*',
+ 'dom::bindings::codegen::RegisterBindings',
'dom::bindings::codegen::UnionTypes::*',
'dom::bindings::error::{FailureUnknown, Fallible, Error, ErrorResult}',
'dom::bindings::error::throw_dom_exception',
@@ -5244,22 +5282,30 @@ class GlobalGenRoots():
def PrototypeList(config):
# Prototype ID enum.
protos = [d.name for d in config.getDescriptors(hasInterfacePrototypeObject=True)]
+ proxies = [d.name for d in config.getDescriptors(proxy=True)]
return CGList([
CGGeneric(AUTOGENERATED_WARNING_COMMENT),
CGGeneric("pub static MAX_PROTO_CHAIN_LENGTH: uint = %d;\n\n" % config.maxProtoChainLength),
CGNamespacedEnum('id', 'ID', protos, [0], deriving="PartialEq"),
+ CGNamespacedEnum('proxies', 'Proxy', proxies, [0], deriving="PartialEq"),
])
@staticmethod
def RegisterBindings(config):
# TODO - Generate the methods we want
- return CGImports(CGRegisterProtos(config), [], [
+ code = CGList([
+ CGRegisterProtos(config),
+ CGRegisterProxyHandlers(config),
+ ], "\n")
+
+ return CGImports(code, [], [
'dom::bindings::codegen',
+ 'dom::bindings::codegen::PrototypeList::proxies',
'dom::bindings::js::{JS, JSRef}',
'dom::window::Window',
- 'page::JSPageInfo',
+ 'libc',
])
@staticmethod