From 06d2780bfea9a084b8b78c643be4e7423ab75e42 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 8 Mar 2014 18:48:35 +0100 Subject: [PATCH 1/3] Move JSVal into the jsval module. --- crust.rs | 1 + global.rs | 3 ++- glue.rs | 1 + js.rc | 6 ++++-- jsapi.rs | 8 +------- jsval.rs | 9 ++++++++- rust.rs | 1 + 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/crust.rs b/crust.rs index ef2c5cba0..65be9156c 100644 --- a/crust.rs +++ b/crust.rs @@ -5,6 +5,7 @@ use std::libc; use jsapi; use jsapi::*; +use jsval::JSVal; pub extern fn JS_PropertyStub(cx: *JSContext, obj: JSHandleObject, id: JSHandleId, vp: JSMutableHandleValue) -> JSBool { unsafe { diff --git a/global.rs b/global.rs index 07827cae6..d083797b9 100644 --- a/global.rs +++ b/global.rs @@ -18,10 +18,11 @@ use std::cast::transmute; use std::ptr::null; use std::ptr; use jsapi; -use jsapi::{JSClass, JSContext, JSVal, JSFunctionSpec, JSBool, JSNativeWrapper}; +use jsapi::{JSClass, JSContext, JSFunctionSpec, JSBool, JSNativeWrapper}; use jsapi::{JS_EncodeString, JS_free, JS_ValueToBoolean, JS_ValueToString}; use jsapi::{JS_ReportError, JS_ValueToSource, JS_GC, JS_GetRuntime}; use jsfriendapi::JSJitInfo; +use jsval::JSVal; use JSCLASS_IS_GLOBAL; use JSCLASS_HAS_RESERVED_SLOTS; use JSCLASS_RESERVED_SLOTS_MASK; diff --git a/glue.rs b/glue.rs index 9aedd4c12..bbaff8efe 100644 --- a/glue.rs +++ b/glue.rs @@ -8,6 +8,7 @@ use std::libc; use std::libc::*; use jsapi::*; use jsfriendapi::JSJitInfo; +use jsval::JSVal; pub type enum_StubType = c_uint; pub static PROPERTY_STUB: u32 = 0_u32; diff --git a/js.rc b/js.rc index 6646e3583..fa8d9363b 100644 --- a/js.rc +++ b/js.rc @@ -19,10 +19,11 @@ use std::ptr::null; use std::result::{Result, Ok, Err}; use std::libc::c_uint; use jsapi::{JSBool, JSContext, - JSObject, JSVal, jsid, + JSObject, jsid, JSProto_LIMIT}; use jsapi::JS_ComputeThis; use std::libc::types::common::c99::uint32_t; +use jsval::JSVal; pub use jsval::{JSVAL_TO_OBJECT, JSVAL_IS_PRIMITIVE, JSVAL_IS_OBJECT}; use rust::jsobj; @@ -179,7 +180,8 @@ pub unsafe fn JS_CALLEE(_cx: *JSContext, vp: *JSVal) -> JSVal { mod shadow { use std::libc; use std::ptr; - use jsapi::{JSObject, JSClass, jsid, JSVal}; + use jsapi::{JSObject, JSClass, jsid}; + use jsval::JSVal; struct TypeObject { proto: *JSObject diff --git a/jsapi.rs b/jsapi.rs index c353b8ef2..3643ab4f3 100644 --- a/jsapi.rs +++ b/jsapi.rs @@ -8,6 +8,7 @@ use std::libc::*; use jsfriendapi::JSJitInfo; +use jsval::JSVal; pub type moz_static_assert0 = c_int; @@ -254,13 +255,6 @@ pub type moz_static_assert5 = c_int; pub type moz_static_assert6 = c_int; -// JSVal was originally type of u64. -// now this become {u64} because of the union abi issue on ARM arch. See #398. -#[deriving(Eq,Clone)] -pub struct JSVal { - v: u64 -} - pub struct JSHandleObject { unnamed: **JSObject, } diff --git a/jsval.rs b/jsval.rs index 31af9b6a2..6a6aff163 100644 --- a/jsval.rs +++ b/jsval.rs @@ -2,7 +2,7 @@ * 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 jsapi::{JSVal, JSObject}; +use jsapi::JSObject; static JSVAL_TAG_MAX_DOUBLE: u64 = 0x1FFF0; @@ -22,6 +22,13 @@ static JSVAL_TAG_SHIFT: int = 47; static JSVAL_PAYLOAD_MASK: u64 = 0x00007FFFFFFFFFFF; +// JSVal was originally type of u64. +// now this become {u64} because of the union abi issue on ARM arch. See #398. +#[deriving(Eq,Clone)] +pub struct JSVal { + v: u64 +} + #[inline(always)] pub fn INT_TO_JSVAL(i: i32) -> JSVal { JSVal { diff --git a/rust.rs b/rust.rs index e49a71d09..b078cebf5 100644 --- a/rust.rs +++ b/rust.rs @@ -9,6 +9,7 @@ use std::libc::{c_char, uintptr_t}; use std::num; use std::rc; use jsapi::*; +use jsval::JSVal; use default_stacksize; use default_heapsize; use JSOPTION_VAROBJFIX; From e993175799354c94224f89e2e2bdc5676998dcd5 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 8 Mar 2014 19:13:46 +0100 Subject: [PATCH 2/3] Implement FooValue() functions. --- global.rs | 11 ++--- js.rc | 35 -------------- jsval.rs | 140 ++++++++++++++++++++++++++++++++++++++++++++++-------- rust.rs | 5 +- 4 files changed, 127 insertions(+), 64 deletions(-) diff --git a/global.rs b/global.rs index d083797b9..b78f54413 100644 --- a/global.rs +++ b/global.rs @@ -22,14 +22,13 @@ use jsapi::{JSClass, JSContext, JSFunctionSpec, JSBool, JSNativeWrapper}; use jsapi::{JS_EncodeString, JS_free, JS_ValueToBoolean, JS_ValueToString}; use jsapi::{JS_ReportError, JS_ValueToSource, JS_GC, JS_GetRuntime}; use jsfriendapi::JSJitInfo; -use jsval::JSVal; +use jsval::{JSVal, UndefinedValue}; use JSCLASS_IS_GLOBAL; use JSCLASS_HAS_RESERVED_SLOTS; use JSCLASS_RESERVED_SLOTS_MASK; use JSCLASS_RESERVED_SLOTS_SHIFT; use JSCLASS_GLOBAL_SLOT_COUNT; use JS_ARGV; -use JSVAL_VOID; use JS_SET_RVAL; static global_name: [i8, ..7] = ['g' as i8, 'l' as i8, 'o' as i8, 'b' as i8, 'a' as i8, 'l' as i8, 0 as i8]; @@ -109,7 +108,7 @@ pub extern fn debug(cx: *JSContext, argc: c_uint, vp: *mut JSVal) -> JSBool { let jsstr = JS_ValueToString(cx, *ptr::offset(argv, i)); debug!("{:s}", jsval_to_rust_str(cx, jsstr)); } - JS_SET_RVAL(cx, &*vp, JSVAL_VOID); + JS_SET_RVAL(cx, &*vp, UndefinedValue()); return 1_i32; } } @@ -117,7 +116,7 @@ pub extern fn debug(cx: *JSContext, argc: c_uint, vp: *mut JSVal) -> JSBool { pub extern fn gc(cx: *JSContext, _argc: c_uint, vp: *mut JSVal) -> JSBool { unsafe { JS_GC(JS_GetRuntime(cx)); - JS_SET_RVAL(cx, &*vp, JSVAL_VOID); + JS_SET_RVAL(cx, &*vp, UndefinedValue()); return 1; } } @@ -128,7 +127,7 @@ pub extern fn assert(cx: *JSContext, argc: c_uint, vp: *mut JSVal) -> JSBool { let argv = JS_ARGV(cx, &*vp); let argument = match argc { - 0 => JSVAL_VOID, + 0 => UndefinedValue(), _ => *ptr::offset(argv, 0) }; @@ -150,7 +149,7 @@ pub extern fn assert(cx: *JSContext, argc: c_uint, vp: *mut JSVal) -> JSBool { return 0_i32; } - JS_SET_RVAL(cx, &*vp, JSVAL_VOID); + JS_SET_RVAL(cx, &*vp, UndefinedValue()); return 1_i32; } } diff --git a/js.rc b/js.rc index fa8d9363b..d201fac50 100644 --- a/js.rc +++ b/js.rc @@ -59,41 +59,6 @@ pub static default_heapsize: u32 = 8_u32 * 1024_u32 * 1024_u32; pub static default_stacksize: uint = 8192u; pub static ERR: JSBool = 0_i32; -pub static JSVAL_TAG_MAX_DOUBLE: u64 = 0x1FFF0; - -pub static JSVAL_TYPE_DOUBLE: u64 = 0x00; -pub static JSVAL_TYPE_INT32: u64 = 0x01; -pub static JSVAL_TYPE_UNDEFINED: u64 = 0x02; -pub static JSVAL_TYPE_BOOLEAN: u64 = 0x03; -pub static JSVAL_TYPE_MAGIC: u64 = 0x04; -pub static JSVAL_TYPE_STRING: u64 = 0x05; -pub static JSVAL_TYPE_NULL: u64 = 0x06; -pub static JSVAL_TYPE_OBJECT: u64 = 0x07; -pub static JSVAL_TYPE_UNKNOWN: u64 = 0x20; - -pub static JSVAL_TAG_SHIFT: int = 47; - -//The following constants are totally broken on non-64bit platforms. -//See jsapi.h for the proper macro definitions. -pub static JSVAL_VOID: JSVal = JSVal { - v: (JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED) << JSVAL_TAG_SHIFT -}; -pub static JSVAL_NULL: JSVal = JSVal { - v: (JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL) << JSVAL_TAG_SHIFT -}; -pub static JSVAL_ZERO: JSVal = JSVal { - v: (JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32) << JSVAL_TAG_SHIFT -}; -pub static JSVAL_ONE: JSVal = JSVal { - v: ((JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32) << JSVAL_TAG_SHIFT) | 1 -}; -pub static JSVAL_FALSE: JSVal = JSVal { - v: (JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN) << JSVAL_TAG_SHIFT -}; -pub static JSVAL_TRUE: JSVal = JSVal { - v: ((JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN) << JSVAL_TAG_SHIFT) | 1 -}; - pub static JSID_TYPE_STRING: i64 = 0; pub static JSID_TYPE_INT: i64 = 1; pub static JSID_TYPE_VOID: i64 = 2; diff --git a/jsval.rs b/jsval.rs index 6a6aff163..5939ae2c6 100644 --- a/jsval.rs +++ b/jsval.rs @@ -2,24 +2,56 @@ * 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 jsapi::JSObject; - -static JSVAL_TAG_MAX_DOUBLE: u64 = 0x1FFF0; - -//static JSVAL_TYPE_DOUBLE: u64 = 0x00; -static JSVAL_TYPE_INT32: u64 = 0x01; -//static JSVAL_TYPE_UNDEFINED: u64 = 0x02; -//static JSVAL_TYPE_BOOLEAN: u64 = 0x03; -//static JSVAL_TYPE_MAGIC: u64 = 0x04; -//static JSVAL_TYPE_STRING: u64 = 0x05; -//static JSVAL_TYPE_NULL: u64 = 0x06; -static JSVAL_TYPE_OBJECT: u64 = 0x07; -//static JSVAL_TYPE_UNKNOWN: u64 = 0x20; - -static JSVAL_TAG_OBJECT: u32 = (JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT) as u32; -static JSVAL_SHIFTED_TAG_OBJECT: u64 = JSVAL_TAG_OBJECT as u64 << JSVAL_TAG_SHIFT; +use jsapi::{JSObject, JSString}; + +use std::cast; +use std::libc::c_void; + static JSVAL_TAG_SHIFT: int = 47; +#[repr(u8)] +enum ValueType { + JSVAL_TYPE_DOUBLE = 0x00, + JSVAL_TYPE_INT32 = 0x01, + JSVAL_TYPE_UNDEFINED = 0x02, + JSVAL_TYPE_BOOLEAN = 0x03, + JSVAL_TYPE_MAGIC = 0x04, + JSVAL_TYPE_STRING = 0x05, + JSVAL_TYPE_NULL = 0x06, + JSVAL_TYPE_OBJECT = 0x07, + + /* These never appear in a jsval; they are only provided as an out-of-band value. */ + JSVAL_TYPE_UNKNOWN = 0x20, + JSVAL_TYPE_MISSING = 0x21 +} + +static JSVAL_TAG_MAX_DOUBLE: u32 = 0x1FFF0u32; + +#[repr(u32)] +enum ValueTag { + JSVAL_TAG_DOUBLE = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_DOUBLE as u32), + JSVAL_TAG_INT32 = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_INT32 as u32), + JSVAL_TAG_UNDEFINED = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_UNDEFINED as u32), + JSVAL_TAG_STRING = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_STRING as u32), + JSVAL_TAG_BOOLEAN = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_BOOLEAN as u32), + JSVAL_TAG_MAGIC = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_MAGIC as u32), + JSVAL_TAG_NULL = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_NULL as u32), + JSVAL_TAG_OBJECT = JSVAL_TAG_MAX_DOUBLE | (JSVAL_TYPE_OBJECT as u32), +} + +#[repr(u64)] +enum ValueShiftedTag { + JSVAL_SHIFTED_TAG_MAX_DOUBLE = (((JSVAL_TAG_MAX_DOUBLE as u64) << JSVAL_TAG_SHIFT) | 0xFFFFFFFFu64), + JSVAL_SHIFTED_TAG_INT32 = ((JSVAL_TAG_INT32 as u64) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_UNDEFINED = ((JSVAL_TAG_UNDEFINED as u64) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_STRING = ((JSVAL_TAG_STRING as u64) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_BOOLEAN = ((JSVAL_TAG_BOOLEAN as u64) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_MAGIC = ((JSVAL_TAG_MAGIC as u64) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_NULL = ((JSVAL_TAG_NULL as u64) << JSVAL_TAG_SHIFT), + JSVAL_SHIFTED_TAG_OBJECT = ((JSVAL_TAG_OBJECT as u64) << JSVAL_TAG_SHIFT) +} + + static JSVAL_PAYLOAD_MASK: u64 = 0x00007FFFFFFFFFFF; // JSVal was originally type of u64. @@ -30,9 +62,77 @@ pub struct JSVal { } #[inline(always)] -pub fn INT_TO_JSVAL(i: i32) -> JSVal { +fn BuildJSVal(tag: ValueTag, payload: u64) -> JSVal { + JSVal { + v: ((tag as u32 as u64) << JSVAL_TAG_SHIFT) | payload + } +} + + +#[inline(always)] +pub fn NullValue() -> JSVal { + BuildJSVal(JSVAL_TAG_NULL, 0) +} + +#[inline(always)] +pub fn UndefinedValue() -> JSVal { + BuildJSVal(JSVAL_TAG_UNDEFINED, 0) +} + +#[inline(always)] +pub fn Int32Value(i: i32) -> JSVal { + BuildJSVal(JSVAL_TAG_INT32, i as u64) +} + +#[inline(always)] +pub fn DoubleValue(f: f64) -> JSVal { + let bits: u64 = unsafe { cast::transmute(f) }; + BuildJSVal(JSVAL_TAG_DOUBLE, bits) +} + +#[inline(always)] +pub fn UInt32Value(ui: u32) -> JSVal { + if ui > 0x7fffffff { + DoubleValue(ui as f64) + } else { + Int32Value(ui as i32) + } +} + +#[inline(always)] +pub fn StringValue(s: &JSString) -> JSVal { + let bits = s as *JSString as uint as u64; + assert!((bits >> JSVAL_TAG_SHIFT) == 0); + BuildJSVal(JSVAL_TAG_STRING, bits) +} + +#[inline(always)] +pub fn BooleanValue(b: bool) -> JSVal { + BuildJSVal(JSVAL_TAG_BOOLEAN, b as u64) +} + +#[inline(always)] +pub fn ObjectValue(o: &JSObject) -> JSVal { + let bits = o as *JSObject as uint as u64; + assert!((bits >> JSVAL_TAG_SHIFT) == 0); + BuildJSVal(JSVAL_TAG_OBJECT, bits) +} + +#[inline(always)] +pub fn ObjectOrNullValue(o: *JSObject) -> JSVal { + if o.is_null() { + NullValue() + } else { + ObjectValue(unsafe { &*o }) + } +} + +#[inline(always)] +pub fn PrivateValue(o: *c_void) -> JSVal { + let ptrBits = o as uint as u64; + assert!((ptrBits & 1) == 0); JSVal { - v: ((JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32) << JSVAL_TAG_SHIFT) | (i as u64) + v: ptrBits >> 1 } } @@ -45,12 +145,12 @@ pub fn JSVAL_TO_OBJECT(v: JSVal) -> *JSObject { #[inline(always)] pub fn JSVAL_IS_PRIMITIVE(v: JSVal) -> bool { - v.v < JSVAL_SHIFTED_TAG_OBJECT + v.v < (JSVAL_SHIFTED_TAG_OBJECT as u64) } #[inline(always)] pub fn JSVAL_IS_OBJECT(v: JSVal) -> bool { - v.v >= JSVAL_SHIFTED_TAG_OBJECT + v.v >= (JSVAL_SHIFTED_TAG_OBJECT as u64) } #[inline(always)] diff --git a/rust.rs b/rust.rs index b078cebf5..13975ae75 100644 --- a/rust.rs +++ b/rust.rs @@ -9,13 +9,12 @@ use std::libc::{c_char, uintptr_t}; use std::num; use std::rc; use jsapi::*; -use jsval::JSVal; +use jsval::{JSVal, NullValue}; use default_stacksize; use default_heapsize; use JSOPTION_VAROBJFIX; use JSOPTION_METHODJIT; use JSOPTION_TYPE_INFERENCE; -use JSVAL_NULL; use ERR; use std::ptr; use std::ptr::null; @@ -186,7 +185,7 @@ impl Cx { -> Result<(),()> { let script_utf16 = script.to_utf16(); filename.to_c_str().with_ref(|filename_cstr| { - let rval: JSVal = JSVAL_NULL; + let rval: JSVal = NullValue(); debug!("Evaluating script from {:s} with content {}", filename, script); unsafe { if ERR == JS_EvaluateUCScript(self.ptr, glob.borrow().ptr, From 85dc7859ef52da2efdee7dde905f76c17cdc79fb Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 9 Mar 2014 11:27:14 +0100 Subject: [PATCH 3/3] Implement JSVal member functions to replace JSVAL_IS_* and JSVAL_TO_*. --- glue.rs | 69 ------------------------- js.rc | 9 ++-- jsglue.cpp | 144 ----------------------------------------------------- jsval.rs | 65 +++++++++++++++++------- 4 files changed, 51 insertions(+), 236 deletions(-) diff --git a/glue.rs b/glue.rs index bbaff8efe..127e87a1c 100644 --- a/glue.rs +++ b/glue.rs @@ -58,75 +58,6 @@ extern { //#[rust_stack] pub fn GetJSClassHookStubPointer(_type: enum_StubType) -> *c_void; -//#[rust_stack] -pub fn RUST_JSVAL_IS_NULL(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_VOID(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_INT(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_INT(v: JSVal) -> int32_t; - -//#[rust_stack] -pub fn RUST_INT_TO_JSVAL(v: int32_t) -> JSVal; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_DOUBLE(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_DOUBLE(v: JSVal) -> c_double; - -//#[rust_stack] -pub fn RUST_DOUBLE_TO_JSVAL(v: c_double) -> JSVal; - -//#[rust_stack] -pub fn RUST_UINT_TO_JSVAL(v: uint32_t) -> JSVal; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_NUMBER(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_STRING(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_STRING(v: JSVal) -> *JSString; - -//#[rust_stack] -pub fn RUST_STRING_TO_JSVAL(v: *JSString) -> JSVal; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_OBJECT(v: JSVal) -> *JSObject; - -//#[rust_stack] -pub fn RUST_OBJECT_TO_JSVAL(v: *JSObject) -> JSVal; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_BOOLEAN(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_BOOLEAN(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_BOOLEAN_TO_JSVAL(v: JSBool) -> JSVal; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_PRIMITIVE(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_IS_GCTHING(v: JSVal) -> JSBool; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_GCTHING(v: JSVal) -> *c_void; - -//#[rust_stack] -pub fn RUST_PRIVATE_TO_JSVAL(v: *c_void) -> JSVal; - -//#[rust_stack] -pub fn RUST_JSVAL_TO_PRIVATE(v: JSVal) -> *c_void; - //#[rust_stack] pub fn RUST_JS_NumberValue(d: f64) -> JSVal; diff --git a/js.rc b/js.rc index d201fac50..ff1095590 100644 --- a/js.rc +++ b/js.rc @@ -24,7 +24,6 @@ use jsapi::{JSBool, JSContext, use jsapi::JS_ComputeThis; use std::libc::types::common::c99::uint32_t; use jsval::JSVal; -pub use jsval::{JSVAL_TO_OBJECT, JSVAL_IS_PRIMITIVE, JSVAL_IS_OBJECT}; use rust::jsobj; // These are just macros in jsapi.h @@ -126,13 +125,13 @@ pub unsafe fn JS_SET_RVAL(_cx: *JSContext, vp: *JSVal, v: JSVal) { #[inline(alwyas)] pub unsafe fn JS_THIS_OBJECT(cx: *JSContext, vp: *mut JSVal) -> *JSObject { - let r = JSVAL_TO_OBJECT( - if JSVAL_IS_PRIMITIVE(*ptr::offset(&*vp, 1)) { + let r = + if (*ptr::offset(&*vp, 1)).is_primitive() { JS_ComputeThis(cx, &*vp) } else { *ptr::offset(&*vp, 1) - }); - r + }; + r.to_object_or_null() } #[inline(always)] diff --git a/jsglue.cpp b/jsglue.cpp index a2091c822..085e1273c 100644 --- a/jsglue.cpp +++ b/jsglue.cpp @@ -298,150 +298,6 @@ GetJSClassHookStubPointer(enum StubType type) return NULL; } -JSBool -RUST_JSVAL_IS_NULL(jsval v) -{ - return JSVAL_IS_NULL(v); -} - -JSBool -RUST_JSVAL_IS_VOID(jsval v) -{ - return JSVAL_IS_VOID(v); -} - -JSBool -RUST_JSVAL_IS_INT(jsval v) -{ - return JSVAL_IS_INT(v); -} - -int32_t -RUST_JSVAL_TO_INT(jsval v) -{ - return JSVAL_TO_INT(v); -} - -jsval -RUST_INT_TO_JSVAL(int32_t v) -{ - return INT_TO_JSVAL(v); -} - -JSBool -RUST_JSVAL_IS_DOUBLE(jsval v) -{ - return JSVAL_IS_DOUBLE(v); -} - -double -RUST_JSVAL_TO_DOUBLE(jsval v) -{ - return JSVAL_TO_DOUBLE(v); -} - -jsval -RUST_DOUBLE_TO_JSVAL(double v) -{ - return DOUBLE_TO_JSVAL(v); -} - -jsval -RUST_UINT_TO_JSVAL(uint32_t v) -{ - return UINT_TO_JSVAL(v); -} - -JSBool -RUST_JSVAL_IS_NUMBER(jsval v) -{ - return JSVAL_IS_NUMBER(v); -} - -JSBool -RUST_JSVAL_IS_STRING(jsval v) -{ - return JSVAL_IS_STRING(v); -} - -JSString * -RUST_JSVAL_TO_STRING(jsval v) -{ - return JSVAL_TO_STRING(v); -} - -jsval -RUST_STRING_TO_JSVAL(JSString *v) -{ - return STRING_TO_JSVAL(v); -} - -JSBool -RUST_JSVAL_IS_OBJECT(jsval v) -{ - return !JSVAL_IS_PRIMITIVE(v) || JSVAL_IS_NULL(v); -} - -JSObject * -RUST_JSVAL_TO_OBJECT(jsval v) -{ - return JSVAL_TO_OBJECT(v); -} - -jsval -RUST_OBJECT_TO_JSVAL(JSObject *v) -{ - return OBJECT_TO_JSVAL(v); -} - -JSBool -RUST_JSVAL_IS_BOOLEAN(jsval v) -{ - return JSVAL_IS_BOOLEAN(v); -} - -JSBool -RUST_JSVAL_TO_BOOLEAN(jsval v) -{ - return JSVAL_TO_BOOLEAN(v); -} - -jsval -RUST_BOOLEAN_TO_JSVAL(JSBool v) -{ - return BOOLEAN_TO_JSVAL(v); -} - -JSBool -RUST_JSVAL_IS_PRIMITIVE(jsval v) -{ - return JSVAL_IS_PRIMITIVE(v); -} - -JSBool -RUST_JSVAL_IS_GCTHING(jsval v) -{ - return JSVAL_IS_GCTHING(v); -} - -void * -RUST_JSVAL_TO_GCTHING(jsval v) -{ - return JSVAL_TO_GCTHING(v); -} - -jsval -RUST_PRIVATE_TO_JSVAL(void *v) -{ - return PRIVATE_TO_JSVAL(v); -} - -void * -RUST_JSVAL_TO_PRIVATE(jsval v) -{ - return JSVAL_TO_PRIVATE(v); -} - jsval RUST_JS_NumberValue(double d) { diff --git a/jsval.rs b/jsval.rs index 5939ae2c6..01a01db39 100644 --- a/jsval.rs +++ b/jsval.rs @@ -136,25 +136,54 @@ pub fn PrivateValue(o: *c_void) -> JSVal { } } -#[inline(always)] -pub fn JSVAL_TO_OBJECT(v: JSVal) -> *JSObject { - let bits = (v.v & JSVAL_PAYLOAD_MASK); - assert!(bits & 0x7 == 0); - bits as *JSObject -} +impl JSVal { + pub fn is_undefined(&self) -> bool { + self.v == JSVAL_SHIFTED_TAG_UNDEFINED as u64 + } -#[inline(always)] -pub fn JSVAL_IS_PRIMITIVE(v: JSVal) -> bool { - v.v < (JSVAL_SHIFTED_TAG_OBJECT as u64) -} + pub fn is_null(&self) -> bool { + self.v == JSVAL_SHIFTED_TAG_NULL as u64 + } -#[inline(always)] -pub fn JSVAL_IS_OBJECT(v: JSVal) -> bool { - v.v >= (JSVAL_SHIFTED_TAG_OBJECT as u64) -} + pub fn is_null_or_undefined(&self) -> bool { + self.is_null() || self.is_undefined() + } -#[inline(always)] -pub fn JSVAL_TO_PRIVATE(v: JSVal) -> *() { - assert!(v.v & 0x8000000000000000 == 0); - (v.v << 1) as *() + pub fn is_double(&self) -> bool { + self.v <= JSVAL_SHIFTED_TAG_MAX_DOUBLE as u64 + } + + pub fn is_primitive(&self) -> bool { + static JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_PRIMITIVE_SET: u64 = JSVAL_SHIFTED_TAG_OBJECT as u64; + self.v < JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_PRIMITIVE_SET + } + + pub fn is_object(&self) -> bool { + assert!((self.v >> JSVAL_TAG_SHIFT) <= JSVAL_TAG_OBJECT as u64); + self.v >= JSVAL_SHIFTED_TAG_OBJECT as u64 + } + + pub fn to_object(&self) -> *JSObject { + assert!(self.is_object()); + self.to_object_or_null() + } + + pub fn is_object_or_null(&self) -> bool { + static JSVAL_LOWER_INCL_SHIFTED_TAG_OF_OBJ_OR_NULL_SET: u64 = JSVAL_SHIFTED_TAG_NULL as u64; + assert!((self.v >> JSVAL_TAG_SHIFT) <= JSVAL_TAG_OBJECT as u64); + self.v >= JSVAL_LOWER_INCL_SHIFTED_TAG_OF_OBJ_OR_NULL_SET + } + + pub fn to_object_or_null(&self) -> *JSObject { + assert!(self.is_object_or_null()); + let ptrBits = self.v & JSVAL_PAYLOAD_MASK; + assert!((ptrBits & 0x7) == 0); + ptrBits as uint as *JSObject + } + + pub fn to_private(&self) -> *c_void { + assert!(self.is_double()); + assert!((self.v & 0x8000000000000000u64) == 0); + (self.v << 1) as uint as *c_void + } }