Mercurial > spidermonkey-playground
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);