StaGlobal didn't write the accumulator, but the baseline implementation assumed that it could preserve the accumulator by taking the return value of the StoreGlobalIC. This almost always worked, except for setters on the global object. Fix this by marking StaGlobal as clobbering the accumulator, same as StaNamedProperty (StaNamedProperty needs to do this anyway to avoid inlined setters from needing to create accumulator-preserving frames; StaGlobal would have needed the same thing if we'd ever inlined setters for it). Also, add a new debug scope, EnsureAccumulatorPreservedScope, to the baseline compiler, which checks if the accumulator value is preserved across non-accumulator-writing bytecodes. This found a (benign) bug with ForInPrepare, so fix that too. Fixed: chromium:1242306 Change-Id: I220b5b1c41010c16ac9f944cbd55d2705c299434 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3122325 Commit-Queue: Leszek Swirski <leszeks@chromium.org> Auto-Submit: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Cr-Commit-Position: refs/heads/main@{#76525}
105 lines
2.0 KiB
Plaintext
105 lines
2.0 KiB
Plaintext
#
|
|
# Autogenerated by generate-bytecode-expectations.
|
|
#
|
|
|
|
---
|
|
wrap: no
|
|
test function name: f
|
|
|
|
---
|
|
snippet: "
|
|
var global = 1;
|
|
function f() { return ++global; }
|
|
f();
|
|
"
|
|
frame size: 1
|
|
parameter count: 1
|
|
bytecode array length: 12
|
|
bytecodes: [
|
|
/* 31 S> */ B(LdaGlobal), U8(0), U8(0),
|
|
B(Inc), U8(2),
|
|
B(Star0),
|
|
/* 40 E> */ B(StaGlobal), U8(0), U8(3),
|
|
B(Ldar), R(0),
|
|
/* 47 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
ONE_BYTE_INTERNALIZED_STRING_TYPE ["global"],
|
|
]
|
|
handlers: [
|
|
]
|
|
|
|
---
|
|
snippet: "
|
|
var global = 1;
|
|
function f() { return global--; }
|
|
f();
|
|
"
|
|
frame size: 2
|
|
parameter count: 1
|
|
bytecode array length: 15
|
|
bytecodes: [
|
|
/* 31 S> */ B(LdaGlobal), U8(0), U8(0),
|
|
B(ToNumeric), U8(2),
|
|
B(Star0),
|
|
B(Dec), U8(2),
|
|
B(Star1),
|
|
/* 44 E> */ B(StaGlobal), U8(0), U8(3),
|
|
B(Ldar), R(0),
|
|
/* 47 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
ONE_BYTE_INTERNALIZED_STRING_TYPE ["global"],
|
|
]
|
|
handlers: [
|
|
]
|
|
|
|
---
|
|
snippet: "
|
|
unallocated = 1;
|
|
function f() { 'use strict'; return --unallocated; }
|
|
f();
|
|
"
|
|
frame size: 1
|
|
parameter count: 1
|
|
bytecode array length: 12
|
|
bytecodes: [
|
|
/* 46 S> */ B(LdaGlobal), U8(0), U8(0),
|
|
B(Dec), U8(2),
|
|
B(Star0),
|
|
/* 55 E> */ B(StaGlobal), U8(0), U8(3),
|
|
B(Ldar), R(0),
|
|
/* 67 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
ONE_BYTE_INTERNALIZED_STRING_TYPE ["unallocated"],
|
|
]
|
|
handlers: [
|
|
]
|
|
|
|
---
|
|
snippet: "
|
|
unallocated = 1;
|
|
function f() { return unallocated++; }
|
|
f();
|
|
"
|
|
frame size: 2
|
|
parameter count: 1
|
|
bytecode array length: 15
|
|
bytecodes: [
|
|
/* 32 S> */ B(LdaGlobal), U8(0), U8(0),
|
|
B(ToNumeric), U8(2),
|
|
B(Star0),
|
|
B(Inc), U8(2),
|
|
B(Star1),
|
|
/* 50 E> */ B(StaGlobal), U8(0), U8(3),
|
|
B(Ldar), R(0),
|
|
/* 53 S> */ B(Return),
|
|
]
|
|
constant pool: [
|
|
ONE_BYTE_INTERNALIZED_STRING_TYPE ["unallocated"],
|
|
]
|
|
handlers: [
|
|
]
|
|
|