blob: bc59a1b0877e0ebd687d4698ac4b32ab724d7869 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdochda12d292016-06-02 14:46:10 +01005// Flags: --allow-natives-syntax --expose-debug-as debug
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00006
7"use strict";
8
9// Test non-JSObject receiver.
10function f(o) {
11 var result = [];
12 for (var i in o) {
13 result.push(i);
14 }
15 return result;
16}
17
18assertEquals(["0"], f("a"));
19assertEquals(["0"], f("a"));
20
21%OptimizeFunctionOnNextCall(f);
22assertEquals(["0","1","2"], f("bla"));
23
24// Test the lazy deopt points.
25var keys = ["a", "b", "c", "d"];
Ben Murdochda12d292016-06-02 14:46:10 +010026var property_descriptor_keys = [];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027var deopt_enum = false;
Ben Murdochda12d292016-06-02 14:46:10 +010028var deopt_property_descriptor = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000029
30var handler = {
Ben Murdoch097c5b22016-05-18 11:27:45 +010031 ownKeys() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000032 if (deopt_enum) {
33 %DeoptimizeFunction(f2);
34 deopt_enum = false;
35 }
Ben Murdoch097c5b22016-05-18 11:27:45 +010036 return keys;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037 },
Ben Murdochda12d292016-06-02 14:46:10 +010038 getOwnPropertyDescriptor(target, k) {
39 if (deopt_property_descriptor) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040 %DeoptimizeFunction(f2);
Ben Murdochda12d292016-06-02 14:46:10 +010041 deopt_property_descriptor = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042 }
Ben Murdochda12d292016-06-02 14:46:10 +010043 property_descriptor_keys.push(k);
44 return { enumerable: true, configurable: true }
45 },
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046};
47
48
49var proxy = new Proxy({}, handler);
50var o = {__proto__: proxy};
51
52function f2(o) {
53 var result = [];
54 for (var i in o) {
55 result.push(i);
56 }
57 return result;
58}
59
60function check_f2() {
61 assertEquals(keys, f2(o));
Ben Murdochda12d292016-06-02 14:46:10 +010062 assertEquals(keys, property_descriptor_keys);
63 property_descriptor_keys.length = 0;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000064}
65
66check_f2();
67check_f2();
68
Ben Murdoch097c5b22016-05-18 11:27:45 +010069// Test lazy deopt after ForInEnumerate
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000070%OptimizeFunctionOnNextCall(f2);
71deopt_enum = true;
72check_f2();
73
74// Test lazy deopt after FILTER_KEY
75%OptimizeFunctionOnNextCall(f2);
Ben Murdochda12d292016-06-02 14:46:10 +010076deopt_property_descriptor = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000077check_f2();
78
Ben Murdochda12d292016-06-02 14:46:10 +010079
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080function f3(o) {
81 for (var i in o) {
82 }
83}
84
85f3({__proto__:{x:1}});
86f3({__proto__:{x:1}});
87
88%OptimizeFunctionOnNextCall(f3);
89f3(undefined);
90f3(null);
91
92// Reliable repro for an issue previously flushed out by GC stress.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000093var p = {x: "x"}
94
95function f4(o, p) {
96 var result = [];
97 for (var i in o) {
98 var j = p.x + "str";
99 result.push(i);
100 }
101 return result;
102}
103
104function check_f4() {
105 assertEquals(keys, f4(o, p));
Ben Murdochda12d292016-06-02 14:46:10 +0100106 assertEquals(keys, property_descriptor_keys);
107 property_descriptor_keys.length = 0;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108}
109
110check_f4();
111check_f4();
112
113%OptimizeFunctionOnNextCall(f4);
114
115p.y = "y"; // Change map, cause eager deopt.
116check_f4();
117
118// Repro for Turbofan equivalent.
119var x;
120var count = 0;
121
122var Debug = debug.Debug;
123
124function listener(event, exec_state, event_data, data) {
125 if (event == Debug.DebugEvent.Break) {
126 %DeoptimizeFunction(f5);
127 }
128}
129
130var handler3 = {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100131 ownKeys() { return ["a", "b"] },
Ben Murdochda12d292016-06-02 14:46:10 +0100132 getOwnPropertyDescriptor(target, k) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133 if (k == "a") count++;
Ben Murdochda12d292016-06-02 14:46:10 +0100134 if (x) %ScheduleBreak()
135 return { enumerable: true, configurable: true }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136 }
137};
138
139var proxy3 = new Proxy({}, handler3);
140var o3 = {__proto__: proxy3};
141
142function f5() {
143 for (var p in o3) {
144 print(p);
145 }
146}
147
148x = false;
149
150f5(); f5(); f5();
151%OptimizeFunctionOnNextCall(f5);
152x = true;
153count = 0;
154Debug.setListener(listener);
155f5();
156Debug.setListener(null);
157assertEquals(1, count);