mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 649491 - rm JSFRAME_ASSIGNING (r=dvander)
This commit is contained in:
parent
ae07f5cdce
commit
01d2bb36b4
@ -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, ®s.sp[-2], ®s.sp[-1]))
|
||||
goto error;
|
||||
regs.fp->setAssigning();
|
||||
JSBool ok = obj->setProperty(cx, id, ®s.sp[-1], script->strictModeCode);
|
||||
regs.fp->clearAssigning();
|
||||
if (!ok)
|
||||
goto error;
|
||||
|
||||
{
|
||||
JSAutoResolveFlags rf(cx, setPropFlags);
|
||||
if (!obj->setProperty(cx, id, ®s.sp[-1], script->strictModeCode))
|
||||
goto error;
|
||||
}
|
||||
|
||||
regs.sp--;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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,
|
||||
|
@ -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())
|
||||
|
@ -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];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user