// 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(); })();