| Index: test/mjsunit/for-in-opt.js
|
| diff --git a/test/mjsunit/for-in-opt.js b/test/mjsunit/for-in-opt.js
|
| index 67ef2d870e238b16c969184632563c81f9be2a3e..a6ee0ec81e32fdf965b30b831ac714bd64dbb251 100644
|
| --- a/test/mjsunit/for-in-opt.js
|
| +++ b/test/mjsunit/for-in-opt.js
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// Flags: --harmony-proxies --allow-natives-syntax
|
| +// Flags: --harmony-proxies --allow-natives-syntax --expose-debug-as debug
|
|
|
| "use strict";
|
|
|
| @@ -84,3 +84,77 @@ f3({__proto__:{x:1}});
|
| %OptimizeFunctionOnNextCall(f3);
|
| f3(undefined);
|
| f3(null);
|
| +
|
| +// Reliable repro for an issue previously flushed out by GC stress.
|
| +var handler2 = {
|
| + getPropertyDescriptor: function(k) {
|
| + has_keys.push(k);
|
| + return {value: 10, configurable: true, writable: false, enumerable: true};
|
| + }
|
| +}
|
| +var proxy2 = Proxy.create(handler2);
|
| +var o2 = {__proto__: proxy2};
|
| +var p = {x: "x"}
|
| +
|
| +function f4(o, p) {
|
| + var result = [];
|
| + for (var i in o) {
|
| + var j = p.x + "str";
|
| + result.push(i);
|
| + }
|
| + return result;
|
| +}
|
| +function check_f4() {
|
| + assertEquals(keys, f4(o, p));
|
| + assertEquals(keys, has_keys);
|
| + has_keys.length = 0;
|
| +}
|
| +check_f4();
|
| +check_f4();
|
| +%OptimizeFunctionOnNextCall(f4);
|
| +p.y = "y"; // Change map, cause eager deopt.
|
| +check_f4();
|
| +
|
| +// Repro for Turbofan equivalent.
|
| +var x;
|
| +var count = 0;
|
| +
|
| +var Debug = debug.Debug;
|
| +
|
| +function listener(event, exec_state, event_data, data) {
|
| + if (event == Debug.DebugEvent.Break) {
|
| + %DeoptimizeFunction(f5);
|
| + }
|
| +}
|
| +
|
| +var handler3 = {
|
| + enumerate: function(target) {
|
| + return ["a", "b"];
|
| + },
|
| +
|
| + getPropertyDescriptor: function(k) {
|
| + if (k == "a") count++;
|
| + if (x) %ScheduleBreak();
|
| + return {value: 10, configurable: true, writable: false, enumerable: true};
|
| + }
|
| +};
|
| +
|
| +var proxy3 = Proxy.create(handler3);
|
| +var o3 = {__proto__: proxy3};
|
| +
|
| +function f5() {
|
| + for (var p in o3) {
|
| + print(p);
|
| + }
|
| +}
|
| +
|
| +x = false;
|
| +
|
| +f5(); f5(); f5();
|
| +%OptimizeFunctionOnNextCall(f5);
|
| +x = true;
|
| +count = 0;
|
| +Debug.setListener(listener);
|
| +f5();
|
| +Debug.setListener(null);
|
| +assertEquals(1, count);
|
|
|