// 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. // This is adapted from mjsunit/for-in-opt.js. // Flags: --harmony-proxies --harmony-reflect --allow-natives-syntax "use strict"; function f(o) { var result = []; for (var i of Reflect.enumerate(Object(o))) { result.push(i); } return result; } assertEquals(["0"], f("a")); assertEquals(["0"], f("a")); %OptimizeFunctionOnNextCall(f); assertEquals(["0","1","2"], f("bla")); // Test the lazy deopt points. var keys = ["a", "b", "c", "d"]; var has_keys = []; var deopt_has = false; var deopt_enum = false; var handler = { enumerate: function(target) { if (deopt_enum) { %DeoptimizeFunction(f2); deopt_enum = false; } return keys; }, getPropertyDescriptor: function(k) { if (deopt_has) { %DeoptimizeFunction(f2); deopt_has = false; } has_keys.push(k); return {value: 10, configurable: true, writable: false, enumerable: true}; } }; // TODO(neis,cbruni): Enable once the enumerate proxy trap is properly // implemented. // var proxy = new Proxy({}, handler); // var o = {__proto__: proxy}; // // function f2(o) { // var result = []; // for (var i of Reflect.enumerate(o)) { // result.push(i); // } // return result; // } // // function check_f2() { // assertEquals(keys, f2(o)); // assertEquals(keys, has_keys); // has_keys.length = 0; // } // // check_f2(); // check_f2(); // Test lazy deopt after GetPropertyNamesFast // %OptimizeFunctionOnNextCall(f2); // deopt_enum = true; // check_f2(); // Test lazy deopt after FILTER_KEY // %OptimizeFunctionOnNextCall(f2); // deopt_has = true; // check_f2();