mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 696813 - Hoist two functions out of Decompile JSOP_ENTERBLOCK case for later reuse (r=jorendorff)
--HG-- extra : rebase_source : f9c0a19d1926efc7cc89ff64fa0eca3e73775830
This commit is contained in:
parent
04b64ac7ef
commit
b93fb2c304
@ -1878,6 +1878,50 @@ DecompileGroupAssignment(SprintStack *ss, jsbytecode *pc, jsbytecode *endpc,
|
|||||||
|
|
||||||
#endif /* JS_HAS_DESTRUCTURING */
|
#endif /* JS_HAS_DESTRUCTURING */
|
||||||
|
|
||||||
|
#define LOCAL_ASSERT(expr) LOCAL_ASSERT_RV(expr, false)
|
||||||
|
|
||||||
|
typedef Vector<JSAtom *, 8> AtomVector;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The names of the vars of a let block/expr are stored as the ids of the
|
||||||
|
* shapes of the block object. Shapes are stored in a singly-linked list in
|
||||||
|
* reverse order of addition. This function takes care of putting the names
|
||||||
|
* back in declaration order.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
GetBlockNames(JSContext *cx, JSObject *blockObj, AtomVector *atoms)
|
||||||
|
{
|
||||||
|
size_t numAtoms = OBJ_BLOCK_COUNT(cx, blockObj);
|
||||||
|
LOCAL_ASSERT(numAtoms > 0);
|
||||||
|
if (!atoms->resize(numAtoms))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uintN i = numAtoms;
|
||||||
|
for (Shape::Range r = blockObj->lastProperty()->all(); !r.empty(); r.popFront()) {
|
||||||
|
const Shape &shape = r.front();
|
||||||
|
LOCAL_ASSERT(shape.hasShortID());
|
||||||
|
--i;
|
||||||
|
LOCAL_ASSERT((uintN)shape.shortid == i);
|
||||||
|
(*atoms)[i] = JSID_TO_ATOM(shape.propid);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL_ASSERT(i == 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef LOCAL_ASSERT
|
||||||
|
|
||||||
|
static bool
|
||||||
|
PushBlockNames(JSContext *cx, SprintStack *ss, const AtomVector &atoms)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < atoms.length(); i++) {
|
||||||
|
const char *name = QuoteString(&ss->sprinter, atoms[i], 0);
|
||||||
|
if (!name || !PushOff(ss, STR2OFF(&ss->sprinter, name), JSOP_ENTERBLOCK))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static JSBool
|
static JSBool
|
||||||
InitSprintStack(JSContext *cx, SprintStack *ss, JSPrinter *jp, uintN depth)
|
InitSprintStack(JSContext *cx, SprintStack *ss, JSPrinter *jp, uintN depth)
|
||||||
{
|
{
|
||||||
@ -2723,26 +2767,10 @@ Decompile(SprintStack *ss, jsbytecode *pc, intN nb)
|
|||||||
case JSOP_ENTERBLOCK:
|
case JSOP_ENTERBLOCK:
|
||||||
{
|
{
|
||||||
LOAD_OBJECT(0);
|
LOAD_OBJECT(0);
|
||||||
argc = OBJ_BLOCK_COUNT(cx, obj);
|
AtomVector atoms(cx);
|
||||||
|
if (!GetBlockNames(cx, obj, &atoms) || !PushBlockNames(cx, ss, atoms))
|
||||||
Vector<JSAtom *, 5> atomv(cx);
|
|
||||||
if (!atomv.resize(argc))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (Shape::Range r = obj->lastProperty()->all(); !r.empty(); r.popFront()) {
|
|
||||||
const Shape &shape = r.front();
|
|
||||||
LOCAL_ASSERT(shape.hasShortID());
|
|
||||||
LOCAL_ASSERT(shape.shortid >= 0);
|
|
||||||
LOCAL_ASSERT(shape.shortid < argc);
|
|
||||||
atomv[shape.shortid] = JSID_TO_ATOM(shape.propid);
|
|
||||||
}
|
|
||||||
for (i = 0; i < argc; i++) {
|
|
||||||
atom = atomv[i];
|
|
||||||
rval = QuoteString(&ss->sprinter, atom, 0);
|
|
||||||
if (!rval || !PushOff(ss, STR2OFF(&ss->sprinter, rval), op))
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sn = js_GetSrcNote(jp->script, pc);
|
sn = js_GetSrcNote(jp->script, pc);
|
||||||
switch (sn ? SN_TYPE(sn) : SRC_NULL) {
|
switch (sn ? SN_TYPE(sn) : SRC_NULL) {
|
||||||
#if JS_HAS_BLOCK_SCOPE
|
#if JS_HAS_BLOCK_SCOPE
|
||||||
|
Loading…
Reference in New Issue
Block a user