mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Fill out the interface creation.
This commit is contained in:
parent
236f47b0a9
commit
e333e5d4c3
2 changed files with 103 additions and 15 deletions
|
@ -556,7 +556,7 @@ class PropertyDefiner:
|
||||||
specs.append(specTerminator)
|
specs.append(specTerminator)
|
||||||
prefableSpecs.append(" { false, NULL }");
|
prefableSpecs.append(" { false, NULL }");
|
||||||
|
|
||||||
arrays = (("const %s_specs: [%s * %i] = [\n" +
|
arrays = (("const %s: [%s * %i] = [\n" +
|
||||||
',\n'.join(specs) + "\n" +
|
',\n'.join(specs) + "\n" +
|
||||||
"];\n\n") % (name, specType, len(specs)))
|
"];\n\n") % (name, specType, len(specs)))
|
||||||
#+
|
#+
|
||||||
|
@ -1199,7 +1199,7 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
||||||
idsToInit = []
|
idsToInit = []
|
||||||
# There is no need to init any IDs in workers, because worker bindings
|
# There is no need to init any IDs in workers, because worker bindings
|
||||||
# don't have Xrays.
|
# don't have Xrays.
|
||||||
if not self.descriptor.workers:
|
if False and not self.descriptor.workers: #XXXjdm punt on the interned string optimization
|
||||||
for var in self.properties.xrayRelevantArrayNames():
|
for var in self.properties.xrayRelevantArrayNames():
|
||||||
props = getattr(self.properties, var)
|
props = getattr(self.properties, var)
|
||||||
# We only have non-chrome ids to init if we have no chrome ids.
|
# We only have non-chrome ids to init if we have no chrome ids.
|
||||||
|
@ -1262,16 +1262,16 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
||||||
if self.descriptor.proxy:
|
if self.descriptor.proxy:
|
||||||
domClass = "&Class"
|
domClass = "&Class"
|
||||||
else:
|
else:
|
||||||
domClass = "&Class.mClass"
|
domClass = "&Class.dom_class"
|
||||||
else:
|
else:
|
||||||
domClass = "ptr::null()"
|
domClass = "ptr::null()"
|
||||||
|
|
||||||
call = """return dom::CreateInterfaceObjects(aCx, aGlobal, aReceiver, parentProto,
|
call = """return CreateInterfaceObjects2(aCx, aGlobal, aReceiver, parentProto,
|
||||||
%s, %s, %s, %d,
|
%s, %s, %s, %d,
|
||||||
%s,
|
%s,
|
||||||
%%(methods)s, %%(attrs)s,
|
%%(methods)s, ptr::to_unsafe_ptr(&%%(attrs)s[0]),
|
||||||
%%(consts)s, %%(staticMethods)s,
|
%%(consts)s, %%(staticMethods)s,
|
||||||
%s);""" % (
|
%s);""" % (
|
||||||
"&PrototypeClass" if needInterfacePrototypeObject else "ptr::null()",
|
"&PrototypeClass" if needInterfacePrototypeObject else "ptr::null()",
|
||||||
"&InterfaceObjectClass" if needInterfaceObjectClass else "ptr::null()",
|
"&InterfaceObjectClass" if needInterfaceObjectClass else "ptr::null()",
|
||||||
constructHook if needConstructor else "ptr::null()",
|
constructHook if needConstructor else "ptr::null()",
|
||||||
|
@ -1293,7 +1293,8 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
||||||
[CGGeneric(getParentProto), initIds, prefCache, chrome,
|
[CGGeneric(getParentProto), initIds, prefCache, chrome,
|
||||||
CGGeneric(call % self.properties.variableNames(False))],
|
CGGeneric(call % self.properties.variableNames(False))],
|
||||||
"\n\n")
|
"\n\n")
|
||||||
return CGIndenter(CGWrapper(functionBody, pre="/*", post="*/return ptr::null()")).define()
|
#return CGIndenter(CGWrapper(functionBody, pre="/*", post="*/return ptr::null()")).define()
|
||||||
|
return CGIndenter(functionBody).define()
|
||||||
|
|
||||||
class CGGetPerInterfaceObject(CGAbstractMethod):
|
class CGGetPerInterfaceObject(CGAbstractMethod):
|
||||||
"""
|
"""
|
||||||
|
@ -1738,7 +1739,7 @@ class CGMemberJITInfo(CGThing):
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def defineJitInfo(self, infoName, opName, infallible):
|
def defineJitInfo(self, infoName, opName, infallible):
|
||||||
protoID = "prototypes::id::%s as uint" % self.descriptor.name
|
protoID = "prototypes::id::%s as u32" % self.descriptor.name
|
||||||
depth = self.descriptor.interface.inheritanceDepth()
|
depth = self.descriptor.interface.inheritanceDepth()
|
||||||
failstr = "true" if infallible else "false"
|
failstr = "true" if infallible else "false"
|
||||||
return ("\n"
|
return ("\n"
|
||||||
|
|
|
@ -2,7 +2,8 @@ use js;
|
||||||
use js::rust::Compartment;
|
use js::rust::Compartment;
|
||||||
use js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL,
|
use js::{JS_ARGV, JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL,
|
||||||
JS_THIS_OBJECT, JS_SET_RVAL};
|
JS_THIS_OBJECT, JS_SET_RVAL};
|
||||||
use js::jsapi::{JSContext, JSVal, JSObject, JSBool, jsid, JSClass, JSFreeOp};
|
use js::jsapi::{JSContext, JSVal, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSNative,
|
||||||
|
JSFunctionSpec, JSPropertySpec, JSVal};
|
||||||
use js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
|
use js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
|
||||||
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
|
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
|
||||||
JS_DefineFunctions, JS_DefineProperty, JS_GetContextPrivate,
|
JS_DefineFunctions, JS_DefineProperty, JS_GetContextPrivate,
|
||||||
|
@ -197,6 +198,11 @@ pub fn define_empty_prototype(name: ~str, proto: Option<~str>, compartment: @mut
|
||||||
// globals and non-globals.
|
// globals and non-globals.
|
||||||
const DOM_OBJECT_SLOT: uint = 0;
|
const DOM_OBJECT_SLOT: uint = 0;
|
||||||
|
|
||||||
|
// NOTE: This is baked into the Ion JIT as 0 in codegen for LGetDOMProperty and
|
||||||
|
// LSetDOMProperty. Those constants need to be changed accordingly if this value
|
||||||
|
// changes.
|
||||||
|
const DOM_PROTO_INSTANCE_CLASS_SLOT: u32 = 0;
|
||||||
|
|
||||||
// All DOM globals must have a slot at DOM_PROTOTYPE_SLOT. We have to
|
// All DOM globals must have a slot at DOM_PROTOTYPE_SLOT. We have to
|
||||||
// start at 1 past JSCLASS_GLOBAL_SLOT_COUNT because XPConnect uses
|
// start at 1 past JSCLASS_GLOBAL_SLOT_COUNT because XPConnect uses
|
||||||
// that one.
|
// that one.
|
||||||
|
@ -207,7 +213,28 @@ const DOM_PROTOTYPE_SLOT: u32 = js::JSCLASS_GLOBAL_SLOT_COUNT + 1;
|
||||||
// changes.
|
// changes.
|
||||||
const JSCLASS_DOM_GLOBAL: u32 = js::JSCLASS_USERBIT1;
|
const JSCLASS_DOM_GLOBAL: u32 = js::JSCLASS_USERBIT1;
|
||||||
|
|
||||||
struct NativePropertyHooks {
|
pub struct NativeProperties {
|
||||||
|
staticMethods: *JSFunctionSpec,
|
||||||
|
staticMethodIds: *jsid,
|
||||||
|
staticMethodsSpecs: *JSFunctionSpec,
|
||||||
|
staticAttributes: *JSPropertySpec,
|
||||||
|
staticAttributeIds: *jsid,
|
||||||
|
staticAttributeSpecs: *JSPropertySpec,
|
||||||
|
methods: *JSFunctionSpec,
|
||||||
|
methodIds: *jsid,
|
||||||
|
methodsSpecs: *JSFunctionSpec,
|
||||||
|
attributes: *JSPropertySpec,
|
||||||
|
attributeIds: *jsid,
|
||||||
|
attributeSpecs: *JSPropertySpec,
|
||||||
|
unforgeableAttributes: *JSPropertySpec,
|
||||||
|
unforgeableAttributeIds: *jsid,
|
||||||
|
unforgeableAttributeSpecs: *JSPropertySpec,
|
||||||
|
constants: *ConstantSpec,
|
||||||
|
constantIds: *jsid,
|
||||||
|
constantSpecs: *ConstantSpec
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct NativePropertyHooks {
|
||||||
resolve_own_property: *u8,
|
resolve_own_property: *u8,
|
||||||
resolve_property: *u8,
|
resolve_property: *u8,
|
||||||
enumerate_own_properties: *u8,
|
enumerate_own_properties: *u8,
|
||||||
|
@ -215,7 +242,17 @@ struct NativePropertyHooks {
|
||||||
proto_hooks: *NativePropertyHooks
|
proto_hooks: *NativePropertyHooks
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DOMClass {
|
pub struct JSNativeHolder {
|
||||||
|
native: js::jsapi::JSNative,
|
||||||
|
propertyHooks: *NativePropertyHooks
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConstantSpec {
|
||||||
|
name: &str,
|
||||||
|
value: JSVal
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct DOMClass {
|
||||||
// A list of interfaces that this object implements, in order of decreasing
|
// A list of interfaces that this object implements, in order of decreasing
|
||||||
// derivedness.
|
// derivedness.
|
||||||
interface_chain: [prototypes::id::Prototype * 1 /*prototypes::id::_ID_Count*/],
|
interface_chain: [prototypes::id::Prototype * 1 /*prototypes::id::_ID_Count*/],
|
||||||
|
@ -224,7 +261,7 @@ struct DOMClass {
|
||||||
native_hooks: *NativePropertyHooks
|
native_hooks: *NativePropertyHooks
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DOMJSClass {
|
pub struct DOMJSClass {
|
||||||
base: JSClass,
|
base: JSClass,
|
||||||
dom_class: DOMClass
|
dom_class: DOMClass
|
||||||
}
|
}
|
||||||
|
@ -244,3 +281,53 @@ mod prototypes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn CreateInterfaceObjects2(cx: *JSContext, global: *JSObject, receiver: *JSObject,
|
||||||
|
protoProto: *JSObject, protoClass: *JSClass,
|
||||||
|
constructorClass: *JSClass, constructor: JSNative,
|
||||||
|
ctorNargs: uint,
|
||||||
|
domClass: *DOMClass,
|
||||||
|
methods: *JSFunctionSpec,
|
||||||
|
properties: *JSPropertySpec,
|
||||||
|
constants: *ConstantSpec,
|
||||||
|
staticMethods: *JSFunctionSpec,
|
||||||
|
name: &str) -> *JSObject {
|
||||||
|
unsafe {
|
||||||
|
let mut proto = ptr::null();
|
||||||
|
if protoClass.is_not_null() {
|
||||||
|
proto = /*CreateInterfacePrototypeObject(cx, global, protoProto,
|
||||||
|
protoClass,
|
||||||
|
regularProperties,
|
||||||
|
chromeOnlyProperties);*/ptr::null();
|
||||||
|
if proto.is_null() {
|
||||||
|
return ptr::null();
|
||||||
|
}
|
||||||
|
|
||||||
|
JS_SetReservedSlot(proto, DOM_PROTO_INSTANCE_CLASS_SLOT,
|
||||||
|
RUST_PRIVATE_TO_JSVAL(domClass as *libc::c_void));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut interface = ptr::null();
|
||||||
|
if constructorClass.is_not_null() || constructor.is_not_null() {
|
||||||
|
interface = do str::as_c_str(name) |s| {
|
||||||
|
/*CreateInterfaceObject(cx, global, constructorClass, constructor,
|
||||||
|
ctorNargs, proto, properties,
|
||||||
|
chromeOnlyProperties, s)*/ptr::null()
|
||||||
|
};
|
||||||
|
if interface.is_null() {
|
||||||
|
return ptr::null();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if protoClass.is_not_null() {
|
||||||
|
proto
|
||||||
|
} else {
|
||||||
|
interface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub extern fn ThrowingConstructor(cx: *JSContext, argc: uint, vp: *JSVal) -> JSBool {
|
||||||
|
//XXX should trigger exception here
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue