| // Copyright 2015 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 Migrator(o) { |
| return o.foo; |
| } |
| function Loader(o) { |
| return o[0]; |
| } |
| |
| var first_smi_array = [1]; |
| var second_smi_array = [2]; |
| var first_object_array = ["first"]; |
| var second_object_array = ["string"]; |
| |
| assertTrue(%HasSmiElements(first_smi_array)); |
| assertTrue(%HasSmiElements(second_smi_array)); |
| assertTrue(%HasObjectElements(first_object_array)); |
| assertTrue(%HasObjectElements(second_object_array)); |
| |
| // Prepare identical transition chains for smi and object arrays. |
| first_smi_array.foo = 0; |
| second_smi_array.foo = 0; |
| first_object_array.foo = 0; |
| second_object_array.foo = 0; |
| |
| // Collect type feedback for not-yet-deprecated original object array map. |
| for (var i = 0; i < 3; i++) Migrator(second_object_array); |
| |
| // Blaze a migration trail for smi array maps. |
| // This marks the migrated smi array map as a migration target. |
| first_smi_array.foo = 0.5; |
| print(second_smi_array.foo); |
| |
| // Deprecate original object array map. |
| // Use TryMigrate from deferred optimized code to migrate second object array. |
| first_object_array.foo = 0.5; |
| %OptimizeFunctionOnNextCall(Migrator); |
| Migrator(second_object_array); |
| |
| // |second_object_array| now erroneously has a smi map. |
| // Optimized code assuming smi elements will expose this. |
| |
| for (var i = 0; i < 3; i++) Loader(second_smi_array); |
| %OptimizeFunctionOnNextCall(Loader); |
| assertEquals("string", Loader(second_object_array)); |
| |
| // Any of the following checks will also fail: |
| assertTrue(%HasObjectElements(second_object_array)); |
| assertFalse(%HasSmiElements(second_object_array)); |
| assertTrue(%HaveSameMap(first_object_array, second_object_array)); |
| assertFalse(%HaveSameMap(first_smi_array, second_object_array)); |
| |
| %ClearFunctionFeedback(Loader); |
| %ClearFunctionFeedback(Migrator); |