/gist:5450506
Last active Dec 16, 2015
Resolve ABI incompatibility problem for direct connecting to mozjs
| diff --git a/src/servo/dom/bindings/codegen/CodegenRust.py b/src/servo/dom/bindings/codegen/CodegenRust.py | |
| index 71c2223..ff548b2 100644 | |
| --- a/src/servo/dom/bindings/codegen/CodegenRust.py | |
| +++ b/src/servo/dom/bindings/codegen/CodegenRust.py | |
| @@ -3568,7 +3568,7 @@ def finalizeHook(descriptor, hookName, context): | |
| pass | |
| else: | |
| assert descriptor.nativeIsISupports | |
| - release = """let val = JS_GetReservedSlot(obj, 0); | |
| + release = """let val = GetReservedSlot(obj, 0); | |
| let _: %s = cast::reinterpret_cast(&RUST_JSVAL_TO_PRIVATE(val)); | |
| """ % (descriptor.pointerType + descriptor.nativeType) | |
| #return clearWrapper + release | |
| diff --git a/src/servo/dom/bindings/document.rs b/src/servo/dom/bindings/document.rs | |
| index 17f3573..113aceb 100644 | |
| --- a/src/servo/dom/bindings/document.rs | |
| +++ b/src/servo/dom/bindings/document.rs | |
| @@ -8,7 +8,7 @@ use js::{JS_ARGV, JSPROP_ENUMERATE, JSPROP_SHARED, | |
| use js::jsapi::{JSContext, JSVal, JSObject, JSBool, JSFreeOp, | |
| JSPropertySpec, JSPropertyOpWrapper, JSStrictPropertyOpWrapper, | |
| JSNativeWrapper, JSFunctionSpec}; | |
| -use js::jsapi::bindgen::{JS_GetReservedSlot, JS_SetReservedSlot, | |
| +use js::jsapi::bindgen::{JS_SetReservedSlot, | |
| JS_DefineFunctions, JS_DefineProperties}; | |
| use js::glue::bindgen::*; | |
| use js::glue::{PROPERTY_STUB, STRICT_PROPERTY_STUB}; | |
| @@ -66,14 +66,14 @@ extern fn getElementsByTagName(cx: *JSContext, _argc: c_uint, vp: *JSVal) -> JSB | |
| unsafe fn unwrap(obj: *JSObject) -> *mut rust_box<Document> { | |
| //TODO: some kind of check if this is a Document object | |
| - let val = JS_GetReservedSlot(obj, 0); | |
| + let val = GetReservedSlot(obj, 0); | |
| RUST_JSVAL_TO_PRIVATE(val) as *mut rust_box<Document> | |
| } | |
| extern fn finalize(_fop: *JSFreeOp, obj: *JSObject) { | |
| debug!("document finalize!"); | |
| unsafe { | |
| - let val = JS_GetReservedSlot(obj, 0); | |
| + let val = GetReservedSlot(obj, 0); | |
| let _doc: @Document = cast::reinterpret_cast(&RUST_JSVAL_TO_PRIVATE(val)); | |
| } | |
| } | |
| diff --git a/src/servo/dom/bindings/element.rs b/src/servo/dom/bindings/element.rs | |
| index 9270375..f8aa2ce 100644 | |
| --- a/src/servo/dom/bindings/element.rs | |
| +++ b/src/servo/dom/bindings/element.rs | |
| @@ -24,7 +24,7 @@ use js::{JS_THIS_OBJECT, JS_SET_RVAL, JSPROP_NATIVE_ACCESSORS}; | |
| extern fn finalize(_fop: *JSFreeOp, obj: *JSObject) { | |
| debug!("element finalize: %?!", obj as uint); | |
| unsafe { | |
| - let val = JS_GetReservedSlot(obj, DOM_OBJECT_SLOT as u32); | |
| + let val = GetReservedSlot(obj, DOM_OBJECT_SLOT as u32); | |
| let node: AbstractNode = cast::reinterpret_cast(&RUST_JSVAL_TO_PRIVATE(val)); | |
| let _elem: ~Element = cast::transmute(node.raw_object()); | |
| } | |
| diff --git a/src/servo/dom/bindings/utils.rs b/src/servo/dom/bindings/utils.rs | |
| index c2cbd67..08a9192 100644 | |
| --- a/src/servo/dom/bindings/utils.rs | |
| +++ b/src/servo/dom/bindings/utils.rs | |
| @@ -10,7 +10,7 @@ use js::{JSCLASS_HAS_RESERVED_SLOTS, JSPROP_ENUMERATE, JSVAL_NULL, | |
| use js::jsapi::{JSContext, JSVal, JSObject, JSBool, jsid, JSClass, JSNative, | |
| JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor}; | |
| use js::jsapi::bindgen::{JS_ValueToString, | |
| - JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN, | |
| + JS_SetReservedSlot, JS_NewStringCopyN, | |
| JS_DefineFunctions, JS_DefineProperty, | |
| JS_GetClass, JS_GetPrototype, JS_LinkConstructorAndPrototype, | |
| JS_AlreadyHasOwnProperty, JS_NewObject, JS_NewFunction, | |
| @@ -20,7 +20,7 @@ use js::jsapi::bindgen::{JS_ValueToString, | |
| JS_HasPropertyById, JS_GetPrototype, JS_GetGlobalForObject, | |
| JS_EncodeString, JS_free}; | |
| use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType; | |
| -use js::glue::bindgen::{DefineFunctionWithReserved, GetObjectJSClass, RUST_OBJECT_TO_JSVAL}; | |
| +use js::glue::bindgen::{DefineFunctionWithReserved, GetObjectJSClass, RUST_OBJECT_TO_JSVAL, GetReservedSlot}; | |
| use js::glue::{PROPERTY_STUB, STRICT_PROPERTY_STUB, ENUMERATE_STUB, CONVERT_STUB, | |
| RESOLVE_STUB}; | |
| use js::glue::bindgen::*; | |
| @@ -111,7 +111,7 @@ pub unsafe fn unwrap<T>(obj: *JSObject) -> T { | |
| } else { | |
| DOM_PROXY_OBJECT_SLOT | |
| } as u32; | |
| - let val = JS_GetReservedSlot(obj, slot); | |
| + let val = GetReservedSlot(obj, slot); | |
| cast::transmute(RUST_JSVAL_TO_PRIVATE(val)) | |
| } | |
| @@ -347,7 +347,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(RUST_JSVAL_TO_PRIVATE(GetReservedSlot(global, DOM_PROTOTYPE_SLOT))) | |
| } | |
| } | |
| @@ -800,4 +800,4 @@ pub enum Error { | |
| FailureUnknown | |
| } | |
| -pub type ErrorResult = Result<(), Error>; | |
| \ No newline at end of file | |
| +pub type ErrorResult = Result<(), Error>; | |
| diff --git a/src/servo/dom/bindings/window.rs b/src/servo/dom/bindings/window.rs | |
| index e764674..5d1563f 100644 | |
| --- a/src/servo/dom/bindings/window.rs | |
| +++ b/src/servo/dom/bindings/window.rs | |
| @@ -17,7 +17,7 @@ use js::global::jsval_to_rust_str; | |
| use js::glue::bindgen::*; | |
| use js::glue::bindgen::RUST_JSVAL_TO_INT; | |
| use js::jsapi::bindgen::{JS_DefineFunctions}; | |
| -use js::jsapi::bindgen::{JS_GetReservedSlot, JS_SetReservedSlot}; | |
| +use js::jsapi::bindgen::{JS_SetReservedSlot}; | |
| use js::jsapi::bindgen::{JS_ValueToString}; | |
| use js::jsapi::{JSContext, JSVal, JSObject, JSBool, JSFreeOp, JSFunctionSpec}; | |
| use js::jsapi::{JSNativeWrapper}; | |
| @@ -64,14 +64,14 @@ extern fn close(cx: *JSContext, _argc: c_uint, vp: *JSVal) -> JSBool { | |
| } | |
| unsafe fn unwrap(obj: *JSObject) -> *rust_box<Window> { | |
| - let val = JS_GetReservedSlot(obj, 0); | |
| + let val = GetReservedSlot(obj, 0); | |
| cast::reinterpret_cast(&RUST_JSVAL_TO_PRIVATE(val)) | |
| } | |
| extern fn finalize(_fop: *JSFreeOp, obj: *JSObject) { | |
| debug!("finalize!"); | |
| unsafe { | |
| - let val = JS_GetReservedSlot(obj, 0); | |
| + let val = GetReservedSlot(obj, 0); | |
| let _: @Window = cast::reinterpret_cast(&RUST_JSVAL_TO_PRIVATE(val)); | |
| } | |
| } | |
| diff --git a/src/rust-mozjs/glue.rs b/src/rust-mozjs/glue.rs | |
| index 61b08f2..c9f065d 100644 | |
| --- a/src/rust-mozjs/glue.rs | |
| +++ b/src/rust-mozjs/glue.rs | |
| @@ -159,4 +159,6 @@ pub fn DefineFunctionWithReserved(cx: *JSContext, obj: *JSObject, | |
| pub fn GetObjectJSClass(obj: *JSObject) -> *JSClass; | |
| pub fn js_GetErrorMessage(userRef: *libc::c_void, locale: *libc::c_char, | |
| errorNumber: libc::c_uint) -> *JSErrorFormatString; | |
| + | |
| +pub fn GetReservedSlot(obj: JSRawObject, index: uint32_t) -> JSVal; | |
| } | |
| diff --git a/src/rust-mozjs/jsglue.cpp b/src/rust-mozjs/jsglue.cpp | |
| index 3f5028e..b5c346b 100644 | |
| --- a/src/rust-mozjs/jsglue.cpp | |
| +++ b/src/rust-mozjs/jsglue.cpp | |
| @@ -569,4 +569,9 @@ js_GetErrorMessage(void* userRef, char* locale, uint32_t errorNumber) | |
| return js_GetErrorMessage(userRef, locale, errorNumber); | |
| } | |
| +uint64_t | |
| +GetReservedSlot(JSRawObject obj, uint32_t index) | |
| +{ | |
| + return jsval_to_uint64(JS_GetReservedSlot(obj, index)); | |
| +} | |
| } // extern "C" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment