Remove __call__ and add a callback used to check f.caller access for any function object f (109113, r=jst, sr=jband, a=blizzard).

git-svn-id: svn://10.0.0.236/branches/MOZILLA_0_9_6_BRANCH@108268 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
brendan%mozilla.org
2001-11-16 04:00:16 +00:00
parent 13f363642d
commit f71c6d1ea2
5 changed files with 31 additions and 25 deletions

View File

@@ -2707,6 +2707,16 @@ JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode,
return OBJ_CHECK_ACCESS(cx, obj, id, mode, vp, attrsp);
}
JS_PUBLIC_API(JSCheckAccessOp)
JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb)
{
JSCheckAccessOp oldacb;
oldacb = rt->checkObjectAccess;
rt->checkObjectAccess = acb;
return oldacb;
}
JS_PUBLIC_API(JSBool)
JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp)
{

View File

@@ -1041,6 +1041,9 @@ extern JS_PUBLIC_API(JSBool)
JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode,
jsval *vp, uintN *attrsp);
extern JS_PUBLIC_API(JSCheckAccessOp)
JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb);
extern JS_PUBLIC_API(JSBool)
JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp);

View File

@@ -184,6 +184,12 @@ struct JSRuntime {
#define NO_SCOPE_SHARING_TODO ((JSScope *) 0xfeedbeef)
#endif
/*
* Check property accessibility for objects of arbitrary class. Used at
* present to check f.caller accessibility for any function object f.
*/
JSCheckAccessOp checkObjectAccess;
/* Security principals serialization support. */
JSPrincipalsTranscoder principalsTranscoder;

View File

@@ -67,8 +67,7 @@ enum {
ARGS_CALLEE = -4, /* reference from arguments to active funobj */
FUN_ARITY = -5, /* number of formal parameters; desired argc */
FUN_NAME = -6, /* function name, "" if anonymous */
FUN_CALL = -7, /* function's top Call object in this context */
FUN_CALLER = -8 /* Function.prototype.caller, backward compat */
FUN_CALLER = -7 /* Function.prototype.caller, backward compat */
};
#if JSFRAME_OVERRIDE_BITS < 8
@@ -626,7 +625,6 @@ Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
static JSPropertySpec call_props[] = {
{js_arguments_str, CALL_ARGUMENTS, JSPROP_PERMANENT,0,0},
{"__callee__", CALL_CALLEE, 0,0,0},
{"__call__", FUN_CALL, 0,0,0},
{0,0,0,0,0}
};
@@ -659,11 +657,6 @@ call_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
*vp = fp->argv ? fp->argv[-2] : OBJECT_TO_JSVAL(fp->fun->object);
break;
case FUN_CALL:
if (!TEST_OVERRIDE_BIT(fp, slot))
*vp = OBJECT_TO_JSVAL(obj);
break;
default:
if ((uintN)slot < JS_MAX(fp->argc, fp->fun->nargs))
*vp = fp->argv[slot];
@@ -689,7 +682,6 @@ call_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
switch (slot) {
case CALL_ARGUMENTS:
case CALL_CALLEE:
case FUN_CALL:
SET_OVERRIDE_BIT(fp, slot);
break;
@@ -870,7 +862,6 @@ static JSPropertySpec function_props[] = {
{js_arity_str, FUN_ARITY, FUNCTION_PROP_ATTRS,0,0},
{js_length_str, ARGS_LENGTH, FUNCTION_PROP_ATTRS,0,0},
{js_name_str, FUN_NAME, FUNCTION_PROP_ATTRS,0,0},
{"__call__", FUN_CALL, FUNCTION_PROP_ATTRS,0,0},
{js_caller_str, FUN_CALLER, FUNCTION_PROP_ATTRS,0,0},
{0,0,0,0,0}
};
@@ -939,22 +930,16 @@ fun_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
: STRING_TO_JSVAL(cx->runtime->emptyString);
break;
case FUN_CALL:
if (fp && fp->fun) {
JSObject *callobj = js_GetCallObject(cx, fp, NULL);
if (!callobj)
return JS_FALSE;
*vp = OBJECT_TO_JSVAL(callobj);
} else {
*vp = JSVAL_NULL;
}
break;
case FUN_CALLER:
if (fp && fp->down && fp->down->fun)
*vp = fp->down->argv[-2];
else
*vp = JSVAL_NULL;
if (cx->runtime->checkObjectAccess) {
id = ATOM_KEY(cx->runtime->atomState.callerAtom);
if (!cx->runtime->checkObjectAccess(cx, obj, id, JSACC_READ, vp))
return JS_FALSE;
}
break;
default:

View File

@@ -78,10 +78,12 @@ typedef enum JSType {
/* JSObjectOps.checkAccess mode enumeration. */
typedef enum JSAccessMode {
JSACC_PROTO,
JSACC_PARENT,
JSACC_IMPORT,
JSACC_WATCH,
JSACC_PROTO, /* XXXbe redundant w.r.t. id */
JSACC_PARENT, /* XXXbe redundant w.r.t. id */
JSACC_IMPORT, /* import foo.bar */
JSACC_WATCH, /* a watchpoint on object foo for id 'bar' */
JSACC_READ, /* a "get" of foo.bar */
JSACC_WRITE, /* a "set" of foo.bar = baz */
JSACC_LIMIT
} JSAccessMode;