Bug 730836 - Refactor SetObjectElementOperation to avoid a GetPcScript call. r=pierron

--HG--
extra : rebase_source : 889b08873e1cab824f62c09c412e6b8d85a98b28
This commit is contained in:
Jan de Mooij 2012-02-28 12:06:42 +01:00
Родитель fef7f4a40e
Коммит 40831abc1a
5 изменённых файлов: 11 добавлений и 12 удалений

Просмотреть файл

@ -1117,8 +1117,7 @@ class TypeScript
static inline void Monitor(JSContext *cx, const js::Value &rval);
/* Monitor an assignment at a SETELEM on a non-integer identifier. */
static inline void MonitorAssign(JSContext *cx, JSScript *script, jsbytecode *pc,
JSObject *obj, jsid id, const js::Value &val);
static inline void MonitorAssign(JSContext *cx, JSObject *obj, jsid id);
/* Add a type for a variable in a script. */
static inline void SetThis(JSContext *cx, JSScript *script, Type type);

Просмотреть файл

@ -639,8 +639,7 @@ TypeScript::Monitor(JSContext *cx, const js::Value &rval)
}
/* static */ inline void
TypeScript::MonitorAssign(JSContext *cx, JSScript *script, jsbytecode *pc,
JSObject *obj, jsid id, const js::Value &rval)
TypeScript::MonitorAssign(JSContext *cx, JSObject *obj, jsid id)
{
if (cx->typeInferenceEnabled() && !obj->hasSingletonType()) {
/*

Просмотреть файл

@ -2641,7 +2641,7 @@ BEGIN_CASE(JSOP_SETELEM)
jsid id;
FETCH_ELEMENT_ID(obj, -2, id);
Value &value = regs.sp[-1];
if (!SetObjectElementOperation(cx, obj, id, value))
if (!SetObjectElementOperation(cx, obj, id, value, script->strictModeCode))
goto error;
regs.sp[-3] = value;
regs.sp -= 2;

Просмотреть файл

@ -798,12 +798,9 @@ GetElementOperation(JSContext *cx, const Value &lref, const Value &rref, Value *
}
static JS_ALWAYS_INLINE bool
SetObjectElementOperation(JSContext *cx, JSObject *obj, jsid id, const Value &value)
SetObjectElementOperation(JSContext *cx, JSObject *obj, jsid id, const Value &value, bool strict)
{
JSScript *script;
jsbytecode *pc;
types::TypeScript::GetPcScript(cx, &script, &pc);
types::TypeScript::MonitorAssign(cx, script, pc, obj, id, value);
types::TypeScript::MonitorAssign(cx, obj, id);
do {
if (obj->isDenseArray() && JSID_IS_INT(id)) {
@ -819,6 +816,10 @@ SetObjectElementOperation(JSContext *cx, JSObject *obj, jsid id, const Value &va
obj->setDenseArrayElementWithType(cx, i, value);
return true;
} else {
JSScript *script;
jsbytecode *pc;
types::TypeScript::GetPcScript(cx, &script, &pc);
if (script->hasAnalysis())
script->analysis()->getCode(pc).arrayWriteHole = true;
}
@ -826,7 +827,7 @@ SetObjectElementOperation(JSContext *cx, JSObject *obj, jsid id, const Value &va
} while (0);
Value tmp = value;
return obj->setGeneric(cx, id, &tmp, script->strictModeCode);
return obj->setGeneric(cx, id, &tmp, strict);
}
#define RELATIONAL_OP(OP) \

Просмотреть файл

@ -231,7 +231,7 @@ stubs::SetElem(VMFrame &f)
if (!FetchElementId(f.cx, obj, idval, id, &regs.sp[-2]))
THROW();
TypeScript::MonitorAssign(cx, f.script(), f.pc(), obj, id, rval);
TypeScript::MonitorAssign(cx, obj, id);
do {
if (obj->isDenseArray() && JSID_IS_INT(id)) {