зеркало из https://github.com/mozilla/gecko-dev.git
Bug 730836 - Refactor SetObjectElementOperation to avoid a GetPcScript call. r=pierron
--HG-- extra : rebase_source : 889b08873e1cab824f62c09c412e6b8d85a98b28
This commit is contained in:
Родитель
fef7f4a40e
Коммит
40831abc1a
|
@ -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, ®s.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)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче