mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-31 19:47:32 +09:00
Bug 1147371: Implement JSOP_PICK and JSOP_UNPICK in the expression decompiler
Issue #74
This commit is contained in:
parent
95390009cc
commit
0f625eb5bd
3 changed files with 31 additions and 1 deletions
|
|
@ -460,6 +460,34 @@ BytecodeParser::simulateOp(JSOp op, uint32_t offset, uint32_t* offsetStack, uint
|
||||||
offsetStack[stackDepth] = tmp;
|
offsetStack[stackDepth] = tmp;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case JSOP_PICK: {
|
||||||
|
jsbytecode* pc = script_->offsetToPC(offset);
|
||||||
|
unsigned n = GET_UINT8(pc);
|
||||||
|
MOZ_ASSERT(ndefs == n + 1);
|
||||||
|
if (offsetStack) {
|
||||||
|
uint32_t top = stackDepth + n;
|
||||||
|
uint32_t tmp = offsetStack[stackDepth];
|
||||||
|
for (uint32_t i = stackDepth; i < top; i++)
|
||||||
|
offsetStack[i] = offsetStack[i + 1];
|
||||||
|
offsetStack[top] = tmp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case JSOP_UNPICK: {
|
||||||
|
jsbytecode* pc = script_->offsetToPC(offset);
|
||||||
|
unsigned n = GET_UINT8(pc);
|
||||||
|
MOZ_ASSERT(ndefs == n + 1);
|
||||||
|
if (offsetStack) {
|
||||||
|
uint32_t top = stackDepth + n;
|
||||||
|
uint32_t tmp = offsetStack[top];
|
||||||
|
for (uint32_t i = top; i > stackDepth; i--)
|
||||||
|
offsetStack[i] = offsetStack[i - 1];
|
||||||
|
offsetStack[stackDepth] = tmp;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stackDepth += ndefs;
|
stackDepth += ndefs;
|
||||||
return stackDepth;
|
return stackDepth;
|
||||||
|
|
|
||||||
|
|
@ -423,6 +423,7 @@ BytecodeFallsThrough(JSOp op)
|
||||||
case JSOP_RETRVAL:
|
case JSOP_RETRVAL:
|
||||||
case JSOP_FINALYIELDRVAL:
|
case JSOP_FINALYIELDRVAL:
|
||||||
case JSOP_THROW:
|
case JSOP_THROW:
|
||||||
|
case JSOP_THROWMSG:
|
||||||
case JSOP_TABLESWITCH:
|
case JSOP_TABLESWITCH:
|
||||||
return false;
|
return false;
|
||||||
case JSOP_GOSUB:
|
case JSOP_GOSUB:
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ GetDefCount(JSScript* script, unsigned offset)
|
||||||
case JSOP_AND:
|
case JSOP_AND:
|
||||||
return 1;
|
return 1;
|
||||||
case JSOP_PICK:
|
case JSOP_PICK:
|
||||||
|
case JSOP_UNPICK:
|
||||||
/*
|
/*
|
||||||
* Pick pops and pushes how deep it looks in the stack + 1
|
* Pick pops and pushes how deep it looks in the stack + 1
|
||||||
* items. i.e. if the stack were |a b[2] c[1] d[0]|, pick 2
|
* items. i.e. if the stack were |a b[2] c[1] d[0]|, pick 2
|
||||||
|
|
@ -44,7 +45,7 @@ GetUseCount(JSScript* script, unsigned offset)
|
||||||
{
|
{
|
||||||
jsbytecode* pc = script->offsetToPC(offset);
|
jsbytecode* pc = script->offsetToPC(offset);
|
||||||
|
|
||||||
if (JSOp(*pc) == JSOP_PICK)
|
if (JSOp(*pc) == JSOP_PICK || JSOp(*pc) == JSOP_UNPICK)
|
||||||
return pc[1] + 1;
|
return pc[1] + 1;
|
||||||
if (CodeSpec[*pc].nuses == -1)
|
if (CodeSpec[*pc].nuses == -1)
|
||||||
return StackUses(script, pc);
|
return StackUses(script, pc);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue