Bug 649491 - rm JSFRAME_ASSIGNING (r=dvander)

This commit is contained in:
Luke Wagner 2011-04-08 15:45:18 -07:00
parent ae07f5cdce
commit 01d2bb36b4
5 changed files with 64 additions and 65 deletions

View File

@ -3925,19 +3925,26 @@ do_incop:
const JSCodeSpec *cs = &js_CodeSpec[op];
JS_ASSERT(cs->ndefs == 1);
JS_ASSERT((cs->format & JOF_TMPSLOT_MASK) >= JOF_TMPSLOT2);
uint32 format = cs->format;
uint32 setPropFlags = (JOF_MODE(format) == JOF_NAME)
? JSRESOLVE_ASSIGNING
: JSRESOLVE_ASSIGNING | JSRESOLVE_QUALIFIED;
Value &ref = regs.sp[-1];
int32_t tmp;
if (JS_LIKELY(ref.isInt32() && CanIncDecWithoutOverflow(tmp = ref.toInt32()))) {
int incr = (cs->format & JOF_INC) ? 1 : -1;
if (cs->format & JOF_POST)
int incr = (format & JOF_INC) ? 1 : -1;
if (format & JOF_POST)
ref.getInt32Ref() = tmp + incr;
else
ref.getInt32Ref() = tmp += incr;
regs.fp->setAssigning();
JSBool ok = obj->setProperty(cx, id, &ref, script->strictModeCode);
regs.fp->clearAssigning();
if (!ok)
goto error;
{
JSAutoResolveFlags rf(cx, setPropFlags);
if (!obj->setProperty(cx, id, &ref, script->strictModeCode))
goto error;
}
/*
* We must set regs.sp[-1] to tmp for both post and pre increments
@ -3949,11 +3956,13 @@ do_incop:
PUSH_NULL();
if (!js_DoIncDec(cx, cs, &regs.sp[-2], &regs.sp[-1]))
goto error;
regs.fp->setAssigning();
JSBool ok = obj->setProperty(cx, id, &regs.sp[-1], script->strictModeCode);
regs.fp->clearAssigning();
if (!ok)
goto error;
{
JSAutoResolveFlags rf(cx, setPropFlags);
if (!obj->setProperty(cx, id, &regs.sp[-1], script->strictModeCode))
goto error;
}
regs.sp--;
}

View File

@ -71,26 +71,25 @@ enum JSInterpMode
enum JSFrameFlags
{
/* Primary frame type */
JSFRAME_GLOBAL = 0x1, /* frame pushed for a global script */
JSFRAME_FUNCTION = 0x2, /* frame pushed for a scripted call */
JSFRAME_DUMMY = 0x4, /* frame pushed for bookkeeping */
JSFRAME_GLOBAL = 0x1, /* frame pushed for a global script */
JSFRAME_FUNCTION = 0x2, /* frame pushed for a scripted call */
JSFRAME_DUMMY = 0x4, /* frame pushed for bookkeeping */
/* Frame subtypes */
JSFRAME_EVAL = 0x8, /* frame pushed for eval() or debugger eval */
JSFRAME_DEBUGGER = 0x10, /* frame pushed for debugger eval */
JSFRAME_GENERATOR = 0x20, /* frame is associated with a generator */
JSFRAME_FLOATING_GENERATOR = 0x40, /* frame is is in generator obj, not on stack */
JSFRAME_CONSTRUCTING = 0x80, /* frame is for a constructor invocation */
JSFRAME_EVAL = 0x8, /* frame pushed for eval() or debugger eval */
JSFRAME_DEBUGGER = 0x10, /* frame pushed for debugger eval */
JSFRAME_GENERATOR = 0x20, /* frame is associated with a generator */
JSFRAME_FLOATING_GENERATOR = 0x40, /* frame is is in generator obj, not on stack */
JSFRAME_CONSTRUCTING = 0x80, /* frame is for a constructor invocation */
/* Temporary frame states */
JSFRAME_ASSIGNING = 0x100, /* not-JOF_ASSIGNING op is assigning */
JSFRAME_YIELDING = 0x200, /* js::Interpret dispatched JSOP_YIELD */
JSFRAME_FINISHED_IN_INTERPRETER = 0x400, /* set if frame finished in Interpret() */
JSFRAME_YIELDING = 0x200, /* js::Interpret dispatched JSOP_YIELD */
JSFRAME_FINISHED_IN_INTERP = 0x400, /* set if frame finished in Interpret() */
/* Concerning function arguments */
JSFRAME_OVERRIDE_ARGS = 0x1000, /* overridden arguments local variable */
JSFRAME_OVERFLOW_ARGS = 0x2000, /* numActualArgs > numFormalArgs */
JSFRAME_UNDERFLOW_ARGS = 0x4000, /* numActualArgs < numFormalArgs */
JSFRAME_OVERRIDE_ARGS = 0x1000, /* overridden arguments local variable */
JSFRAME_OVERFLOW_ARGS = 0x2000, /* numActualArgs > numFormalArgs */
JSFRAME_UNDERFLOW_ARGS = 0x4000, /* numActualArgs < numFormalArgs */
/* Lazy frame initialization */
JSFRAME_HAS_IMACRO_PC = 0x8000, /* frame has imacpc value available */
@ -725,18 +724,6 @@ struct JSStackFrame
flags_ |= JSFRAME_OVERRIDE_ARGS;
}
bool isAssigning() const {
return !!(flags_ & JSFRAME_ASSIGNING);
}
void setAssigning() {
flags_ |= JSFRAME_ASSIGNING;
}
void clearAssigning() {
flags_ &= ~JSFRAME_ASSIGNING;
}
bool isYielding() {
return !!(flags_ & JSFRAME_YIELDING);
}
@ -750,11 +737,11 @@ struct JSStackFrame
}
void setFinishedInInterpreter() {
flags_ |= JSFRAME_FINISHED_IN_INTERPRETER;
flags_ |= JSFRAME_FINISHED_IN_INTERP;
}
bool finishedInInterpreter() const {
return !!(flags_ & JSFRAME_FINISHED_IN_INTERPRETER);
return !!(flags_ & JSFRAME_FINISHED_IN_INTERP);
}
/*

View File

@ -113,7 +113,7 @@ JSStackFrame::resetInvokeCallFrame()
JSFRAME_HAS_HOOK_DATA |
JSFRAME_HAS_CALL_OBJ |
JSFRAME_HAS_ARGS_OBJ |
JSFRAME_FINISHED_IN_INTERPRETER)));
JSFRAME_FINISHED_IN_INTERP)));
/*
* Since the stack frame is usually popped after PutActivationObjects,

View File

@ -3124,7 +3124,7 @@ js_InferFlags(JSContext *cx, uintN defaultFlags)
format = cs->format;
if (JOF_MODE(format) != JOF_NAME)
flags |= JSRESOLVE_QUALIFIED;
if ((format & (JOF_SET | JOF_FOR)) || fp->isAssigning()) {
if (format & (JOF_SET | JOF_FOR)) {
flags |= JSRESOLVE_ASSIGNING;
} else if (cs->length >= 0) {
pc += cs->length;
@ -6939,8 +6939,6 @@ js_DumpStackFrame(JSContext *cx, JSStackFrame *start)
fprintf(stderr, " constructing");
if (fp->hasOverriddenArgs())
fprintf(stderr, " overridden_args");
if (fp->isAssigning())
fprintf(stderr, " assigning");
if (fp->isDebuggerFrame())
fprintf(stderr, " debugger");
if (fp->isEvalFrame())

View File

@ -1508,18 +1508,21 @@ CanIncDecWithoutOverflow(int32_t i)
return (i > JSVAL_INT_MIN) && (i < JSVAL_INT_MAX);
}
template <int32 N, bool POST, JSBool strict>
template <int32 N, bool POST, JSBool strict, bool qualified>
static inline bool
ObjIncOp(VMFrame &f, JSObject *obj, jsid id)
{
JSContext *cx = f.cx;
JSStackFrame *fp = f.fp();
f.regs.sp[0].setNull();
f.regs.sp++;
if (!obj->getProperty(cx, id, &f.regs.sp[-1]))
return false;
uint32 setPropFlags = qualified
? JSRESOLVE_ASSIGNING
: JSRESOLVE_ASSIGNING | JSRESOLVE_QUALIFIED;
Value &ref = f.regs.sp[-1];
int32_t tmp;
if (JS_LIKELY(ref.isInt32() && CanIncDecWithoutOverflow(tmp = ref.toInt32()))) {
@ -1527,11 +1530,12 @@ ObjIncOp(VMFrame &f, JSObject *obj, jsid id)
ref.getInt32Ref() = tmp + N;
else
ref.getInt32Ref() = tmp += N;
fp->setAssigning();
JSBool ok = obj->setProperty(cx, id, &ref, strict);
fp->clearAssigning();
if (!ok)
return false;
{
JSAutoResolveFlags rf(cx, setPropFlags);
if (!obj->setProperty(cx, id, &ref, strict))
return false;
}
/*
* We must set regs.sp[-1] to tmp for both post and pre increments
@ -1551,11 +1555,12 @@ ObjIncOp(VMFrame &f, JSObject *obj, jsid id)
ref.setDouble(d);
}
v.setDouble(d);
fp->setAssigning();
JSBool ok = obj->setProperty(cx, id, &v, strict);
fp->clearAssigning();
if (!ok)
return false;
{
JSAutoResolveFlags rf(cx, setPropFlags);
if (!obj->setProperty(cx, id, &v, strict))
return false;
}
}
return true;
@ -1596,7 +1601,7 @@ NameIncDec(VMFrame &f, JSObject *obj, JSAtom *origAtom)
ReportAtomNotDefined(cx, atom);
return false;
}
return ObjIncOp<N, POST, strict>(f, obj, id);
return ObjIncOp<N, POST, strict, false>(f, obj, id);
}
template<JSBool strict>
@ -1606,7 +1611,7 @@ stubs::PropInc(VMFrame &f, JSAtom *atom)
JSObject *obj = ValueToObject(f.cx, &f.regs.sp[-1]);
if (!obj)
THROW();
if (!ObjIncOp<1, true, strict>(f, obj, ATOM_TO_JSID(atom)))
if (!ObjIncOp<1, true, strict, true>(f, obj, ATOM_TO_JSID(atom)))
THROW();
f.regs.sp[-2] = f.regs.sp[-1];
}
@ -1621,7 +1626,7 @@ stubs::PropDec(VMFrame &f, JSAtom *atom)
JSObject *obj = ValueToObject(f.cx, &f.regs.sp[-1]);
if (!obj)
THROW();
if (!ObjIncOp<-1, true, strict>(f, obj, ATOM_TO_JSID(atom)))
if (!ObjIncOp<-1, true, strict, true>(f, obj, ATOM_TO_JSID(atom)))
THROW();
f.regs.sp[-2] = f.regs.sp[-1];
}
@ -1636,7 +1641,7 @@ stubs::IncProp(VMFrame &f, JSAtom *atom)
JSObject *obj = ValueToObject(f.cx, &f.regs.sp[-1]);
if (!obj)
THROW();
if (!ObjIncOp<1, false, strict>(f, obj, ATOM_TO_JSID(atom)))
if (!ObjIncOp<1, false, strict, true>(f, obj, ATOM_TO_JSID(atom)))
THROW();
f.regs.sp[-2] = f.regs.sp[-1];
}
@ -1651,7 +1656,7 @@ stubs::DecProp(VMFrame &f, JSAtom *atom)
JSObject *obj = ValueToObject(f.cx, &f.regs.sp[-1]);
if (!obj)
THROW();
if (!ObjIncOp<-1, false, strict>(f, obj, ATOM_TO_JSID(atom)))
if (!ObjIncOp<-1, false, strict, true>(f, obj, ATOM_TO_JSID(atom)))
THROW();
f.regs.sp[-2] = f.regs.sp[-1];
}
@ -1669,7 +1674,7 @@ stubs::ElemInc(VMFrame &f)
jsid id;
if (!FetchElementId(f, obj, f.regs.sp[-1], id, &f.regs.sp[-1]))
THROW();
if (!ObjIncOp<1, true, strict>(f, obj, id))
if (!ObjIncOp<1, true, strict, true>(f, obj, id))
THROW();
f.regs.sp[-3] = f.regs.sp[-1];
}
@ -1687,7 +1692,7 @@ stubs::ElemDec(VMFrame &f)
jsid id;
if (!FetchElementId(f, obj, f.regs.sp[-1], id, &f.regs.sp[-1]))
THROW();
if (!ObjIncOp<-1, true, strict>(f, obj, id))
if (!ObjIncOp<-1, true, strict, true>(f, obj, id))
THROW();
f.regs.sp[-3] = f.regs.sp[-1];
}
@ -1705,7 +1710,7 @@ stubs::IncElem(VMFrame &f)
jsid id;
if (!FetchElementId(f, obj, f.regs.sp[-1], id, &f.regs.sp[-1]))
THROW();
if (!ObjIncOp<1, false, strict>(f, obj, id))
if (!ObjIncOp<1, false, strict, true>(f, obj, id))
THROW();
f.regs.sp[-3] = f.regs.sp[-1];
}
@ -1723,7 +1728,7 @@ stubs::DecElem(VMFrame &f)
jsid id;
if (!FetchElementId(f, obj, f.regs.sp[-1], id, &f.regs.sp[-1]))
THROW();
if (!ObjIncOp<-1, false, strict>(f, obj, id))
if (!ObjIncOp<-1, false, strict, true>(f, obj, id))
THROW();
f.regs.sp[-3] = f.regs.sp[-1];
}