Add separate bytecode instructions for environment lookups that must stay dynamic, such as eval- and with-sensitive scopes. Keep the coordinate variants for eagerly resolved declarative environments so their operands can be treated as immutable at runtime. This removes cached-coordinate mutation from the interpreter paths and updates the bytecode expectations for the new dynamic lookup opcodes.
154 lines
4.9 KiB
Text
154 lines
4.9 KiB
Text
$8565e4c5 indexed-append-guards.js:16:1
|
|
Registers: 11
|
|
Blocks: 7
|
|
Constants:
|
|
[0] = String("use strict")
|
|
[1] = Int32(0)
|
|
[2] = Int32(1)
|
|
[3] = Undefined
|
|
[4] = String("Indexed object append mutated")
|
|
[5] = String("length")
|
|
[6] = Bool(false)
|
|
[7] = Int32(2)
|
|
[8] = String("Array length changed")
|
|
[9] = String("Array append mutated")
|
|
|
|
block0:
|
|
[ 0] GetGlobal dst:reg6, `Object`
|
|
[ 10] GetById dst:reg7, base:reg6, `preventExtensions` (Object.preventExtensions)
|
|
[ 28] NewObject dst:reg8
|
|
[ 38] ToPrimitiveWithStringHint dst:Int32(0), value:Int32(0)
|
|
[ 48] PutByValue base:reg8, property:Int32(0), src:Int32(1), kind:Own
|
|
[ 60] Call dst:reg5, callee:reg7, this_value:reg6, Object.preventExtensions, arguments:[reg8]
|
|
[ 88] DynamicInitializeLexicalBinding `object`, src:reg5
|
|
[ 98] GetGlobal dst:reg7, `expect_type_error`
|
|
[ a8] NewFunction dst:reg6, shared_function_data_index:0
|
|
[ c0] Call dst:reg5, callee:reg7, this_value:Undefined, expect_type_error, arguments:[reg6]
|
|
[ e8] GetGlobal dst:reg7, `object`
|
|
[ f8] GetByValue dst:reg6, base:reg7, property:Int32(1) (object[Int32(1)])
|
|
[ 110] StrictlyInequals dst:reg7, lhs:reg6, rhs:Undefined
|
|
[ 120] Mov dst:reg6, src:Undefined
|
|
[ 130] JumpFalse condition:reg7, target:block2
|
|
|
|
block1:
|
|
[ 140] GetGlobal dst:reg9, `Error`
|
|
[ 150] CallConstruct dst:reg8, callee:reg9, Error, arguments:[String("Indexed object append mutated")]
|
|
[ 170] Throw src:reg8
|
|
|
|
block2:
|
|
[ 178] NewPrimitiveArray dst:reg5, elements:[1, 2]
|
|
[ 198] DynamicInitializeLexicalBinding `array`, src:reg5
|
|
[ 1a8] GetGlobal dst:reg7, `Object`
|
|
[ 1b8] GetById dst:reg8, base:reg7, `defineProperty` (Object.defineProperty)
|
|
[ 1d0] GetGlobal dst:reg9, `array`
|
|
[ 1e0] NewObject dst:reg10
|
|
[ 1f0] InitObjectLiteralProperty object:reg10, `writable`, src:Bool(false), shape_cache_index:0, property_slot:0
|
|
[ 208] CacheObjectShape object:reg10
|
|
[ 218] Call dst:reg5, callee:reg8, this_value:reg7, Object.defineProperty, arguments:[reg9, String("length"), reg10]
|
|
[ 248] GetGlobal dst:reg8, `expect_type_error`
|
|
[ 258] NewFunction dst:reg7, shared_function_data_index:1
|
|
[ 270] Call dst:reg6, callee:reg8, this_value:Undefined, expect_type_error, arguments:[reg7]
|
|
[ 298] GetGlobal dst:reg5, `array`
|
|
[ 2a8] GetLength dst:reg8, base:reg5 (array.length)
|
|
[ 2c0] StrictlyInequals dst:reg5, lhs:reg8, rhs:Int32(2)
|
|
[ 2d0] Mov dst:reg8, src:Undefined
|
|
[ 2e0] JumpFalse condition:reg5, target:block4
|
|
|
|
block3:
|
|
[ 2f0] GetGlobal dst:reg10, `Error`
|
|
[ 300] CallConstruct dst:reg7, callee:reg10, Error, arguments:[String("Array length changed")]
|
|
[ 320] Throw src:reg7
|
|
|
|
block4:
|
|
[ 328] GetGlobal dst:reg6, `array`
|
|
[ 338] GetByValue dst:reg5, base:reg6, property:Int32(2) (array[Int32(2)])
|
|
[ 350] StrictlyInequals dst:reg6, lhs:reg5, rhs:Undefined
|
|
[ 360] Mov dst:reg5, src:Undefined
|
|
[ 370] JumpFalse condition:reg6, target:block6
|
|
|
|
block5:
|
|
[ 380] GetGlobal dst:reg10, `Error`
|
|
[ 390] CallConstruct dst:reg7, callee:reg10, Error, arguments:[String("Array append mutated")]
|
|
[ 3b0] Throw src:reg7
|
|
|
|
block6:
|
|
[ 3b8] End value:reg5
|
|
|
|
|
|
expect_type_error$fc915998 indexed-append-guards.js:4:5
|
|
Registers: 9
|
|
Blocks: 8
|
|
Locals: error~0, did_throw~1
|
|
Constants:
|
|
[0] = Bool(false)
|
|
[1] = Bool(true)
|
|
[2] = Undefined
|
|
[3] = String("Expected TypeError")
|
|
|
|
block0:
|
|
[ 0] GetLexicalEnvironment dst:reg4
|
|
[ 8] Mov dst:did_throw~1, src:Bool(false)
|
|
[ 18] Jump target:block5
|
|
|
|
block1:
|
|
[ 20] Catch dst:reg5
|
|
[ 28] SetLexicalEnvironment environment:reg4
|
|
[ 30] Mov dst:error~0, src:reg5
|
|
[ 40] GetGlobal dst:reg7, `TypeError`
|
|
[ 50] InstanceOf dst:reg8, lhs:error~0, rhs:reg7
|
|
[ 60] Not dst:reg6, src:reg8
|
|
[ 70] JumpFalse condition:reg6, target:block3
|
|
|
|
block2:
|
|
[ 80] Throw src:error~0
|
|
|
|
block3:
|
|
[ 88] Mov dst:did_throw~1, src:Bool(true)
|
|
|
|
block4:
|
|
[ 98] Not dst:reg5, src:did_throw~1
|
|
[ a8] JumpIf condition:reg5, true_target:block6, false_target:block7
|
|
|
|
block5:
|
|
[ b8] Call dst:reg5, callee:arg0, this_value:Undefined, callback
|
|
[ d8] Jump target:block4
|
|
|
|
block6:
|
|
[ e0] GetGlobal dst:reg8, `Error`
|
|
[ f0] CallConstruct dst:reg6, callee:reg8, Error, arguments:[String("Expected TypeError")]
|
|
[ 110] Throw src:reg6
|
|
|
|
block7:
|
|
[ 118] End value:Undefined
|
|
|
|
Exception handlers:
|
|
[ b8 .. e0] => handler block1
|
|
|
|
|
|
$ec717972 indexed-append-guards.js:18:5
|
|
Registers: 6
|
|
Blocks: 1
|
|
Constants:
|
|
[0] = Int32(1)
|
|
[1] = Int32(2)
|
|
[2] = Undefined
|
|
|
|
block0:
|
|
[ 0] GetGlobal dst:reg5, `object`
|
|
[ 10] PutByValue base:reg5, property:Int32(1), src:Int32(2), kind:Normal (object[Int32(1)])
|
|
[ 28] End value:Undefined
|
|
|
|
|
|
$01eb2052 indexed-append-guards.js:26:5
|
|
Registers: 8
|
|
Blocks: 1
|
|
Constants:
|
|
[0] = Int32(3)
|
|
[1] = Undefined
|
|
|
|
block0:
|
|
[ 0] GetGlobal dst:reg5, `array`
|
|
[ 10] GetGlobal dst:reg6, `array`
|
|
[ 20] GetLength dst:reg7, base:reg6 (array.length)
|
|
[ 38] PutByValue base:reg5, property:reg7, src:Int32(3), kind:Normal (array[reg7])
|
|
[ 50] End value:Undefined
|