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);