Remove JSPageInfo::js_compartment.

A js::rust::Compartment is little more than a glorified pointer to the
reflector of a window, so there's no good reason to use it. Instead, this
commit passes a JS<Window> directly when it's necessary.

This also means that we now have to use JS_DefineFunctions rather than
Compartment::define_functions; I believe the former is clearer to the reader
than the extra indirection involved in the latter calling through three
reopsitories.

This commit also simplifies ScriptTask::load to reuse the 'cx' local that is
in scope already, rather than refetching it through js_info.
This commit is contained in:
Ms2ger 2014-04-21 13:43:13 +02:00
parent bb8a037cb2
commit 4f9e119334
3 changed files with 31 additions and 37 deletions

View file

@ -2118,7 +2118,10 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod):
a given interface.
"""
def __init__(self, descriptor):
args = [Argument('&mut JSPageInfo', 'js_info')]
args = [
Argument('&JS<Window>', 'window'),
Argument('&mut JSPageInfo', 'js_info'),
]
CGAbstractMethod.__init__(self, descriptor, 'DefineDOMInterface', 'void', args, pub=True)
def define(self):
@ -2173,10 +2176,10 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod):
('Some(%s)' % TRACE_HOOK_NAME),
self.descriptor.name)
return (body + """ let cx = (*js_info.js_context).deref().ptr;
let receiver = js_info.js_compartment.global_obj;
let global: *JSObject = JS_GetGlobalForObject(cx, receiver);
assert!(%s(cx, global, receiver).is_not_null());""" % (getter))
return (body + """ let cx = (**js_info.js_context).ptr;
let global = window.reflector().get_jsobject();
assert!(global.is_not_null());
assert!(%s(cx, global, global).is_not_null());""" % (getter))
def needCx(returnType, arguments, extendedAttributes, considerTypes):
return (considerTypes and
@ -4305,13 +4308,16 @@ class CGDictionary(CGThing):
class CGRegisterProtos(CGAbstractMethod):
def __init__(self, config):
CGAbstractMethod.__init__(self, None, 'Register', 'void',
[Argument('&mut JSPageInfo', 'js_info')],
arguments = [
Argument('&JS<Window>', 'window'),
Argument('&mut JSPageInfo', 'js_info'),
]
CGAbstractMethod.__init__(self, None, 'Register', 'void', arguments,
unsafe=False, pub=True)
self.config = config
def _registerProtos(self):
lines = [" codegen::%sBinding::DefineDOMInterface(js_info);" % desc.name
lines = [" codegen::%sBinding::DefineDOMInterface(window, js_info);" % desc.name
for desc in self.config.getDescriptors(hasInterfaceObject=True,
register=True)]
return '\n'.join(lines) + '\n'
@ -5349,6 +5355,8 @@ class GlobalGenRoots():
# TODO - Generate the methods we want
return CGImports(CGRegisterProtos(config), [
'dom::bindings::codegen',
'dom::bindings::js::JS',
'dom::window::Window',
'script_task::JSPageInfo',
])

View file

@ -20,7 +20,7 @@ use servo_net::image_cache_task::ImageCacheTask;
use servo_util::str::DOMString;
use servo_util::task::{spawn_named};
use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JS_PropertyStub, JS_StrictPropertyStub};
use js::jsapi::{JSContext, JS_DefineProperty, JS_PropertyStub, JS_StrictPropertyStub};
use js::jsval::{NullValue, ObjectValue, JSVal};
use js::JSPROP_ENUMERATE;
@ -91,9 +91,9 @@ pub struct Window {
}
impl Window {
pub fn get_cx(&self) -> *JSObject {
pub fn get_cx(&self) -> *JSContext {
let js_info = self.page().js_info();
js_info.get_ref().js_compartment.deref().cx.deref().ptr
(**js_info.get_ref().js_context).ptr
}
pub fn page<'a>(&'a self) -> &'a Page {