From dfb1030a31009a8fad6b6dea01b59ed4b5945f66 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Sat, 29 Mar 2014 13:25:46 -0400 Subject: [PATCH] Add gczeal and more jsval helpers. --- jsapi.rs | 4 ++++ jsval.rs | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/jsapi.rs b/jsapi.rs index f2bc8510f..a16d7fd2d 100644 --- a/jsapi.rs +++ b/jsapi.rs @@ -593,6 +593,8 @@ pub type enum_JSExecPart = c_uint; pub static JSEXEC_PROLOG: u32 = 0_u32; pub static JSEXEC_MAIN: u32 = 1_u32; +pub static JS_DEFAULT_ZEAL_FREQ: u32 = 100; + pub type JSExecPart = enum_JSExecPart; pub type JSONWriteCallback = *u8; @@ -934,6 +936,8 @@ pub fn JS_GC(rt: *JSRuntime); pub fn JS_MaybeGC(cx: *JSContext); +pub fn JS_SetGCZeal(cx: *JSContext, zeal: u8, frequency: u32); + pub fn JS_InhibitGC(cx: *JSContext); pub fn JS_AllowGC(cx: *JSContext); diff --git a/jsval.rs b/jsval.rs index a58a4190d..ab6227b94 100644 --- a/jsval.rs +++ b/jsval.rs @@ -161,6 +161,10 @@ impl JSVal { self.v < JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_PRIMITIVE_SET } + pub fn is_string(&self) -> bool { + (self.v >> JSVAL_TAG_SHIFT) == JSVAL_TAG_STRING as u64 + } + 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 @@ -189,4 +193,25 @@ impl JSVal { assert!((self.v & 0x8000000000000000u64) == 0); (self.v << 1) as uint as *c_void } + + pub fn is_gcthing(&self) -> bool { + static JSVAL_LOWER_INCL_SHIFTED_TAG_OF_GCTHING_SET: u64 = JSVAL_SHIFTED_TAG_STRING as u64; + self.v >= JSVAL_LOWER_INCL_SHIFTED_TAG_OF_GCTHING_SET + } + + pub fn to_gcthing(&self) -> *c_void { + assert!(self.is_gcthing()); + let ptrBits = self.v & JSVAL_PAYLOAD_MASK; + assert!((ptrBits & 0x7) == 0); + ptrBits as *c_void + } + + pub fn is_markable(&self) -> bool { + self.is_gcthing() && !self.is_null() + } + + pub fn trace_kind(&self) -> u32 { + assert!(self.is_markable()); + (!self.is_object()) as u32 + } }