aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2016-03-15 13:14:51 +0100
committerggomez <guillaume1.gomez@gmail.com>2016-03-21 11:57:48 +0100
commitb6feab97e09d20bc7b9755132d0a802acde7b6b6 (patch)
tree135a26ece894cd67f2ef0e0fa40b3de838fdf7d6 /components/script
parenta862384841cb6e8ff43f627a59b67c4f5189b81b (diff)
downloadservo-b6feab97e09d20bc7b9755132d0a802acde7b6b6.tar.gz
servo-b6feab97e09d20bc7b9755132d0a802acde7b6b6.zip
Make all interface objects share the same funToString
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py23
-rw-r--r--components/script/dom/bindings/interface.rs32
2 files changed, 25 insertions, 30 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 4468bb13b6b..0f7e1570138 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1893,15 +1893,16 @@ class CGInterfaceObjectJSClass(CGThing):
constructor = CONSTRUCT_HOOK_NAME
else:
constructor = "throwing_constructor"
+ name = self.descriptor.interface.identifier.name
args = {
"constructor": constructor,
- "name": self.descriptor.interface.identifier.name,
- "id": self.descriptor.interface.identifier.name,
+ "id": name,
+ "representation": str_to_const_array("function %s() {\\n [native code]\\n}" % name),
"depth": self.descriptor.prototypeDepth
}
return """\
static InterfaceObjectClass: NonCallbackInterfaceObjectClass =
- NonCallbackInterfaceObjectClass::new(%(constructor)s, fun_to_string,
+ NonCallbackInterfaceObjectClass::new(%(constructor)s, %(representation)s,
PrototypeList::ID::%(id)s, %(depth)s);
""" % args
@@ -4824,21 +4825,6 @@ let args = CallArgs::from_vp(vp, argc);
return CGList([preamble, callGenerator])
-class CGClassFunToStringHook(CGAbstractExternMethod):
- """
- A hook to convert functions to strings.
- """
- def __init__(self, descriptor):
- args = [Argument('*mut JSContext', 'cx'), Argument('HandleObject', '_obj'),
- Argument('u32', '_indent')]
- CGAbstractExternMethod.__init__(self, descriptor, "fun_to_string", '*mut JSString', args)
-
- def definition_body(self):
- name = self.descriptor.interface.identifier.name
- string = str_to_const_array("function %s() {\\n [native code]\\n}" % name)
- return CGGeneric("JS_NewStringCopyZ(cx, %s as *const _ as *const libc::c_char)" % string)
-
-
class CGClassFinalizeHook(CGAbstractClassHook):
"""
A hook for finalize, used to release our native object.
@@ -5007,7 +4993,6 @@ class CGDescriptor(CGThing):
cgThings.append(CGClassConstructHook(descriptor, ctor))
if not descriptor.interface.isCallback():
cgThings.append(CGInterfaceObjectJSClass(descriptor))
- cgThings.append(CGClassFunToStringHook(descriptor))
if not descriptor.interface.isCallback():
cgThings.append(CGPrototypeJSClass(descriptor))
diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs
index a5bc3ec513c..7db3c6e17c4 100644
--- a/components/script/dom/bindings/interface.rs
+++ b/components/script/dom/bindings/interface.rs
@@ -13,8 +13,9 @@ use js::jsapi::{HandleObject, HandleValue, JSClass, JSContext, JSFunctionSpec};
use js::jsapi::{JSPropertySpec, JSString, JS_DefineProperty1, JS_DefineProperty2};
use js::jsapi::{JS_DefineProperty4, JS_GetClass, JS_GetFunctionObject, JS_GetPrototype};
use js::jsapi::{JS_InternString, JS_LinkConstructorAndPrototype, JS_NewFunction, JS_NewObject};
-use js::jsapi::{JS_NewObjectWithUniqueType, JS_DefineProperty, MutableHandleObject};
-use js::jsapi::{MutableHandleValue, ObjectOps, RootedObject, RootedString, RootedValue, Value};
+use js::jsapi::{JS_NewObjectWithUniqueType, JS_NewStringCopyZ, JS_DefineProperty};
+use js::jsapi::{MutableHandleObject, MutableHandleValue, ObjectOps, RootedObject, RootedString};
+use js::jsapi::{RootedValue, Value};
use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value};
use js::rust::{define_methods, define_properties};
use js::{JSPROP_ENUMERATE, JSFUN_CONSTRUCTOR, JSPROP_PERMANENT, JSPROP_READONLY};
@@ -79,17 +80,23 @@ pub fn define_constants(cx: *mut JSContext, obj: HandleObject, constants: &'stat
}
}
+unsafe extern "C" fn fun_to_string_hook(cx: *mut JSContext,
+ obj: HandleObject,
+ _indent: u32)
+ -> *mut JSString {
+ let js_class = JS_GetClass(obj.get());
+ assert!(!js_class.is_null());
+ let object_class = &*(js_class as *const NonCallbackInterfaceObjectClass);
+ assert!(object_class.representation.last() == Some(&0));
+ let ret = JS_NewStringCopyZ(cx, object_class.representation.as_ptr() as *const libc::c_char);
+ assert!(!ret.is_null());
+ ret
+}
+
/// A constructor class hook.
pub type ConstructorClassHook =
unsafe extern "C" fn(cx: *mut JSContext, argc: u32, vp: *mut Value) -> bool;
-/// A fun_to_string class hook.
-pub type FunToStringHook =
- unsafe extern "C" fn(cx: *mut JSContext,
- obj: HandleObject,
- indent: u32)
- -> *mut JSString;
-
/// The class of a non-callback interface object.
#[derive(Copy, Clone)]
pub struct NonCallbackInterfaceObjectClass {
@@ -99,6 +106,8 @@ pub struct NonCallbackInterfaceObjectClass {
pub proto_id: PrototypeList::ID,
/// The prototype depth of that interface, used in the hasInstance hook.
pub proto_depth: u16,
+ /// The string representation of the object (ends with '\0').
+ pub representation: &'static [u8],
}
unsafe impl Sync for NonCallbackInterfaceObjectClass {}
@@ -107,7 +116,7 @@ impl NonCallbackInterfaceObjectClass {
/// Create a new `NonCallbackInterfaceObjectClass` structure.
pub const fn new(
constructor: ConstructorClassHook,
- fun_to_string: FunToStringHook,
+ string_rep: &'static [u8],
proto_id: PrototypeList::ID,
proto_depth: u16)
-> NonCallbackInterfaceObjectClass {
@@ -157,11 +166,12 @@ impl NonCallbackInterfaceObjectClass {
getElements: None,
enumerate: None,
thisObject: None,
- funToString: Some(fun_to_string),
+ funToString: Some(fun_to_string_hook),
}
},
proto_id: proto_id,
proto_depth: proto_depth,
+ representation: string_rep,
}
}