diff options
author | janekptacijarabaci <janekptacijarabaci@seznam.cz> | 2018-03-20 12:40:00 +0100 |
---|---|---|
committer | janekptacijarabaci <janekptacijarabaci@seznam.cz> | 2018-03-20 12:40:00 +0100 |
commit | 2a57d73c3b5304be3f9be51018a1bbee79f007e2 (patch) | |
tree | 90bd70148cd2ee939092d6e70bd618ab5df914b1 /js/src/jit/BaselineCompiler.cpp | |
parent | caa2a53c402c7b509e9939e9aefe595dc0dbe516 (diff) | |
download | UXP-2a57d73c3b5304be3f9be51018a1bbee79f007e2.tar UXP-2a57d73c3b5304be3f9be51018a1bbee79f007e2.tar.gz UXP-2a57d73c3b5304be3f9be51018a1bbee79f007e2.tar.lz UXP-2a57d73c3b5304be3f9be51018a1bbee79f007e2.tar.xz UXP-2a57d73c3b5304be3f9be51018a1bbee79f007e2.zip |
Bug 1204028: Evaluate LHS reference before RHS in destructuring
Issue #73
[Depends on] Bug 1147371: Implement IteratorClose
Diffstat (limited to 'js/src/jit/BaselineCompiler.cpp')
-rw-r--r-- | js/src/jit/BaselineCompiler.cpp | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index 4dcc10b61..2f0d41707 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -1147,7 +1147,7 @@ BaselineCompiler::emit_JSOP_PICK() // after : A B D E C // First, move value at -(amount + 1) into R0. - int depth = -(GET_INT8(pc) + 1); + int32_t depth = -(GET_INT8(pc) + 1); masm.loadValue(frame.addressOfStackValue(frame.peek(depth)), R0); // Move the other values down. @@ -1166,6 +1166,34 @@ BaselineCompiler::emit_JSOP_PICK() } bool +BaselineCompiler::emit_JSOP_UNPICK() +{ + frame.syncStack(0); + + // Pick takes the top of the stack value and moves it under the nth value. + // For instance, unpick 2: + // before: A B C D E + // after : A B E C D + + // First, move value at -1 into R0. + masm.loadValue(frame.addressOfStackValue(frame.peek(-1)), R0); + + // Move the other values up. + int32_t depth = -(GET_INT8(pc) + 1); + for (int32_t i = -1; i > depth; i--) { + Address source = frame.addressOfStackValue(frame.peek(i - 1)); + Address dest = frame.addressOfStackValue(frame.peek(i)); + masm.loadValue(source, R1); + masm.storeValue(R1, dest); + } + + // Store R0 under the nth value. + Address dest = frame.addressOfStackValue(frame.peek(depth)); + masm.storeValue(R0, dest); + return true; +} + +bool BaselineCompiler::emit_JSOP_GOTO() { frame.syncStack(0); |