diff options
Diffstat (limited to 'deps/v8/test/mjsunit/regress/regress-997485.js')
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-997485.js | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/regress/regress-997485.js b/deps/v8/test/mjsunit/regress/regress-997485.js new file mode 100644 index 0000000000..bcc1664222 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-997485.js @@ -0,0 +1,127 @@ +// Copyright 2019 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax + +(function doubleToTaggedWithTaggedValueStoresCorrectly() { + + function setX_Double(o) { o.x = 4.2; } + + function foo() { + // o.x starts off as Double + const o = { x: 0.1 }; + + // Write to it a few times with setX_Double, to make sure setX_Double has + // Double feedback. + setX_Double(o); + setX_Double(o); + + // Transition o.x to Tagged. + o.x = {}; + + // setX_Double will still have Double feedback, so make sure it works with + // the new Tagged representation o.x. + setX_Double(o); + + assertEquals(o.x, 4.2); + } + + %EnsureFeedbackVectorForFunction(setX_Double); + foo(); + +})(); + +(function doubleToTaggedWithDoubleValueDoesNotMutate() { + + function setX_Double(o) { o.x = 4.2; } + + function foo() { + // o.x starts off as Double + const o = { x: 0.1 }; + + // Write to it a few times with setX_Double, to make sure setX_Double has + // Double feedback. + setX_Double(o); + setX_Double(o); + + // Transition o.x to Tagged. + o.x = {}; + + // Write the HeapNumber val to o.x. + const val = 1.25; + o.x = val; + + // setX_Double will still have Double feedback, which expects to be able to + // mutate o.x's HeapNumber, so make sure it does not mutate val. + setX_Double(o); + + assertEquals(o.x, 4.2); + assertNotEquals(val, 4.2); + } + + %EnsureFeedbackVectorForFunction(setX_Double); + foo(); + +})(); + +(function doubleToTaggedWithTaggedValueStoresSmiCorrectly() { + + function setX_Smi(o) { o.x = 42; } + + function foo() { + // o.x starts off as Double + const o = { x: 0.1 }; + + // Write to it a few times with setX_Smi, to make sure setX_Smi has + // Double feedback. + setX_Smi(o); + setX_Smi(o); + + // Transition o.x to Tagged. + o.x = {}; + + // setX_Smi will still have Double feedback, so make sure it works with + // the new Tagged representation o.x. + setX_Smi(o); + + assertEquals(o.x, 42); + } + + %EnsureFeedbackVectorForFunction(setX_Smi); + foo(); + +})(); + +(function doubleToTaggedWithSmiValueDoesNotMutate() { + + function setX_Smi(o) { o.x = 42; } + + function foo() { + // o.x starts off as Double + const o = { x: 0.1 }; + + // Write to it a few times with setX_Smi, to make sure setX_Smi has + // Double feedback. + setX_Smi(o); + setX_Smi(o); + + // Transition o.x to Tagged. + o.x = {}; + + // Write the HeapNumber val to o.x. + const val = 1.25; + o.x = val; + + // setX_Smi will still have Double feedback, which expects to be able to + // mutate o.x's HeapNumber, so make sure it does not mutate val. + setX_Smi(o); + + assertEquals(o.x, 42); + assertNotEquals(val, 42); + } + + %EnsureFeedbackVectorForFunction(setX_Smi); + foo(); + +})(); |