5e725a2b43
Emit a single destructuring assignment for destructuring declarations, which can be desugared by the bytecode generator. This allows us to remove destructuring desugaring from the parser (specifically, the pattern rewriter) entirely. The pattern "rewriter" is now only responsible for walking the destructuring pattern to declare variables, mark them assigned, and potentially rewrite scopes for the edge case of parameters with a sloppy eval. Note that since the rewriter is no longer rewriting, we have to flip the VariableProxy copying logic for var re-lookup, so that we now pass the new VariableProxy to the variable declaration and leave the original unresolved (rather than passing the original through and rewriting to a new unresolved VariableProxy). This change does have some effect on breakpoint locations, due to some of the available information changing between the parser and bytecode generator, however the new locations appear to be more consistent between assignments and declarations. Change-Id: I3a58dd0a387d2bfb8e5e9e22dde0acc5f440cb82 Reviewed-on: https://chromium-review.googlesource.com/c/1382462 Commit-Queue: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Adam Klein <adamk@chromium.org> Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Cr-Commit-Position: refs/heads/master@{#58670}
103 lines
2.0 KiB
Plaintext
103 lines
2.0 KiB
Plaintext
#
|
|
# Autogenerated by generate-bytecode-expectations.
|
|
#
|
|
|
|
---
|
|
wrap: no
|
|
test function name: f
|
|
|
|
---
|
|
snippet: "
|
|
function f(...restArgs) { return restArgs; }
|
|
f();
|
|
"
|
|
frame size: 2
|
|
parameter count: 1
|
|
bytecode array length: 7
|
|
bytecodes: [
|
|
B(CreateRestParameter),
|
|
B(Star), R(0),
|
|
/* 10 E> */ B(StackCheck),
|
|
/* 22 S> */ B(Star), R(1),
|
|
/* 42 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
]
|
|
handlers: [
|
|
]
|
|
|
|
---
|
|
snippet: "
|
|
function f(a, ...restArgs) { return restArgs; }
|
|
f();
|
|
"
|
|
frame size: 3
|
|
parameter count: 2
|
|
bytecode array length: 13
|
|
bytecodes: [
|
|
B(CreateRestParameter),
|
|
B(Star), R(0),
|
|
/* 10 E> */ B(StackCheck),
|
|
/* 12 S> */ B(Mov), R(arg0), R(1),
|
|
/* 25 S> */ B(Mov), R(0), R(2),
|
|
/* 29 S> */ B(Ldar), R(2),
|
|
/* 45 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
]
|
|
handlers: [
|
|
]
|
|
|
|
---
|
|
snippet: "
|
|
function f(a, ...restArgs) { return restArgs[0]; }
|
|
f();
|
|
"
|
|
frame size: 3
|
|
parameter count: 2
|
|
bytecode array length: 15
|
|
bytecodes: [
|
|
B(CreateRestParameter),
|
|
B(Star), R(0),
|
|
/* 10 E> */ B(StackCheck),
|
|
/* 12 S> */ B(Mov), R(arg0), R(1),
|
|
/* 25 S> */ B(Mov), R(0), R(2),
|
|
/* 29 S> */ B(LdaZero),
|
|
/* 44 E> */ B(LdaKeyedProperty), R(2), U8(0),
|
|
/* 48 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
]
|
|
handlers: [
|
|
]
|
|
|
|
---
|
|
snippet: "
|
|
function f(a, ...restArgs) { return restArgs[0] + arguments[0]; }
|
|
f();
|
|
"
|
|
frame size: 5
|
|
parameter count: 2
|
|
bytecode array length: 27
|
|
bytecodes: [
|
|
B(CreateUnmappedArguments),
|
|
B(Star), R(3),
|
|
B(CreateRestParameter),
|
|
B(Star), R(0),
|
|
/* 10 E> */ B(StackCheck),
|
|
/* 12 S> */ B(Mov), R(arg0), R(1),
|
|
/* 25 S> */ B(Mov), R(0), R(2),
|
|
/* 29 S> */ B(LdaZero),
|
|
/* 44 E> */ B(LdaKeyedProperty), R(2), U8(1),
|
|
B(Star), R(4),
|
|
B(LdaZero),
|
|
/* 59 E> */ B(LdaKeyedProperty), R(3), U8(3),
|
|
/* 48 E> */ B(Add), R(4), U8(0),
|
|
/* 63 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
]
|
|
handlers: [
|
|
]
|
|
|