changeset 15:1d73446eef62

added functionInfo() native function.
author Atul Varma <varmaa@toolness.com>
date Fri, 19 Jun 2009 22:42:00 -0700
parents 1f48075a404e
children 36b66c249446
files spidermonkey-playground.cpp tcb.js
diffstat 2 files changed, 42 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/spidermonkey-playground.cpp	Fri Jun 19 16:43:02 2009 -0700
+++ b/spidermonkey-playground.cpp	Fri Jun 19 22:42:00 2009 -0700
@@ -106,6 +106,37 @@
   return JS_LookupPropertyById(cx, target, argv[1], rval);
 }
 
+static JSBool functionInfo(JSContext *cx, JSObject *obj, uintN argc,
+                           jsval *argv, jsval *rval)
+{
+  JSFunction *func;
+
+  if (!JS_ConvertArguments(cx, argc, argv, "f", &func))
+    return JS_FALSE;
+
+  JSScript *script = JS_GetFunctionScript(cx, func);
+
+  if (script == NULL) {
+    *rval = JSVAL_NULL;
+    return JS_TRUE;
+  }
+  
+  jsval filenameVal = JSVAL_NULL;
+
+  const char *filename = JS_GetScriptFilename(cx, script);
+  if (filename) {
+    JSString *filenameStr = JS_NewStringCopyZ(cx, filename);
+    filenameVal = STRING_TO_JSVAL(filenameStr);
+  }
+
+  JSObject *funcInfo = JS_NewObject(cx, NULL, NULL, NULL);
+  JS_DefineProperty(cx, funcInfo, "filename", filenameVal,
+                    NULL, NULL, 0);
+
+  *rval = OBJECT_TO_JSVAL(funcInfo);
+  return JS_TRUE;
+}
+
 static JSBool stack(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
                     jsval *rval)
 {
@@ -244,6 +275,7 @@
   JS_FS("stack",   stack,   0, 0, 0),
   JS_FS("require", require, 2, 0, 0),
   JS_FS("lookupProperty", lookupProperty, 2, 0, 0),
+  JS_FS("functionInfo", functionInfo, 1, 0, 0),
   JS_FS_END
 };
 
--- a/tcb.js	Fri Jun 19 16:43:02 2009 -0700
+++ b/tcb.js	Fri Jun 19 22:42:00 2009 -0700
@@ -2,14 +2,21 @@
 // particular property needs to be accessed on a particular object.
 function checkAccess(obj, id) {
   var frame = stack().caller;
+  var isSuspicious = false;
   if (!(frame.filename == null ||
-        frame.filename == "tcb.js"))
+        frame.filename == "tcb.js")) {
+    isSuspicious = true;
     print("access request from " + frame.filename + " on property '" + id +
           "' of " + obj);
+  }
   if (id == 'caller') {
-    if (frame.caller)
+    if (frame.caller &&
+        frame.caller.functionObject &&
+        !(isSuspicious &&
+          (functionInfo(frame.caller.functionObject).filename !=
+           frame.filename))) {
       return frame.caller.functionObject;
-    else
+    } else
       return null;
   }
   return lookupProperty(obj, id);