Mercurial > spidermonkey-playground
changeset 20:802ab1d478c6
Added getWrapper() and unwrap() functions.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Mon, 22 Jun 2009 08:29:14 -0700 |
parents | bbbad7e4b4aa |
children | cd5faa0bb46c |
files | spidermonkey-playground.cpp tcb.js wrapper.cpp wrapper.h |
diffstat | 4 files changed, 45 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/spidermonkey-playground.cpp Mon Jun 22 08:12:21 2009 -0700 +++ b/spidermonkey-playground.cpp Mon Jun 22 08:29:14 2009 -0700 @@ -298,6 +298,8 @@ static JSFunctionSpec tcb_global_functions[] = { JS_FS("print", print, 1, 0, 0), + JS_FS("getWrapper", getWrapper, 1, 0, 0), + JS_FS("unwrap", unwrapObject, 1, 0, 0), JS_FS("wrap", wrapObject, 2, 0, 0), JS_FS("stack", stack, 0, 0, 0), JS_FS("require", require, 2, 0, 0),
--- a/tcb.js Mon Jun 22 08:12:21 2009 -0700 +++ b/tcb.js Mon Jun 22 08:29:14 2009 -0700 @@ -66,4 +66,12 @@ print("module.foo() is " + module.foo()); })(); -var wrapped = wrap({}, {}); +var wrapper = {}; +var wrappee = {}; +var wrapped = wrap(wrappee, wrapper); + +if (unwrap(wrapped) !== wrappee) + throw new Error("Unwrapping doesn't work!"); + +if (getWrapper(wrapped) !== wrapper) + throw new Error("Getting the wrapper doesn't work!");
--- a/wrapper.cpp Mon Jun 22 08:12:21 2009 -0700 +++ b/wrapper.cpp Mon Jun 22 08:29:14 2009 -0700 @@ -313,6 +313,36 @@ JSCLASS_NO_RESERVED_MEMBERS }; +static JSBool getWrappedComponent(JSContext *cx, uintN argc, jsval *argv, + jsval *rval, uint32 slotIndex) +{ + JSObject *wrapped; + + if (!JS_ConvertArguments(cx, argc, argv, "o", &wrapped)) + return JS_FALSE; + + if (JS_GetClass(cx, wrapped) == &sFlexibleWrapper_JSClass.base) { + if (!JS_GetReservedSlot(cx, wrapped, slotIndex, rval)) + return JS_FALSE; + return JS_TRUE; + } + + *rval = JSVAL_NULL; + return JS_TRUE; +} + +JSBool getWrapper(JSContext *cx, JSObject *obj, uintN argc, + jsval *argv, jsval *rval) +{ + return getWrappedComponent(cx, argc, argv, rval, SLOT_RESOLVER); +} + +JSBool unwrapObject(JSContext *cx, JSObject *obj, uintN argc, + jsval *argv, jsval *rval) +{ + return getWrappedComponent(cx, argc, argv, rval, SLOT_WRAPPEE); +} + JSBool wrapObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
--- a/wrapper.h Mon Jun 22 08:12:21 2009 -0700 +++ b/wrapper.h Mon Jun 22 08:29:14 2009 -0700 @@ -37,5 +37,9 @@ #include "jsapi.h" extern JSExtendedClass sFlexibleWrapper_JSClass; +extern JSBool getWrapper(JSContext *cx, JSObject *obj, uintN argc, + jsval *argv, jsval *rval); +extern JSBool unwrapObject(JSContext *cx, JSObject *obj, uintN argc, + jsval *argv, jsval *rval); extern JSBool wrapObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);