Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use the improved JSVal interfaces. #1868

Merged
merged 4 commits into from Mar 10, 2014
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -3,9 +3,10 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use dom::bindings::utils::Reflectable;
use js::jsapi::{JSContext, JSObject, JS_WrapObject, JSVal, JS_ObjectIsCallable};
use js::jsapi::{JSContext, JSObject, JS_WrapObject, JS_ObjectIsCallable};
use js::jsapi::{JS_GetProperty, JSTracer, JS_CallTracer};
use js::{JSVAL_IS_OBJECT, JSVAL_TO_OBJECT, JSTRACE_OBJECT};
use js::jsval::JSVal;
use js::JSTRACE_OBJECT;

use std::cast;
use std::libc;
@@ -66,8 +67,8 @@ impl CallbackInterface {
return false;
}

if !JSVAL_IS_OBJECT(*callable) ||
JS_ObjectIsCallable(cx, JSVAL_TO_OBJECT(*callable)) == 0 {
if !callable.is_object() ||
JS_ObjectIsCallable(cx, callable.to_object()) == 0 {
//ThrowErrorMessage(cx, MSG_NOT_CALLABLE, description.get());
return false;
}

Large diffs are not rendered by default.

@@ -2,13 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use js::jsapi::{JSVal, JSBool, JSContext};
use js::jsapi::{JSBool, JSContext};
use js::jsapi::{JS_ValueToUint64, JS_ValueToInt64};
use js::jsapi::{JS_ValueToECMAUint32, JS_ValueToECMAInt32};
use js::jsapi::{JS_ValueToUint16, JS_ValueToNumber, JS_ValueToBoolean};
use js::{JSVAL_FALSE, JSVAL_TRUE, JSVAL_NULL};
use js::glue::{RUST_INT_TO_JSVAL, RUST_UINT_TO_JSVAL, RUST_JS_NumberValue};
use js::glue::{RUST_JSVAL_IS_NULL, RUST_JSVAL_IS_VOID};
use js::jsval::JSVal;
use js::jsval::{NullValue, BooleanValue, Int32Value, UInt32Value};
use js::glue::RUST_JS_NumberValue;

pub trait JSValConvertible {
fn to_jsval(&self) -> JSVal;
@@ -30,11 +30,7 @@ unsafe fn convert_from_jsval<T: Default>(

impl JSValConvertible for bool {
fn to_jsval(&self) -> JSVal {
if *self {
JSVAL_TRUE
} else {
JSVAL_FALSE
}
BooleanValue(*self)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<bool, ()> {
@@ -45,9 +41,7 @@ impl JSValConvertible for bool {

impl JSValConvertible for i8 {
fn to_jsval(&self) -> JSVal {
unsafe {
RUST_INT_TO_JSVAL(*self as i32)
}
Int32Value(*self as i32)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<i8, ()> {
@@ -58,9 +52,7 @@ impl JSValConvertible for i8 {

impl JSValConvertible for u8 {
fn to_jsval(&self) -> JSVal {
unsafe {
RUST_INT_TO_JSVAL(*self as i32)
}
Int32Value(*self as i32)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<u8, ()> {
@@ -71,9 +63,7 @@ impl JSValConvertible for u8 {

impl JSValConvertible for i16 {
fn to_jsval(&self) -> JSVal {
unsafe {
RUST_INT_TO_JSVAL(*self as i32)
}
Int32Value(*self as i32)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<i16, ()> {
@@ -84,9 +74,7 @@ impl JSValConvertible for i16 {

impl JSValConvertible for u16 {
fn to_jsval(&self) -> JSVal {
unsafe {
RUST_UINT_TO_JSVAL(*self as u32)
}
Int32Value(*self as i32)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<u16, ()> {
@@ -96,9 +84,7 @@ impl JSValConvertible for u16 {

impl JSValConvertible for i32 {
fn to_jsval(&self) -> JSVal {
unsafe {
RUST_INT_TO_JSVAL(*self)
}
Int32Value(*self)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<i32, ()> {
@@ -108,9 +94,7 @@ impl JSValConvertible for i32 {

impl JSValConvertible for u32 {
fn to_jsval(&self) -> JSVal {
unsafe {
RUST_UINT_TO_JSVAL(*self)
}
UInt32Value(*self)
}

fn from_jsval(cx: *JSContext, val: JSVal) -> Result<u32, ()> {
@@ -171,12 +155,12 @@ impl<T: JSValConvertible> JSValConvertible for Option<T> {
fn to_jsval(&self) -> JSVal {
match self {
&Some(ref value) => value.to_jsval(),
&None => JSVAL_NULL,
&None => NullValue(),
}
}

fn from_jsval(cx: *JSContext, value: JSVal) -> Result<Option<T>, ()> {
if unsafe { RUST_JSVAL_IS_NULL(value) != 0 || RUST_JSVAL_IS_VOID(value) != 0 } {
if value.is_null_or_undefined() {
Ok(None)
} else {
let result: Result<T, ()> = JSValConvertible::from_jsval(cx, value);
@@ -6,7 +6,8 @@ use dom::bindings::utils::is_dom_proxy;
use js::jsapi::{JSContext, jsid, JSPropertyDescriptor, JSObject, JSString, jschar};
use js::jsapi::{JS_GetPropertyDescriptorById, JS_NewUCString, JS_malloc, JS_free};
use js::jsapi::{JSBool, JS_DefinePropertyById, JS_NewObjectWithGivenProto};
use js::glue::{RUST_JSVAL_IS_VOID, RUST_JSVAL_TO_OBJECT, GetProxyExtra, RUST_OBJECT_TO_JSVAL};
use js::jsval::ObjectValue;
use js::glue::GetProxyExtra;
use js::glue::{GetObjectProto, GetObjectParent, SetProxyExtra, GetProxyHandler};
use js::glue::InvokeGetOwnPropertyDescriptor;
use js::crust::{JS_StrictPropertyStub};
@@ -97,10 +98,10 @@ pub fn GetExpandoObject(obj: *JSObject) -> *JSObject {
unsafe {
assert!(is_dom_proxy(obj));
let val = GetProxyExtra(obj, JSPROXYSLOT_EXPANDO);
if RUST_JSVAL_IS_VOID(val) == 1 {
if val.is_undefined() {
ptr::null()
} else {
RUST_JSVAL_TO_OBJECT(val)
val.to_object()
}
}
}
@@ -116,7 +117,7 @@ pub fn EnsureExpandoObject(cx: *JSContext, obj: *JSObject) -> *JSObject {
return ptr::null();
}

SetProxyExtra(obj, JSPROXYSLOT_EXPANDO, RUST_OBJECT_TO_JSVAL(expando));
SetProxyExtra(obj, JSPROXYSLOT_EXPANDO, ObjectValue(&*expando));
}
return expando;
}
@@ -19,7 +19,6 @@ use std::str;
use std::vec;
use std::unstable::raw::Box;
use js::glue::*;
use js::glue::{RUST_OBJECT_TO_JSVAL};
use js::glue::{js_IsObjectProxyClass, js_IsFunctionProxyClass, IsProxyHandlerFamily};
use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewFunction};
use js::jsapi::{JS_DefineProperties, JS_WrapValue, JS_ForwardGetPropertyTo};
@@ -30,30 +29,20 @@ use js::jsapi::{JS_HasPropertyById, JS_GetPrototype, JS_GetGlobalForObject};
use js::jsapi::{JS_NewUCStringCopyN, JS_DefineFunctions, JS_DefineProperty};
use js::jsapi::{JS_ValueToString, JS_GetReservedSlot, JS_SetReservedSlot};
use js::jsapi::{JSContext, JSObject, JSBool, jsid, JSClass, JSNative};
use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor};
use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSPropertyDescriptor};
use js::jsapi::{JS_NewGlobalObject, JS_InitStandardClasses};
use js::jsapi::{JSString};
use js::jsapi::{JS_AllowGC, JS_InhibitGC};
use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType;
use js::{JSPROP_ENUMERATE, JSVAL_NULL, JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS};
use js::jsval::JSVal;
use js::jsval::{StringValue, PrivateValue, ObjectValue, NullValue, Int32Value};
use js::jsval::{UInt32Value, DoubleValue, BooleanValue, UndefinedValue};
use js::{JSPROP_ENUMERATE, JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS};
use js::{JSPROP_PERMANENT, JSID_VOID, JSPROP_NATIVE_ACCESSORS, JSPROP_GETTER};
use js::{JSPROP_SETTER, JSVAL_VOID, JSVAL_TRUE, JSVAL_FALSE};
use js::JSPROP_SETTER;
use js::{JSFUN_CONSTRUCTOR, JSPROP_READONLY};
use js;

mod jsval {
use js::glue::{RUST_JSVAL_IS_NULL, RUST_JSVAL_IS_VOID};
use js::jsapi::JSVal;

pub fn is_null(v: JSVal) -> bool {
unsafe { RUST_JSVAL_IS_NULL(v) == 1 }
}

pub fn is_undefined(v: JSVal) -> bool {
unsafe { RUST_JSVAL_IS_VOID(v) == 1 }
}
}

pub struct GlobalStaticData {
proxy_handlers: HashMap<uint, *libc::c_void>,
attribute_ids: HashMap<uint, ~[jsid]>,
@@ -96,7 +85,7 @@ pub unsafe fn dom_object_slot(obj: *JSObject) -> u32 {
pub unsafe fn unwrap<T>(obj: *JSObject) -> T {
let slot = dom_object_slot(obj);
let val = JS_GetReservedSlot(obj, slot);
cast::transmute(RUST_JSVAL_TO_PRIVATE(val))
cast::transmute(val.to_private())
}

pub unsafe fn get_dom_class(obj: *JSObject) -> Result<DOMClass, ()> {
@@ -142,7 +131,7 @@ pub fn unwrap_jsmanaged<T: Reflectable>(obj: *JSObject,

pub fn unwrap_value<T>(val: *JSVal, proto_id: PrototypeList::id::ID, proto_depth: uint) -> Result<T, ()> {
unsafe {
let obj = RUST_JSVAL_TO_OBJECT(*val);
let obj = (*val).to_object();
unwrap_object(obj, proto_id, proto_depth)
}
}
@@ -180,7 +169,7 @@ pub enum StringificationBehavior {

pub fn jsval_to_str(cx: *JSContext, v: JSVal,
nullBehavior: StringificationBehavior) -> Result<DOMString, ()> {
if jsval::is_null(v) && nullBehavior == Empty {
if v.is_null() && nullBehavior == Empty {
Ok(~"")
} else {
let jsstr = unsafe { JS_ValueToString(cx, v) };
@@ -194,7 +183,7 @@ pub fn jsval_to_str(cx: *JSContext, v: JSVal,
}

pub fn jsval_to_domstring(cx: *JSContext, v: JSVal) -> Result<Option<DOMString>, ()> {
if jsval::is_null(v) || jsval::is_undefined(v) {
if v.is_null_or_undefined() {
Ok(None)
} else {
let jsstr = unsafe { JS_ValueToString(cx, v) };
@@ -213,12 +202,12 @@ pub unsafe fn str_to_jsval(cx: *JSContext, string: DOMString) -> JSVal {
if jsstr.is_null() {
fail!("JS_NewUCStringCopyN failed");
}
RUST_STRING_TO_JSVAL(jsstr)
StringValue(&*jsstr)
}

pub unsafe fn domstring_to_jsval(cx: *JSContext, string: Option<DOMString>) -> JSVal {
match string {
None => JSVAL_NULL,
None => NullValue(),
Some(s) => str_to_jsval(cx, s),
}
}
@@ -308,7 +297,7 @@ pub struct DOMJSClass {
pub fn GetProtoOrIfaceArray(global: *JSObject) -> **JSObject {
unsafe {
/*assert ((*JS_GetClass(global)).flags & JSCLASS_DOM_GLOBAL) != 0;*/
cast::transmute(RUST_JSVAL_TO_PRIVATE(JS_GetReservedSlot(global, DOM_PROTOTYPE_SLOT)))
cast::transmute(JS_GetReservedSlot(global, DOM_PROTOTYPE_SLOT).to_private())
}
}

@@ -333,7 +322,7 @@ pub fn CreateInterfaceObjects2(cx: *JSContext, global: *JSObject, receiver: *JSO

unsafe {
JS_SetReservedSlot(proto, DOM_PROTO_INSTANCE_CLASS_SLOT,
RUST_PRIVATE_TO_JSVAL(domClass as *libc::c_void));
PrivateValue(domClass as *libc::c_void));
}
}

@@ -392,7 +381,7 @@ fn CreateInterfaceObject(cx: *JSContext, global: *JSObject, receiver: *JSObject,
}

if alreadyDefined == 0 &&
JS_DefineProperty(cx, receiver, name, RUST_OBJECT_TO_JSVAL(constructor),
JS_DefineProperty(cx, receiver, name, ObjectValue(&*constructor),
None, None, 0) == 0 {
return ptr::null();
}
@@ -410,13 +399,12 @@ fn DefineConstants(cx: *JSContext, obj: *JSObject, constants: *ConstantSpec) ->
return true;
}
let jsval = match spec.value {
NullVal => JSVAL_NULL,
IntVal(i) => RUST_INT_TO_JSVAL(i),
UintVal(u) => RUST_UINT_TO_JSVAL(u),
DoubleVal(d) => RUST_DOUBLE_TO_JSVAL(d),
BoolVal(b) if b => JSVAL_TRUE,
BoolVal(_) => JSVAL_FALSE,
VoidVal => JSVAL_VOID
NullVal => NullValue(),
IntVal(i) => Int32Value(i),
UintVal(u) => UInt32Value(u),
DoubleVal(d) => DoubleValue(d),
BoolVal(b) => BooleanValue(b),
VoidVal => UndefinedValue(),
};
if JS_DefineProperty(cx, obj, spec.name,
jsval, None,
@@ -480,7 +468,7 @@ pub fn initialize_global(global: *JSObject) {
let box_ = squirrel_away_unboxed(protoArray);
JS_SetReservedSlot(global,
DOM_PROTOTYPE_SLOT,
RUST_PRIVATE_TO_JSVAL(box_ as *libc::c_void));
PrivateValue(box_ as *libc::c_void));
}
}

@@ -528,7 +516,7 @@ pub fn GetReflector(cx: *JSContext, reflector: &Reflector,
let obj = reflector.get_jsobject();
assert!(obj.is_not_null());
unsafe {
*vp = RUST_OBJECT_TO_JSVAL(obj);
*vp = ObjectValue(&*obj);
return JS_WrapValue(cx, cast::transmute(vp));
}
}
@@ -10,8 +10,8 @@ use dom::document::Document;
use dom::element::{Element, ElementTypeId, HTMLElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::node::{Node, ElementNodeTypeId};
use js::jsapi::{JSContext, JSVal};
use js::JSVAL_NULL;
use js::jsapi::JSContext;
use js::jsval::{JSVal, NullValue};
use servo_util::namespace;
use servo_util::str::DOMString;

@@ -66,7 +66,7 @@ impl HTMLElement {
}

pub fn GetItemValue(&self, _cx: *JSContext) -> Fallible<JSVal> {
Ok(JSVAL_NULL)
Ok(NullValue())
}

pub fn SetItemValue(&mut self, _cx: *JSContext, _val: JSVal) -> ErrorResult {
@@ -8,8 +8,8 @@ use dom::blob::Blob;
use dom::window::Window;
use servo_util::str::DOMString;

use js::JSVAL_NULL;
use js::jsapi::{JSVal, JSContext};
use js::jsapi::JSContext;
use js::jsval::{JSVal, NullValue};

#[deriving(Encodable)]
pub struct TestBinding {
@@ -44,7 +44,7 @@ impl TestBinding {
pub fn SetStringAttribute(&self, _: DOMString) {}
pub fn InterfaceAttribute(&self) -> JS<Blob> { Blob::new(&self.window) }
pub fn SetInterfaceAttribute(&self, _: &JS<Blob>) {}
pub fn AnyAttribute(&self, _: *JSContext) -> JSVal { JSVAL_NULL }
pub fn AnyAttribute(&self, _: *JSContext) -> JSVal { NullValue() }
pub fn SetAnyAttribute(&self, _: *JSContext, _: JSVal) {}

pub fn GetBooleanAttributeNullable(&self) -> Option<bool> { Some(false) }
@@ -20,8 +20,10 @@ use servo_util::str::DOMString;
use servo_util::task::{spawn_named};

use js::glue::*;
use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JSVal};
use js::{JSVAL_NULL, JSPROP_ENUMERATE};
use js::jsapi::{JSObject, JSContext, JS_DefineProperty};
use js::jsval::JSVal;
use js::jsval::{NullValue, ObjectValue};
use js::JSPROP_ENUMERATE;

use std::cast;
use std::comm::SharedChan;
@@ -208,7 +210,7 @@ impl Window {
}

pub fn ShowModalDialog(&self, _cx: *JSContext, _url: DOMString, _argument: Option<JSVal>) -> JSVal {
JSVAL_NULL
NullValue()
}
}

@@ -317,7 +319,7 @@ impl Window {
for str in fn_names.iter() {
(*str).to_c_str().with_ref(|name| {
JS_DefineProperty(cx, global, name,
RUST_OBJECT_TO_JSVAL(global),
ObjectValue(&*global),
Some(cast::transmute(GetJSClassHookStubPointer(PROPERTY_STUB))),
Some(cast::transmute(GetJSClassHookStubPointer(STRICT_PROPERTY_STUB))),
JSPROP_ENUMERATE);
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.