summaryrefslogtreecommitdiffstats
path: root/js/src/jsopcode.cpp
diff options
context:
space:
mode:
authorjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-03-24 12:28:12 +0100
committerjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-03-24 12:28:12 +0100
commitfdedd57c60d35bed3e6cde12084b7abe08153ed3 (patch)
tree5cba1b96e8d02f657d64f1ea43421d2af044e3c3 /js/src/jsopcode.cpp
parent1ea1ed151571a523d1c8016dcd314e12238cd785 (diff)
downloadUXP-fdedd57c60d35bed3e6cde12084b7abe08153ed3.tar
UXP-fdedd57c60d35bed3e6cde12084b7abe08153ed3.tar.gz
UXP-fdedd57c60d35bed3e6cde12084b7abe08153ed3.tar.lz
UXP-fdedd57c60d35bed3e6cde12084b7abe08153ed3.tar.xz
UXP-fdedd57c60d35bed3e6cde12084b7abe08153ed3.zip
Bug 1147371: Implement JSOP_PICK and JSOP_UNPICK in the expression decompiler
Issue #74
Diffstat (limited to 'js/src/jsopcode.cpp')
-rw-r--r--js/src/jsopcode.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/js/src/jsopcode.cpp b/js/src/jsopcode.cpp
index 31bbfb471..eadbca4f8 100644
--- a/js/src/jsopcode.cpp
+++ b/js/src/jsopcode.cpp
@@ -460,6 +460,34 @@ BytecodeParser::simulateOp(JSOp op, uint32_t offset, uint32_t* offsetStack, uint
offsetStack[stackDepth] = tmp;
}
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;
return stackDepth;