Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: test/cctest/interpreter/test-interpreter.cc

Issue 2242193002: [Interpreter] Avoid accessing Isolate from during bytecode generation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@offheap_sourceposition
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/execution.h" 7 #include "src/execution.h"
8 #include "src/handles.h" 8 #include "src/handles.h"
9 #include "src/interpreter/bytecode-array-builder.h" 9 #include "src/interpreter/bytecode-array-builder.h"
10 #include "src/interpreter/bytecode-array-iterator.h" 10 #include "src/interpreter/bytecode-array-iterator.h"
11 #include "src/interpreter/bytecode-label.h" 11 #include "src/interpreter/bytecode-label.h"
12 #include "src/interpreter/interpreter.h" 12 #include "src/interpreter/interpreter.h"
13 #include "test/cctest/cctest.h" 13 #include "test/cctest/cctest.h"
14 #include "test/cctest/interpreter/interpreter-tester.h" 14 #include "test/cctest/interpreter/interpreter-tester.h"
15 #include "test/cctest/test-feedback-vector.h" 15 #include "test/cctest/test-feedback-vector.h"
16 16
17 namespace v8 { 17 namespace v8 {
18 namespace internal { 18 namespace internal {
19 namespace interpreter { 19 namespace interpreter {
20 20
21 21
22 TEST(InterpreterReturn) { 22 TEST(InterpreterReturn) {
23 HandleAndZoneScope handles; 23 HandleAndZoneScope handles;
24 Handle<Object> undefined_value = 24 Isolate* isolate = handles.main_isolate();
25 handles.main_isolate()->factory()->undefined_value(); 25 Handle<Object> undefined_value = isolate->factory()->undefined_value();
26 26
27 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 27 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
28 0, 0);
29 builder.Return(); 28 builder.Return();
30 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 29 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
31 30
32 InterpreterTester tester(handles.main_isolate(), bytecode_array); 31 InterpreterTester tester(isolate, bytecode_array);
33 auto callable = tester.GetCallable<>(); 32 auto callable = tester.GetCallable<>();
34 Handle<Object> return_val = callable().ToHandleChecked(); 33 Handle<Object> return_val = callable().ToHandleChecked();
35 CHECK(return_val.is_identical_to(undefined_value)); 34 CHECK(return_val.is_identical_to(undefined_value));
36 } 35 }
37 36
38 37
39 TEST(InterpreterLoadUndefined) { 38 TEST(InterpreterLoadUndefined) {
40 HandleAndZoneScope handles; 39 HandleAndZoneScope handles;
41 Handle<Object> undefined_value = 40 Isolate* isolate = handles.main_isolate();
42 handles.main_isolate()->factory()->undefined_value(); 41 Handle<Object> undefined_value = isolate->factory()->undefined_value();
43 42
44 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 43 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
45 0, 0);
46 builder.LoadUndefined().Return(); 44 builder.LoadUndefined().Return();
47 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 45 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
48 46
49 InterpreterTester tester(handles.main_isolate(), bytecode_array); 47 InterpreterTester tester(isolate, bytecode_array);
50 auto callable = tester.GetCallable<>(); 48 auto callable = tester.GetCallable<>();
51 Handle<Object> return_val = callable().ToHandleChecked(); 49 Handle<Object> return_val = callable().ToHandleChecked();
52 CHECK(return_val.is_identical_to(undefined_value)); 50 CHECK(return_val.is_identical_to(undefined_value));
53 } 51 }
54 52
55 53
56 TEST(InterpreterLoadNull) { 54 TEST(InterpreterLoadNull) {
57 HandleAndZoneScope handles; 55 HandleAndZoneScope handles;
58 Handle<Object> null_value = handles.main_isolate()->factory()->null_value(); 56 Isolate* isolate = handles.main_isolate();
57 Handle<Object> null_value = isolate->factory()->null_value();
59 58
60 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 59 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
61 0, 0);
62 builder.LoadNull().Return(); 60 builder.LoadNull().Return();
63 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 61 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
64 62
65 InterpreterTester tester(handles.main_isolate(), bytecode_array); 63 InterpreterTester tester(isolate, bytecode_array);
66 auto callable = tester.GetCallable<>(); 64 auto callable = tester.GetCallable<>();
67 Handle<Object> return_val = callable().ToHandleChecked(); 65 Handle<Object> return_val = callable().ToHandleChecked();
68 CHECK(return_val.is_identical_to(null_value)); 66 CHECK(return_val.is_identical_to(null_value));
69 } 67 }
70 68
71 69
72 TEST(InterpreterLoadTheHole) { 70 TEST(InterpreterLoadTheHole) {
73 HandleAndZoneScope handles; 71 HandleAndZoneScope handles;
74 Handle<Object> the_hole_value = 72 Isolate* isolate = handles.main_isolate();
75 handles.main_isolate()->factory()->the_hole_value(); 73 Handle<Object> the_hole_value = isolate->factory()->the_hole_value();
76 74
77 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 75 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
78 0, 0);
79 builder.LoadTheHole().Return(); 76 builder.LoadTheHole().Return();
80 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 77 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
81 78
82 InterpreterTester tester(handles.main_isolate(), bytecode_array); 79 InterpreterTester tester(isolate, bytecode_array);
83 auto callable = tester.GetCallable<>(); 80 auto callable = tester.GetCallable<>();
84 Handle<Object> return_val = callable().ToHandleChecked(); 81 Handle<Object> return_val = callable().ToHandleChecked();
85 CHECK(return_val.is_identical_to(the_hole_value)); 82 CHECK(return_val.is_identical_to(the_hole_value));
86 } 83 }
87 84
88 85
89 TEST(InterpreterLoadTrue) { 86 TEST(InterpreterLoadTrue) {
90 HandleAndZoneScope handles; 87 HandleAndZoneScope handles;
91 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); 88 Isolate* isolate = handles.main_isolate();
89 Handle<Object> true_value = isolate->factory()->true_value();
92 90
93 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 91 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
94 0, 0);
95 builder.LoadTrue().Return(); 92 builder.LoadTrue().Return();
96 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 93 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
97 94
98 InterpreterTester tester(handles.main_isolate(), bytecode_array); 95 InterpreterTester tester(isolate, bytecode_array);
99 auto callable = tester.GetCallable<>(); 96 auto callable = tester.GetCallable<>();
100 Handle<Object> return_val = callable().ToHandleChecked(); 97 Handle<Object> return_val = callable().ToHandleChecked();
101 CHECK(return_val.is_identical_to(true_value)); 98 CHECK(return_val.is_identical_to(true_value));
102 } 99 }
103 100
104 101
105 TEST(InterpreterLoadFalse) { 102 TEST(InterpreterLoadFalse) {
106 HandleAndZoneScope handles; 103 HandleAndZoneScope handles;
107 Handle<Object> false_value = handles.main_isolate()->factory()->false_value(); 104 Isolate* isolate = handles.main_isolate();
105 Handle<Object> false_value = isolate->factory()->false_value();
108 106
109 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 107 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
110 0, 0);
111 builder.LoadFalse().Return(); 108 builder.LoadFalse().Return();
112 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 109 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
113 110
114 InterpreterTester tester(handles.main_isolate(), bytecode_array); 111 InterpreterTester tester(isolate, bytecode_array);
115 auto callable = tester.GetCallable<>(); 112 auto callable = tester.GetCallable<>();
116 Handle<Object> return_val = callable().ToHandleChecked(); 113 Handle<Object> return_val = callable().ToHandleChecked();
117 CHECK(return_val.is_identical_to(false_value)); 114 CHECK(return_val.is_identical_to(false_value));
118 } 115 }
119 116
120 117
121 TEST(InterpreterLoadLiteral) { 118 TEST(InterpreterLoadLiteral) {
122 HandleAndZoneScope handles; 119 HandleAndZoneScope handles;
123 i::Factory* factory = handles.main_isolate()->factory(); 120 Isolate* isolate = handles.main_isolate();
121 Factory* factory = isolate->factory();
124 122
125 // Small Smis. 123 // Small Smis.
126 for (int i = -128; i < 128; i++) { 124 for (int i = -128; i < 128; i++) {
127 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 125 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
128 0, 0);
129 builder.LoadLiteral(Smi::FromInt(i)).Return(); 126 builder.LoadLiteral(Smi::FromInt(i)).Return();
130 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 127 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
131 128
132 InterpreterTester tester(handles.main_isolate(), bytecode_array); 129 InterpreterTester tester(isolate, bytecode_array);
133 auto callable = tester.GetCallable<>(); 130 auto callable = tester.GetCallable<>();
134 Handle<Object> return_val = callable().ToHandleChecked(); 131 Handle<Object> return_val = callable().ToHandleChecked();
135 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(i)); 132 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(i));
136 } 133 }
137 134
138 // Large Smis. 135 // Large Smis.
139 { 136 {
140 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 137 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
141 0, 0);
142 138
143 builder.LoadLiteral(Smi::FromInt(0x12345678)).Return(); 139 builder.LoadLiteral(Smi::FromInt(0x12345678)).Return();
144 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 140 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
145 141
146 InterpreterTester tester(handles.main_isolate(), bytecode_array); 142 InterpreterTester tester(isolate, bytecode_array);
147 auto callable = tester.GetCallable<>(); 143 auto callable = tester.GetCallable<>();
148 Handle<Object> return_val = callable().ToHandleChecked(); 144 Handle<Object> return_val = callable().ToHandleChecked();
149 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x12345678)); 145 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x12345678));
150 } 146 }
151 147
152 // Heap numbers. 148 // Heap numbers.
153 { 149 {
154 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 150 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
155 0, 0);
156 151
157 builder.LoadLiteral(factory->NewHeapNumber(-2.1e19)).Return(); 152 builder.LoadLiteral(factory->NewHeapNumber(-2.1e19)).Return();
158 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 153 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
159 154
160 InterpreterTester tester(handles.main_isolate(), bytecode_array); 155 InterpreterTester tester(isolate, bytecode_array);
161 auto callable = tester.GetCallable<>(); 156 auto callable = tester.GetCallable<>();
162 Handle<Object> return_val = callable().ToHandleChecked(); 157 Handle<Object> return_val = callable().ToHandleChecked();
163 CHECK_EQ(i::HeapNumber::cast(*return_val)->value(), -2.1e19); 158 CHECK_EQ(i::HeapNumber::cast(*return_val)->value(), -2.1e19);
164 } 159 }
165 160
166 // Strings. 161 // Strings.
167 { 162 {
168 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 163 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
169 0, 0);
170 164
171 Handle<i::String> string = factory->NewStringFromAsciiChecked("String"); 165 Handle<i::String> string = factory->NewStringFromAsciiChecked("String");
172 builder.LoadLiteral(string).Return(); 166 builder.LoadLiteral(string).Return();
173 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 167 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
174 168
175 InterpreterTester tester(handles.main_isolate(), bytecode_array); 169 InterpreterTester tester(isolate, bytecode_array);
176 auto callable = tester.GetCallable<>(); 170 auto callable = tester.GetCallable<>();
177 Handle<Object> return_val = callable().ToHandleChecked(); 171 Handle<Object> return_val = callable().ToHandleChecked();
178 CHECK(i::String::cast(*return_val)->Equals(*string)); 172 CHECK(i::String::cast(*return_val)->Equals(*string));
179 } 173 }
180 } 174 }
181 175
182 176
183 TEST(InterpreterLoadStoreRegisters) { 177 TEST(InterpreterLoadStoreRegisters) {
184 HandleAndZoneScope handles; 178 HandleAndZoneScope handles;
185 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); 179 Isolate* isolate = handles.main_isolate();
180 Handle<Object> true_value = isolate->factory()->true_value();
186 for (int i = 0; i <= kMaxInt8; i++) { 181 for (int i = 0; i <= kMaxInt8; i++) {
187 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 182 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, i + 1);
188 0, i + 1);
189 183
190 Register reg(i); 184 Register reg(i);
191 builder.LoadTrue() 185 builder.LoadTrue()
192 .StoreAccumulatorInRegister(reg) 186 .StoreAccumulatorInRegister(reg)
193 .LoadFalse() 187 .LoadFalse()
194 .LoadAccumulatorWithRegister(reg) 188 .LoadAccumulatorWithRegister(reg)
195 .Return(); 189 .Return();
196 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 190 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
197 191
198 InterpreterTester tester(handles.main_isolate(), bytecode_array); 192 InterpreterTester tester(isolate, bytecode_array);
199 auto callable = tester.GetCallable<>(); 193 auto callable = tester.GetCallable<>();
200 Handle<Object> return_val = callable().ToHandleChecked(); 194 Handle<Object> return_val = callable().ToHandleChecked();
201 CHECK(return_val.is_identical_to(true_value)); 195 CHECK(return_val.is_identical_to(true_value));
202 } 196 }
203 } 197 }
204 198
205 199
206 static const Token::Value kShiftOperators[] = { 200 static const Token::Value kShiftOperators[] = {
207 Token::Value::SHL, Token::Value::SAR, Token::Value::SHR}; 201 Token::Value::SHL, Token::Value::SAR, Token::Value::SHR};
208 202
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 } 254 }
261 255
262 256
263 TEST(InterpreterShiftOpsSmi) { 257 TEST(InterpreterShiftOpsSmi) {
264 int lhs_inputs[] = {0, -17, -182, 1073741823, -1}; 258 int lhs_inputs[] = {0, -17, -182, 1073741823, -1};
265 int rhs_inputs[] = {5, 2, 1, -1, -2, 0, 31, 32, -32, 64, 37}; 259 int rhs_inputs[] = {5, 2, 1, -1, -2, 0, 31, 32, -32, 64, 37};
266 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { 260 for (size_t l = 0; l < arraysize(lhs_inputs); l++) {
267 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { 261 for (size_t r = 0; r < arraysize(rhs_inputs); r++) {
268 for (size_t o = 0; o < arraysize(kShiftOperators); o++) { 262 for (size_t o = 0; o < arraysize(kShiftOperators); o++) {
269 HandleAndZoneScope handles; 263 HandleAndZoneScope handles;
270 i::Isolate* isolate = handles.main_isolate(); 264 Isolate* isolate = handles.main_isolate();
271 i::Factory* factory = isolate->factory(); 265 Factory* factory = isolate->factory();
272 i::Zone zone(isolate->allocator()); 266 Zone zone(isolate->allocator());
273 BytecodeArrayBuilder builder(handles.main_isolate(), 267 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
274 handles.main_zone(), 1, 0, 1);
275 268
276 i::FeedbackVectorSpec feedback_spec(&zone); 269 FeedbackVectorSpec feedback_spec(&zone);
277 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 270 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
278 Handle<i::TypeFeedbackVector> vector = 271 Handle<i::TypeFeedbackVector> vector =
279 i::NewTypeFeedbackVector(isolate, &feedback_spec); 272 NewTypeFeedbackVector(isolate, &feedback_spec);
280 273
281 Register reg(0); 274 Register reg(0);
282 int lhs = lhs_inputs[l]; 275 int lhs = lhs_inputs[l];
283 int rhs = rhs_inputs[r]; 276 int rhs = rhs_inputs[r];
284 builder.LoadLiteral(Smi::FromInt(lhs)) 277 builder.LoadLiteral(Smi::FromInt(lhs))
285 .StoreAccumulatorInRegister(reg) 278 .StoreAccumulatorInRegister(reg)
286 .LoadLiteral(Smi::FromInt(rhs)) 279 .LoadLiteral(Smi::FromInt(rhs))
287 .BinaryOperation(kShiftOperators[o], reg, vector->GetIndex(slot)) 280 .BinaryOperation(kShiftOperators[o], reg, vector->GetIndex(slot))
288 .Return(); 281 .Return();
289 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 282 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
290 283
291 InterpreterTester tester(handles.main_isolate(), bytecode_array); 284 InterpreterTester tester(isolate, bytecode_array);
292 auto callable = tester.GetCallable<>(); 285 auto callable = tester.GetCallable<>();
293 Handle<Object> return_value = callable().ToHandleChecked(); 286 Handle<Object> return_value = callable().ToHandleChecked();
294 Handle<Object> expected_value = 287 Handle<Object> expected_value =
295 factory->NewNumber(BinaryOpC(kShiftOperators[o], lhs, rhs)); 288 factory->NewNumber(BinaryOpC(kShiftOperators[o], lhs, rhs));
296 CHECK(return_value->SameValue(*expected_value)); 289 CHECK(return_value->SameValue(*expected_value));
297 } 290 }
298 } 291 }
299 } 292 }
300 } 293 }
301 294
302 295
303 TEST(InterpreterBinaryOpsSmi) { 296 TEST(InterpreterBinaryOpsSmi) {
304 int lhs_inputs[] = {3266, 1024, 0, -17, -18000}; 297 int lhs_inputs[] = {3266, 1024, 0, -17, -18000};
305 int rhs_inputs[] = {3266, 5, 4, 3, 2, 1, -1, -2}; 298 int rhs_inputs[] = {3266, 5, 4, 3, 2, 1, -1, -2};
306 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { 299 for (size_t l = 0; l < arraysize(lhs_inputs); l++) {
307 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { 300 for (size_t r = 0; r < arraysize(rhs_inputs); r++) {
308 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { 301 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) {
309 HandleAndZoneScope handles; 302 HandleAndZoneScope handles;
310 i::Isolate* isolate = handles.main_isolate(); 303 Isolate* isolate = handles.main_isolate();
311 i::Factory* factory = isolate->factory(); 304 Factory* factory = isolate->factory();
312 i::Zone zone(isolate->allocator()); 305 Zone zone(isolate->allocator());
313 BytecodeArrayBuilder builder(handles.main_isolate(), 306 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
314 handles.main_zone(), 1, 0, 1);
315 307
316 i::FeedbackVectorSpec feedback_spec(&zone); 308 FeedbackVectorSpec feedback_spec(&zone);
317 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 309 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
318 Handle<i::TypeFeedbackVector> vector = 310 Handle<i::TypeFeedbackVector> vector =
319 i::NewTypeFeedbackVector(isolate, &feedback_spec); 311 NewTypeFeedbackVector(isolate, &feedback_spec);
320 312
321 Register reg(0); 313 Register reg(0);
322 int lhs = lhs_inputs[l]; 314 int lhs = lhs_inputs[l];
323 int rhs = rhs_inputs[r]; 315 int rhs = rhs_inputs[r];
324 builder.LoadLiteral(Smi::FromInt(lhs)) 316 builder.LoadLiteral(Smi::FromInt(lhs))
325 .StoreAccumulatorInRegister(reg) 317 .StoreAccumulatorInRegister(reg)
326 .LoadLiteral(Smi::FromInt(rhs)) 318 .LoadLiteral(Smi::FromInt(rhs))
327 .BinaryOperation(kArithmeticOperators[o], reg, 319 .BinaryOperation(kArithmeticOperators[o], reg,
328 vector->GetIndex(slot)) 320 vector->GetIndex(slot))
329 .Return(); 321 .Return();
330 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 322 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
331 323
332 InterpreterTester tester(handles.main_isolate(), bytecode_array); 324 InterpreterTester tester(isolate, bytecode_array);
333 auto callable = tester.GetCallable<>(); 325 auto callable = tester.GetCallable<>();
334 Handle<Object> return_value = callable().ToHandleChecked(); 326 Handle<Object> return_value = callable().ToHandleChecked();
335 Handle<Object> expected_value = 327 Handle<Object> expected_value =
336 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); 328 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs));
337 CHECK(return_value->SameValue(*expected_value)); 329 CHECK(return_value->SameValue(*expected_value));
338 } 330 }
339 } 331 }
340 } 332 }
341 } 333 }
342 334
343 335
344 TEST(InterpreterBinaryOpsHeapNumber) { 336 TEST(InterpreterBinaryOpsHeapNumber) {
345 double lhs_inputs[] = {3266.101, 1024.12, 0.01, -17.99, -18000.833, 9.1e17}; 337 double lhs_inputs[] = {3266.101, 1024.12, 0.01, -17.99, -18000.833, 9.1e17};
346 double rhs_inputs[] = {3266.101, 5.999, 4.778, 3.331, 2.643, 338 double rhs_inputs[] = {3266.101, 5.999, 4.778, 3.331, 2.643,
347 1.1, -1.8, -2.9, 8.3e-27}; 339 1.1, -1.8, -2.9, 8.3e-27};
348 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { 340 for (size_t l = 0; l < arraysize(lhs_inputs); l++) {
349 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { 341 for (size_t r = 0; r < arraysize(rhs_inputs); r++) {
350 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { 342 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) {
351 HandleAndZoneScope handles; 343 HandleAndZoneScope handles;
352 i::Isolate* isolate = handles.main_isolate(); 344 Isolate* isolate = handles.main_isolate();
353 i::Factory* factory = isolate->factory(); 345 Factory* factory = isolate->factory();
354 i::Zone zone(isolate->allocator()); 346 Zone zone(isolate->allocator());
355 BytecodeArrayBuilder builder(handles.main_isolate(), 347 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
356 handles.main_zone(), 1, 0, 1);
357 348
358 i::FeedbackVectorSpec feedback_spec(&zone); 349 FeedbackVectorSpec feedback_spec(&zone);
359 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 350 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
360 Handle<i::TypeFeedbackVector> vector = 351 Handle<i::TypeFeedbackVector> vector =
361 i::NewTypeFeedbackVector(isolate, &feedback_spec); 352 NewTypeFeedbackVector(isolate, &feedback_spec);
362 353
363 Register reg(0); 354 Register reg(0);
364 double lhs = lhs_inputs[l]; 355 double lhs = lhs_inputs[l];
365 double rhs = rhs_inputs[r]; 356 double rhs = rhs_inputs[r];
366 builder.LoadLiteral(factory->NewNumber(lhs)) 357 builder.LoadLiteral(factory->NewNumber(lhs))
367 .StoreAccumulatorInRegister(reg) 358 .StoreAccumulatorInRegister(reg)
368 .LoadLiteral(factory->NewNumber(rhs)) 359 .LoadLiteral(factory->NewNumber(rhs))
369 .BinaryOperation(kArithmeticOperators[o], reg, 360 .BinaryOperation(kArithmeticOperators[o], reg,
370 vector->GetIndex(slot)) 361 vector->GetIndex(slot))
371 .Return(); 362 .Return();
372 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 363 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
373 364
374 InterpreterTester tester(handles.main_isolate(), bytecode_array); 365 InterpreterTester tester(isolate, bytecode_array);
375 auto callable = tester.GetCallable<>(); 366 auto callable = tester.GetCallable<>();
376 Handle<Object> return_value = callable().ToHandleChecked(); 367 Handle<Object> return_value = callable().ToHandleChecked();
377 Handle<Object> expected_value = 368 Handle<Object> expected_value =
378 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); 369 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs));
379 CHECK(return_value->SameValue(*expected_value)); 370 CHECK(return_value->SameValue(*expected_value));
380 } 371 }
381 } 372 }
382 } 373 }
383 } 374 }
384 375
385 376
386 TEST(InterpreterStringAdd) { 377 TEST(InterpreterStringAdd) {
387 HandleAndZoneScope handles; 378 HandleAndZoneScope handles;
388 i::Isolate* isolate = handles.main_isolate(); 379 Isolate* isolate = handles.main_isolate();
389 i::Factory* factory = isolate->factory(); 380 Factory* factory = isolate->factory();
390 i::Zone zone(isolate->allocator()); 381 Zone zone(isolate->allocator());
391 382
392 struct TestCase { 383 struct TestCase {
393 Handle<Object> lhs; 384 Handle<Object> lhs;
394 Handle<Object> rhs; 385 Handle<Object> rhs;
395 Handle<Object> expected_value; 386 Handle<Object> expected_value;
396 } test_cases[] = { 387 } test_cases[] = {
397 {factory->NewStringFromStaticChars("a"), 388 {factory->NewStringFromStaticChars("a"),
398 factory->NewStringFromStaticChars("b"), 389 factory->NewStringFromStaticChars("b"),
399 factory->NewStringFromStaticChars("ab")}, 390 factory->NewStringFromStaticChars("ab")},
400 {factory->NewStringFromStaticChars("aaaaaa"), 391 {factory->NewStringFromStaticChars("aaaaaa"),
(...skipping 10 matching lines...) Expand all
411 factory->NewStringFromStaticChars("a")}, 402 factory->NewStringFromStaticChars("a")},
412 {factory->NewStringFromStaticChars("1.11"), factory->NewHeapNumber(2.5), 403 {factory->NewStringFromStaticChars("1.11"), factory->NewHeapNumber(2.5),
413 factory->NewStringFromStaticChars("1.112.5")}, 404 factory->NewStringFromStaticChars("1.112.5")},
414 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56), 405 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56),
415 factory->NewStringFromStaticChars("-1.112.56")}, 406 factory->NewStringFromStaticChars("-1.112.56")},
416 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5), 407 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5),
417 factory->NewStringFromStaticChars("2.5")}, 408 factory->NewStringFromStaticChars("2.5")},
418 }; 409 };
419 410
420 for (size_t i = 0; i < arraysize(test_cases); i++) { 411 for (size_t i = 0; i < arraysize(test_cases); i++) {
421 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 412 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
422 0, 1); 413 FeedbackVectorSpec feedback_spec(&zone);
423 i::FeedbackVectorSpec feedback_spec(&zone); 414 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
424 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
425 Handle<i::TypeFeedbackVector> vector = 415 Handle<i::TypeFeedbackVector> vector =
426 i::NewTypeFeedbackVector(isolate, &feedback_spec); 416 NewTypeFeedbackVector(isolate, &feedback_spec);
427 417
428 Register reg(0); 418 Register reg(0);
429 builder.LoadLiteral(test_cases[i].lhs) 419 builder.LoadLiteral(test_cases[i].lhs)
430 .StoreAccumulatorInRegister(reg) 420 .StoreAccumulatorInRegister(reg)
431 .LoadLiteral(test_cases[i].rhs) 421 .LoadLiteral(test_cases[i].rhs)
432 .BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot)) 422 .BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot))
433 .Return(); 423 .Return();
434 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 424 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
435 425
436 InterpreterTester tester(handles.main_isolate(), bytecode_array); 426 InterpreterTester tester(isolate, bytecode_array);
437 auto callable = tester.GetCallable<>(); 427 auto callable = tester.GetCallable<>();
438 Handle<Object> return_value = callable().ToHandleChecked(); 428 Handle<Object> return_value = callable().ToHandleChecked();
439 CHECK(return_value->SameValue(*test_cases[i].expected_value)); 429 CHECK(return_value->SameValue(*test_cases[i].expected_value));
440 } 430 }
441 } 431 }
442 432
443 433
444 TEST(InterpreterParameter1) { 434 TEST(InterpreterParameter1) {
445 HandleAndZoneScope handles; 435 HandleAndZoneScope handles;
446 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 436 Isolate* isolate = handles.main_isolate();
447 0, 0); 437 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
448 438
449 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return(); 439 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return();
450 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 440 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
451 441
452 InterpreterTester tester(handles.main_isolate(), bytecode_array); 442 InterpreterTester tester(isolate, bytecode_array);
453 auto callable = tester.GetCallable<Handle<Object>>(); 443 auto callable = tester.GetCallable<Handle<Object>>();
454 444
455 // Check for heap objects. 445 // Check for heap objects.
456 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); 446 Handle<Object> true_value = isolate->factory()->true_value();
457 Handle<Object> return_val = callable(true_value).ToHandleChecked(); 447 Handle<Object> return_val = callable(true_value).ToHandleChecked();
458 CHECK(return_val.is_identical_to(true_value)); 448 CHECK(return_val.is_identical_to(true_value));
459 449
460 // Check for Smis. 450 // Check for Smis.
461 return_val = callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate())) 451 return_val = callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate()))
462 .ToHandleChecked(); 452 .ToHandleChecked();
463 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); 453 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3));
464 } 454 }
465 455
466 456
467 TEST(InterpreterParameter8) { 457 TEST(InterpreterParameter8) {
468 HandleAndZoneScope handles; 458 HandleAndZoneScope handles;
469 i::Isolate* isolate = handles.main_isolate(); 459 Isolate* isolate = handles.main_isolate();
470 i::Zone zone(isolate->allocator()); 460 Zone zone(isolate->allocator());
471 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 8, 461 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 8, 0, 0);
472 0, 0);
473 462
474 i::FeedbackVectorSpec feedback_spec(&zone); 463 FeedbackVectorSpec feedback_spec(&zone);
475 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 464 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
476 i::FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); 465 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot();
477 i::FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); 466 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot();
478 i::FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); 467 FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot();
479 i::FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot(); 468 FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot();
480 i::FeedbackVectorSlot slot5 = feedback_spec.AddGeneralSlot(); 469 FeedbackVectorSlot slot5 = feedback_spec.AddGeneralSlot();
481 i::FeedbackVectorSlot slot6 = feedback_spec.AddGeneralSlot(); 470 FeedbackVectorSlot slot6 = feedback_spec.AddGeneralSlot();
482 471
483 Handle<i::TypeFeedbackVector> vector = 472 Handle<i::TypeFeedbackVector> vector =
484 i::NewTypeFeedbackVector(isolate, &feedback_spec); 473 NewTypeFeedbackVector(isolate, &feedback_spec);
485 474
486 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) 475 builder.LoadAccumulatorWithRegister(builder.Parameter(0))
487 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), 476 .BinaryOperation(Token::Value::ADD, builder.Parameter(1),
488 vector->GetIndex(slot)) 477 vector->GetIndex(slot))
489 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), 478 .BinaryOperation(Token::Value::ADD, builder.Parameter(2),
490 vector->GetIndex(slot1)) 479 vector->GetIndex(slot1))
491 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), 480 .BinaryOperation(Token::Value::ADD, builder.Parameter(3),
492 vector->GetIndex(slot2)) 481 vector->GetIndex(slot2))
493 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), 482 .BinaryOperation(Token::Value::ADD, builder.Parameter(4),
494 vector->GetIndex(slot3)) 483 vector->GetIndex(slot3))
495 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), 484 .BinaryOperation(Token::Value::ADD, builder.Parameter(5),
496 vector->GetIndex(slot4)) 485 vector->GetIndex(slot4))
497 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), 486 .BinaryOperation(Token::Value::ADD, builder.Parameter(6),
498 vector->GetIndex(slot5)) 487 vector->GetIndex(slot5))
499 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), 488 .BinaryOperation(Token::Value::ADD, builder.Parameter(7),
500 vector->GetIndex(slot6)) 489 vector->GetIndex(slot6))
501 .Return(); 490 .Return();
502 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 491 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
503 492
504 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 493 InterpreterTester tester(isolate, bytecode_array, vector);
505 typedef Handle<Object> H; 494 typedef Handle<Object> H;
506 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>(); 495 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>();
507 496
508 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate()); 497 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate());
509 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate()); 498 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate());
510 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate()); 499 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate());
511 Handle<Smi> arg4 = Handle<Smi>(Smi::FromInt(4), handles.main_isolate()); 500 Handle<Smi> arg4 = Handle<Smi>(Smi::FromInt(4), handles.main_isolate());
512 Handle<Smi> arg5 = Handle<Smi>(Smi::FromInt(5), handles.main_isolate()); 501 Handle<Smi> arg5 = Handle<Smi>(Smi::FromInt(5), handles.main_isolate());
513 Handle<Smi> arg6 = Handle<Smi>(Smi::FromInt(6), handles.main_isolate()); 502 Handle<Smi> arg6 = Handle<Smi>(Smi::FromInt(6), handles.main_isolate());
514 Handle<Smi> arg7 = Handle<Smi>(Smi::FromInt(7), handles.main_isolate()); 503 Handle<Smi> arg7 = Handle<Smi>(Smi::FromInt(7), handles.main_isolate());
515 Handle<Smi> arg8 = Handle<Smi>(Smi::FromInt(8), handles.main_isolate()); 504 Handle<Smi> arg8 = Handle<Smi>(Smi::FromInt(8), handles.main_isolate());
516 // Check for Smis. 505 // Check for Smis.
517 Handle<Object> return_val = 506 Handle<Object> return_val =
518 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) 507 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
519 .ToHandleChecked(); 508 .ToHandleChecked();
520 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36)); 509 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36));
521 } 510 }
522 511
523 512
524 TEST(InterpreterParameter1Assign) { 513 TEST(InterpreterParameter1Assign) {
525 HandleAndZoneScope handles; 514 HandleAndZoneScope handles;
526 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 515 Isolate* isolate = handles.main_isolate();
527 0, 0); 516 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
528 517
529 builder.LoadLiteral(Smi::FromInt(5)) 518 builder.LoadLiteral(Smi::FromInt(5))
530 .StoreAccumulatorInRegister(builder.Parameter(0)) 519 .StoreAccumulatorInRegister(builder.Parameter(0))
531 .LoadAccumulatorWithRegister(builder.Parameter(0)) 520 .LoadAccumulatorWithRegister(builder.Parameter(0))
532 .Return(); 521 .Return();
533 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 522 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
534 523
535 InterpreterTester tester(handles.main_isolate(), bytecode_array); 524 InterpreterTester tester(isolate, bytecode_array);
536 auto callable = tester.GetCallable<Handle<Object>>(); 525 auto callable = tester.GetCallable<Handle<Object>>();
537 526
538 Handle<Object> return_val = 527 Handle<Object> return_val =
539 callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate())) 528 callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate()))
540 .ToHandleChecked(); 529 .ToHandleChecked();
541 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); 530 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5));
542 } 531 }
543 532
544 533
545 TEST(InterpreterLoadGlobal) { 534 TEST(InterpreterLoadGlobal) {
546 HandleAndZoneScope handles; 535 HandleAndZoneScope handles;
536 Isolate* isolate = handles.main_isolate();
547 537
548 // Test loading a global. 538 // Test loading a global.
549 std::string source( 539 std::string source(
550 "var global = 321;\n" 540 "var global = 321;\n"
551 "function " + InterpreterTester::function_name() + "() {\n" 541 "function " + InterpreterTester::function_name() + "() {\n"
552 " return global;\n" 542 " return global;\n"
553 "}"); 543 "}");
554 InterpreterTester tester(handles.main_isolate(), source.c_str()); 544 InterpreterTester tester(isolate, source.c_str());
555 auto callable = tester.GetCallable<>(); 545 auto callable = tester.GetCallable<>();
556 546
557 Handle<Object> return_val = callable().ToHandleChecked(); 547 Handle<Object> return_val = callable().ToHandleChecked();
558 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(321)); 548 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(321));
559 } 549 }
560 550
561 551
562 TEST(InterpreterStoreGlobal) { 552 TEST(InterpreterStoreGlobal) {
563 HandleAndZoneScope handles; 553 HandleAndZoneScope handles;
564 i::Isolate* isolate = handles.main_isolate(); 554 Isolate* isolate = handles.main_isolate();
565 i::Factory* factory = isolate->factory(); 555 Factory* factory = isolate->factory();
566 556
567 // Test storing to a global. 557 // Test storing to a global.
568 std::string source( 558 std::string source(
569 "var global = 321;\n" 559 "var global = 321;\n"
570 "function " + InterpreterTester::function_name() + "() {\n" 560 "function " + InterpreterTester::function_name() + "() {\n"
571 " global = 999;\n" 561 " global = 999;\n"
572 "}"); 562 "}");
573 InterpreterTester tester(handles.main_isolate(), source.c_str()); 563 InterpreterTester tester(isolate, source.c_str());
574 auto callable = tester.GetCallable<>(); 564 auto callable = tester.GetCallable<>();
575 565
576 callable().ToHandleChecked(); 566 callable().ToHandleChecked();
577 Handle<i::String> name = factory->InternalizeUtf8String("global"); 567 Handle<i::String> name = factory->InternalizeUtf8String("global");
578 Handle<i::Object> global_obj = 568 Handle<i::Object> global_obj =
579 Object::GetProperty(isolate->global_object(), name).ToHandleChecked(); 569 Object::GetProperty(isolate->global_object(), name).ToHandleChecked();
580 CHECK_EQ(Smi::cast(*global_obj), Smi::FromInt(999)); 570 CHECK_EQ(Smi::cast(*global_obj), Smi::FromInt(999));
581 } 571 }
582 572
583 573
584 TEST(InterpreterCallGlobal) { 574 TEST(InterpreterCallGlobal) {
585 HandleAndZoneScope handles; 575 HandleAndZoneScope handles;
576 Isolate* isolate = handles.main_isolate();
586 577
587 // Test calling a global function. 578 // Test calling a global function.
588 std::string source( 579 std::string source(
589 "function g_add(a, b) { return a + b; }\n" 580 "function g_add(a, b) { return a + b; }\n"
590 "function " + InterpreterTester::function_name() + "() {\n" 581 "function " + InterpreterTester::function_name() + "() {\n"
591 " return g_add(5, 10);\n" 582 " return g_add(5, 10);\n"
592 "}"); 583 "}");
593 InterpreterTester tester(handles.main_isolate(), source.c_str()); 584 InterpreterTester tester(isolate, source.c_str());
594 auto callable = tester.GetCallable<>(); 585 auto callable = tester.GetCallable<>();
595 586
596 Handle<Object> return_val = callable().ToHandleChecked(); 587 Handle<Object> return_val = callable().ToHandleChecked();
597 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); 588 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15));
598 } 589 }
599 590
600 591
601 TEST(InterpreterLoadUnallocated) { 592 TEST(InterpreterLoadUnallocated) {
602 HandleAndZoneScope handles; 593 HandleAndZoneScope handles;
594 Isolate* isolate = handles.main_isolate();
603 595
604 // Test loading an unallocated global. 596 // Test loading an unallocated global.
605 std::string source( 597 std::string source(
606 "unallocated = 123;\n" 598 "unallocated = 123;\n"
607 "function " + InterpreterTester::function_name() + "() {\n" 599 "function " + InterpreterTester::function_name() + "() {\n"
608 " return unallocated;\n" 600 " return unallocated;\n"
609 "}"); 601 "}");
610 InterpreterTester tester(handles.main_isolate(), source.c_str()); 602 InterpreterTester tester(isolate, source.c_str());
611 auto callable = tester.GetCallable<>(); 603 auto callable = tester.GetCallable<>();
612 604
613 Handle<Object> return_val = callable().ToHandleChecked(); 605 Handle<Object> return_val = callable().ToHandleChecked();
614 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); 606 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123));
615 } 607 }
616 608
617 609
618 TEST(InterpreterStoreUnallocated) { 610 TEST(InterpreterStoreUnallocated) {
619 HandleAndZoneScope handles; 611 HandleAndZoneScope handles;
620 i::Isolate* isolate = handles.main_isolate(); 612 Isolate* isolate = handles.main_isolate();
621 i::Factory* factory = isolate->factory(); 613 Factory* factory = isolate->factory();
622 614
623 // Test storing to an unallocated global. 615 // Test storing to an unallocated global.
624 std::string source( 616 std::string source(
625 "unallocated = 321;\n" 617 "unallocated = 321;\n"
626 "function " + InterpreterTester::function_name() + "() {\n" 618 "function " + InterpreterTester::function_name() + "() {\n"
627 " unallocated = 999;\n" 619 " unallocated = 999;\n"
628 "}"); 620 "}");
629 InterpreterTester tester(handles.main_isolate(), source.c_str()); 621 InterpreterTester tester(isolate, source.c_str());
630 auto callable = tester.GetCallable<>(); 622 auto callable = tester.GetCallable<>();
631 623
632 callable().ToHandleChecked(); 624 callable().ToHandleChecked();
633 Handle<i::String> name = factory->InternalizeUtf8String("unallocated"); 625 Handle<i::String> name = factory->InternalizeUtf8String("unallocated");
634 Handle<i::Object> global_obj = 626 Handle<i::Object> global_obj =
635 Object::GetProperty(isolate->global_object(), name).ToHandleChecked(); 627 Object::GetProperty(isolate->global_object(), name).ToHandleChecked();
636 CHECK_EQ(Smi::cast(*global_obj), Smi::FromInt(999)); 628 CHECK_EQ(Smi::cast(*global_obj), Smi::FromInt(999));
637 } 629 }
638 630
639 631
640 TEST(InterpreterLoadNamedProperty) { 632 TEST(InterpreterLoadNamedProperty) {
641 HandleAndZoneScope handles; 633 HandleAndZoneScope handles;
642 i::Isolate* isolate = handles.main_isolate(); 634 Isolate* isolate = handles.main_isolate();
643 i::Factory* factory = isolate->factory(); 635 Factory* factory = isolate->factory();
644 i::Zone zone(isolate->allocator()); 636 Zone zone(isolate->allocator());
645 637
646 i::FeedbackVectorSpec feedback_spec(&zone); 638 FeedbackVectorSpec feedback_spec(&zone);
647 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); 639 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot();
648 640
649 Handle<i::TypeFeedbackVector> vector = 641 Handle<i::TypeFeedbackVector> vector =
650 i::NewTypeFeedbackVector(isolate, &feedback_spec); 642 NewTypeFeedbackVector(isolate, &feedback_spec);
651 643
652 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 644 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
653 name = factory->string_table()->LookupString(isolate, name); 645 name = factory->string_table()->LookupString(isolate, name);
654 646
655 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 647 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
656 0, 0);
657 648
658 builder.LoadNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot)) 649 builder.LoadNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot))
659 .Return(); 650 .Return();
660 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 651 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
661 652
662 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 653 InterpreterTester tester(isolate, bytecode_array, vector);
663 auto callable = tester.GetCallable<Handle<Object>>(); 654 auto callable = tester.GetCallable<Handle<Object>>();
664 655
665 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); 656 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })");
666 // Test IC miss. 657 // Test IC miss.
667 Handle<Object> return_val = callable(object).ToHandleChecked(); 658 Handle<Object> return_val = callable(object).ToHandleChecked();
668 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); 659 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123));
669 660
670 // Test transition to monomorphic IC. 661 // Test transition to monomorphic IC.
671 return_val = callable(object).ToHandleChecked(); 662 return_val = callable(object).ToHandleChecked();
672 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); 663 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123));
(...skipping 13 matching lines...) Expand all
686 callable(object4).ToHandleChecked(); 677 callable(object4).ToHandleChecked();
687 Handle<Object> object5 = 678 Handle<Object> object5 =
688 InterpreterTester::NewObject("({ val : 789, val4 : 123 })"); 679 InterpreterTester::NewObject("({ val : 789, val4 : 123 })");
689 return_val = callable(object5).ToHandleChecked(); 680 return_val = callable(object5).ToHandleChecked();
690 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(789)); 681 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(789));
691 } 682 }
692 683
693 684
694 TEST(InterpreterLoadKeyedProperty) { 685 TEST(InterpreterLoadKeyedProperty) {
695 HandleAndZoneScope handles; 686 HandleAndZoneScope handles;
696 i::Isolate* isolate = handles.main_isolate(); 687 Isolate* isolate = handles.main_isolate();
697 i::Factory* factory = isolate->factory(); 688 Factory* factory = isolate->factory();
698 i::Zone zone(isolate->allocator()); 689 Zone zone(isolate->allocator());
699 690
700 i::FeedbackVectorSpec feedback_spec(&zone); 691 FeedbackVectorSpec feedback_spec(&zone);
701 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot(); 692 FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot();
702 693
703 Handle<i::TypeFeedbackVector> vector = 694 Handle<i::TypeFeedbackVector> vector =
704 i::NewTypeFeedbackVector(isolate, &feedback_spec); 695 NewTypeFeedbackVector(isolate, &feedback_spec);
705 696
706 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); 697 Handle<i::String> key = factory->NewStringFromAsciiChecked("key");
707 key = factory->string_table()->LookupString(isolate, key); 698 key = factory->string_table()->LookupString(isolate, key);
708 699
709 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 700 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
710 0, 1);
711 701
712 builder.LoadLiteral(key) 702 builder.LoadLiteral(key)
713 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot)) 703 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot))
714 .Return(); 704 .Return();
715 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 705 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
716 706
717 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 707 InterpreterTester tester(isolate, bytecode_array, vector);
718 auto callable = tester.GetCallable<Handle<Object>>(); 708 auto callable = tester.GetCallable<Handle<Object>>();
719 709
720 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })"); 710 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })");
721 // Test IC miss. 711 // Test IC miss.
722 Handle<Object> return_val = callable(object).ToHandleChecked(); 712 Handle<Object> return_val = callable(object).ToHandleChecked();
723 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); 713 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123));
724 714
725 // Test transition to monomorphic IC. 715 // Test transition to monomorphic IC.
726 return_val = callable(object).ToHandleChecked(); 716 return_val = callable(object).ToHandleChecked();
727 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); 717 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123));
728 718
729 // Test transition to megamorphic IC. 719 // Test transition to megamorphic IC.
730 Handle<Object> object3 = 720 Handle<Object> object3 =
731 InterpreterTester::NewObject("({ key : 789, val2 : 123 })"); 721 InterpreterTester::NewObject("({ key : 789, val2 : 123 })");
732 return_val = callable(object3).ToHandleChecked(); 722 return_val = callable(object3).ToHandleChecked();
733 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(789)); 723 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(789));
734 } 724 }
735 725
736 726
737 TEST(InterpreterStoreNamedProperty) { 727 TEST(InterpreterStoreNamedProperty) {
738 HandleAndZoneScope handles; 728 HandleAndZoneScope handles;
739 i::Isolate* isolate = handles.main_isolate(); 729 Isolate* isolate = handles.main_isolate();
740 i::Factory* factory = isolate->factory(); 730 Factory* factory = isolate->factory();
741 i::Zone zone(isolate->allocator()); 731 Zone zone(isolate->allocator());
742 732
743 i::FeedbackVectorSpec feedback_spec(&zone); 733 FeedbackVectorSpec feedback_spec(&zone);
744 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); 734 FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot();
745 735
746 Handle<i::TypeFeedbackVector> vector = 736 Handle<i::TypeFeedbackVector> vector =
747 i::NewTypeFeedbackVector(isolate, &feedback_spec); 737 NewTypeFeedbackVector(isolate, &feedback_spec);
748 738
749 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 739 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
750 name = factory->string_table()->LookupString(isolate, name); 740 name = factory->string_table()->LookupString(isolate, name);
751 741
752 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 742 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 0);
753 0, 0);
754 743
755 builder.LoadLiteral(Smi::FromInt(999)) 744 builder.LoadLiteral(Smi::FromInt(999))
756 .StoreNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot), 745 .StoreNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot),
757 i::STRICT) 746 STRICT)
758 .Return(); 747 .Return();
759 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 748 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
760 749
761 InterpreterTester tester(isolate, bytecode_array, vector); 750 InterpreterTester tester(isolate, bytecode_array, vector);
762 auto callable = tester.GetCallable<Handle<Object>>(); 751 auto callable = tester.GetCallable<Handle<Object>>();
763 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); 752 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })");
764 // Test IC miss. 753 // Test IC miss.
765 Handle<Object> result; 754 Handle<Object> result;
766 callable(object).ToHandleChecked(); 755 callable(object).ToHandleChecked();
767 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); 756 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result));
768 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999)); 757 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999));
769 758
(...skipping 19 matching lines...) Expand all
789 Handle<Object> object5 = 778 Handle<Object> object5 =
790 InterpreterTester::NewObject("({ val : 789, val4 : 123 })"); 779 InterpreterTester::NewObject("({ val : 789, val4 : 123 })");
791 callable(object5).ToHandleChecked(); 780 callable(object5).ToHandleChecked();
792 CHECK(Runtime::GetObjectProperty(isolate, object5, name).ToHandle(&result)); 781 CHECK(Runtime::GetObjectProperty(isolate, object5, name).ToHandle(&result));
793 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999)); 782 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999));
794 } 783 }
795 784
796 785
797 TEST(InterpreterStoreKeyedProperty) { 786 TEST(InterpreterStoreKeyedProperty) {
798 HandleAndZoneScope handles; 787 HandleAndZoneScope handles;
799 i::Isolate* isolate = handles.main_isolate(); 788 Isolate* isolate = handles.main_isolate();
800 i::Factory* factory = isolate->factory(); 789 Factory* factory = isolate->factory();
801 i::Zone zone(isolate->allocator()); 790 Zone zone(isolate->allocator());
802 791
803 i::FeedbackVectorSpec feedback_spec(&zone); 792 FeedbackVectorSpec feedback_spec(&zone);
804 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedStoreICSlot(); 793 FeedbackVectorSlot slot = feedback_spec.AddKeyedStoreICSlot();
805 794
806 Handle<i::TypeFeedbackVector> vector = 795 Handle<i::TypeFeedbackVector> vector =
807 i::NewTypeFeedbackVector(isolate, &feedback_spec); 796 NewTypeFeedbackVector(isolate, &feedback_spec);
808 797
809 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 798 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
810 name = factory->string_table()->LookupString(isolate, name); 799 name = factory->string_table()->LookupString(isolate, name);
811 800
812 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 801 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
813 0, 1);
814 802
815 builder.LoadLiteral(name) 803 builder.LoadLiteral(name)
816 .StoreAccumulatorInRegister(Register(0)) 804 .StoreAccumulatorInRegister(Register(0))
817 .LoadLiteral(Smi::FromInt(999)) 805 .LoadLiteral(Smi::FromInt(999))
818 .StoreKeyedProperty(builder.Parameter(0), Register(0), 806 .StoreKeyedProperty(builder.Parameter(0), Register(0),
819 vector->GetIndex(slot), i::SLOPPY) 807 vector->GetIndex(slot), i::SLOPPY)
820 .Return(); 808 .Return();
821 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 809 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
822 810
823 InterpreterTester tester(isolate, bytecode_array, vector); 811 InterpreterTester tester(isolate, bytecode_array, vector);
824 auto callable = tester.GetCallable<Handle<Object>>(); 812 auto callable = tester.GetCallable<Handle<Object>>();
825 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); 813 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })");
826 // Test IC miss. 814 // Test IC miss.
827 Handle<Object> result; 815 Handle<Object> result;
828 callable(object).ToHandleChecked(); 816 callable(object).ToHandleChecked();
829 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); 817 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result));
830 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999)); 818 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999));
831 819
832 // Test transition to monomorphic IC. 820 // Test transition to monomorphic IC.
833 callable(object).ToHandleChecked(); 821 callable(object).ToHandleChecked();
834 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); 822 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result));
835 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999)); 823 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999));
836 824
837 // Test transition to megamorphic IC. 825 // Test transition to megamorphic IC.
838 Handle<Object> object2 = 826 Handle<Object> object2 =
839 InterpreterTester::NewObject("({ val : 456, other : 123 })"); 827 InterpreterTester::NewObject("({ val : 456, other : 123 })");
840 callable(object2).ToHandleChecked(); 828 callable(object2).ToHandleChecked();
841 CHECK(Runtime::GetObjectProperty(isolate, object2, name).ToHandle(&result)); 829 CHECK(Runtime::GetObjectProperty(isolate, object2, name).ToHandle(&result));
842 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999)); 830 CHECK_EQ(Smi::cast(*result), Smi::FromInt(999));
843 } 831 }
844 832
845 static void TestInterpreterCall(TailCallMode tail_call_mode) { 833 static void TestInterpreterCall(TailCallMode tail_call_mode) {
846 HandleAndZoneScope handles; 834 HandleAndZoneScope handles;
847 i::Isolate* isolate = handles.main_isolate(); 835 Isolate* isolate = handles.main_isolate();
848 i::Factory* factory = isolate->factory(); 836 Factory* factory = isolate->factory();
849 i::Zone zone(isolate->allocator()); 837 Zone zone(isolate->allocator());
850 838
851 i::FeedbackVectorSpec feedback_spec(&zone); 839 FeedbackVectorSpec feedback_spec(&zone);
852 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); 840 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot();
853 i::FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot(); 841 FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot();
854 842
855 Handle<i::TypeFeedbackVector> vector = 843 Handle<i::TypeFeedbackVector> vector =
856 i::NewTypeFeedbackVector(isolate, &feedback_spec); 844 NewTypeFeedbackVector(isolate, &feedback_spec);
857 int slot_index = vector->GetIndex(slot); 845 int slot_index = vector->GetIndex(slot);
858 int call_slot_index = -1; 846 int call_slot_index = -1;
859 call_slot_index = vector->GetIndex(call_slot); 847 call_slot_index = vector->GetIndex(call_slot);
860 848
861 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); 849 Handle<i::String> name = factory->NewStringFromAsciiChecked("func");
862 name = factory->string_table()->LookupString(isolate, name); 850 name = factory->string_table()->LookupString(isolate, name);
863 851
864 // Check with no args. 852 // Check with no args.
865 { 853 {
866 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 854 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
867 0, 1);
868 855
869 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) 856 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index)
870 .StoreAccumulatorInRegister(Register(0)); 857 .StoreAccumulatorInRegister(Register(0));
871 858
872 builder.Call(Register(0), builder.Parameter(0), 1, call_slot_index, 859 builder.Call(Register(0), builder.Parameter(0), 1, call_slot_index,
873 tail_call_mode); 860 tail_call_mode);
874 861
875 builder.Return(); 862 builder.Return();
876 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 863 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
877 864
878 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 865 InterpreterTester tester(isolate, bytecode_array, vector);
879 auto callable = tester.GetCallable<Handle<Object>>(); 866 auto callable = tester.GetCallable<Handle<Object>>();
880 867
881 Handle<Object> object = InterpreterTester::NewObject( 868 Handle<Object> object = InterpreterTester::NewObject(
882 "new (function Obj() { this.func = function() { return 0x265; }})()"); 869 "new (function Obj() { this.func = function() { return 0x265; }})()");
883 Handle<Object> return_val = callable(object).ToHandleChecked(); 870 Handle<Object> return_val = callable(object).ToHandleChecked();
884 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); 871 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265));
885 } 872 }
886 873
887 // Check that receiver is passed properly. 874 // Check that receiver is passed properly.
888 { 875 {
889 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 876 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
890 0, 1);
891 877
892 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) 878 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index)
893 .StoreAccumulatorInRegister(Register(0)); 879 .StoreAccumulatorInRegister(Register(0));
894 builder.Call(Register(0), builder.Parameter(0), 1, call_slot_index, 880 builder.Call(Register(0), builder.Parameter(0), 1, call_slot_index,
895 tail_call_mode); 881 tail_call_mode);
896 builder.Return(); 882 builder.Return();
897 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 883 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
898 884
899 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 885 InterpreterTester tester(isolate, bytecode_array, vector);
900 auto callable = tester.GetCallable<Handle<Object>>(); 886 auto callable = tester.GetCallable<Handle<Object>>();
901 887
902 Handle<Object> object = InterpreterTester::NewObject( 888 Handle<Object> object = InterpreterTester::NewObject(
903 "new (function Obj() {" 889 "new (function Obj() {"
904 " this.val = 1234;" 890 " this.val = 1234;"
905 " this.func = function() { return this.val; };" 891 " this.func = function() { return this.val; };"
906 "})()"); 892 "})()");
907 Handle<Object> return_val = callable(object).ToHandleChecked(); 893 Handle<Object> return_val = callable(object).ToHandleChecked();
908 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); 894 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234));
909 } 895 }
910 896
911 // Check with two parameters (+ receiver). 897 // Check with two parameters (+ receiver).
912 { 898 {
913 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 899 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 4);
914 0, 4);
915 900
916 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) 901 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index)
917 .StoreAccumulatorInRegister(Register(0)) 902 .StoreAccumulatorInRegister(Register(0))
918 .LoadAccumulatorWithRegister(builder.Parameter(0)) 903 .LoadAccumulatorWithRegister(builder.Parameter(0))
919 .StoreAccumulatorInRegister(Register(1)) 904 .StoreAccumulatorInRegister(Register(1))
920 .LoadLiteral(Smi::FromInt(51)) 905 .LoadLiteral(Smi::FromInt(51))
921 .StoreAccumulatorInRegister(Register(2)) 906 .StoreAccumulatorInRegister(Register(2))
922 .LoadLiteral(Smi::FromInt(11)) 907 .LoadLiteral(Smi::FromInt(11))
923 .StoreAccumulatorInRegister(Register(3)); 908 .StoreAccumulatorInRegister(Register(3));
924 909
925 builder.Call(Register(0), Register(1), 3, call_slot_index, tail_call_mode); 910 builder.Call(Register(0), Register(1), 3, call_slot_index, tail_call_mode);
926 911
927 builder.Return(); 912 builder.Return();
928 913
929 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 914 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
930 915
931 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 916 InterpreterTester tester(isolate, bytecode_array, vector);
932 auto callable = tester.GetCallable<Handle<Object>>(); 917 auto callable = tester.GetCallable<Handle<Object>>();
933 918
934 Handle<Object> object = InterpreterTester::NewObject( 919 Handle<Object> object = InterpreterTester::NewObject(
935 "new (function Obj() { " 920 "new (function Obj() { "
936 " this.func = function(a, b) { return a - b; }" 921 " this.func = function(a, b) { return a - b; }"
937 "})()"); 922 "})()");
938 Handle<Object> return_val = callable(object).ToHandleChecked(); 923 Handle<Object> return_val = callable(object).ToHandleChecked();
939 CHECK(return_val->SameValue(Smi::FromInt(40))); 924 CHECK(return_val->SameValue(Smi::FromInt(40)));
940 } 925 }
941 926
942 // Check with 10 parameters (+ receiver). 927 // Check with 10 parameters (+ receiver).
943 { 928 {
944 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 929 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 12);
945 0, 12);
946 930
947 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) 931 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index)
948 .StoreAccumulatorInRegister(Register(0)) 932 .StoreAccumulatorInRegister(Register(0))
949 .LoadAccumulatorWithRegister(builder.Parameter(0)) 933 .LoadAccumulatorWithRegister(builder.Parameter(0))
950 .StoreAccumulatorInRegister(Register(1)) 934 .StoreAccumulatorInRegister(Register(1))
951 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) 935 .LoadLiteral(factory->NewStringFromAsciiChecked("a"))
952 .StoreAccumulatorInRegister(Register(2)) 936 .StoreAccumulatorInRegister(Register(2))
953 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) 937 .LoadLiteral(factory->NewStringFromAsciiChecked("b"))
954 .StoreAccumulatorInRegister(Register(3)) 938 .StoreAccumulatorInRegister(Register(3))
955 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) 939 .LoadLiteral(factory->NewStringFromAsciiChecked("c"))
(...skipping 10 matching lines...) Expand all
966 .StoreAccumulatorInRegister(Register(9)) 950 .StoreAccumulatorInRegister(Register(9))
967 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) 951 .LoadLiteral(factory->NewStringFromAsciiChecked("i"))
968 .StoreAccumulatorInRegister(Register(10)) 952 .StoreAccumulatorInRegister(Register(10))
969 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) 953 .LoadLiteral(factory->NewStringFromAsciiChecked("j"))
970 .StoreAccumulatorInRegister(Register(11)); 954 .StoreAccumulatorInRegister(Register(11));
971 955
972 builder.Call(Register(0), Register(1), 11, call_slot_index, tail_call_mode); 956 builder.Call(Register(0), Register(1), 11, call_slot_index, tail_call_mode);
973 957
974 builder.Return(); 958 builder.Return();
975 959
976 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 960 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
977 961
978 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 962 InterpreterTester tester(isolate, bytecode_array, vector);
979 auto callable = tester.GetCallable<Handle<Object>>(); 963 auto callable = tester.GetCallable<Handle<Object>>();
980 964
981 Handle<Object> object = InterpreterTester::NewObject( 965 Handle<Object> object = InterpreterTester::NewObject(
982 "new (function Obj() { " 966 "new (function Obj() { "
983 " this.prefix = \"prefix_\";" 967 " this.prefix = \"prefix_\";"
984 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" 968 " this.func = function(a, b, c, d, e, f, g, h, i, j) {"
985 " return this.prefix + a + b + c + d + e + f + g + h + i + j;" 969 " return this.prefix + a + b + c + d + e + f + g + h + i + j;"
986 " }" 970 " }"
987 "})()"); 971 "})()");
988 Handle<Object> return_val = callable(object).ToHandleChecked(); 972 Handle<Object> return_val = callable(object).ToHandleChecked();
(...skipping 23 matching lines...) Expand all
1012 return builder.StoreAccumulatorInRegister(scratch) 996 return builder.StoreAccumulatorInRegister(scratch)
1013 .LoadLiteral(Smi::FromInt(value)) 997 .LoadLiteral(Smi::FromInt(value))
1014 .BinaryOperation(Token::Value::ADD, reg, slot_index) 998 .BinaryOperation(Token::Value::ADD, reg, slot_index)
1015 .StoreAccumulatorInRegister(reg) 999 .StoreAccumulatorInRegister(reg)
1016 .LoadAccumulatorWithRegister(scratch); 1000 .LoadAccumulatorWithRegister(scratch);
1017 } 1001 }
1018 1002
1019 1003
1020 TEST(InterpreterJumps) { 1004 TEST(InterpreterJumps) {
1021 HandleAndZoneScope handles; 1005 HandleAndZoneScope handles;
1022 i::Isolate* isolate = handles.main_isolate(); 1006 Isolate* isolate = handles.main_isolate();
1023 i::Zone zone(isolate->allocator()); 1007 Zone zone(isolate->allocator());
1024 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1008 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2);
1025 0, 2);
1026 1009
1027 i::FeedbackVectorSpec feedback_spec(&zone); 1010 FeedbackVectorSpec feedback_spec(&zone);
1028 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 1011 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
1029 i::FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); 1012 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot();
1030 i::FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); 1013 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot();
1031 1014
1032 Handle<i::TypeFeedbackVector> vector = 1015 Handle<i::TypeFeedbackVector> vector =
1033 i::NewTypeFeedbackVector(isolate, &feedback_spec); 1016 NewTypeFeedbackVector(isolate, &feedback_spec);
1034 1017
1035 Register reg(0), scratch(1); 1018 Register reg(0), scratch(1);
1036 BytecodeLabel label[3]; 1019 BytecodeLabel label[3];
1037 1020
1038 builder.LoadLiteral(Smi::FromInt(0)) 1021 builder.LoadLiteral(Smi::FromInt(0))
1039 .StoreAccumulatorInRegister(reg) 1022 .StoreAccumulatorInRegister(reg)
1040 .Jump(&label[1]); 1023 .Jump(&label[1]);
1041 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]); 1024 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]);
1042 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot)) 1025 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot))
1043 .Jump(&label[2]); 1026 .Jump(&label[2]);
1044 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); 1027 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]);
1045 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot1)) 1028 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot1))
1046 .Jump(&label[0]); 1029 .Jump(&label[0]);
1047 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); 1030 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]);
1048 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot2)) 1031 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot2))
1049 .LoadAccumulatorWithRegister(reg) 1032 .LoadAccumulatorWithRegister(reg)
1050 .Return(); 1033 .Return();
1051 1034
1052 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1035 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1053 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1036 InterpreterTester tester(isolate, bytecode_array);
1054 auto callable = tester.GetCallable<>(); 1037 auto callable = tester.GetCallable<>();
1055 Handle<Object> return_value = callable().ToHandleChecked(); 1038 Handle<Object> return_value = callable().ToHandleChecked();
1056 CHECK_EQ(Smi::cast(*return_value)->value(), 7); 1039 CHECK_EQ(Smi::cast(*return_value)->value(), 7);
1057 } 1040 }
1058 1041
1059 1042
1060 TEST(InterpreterConditionalJumps) { 1043 TEST(InterpreterConditionalJumps) {
1061 HandleAndZoneScope handles; 1044 HandleAndZoneScope handles;
1062 i::Isolate* isolate = handles.main_isolate(); 1045 Isolate* isolate = handles.main_isolate();
1063 i::Zone zone(isolate->allocator()); 1046 Zone zone(isolate->allocator());
1064 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1047 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2);
1065 0, 2);
1066 1048
1067 i::FeedbackVectorSpec feedback_spec(&zone); 1049 FeedbackVectorSpec feedback_spec(&zone);
1068 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 1050 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
1069 i::FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); 1051 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot();
1070 i::FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); 1052 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot();
1071 i::FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); 1053 FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot();
1072 i::FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot(); 1054 FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot();
1073 1055
1074 Handle<i::TypeFeedbackVector> vector = 1056 Handle<i::TypeFeedbackVector> vector =
1075 i::NewTypeFeedbackVector(isolate, &feedback_spec); 1057 NewTypeFeedbackVector(isolate, &feedback_spec);
1076 1058
1077 Register reg(0), scratch(1); 1059 Register reg(0), scratch(1);
1078 BytecodeLabel label[2]; 1060 BytecodeLabel label[2];
1079 BytecodeLabel done, done1; 1061 BytecodeLabel done, done1;
1080 1062
1081 builder.LoadLiteral(Smi::FromInt(0)) 1063 builder.LoadLiteral(Smi::FromInt(0))
1082 .StoreAccumulatorInRegister(reg) 1064 .StoreAccumulatorInRegister(reg)
1083 .LoadFalse() 1065 .LoadFalse()
1084 .JumpIfFalse(&label[0]); 1066 .JumpIfFalse(&label[0]);
1085 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot)) 1067 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot))
1086 .Bind(&label[0]) 1068 .Bind(&label[0])
1087 .LoadTrue() 1069 .LoadTrue()
1088 .JumpIfFalse(&done); 1070 .JumpIfFalse(&done);
1089 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1)) 1071 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1))
1090 .LoadTrue() 1072 .LoadTrue()
1091 .JumpIfTrue(&label[1]); 1073 .JumpIfTrue(&label[1]);
1092 IncrementRegister(builder, reg, 2048, scratch, vector->GetIndex(slot2)) 1074 IncrementRegister(builder, reg, 2048, scratch, vector->GetIndex(slot2))
1093 .Bind(&label[1]); 1075 .Bind(&label[1]);
1094 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3)) 1076 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3))
1095 .LoadFalse() 1077 .LoadFalse()
1096 .JumpIfTrue(&done1); 1078 .JumpIfTrue(&done1);
1097 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4)) 1079 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4))
1098 .LoadAccumulatorWithRegister(reg) 1080 .LoadAccumulatorWithRegister(reg)
1099 .Bind(&done) 1081 .Bind(&done)
1100 .Bind(&done1) 1082 .Bind(&done1)
1101 .Return(); 1083 .Return();
1102 1084
1103 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1085 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1104 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1086 InterpreterTester tester(isolate, bytecode_array);
1105 auto callable = tester.GetCallable<>(); 1087 auto callable = tester.GetCallable<>();
1106 Handle<Object> return_value = callable().ToHandleChecked(); 1088 Handle<Object> return_value = callable().ToHandleChecked();
1107 CHECK_EQ(Smi::cast(*return_value)->value(), 7); 1089 CHECK_EQ(Smi::cast(*return_value)->value(), 7);
1108 } 1090 }
1109 1091
1110 TEST(InterpreterConditionalJumps2) { 1092 TEST(InterpreterConditionalJumps2) {
1111 // TODO(oth): Add tests for all conditional jumps near and far. 1093 // TODO(oth): Add tests for all conditional jumps near and far.
1112 HandleAndZoneScope handles; 1094 HandleAndZoneScope handles;
1113 i::Isolate* isolate = handles.main_isolate(); 1095 Isolate* isolate = handles.main_isolate();
1114 i::Zone zone(isolate->allocator()); 1096 Zone zone(isolate->allocator());
1115 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1097 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 2);
1116 0, 2);
1117 1098
1118 i::FeedbackVectorSpec feedback_spec(&zone); 1099 FeedbackVectorSpec feedback_spec(&zone);
1119 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 1100 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
1120 i::FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); 1101 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot();
1121 i::FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot(); 1102 FeedbackVectorSlot slot2 = feedback_spec.AddGeneralSlot();
1122 i::FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot(); 1103 FeedbackVectorSlot slot3 = feedback_spec.AddGeneralSlot();
1123 i::FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot(); 1104 FeedbackVectorSlot slot4 = feedback_spec.AddGeneralSlot();
1124 1105
1125 Handle<i::TypeFeedbackVector> vector = 1106 Handle<i::TypeFeedbackVector> vector =
1126 i::NewTypeFeedbackVector(isolate, &feedback_spec); 1107 NewTypeFeedbackVector(isolate, &feedback_spec);
1127 1108
1128 Register reg(0), scratch(1); 1109 Register reg(0), scratch(1);
1129 BytecodeLabel label[2]; 1110 BytecodeLabel label[2];
1130 BytecodeLabel done, done1; 1111 BytecodeLabel done, done1;
1131 1112
1132 builder.LoadLiteral(Smi::FromInt(0)) 1113 builder.LoadLiteral(Smi::FromInt(0))
1133 .StoreAccumulatorInRegister(reg) 1114 .StoreAccumulatorInRegister(reg)
1134 .LoadFalse() 1115 .LoadFalse()
1135 .JumpIfFalse(&label[0]); 1116 .JumpIfFalse(&label[0]);
1136 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot)) 1117 IncrementRegister(builder, reg, 1024, scratch, vector->GetIndex(slot))
1137 .Bind(&label[0]) 1118 .Bind(&label[0])
1138 .LoadTrue() 1119 .LoadTrue()
1139 .JumpIfFalse(&done); 1120 .JumpIfFalse(&done);
1140 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1)) 1121 IncrementRegister(builder, reg, 1, scratch, vector->GetIndex(slot1))
1141 .LoadTrue() 1122 .LoadTrue()
1142 .JumpIfTrue(&label[1]); 1123 .JumpIfTrue(&label[1]);
1143 IncrementRegister(builder, reg, 2048, scratch, vector->GetIndex(slot2)) 1124 IncrementRegister(builder, reg, 2048, scratch, vector->GetIndex(slot2))
1144 .Bind(&label[1]); 1125 .Bind(&label[1]);
1145 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3)) 1126 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3))
1146 .LoadFalse() 1127 .LoadFalse()
1147 .JumpIfTrue(&done1); 1128 .JumpIfTrue(&done1);
1148 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4)) 1129 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4))
1149 .LoadAccumulatorWithRegister(reg) 1130 .LoadAccumulatorWithRegister(reg)
1150 .Bind(&done) 1131 .Bind(&done)
1151 .Bind(&done1) 1132 .Bind(&done1)
1152 .Return(); 1133 .Return();
1153 1134
1154 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1135 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1155 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1136 InterpreterTester tester(isolate, bytecode_array);
1156 auto callable = tester.GetCallable<>(); 1137 auto callable = tester.GetCallable<>();
1157 Handle<Object> return_value = callable().ToHandleChecked(); 1138 Handle<Object> return_value = callable().ToHandleChecked();
1158 CHECK_EQ(Smi::cast(*return_value)->value(), 7); 1139 CHECK_EQ(Smi::cast(*return_value)->value(), 7);
1159 } 1140 }
1160 1141
1161 TEST(InterpreterJumpConstantWith16BitOperand) { 1142 TEST(InterpreterJumpConstantWith16BitOperand) {
1162 HandleAndZoneScope handles; 1143 HandleAndZoneScope handles;
1163 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 1144 Isolate* isolate = handles.main_isolate();
1164 0, 257); 1145 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 257);
1165 1146
1166 i::Isolate* isolate = handles.main_isolate(); 1147 Zone zone(isolate->allocator());
1167 i::Zone zone(isolate->allocator());
1168 1148
1169 i::FeedbackVectorSpec feedback_spec(&zone); 1149 FeedbackVectorSpec feedback_spec(&zone);
1170 i::FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot(); 1150 FeedbackVectorSlot slot = feedback_spec.AddGeneralSlot();
1171 Handle<i::TypeFeedbackVector> vector = 1151 Handle<i::TypeFeedbackVector> vector =
1172 i::NewTypeFeedbackVector(isolate, &feedback_spec); 1152 NewTypeFeedbackVector(isolate, &feedback_spec);
1173 1153
1174 Register reg(0), scratch(256); 1154 Register reg(0), scratch(256);
1175 BytecodeLabel done, fake; 1155 BytecodeLabel done, fake;
1176 1156
1177 builder.LoadLiteral(Smi::FromInt(0)); 1157 builder.LoadLiteral(Smi::FromInt(0));
1178 builder.StoreAccumulatorInRegister(reg); 1158 builder.StoreAccumulatorInRegister(reg);
1179 // Consume all 8-bit operands 1159 // Consume all 8-bit operands
1180 for (int i = 1; i <= 256; i++) { 1160 for (int i = 1; i <= 256; i++) {
1181 builder.LoadLiteral(handles.main_isolate()->factory()->NewNumber(i)); 1161 builder.LoadLiteral(isolate->factory()->NewNumber(i));
1182 builder.BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot)); 1162 builder.BinaryOperation(Token::Value::ADD, reg, vector->GetIndex(slot));
1183 builder.StoreAccumulatorInRegister(reg); 1163 builder.StoreAccumulatorInRegister(reg);
1184 } 1164 }
1185 builder.Jump(&done); 1165 builder.Jump(&done);
1186 1166
1187 // Emit more than 16-bit immediate operands worth of code to jump over. 1167 // Emit more than 16-bit immediate operands worth of code to jump over.
1188 builder.Bind(&fake); 1168 builder.Bind(&fake);
1189 for (int i = 0; i < 6600; i++) { 1169 for (int i = 0; i < 6600; i++) {
1190 builder.LoadLiteral(Smi::FromInt(0)); // 1-byte 1170 builder.LoadLiteral(Smi::FromInt(0)); // 1-byte
1191 builder.BinaryOperation(Token::Value::ADD, scratch, 1171 builder.BinaryOperation(Token::Value::ADD, scratch,
1192 vector->GetIndex(slot)); // 6-bytes 1172 vector->GetIndex(slot)); // 6-bytes
1193 builder.StoreAccumulatorInRegister(scratch); // 4-bytes 1173 builder.StoreAccumulatorInRegister(scratch); // 4-bytes
1194 builder.MoveRegister(scratch, reg); // 6-bytes 1174 builder.MoveRegister(scratch, reg); // 6-bytes
1195 } 1175 }
1196 builder.Bind(&done); 1176 builder.Bind(&done);
1197 builder.LoadAccumulatorWithRegister(reg); 1177 builder.LoadAccumulatorWithRegister(reg);
1198 builder.Return(); 1178 builder.Return();
1199 1179
1200 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1180 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1201 BytecodeArrayIterator iterator(bytecode_array); 1181 BytecodeArrayIterator iterator(bytecode_array);
1202 1182
1203 bool found_16bit_constant_jump = false; 1183 bool found_16bit_constant_jump = false;
1204 while (!iterator.done()) { 1184 while (!iterator.done()) {
1205 if (iterator.current_bytecode() == Bytecode::kJumpConstant && 1185 if (iterator.current_bytecode() == Bytecode::kJumpConstant &&
1206 iterator.current_operand_scale() == OperandScale::kDouble) { 1186 iterator.current_operand_scale() == OperandScale::kDouble) {
1207 found_16bit_constant_jump = true; 1187 found_16bit_constant_jump = true;
1208 break; 1188 break;
1209 } 1189 }
1210 iterator.Advance(); 1190 iterator.Advance();
1211 } 1191 }
1212 CHECK(found_16bit_constant_jump); 1192 CHECK(found_16bit_constant_jump);
1213 1193
1214 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1194 InterpreterTester tester(isolate, bytecode_array);
1215 auto callable = tester.GetCallable<>(); 1195 auto callable = tester.GetCallable<>();
1216 Handle<Object> return_value = callable().ToHandleChecked(); 1196 Handle<Object> return_value = callable().ToHandleChecked();
1217 CHECK_EQ(Smi::cast(*return_value)->value(), 256.0 / 2 * (1 + 256)); 1197 CHECK_EQ(Smi::cast(*return_value)->value(), 256.0 / 2 * (1 + 256));
1218 } 1198 }
1219 1199
1220 TEST(InterpreterJumpWith32BitOperand) { 1200 TEST(InterpreterJumpWith32BitOperand) {
1221 HandleAndZoneScope handles; 1201 HandleAndZoneScope handles;
1222 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 1202 Isolate* isolate = handles.main_isolate();
1223 0, 1); 1203 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1);
1224 Register reg(0); 1204 Register reg(0);
1225 BytecodeLabel done; 1205 BytecodeLabel done;
1226 1206
1227 builder.LoadLiteral(Smi::FromInt(0)); 1207 builder.LoadLiteral(Smi::FromInt(0));
1228 builder.StoreAccumulatorInRegister(reg); 1208 builder.StoreAccumulatorInRegister(reg);
1229 // Consume all 16-bit constant pool entries 1209 // Consume all 16-bit constant pool entries
1230 for (int i = 1; i <= 65536; i++) { 1210 for (int i = 1; i <= 65536; i++) {
1231 builder.LoadLiteral(handles.main_isolate()->factory()->NewNumber(i)); 1211 builder.LoadLiteral(isolate->factory()->NewNumber(i));
1232 } 1212 }
1233 builder.Jump(&done); 1213 builder.Jump(&done);
1234 builder.LoadLiteral(Smi::FromInt(0)); 1214 builder.LoadLiteral(Smi::FromInt(0));
1235 builder.Bind(&done); 1215 builder.Bind(&done);
1236 builder.Return(); 1216 builder.Return();
1237 1217
1238 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1218 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1239 BytecodeArrayIterator iterator(bytecode_array); 1219 BytecodeArrayIterator iterator(bytecode_array);
1240 1220
1241 bool found_32bit_jump = false; 1221 bool found_32bit_jump = false;
1242 while (!iterator.done()) { 1222 while (!iterator.done()) {
1243 if (iterator.current_bytecode() == Bytecode::kJump && 1223 if (iterator.current_bytecode() == Bytecode::kJump &&
1244 iterator.current_operand_scale() == OperandScale::kQuadruple) { 1224 iterator.current_operand_scale() == OperandScale::kQuadruple) {
1245 found_32bit_jump = true; 1225 found_32bit_jump = true;
1246 break; 1226 break;
1247 } 1227 }
1248 iterator.Advance(); 1228 iterator.Advance();
1249 } 1229 }
1250 CHECK(found_32bit_jump); 1230 CHECK(found_32bit_jump);
1251 1231
1252 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1232 InterpreterTester tester(isolate, bytecode_array);
1253 auto callable = tester.GetCallable<>(); 1233 auto callable = tester.GetCallable<>();
1254 Handle<Object> return_value = callable().ToHandleChecked(); 1234 Handle<Object> return_value = callable().ToHandleChecked();
1255 CHECK_EQ(Smi::cast(*return_value)->value(), 65536.0); 1235 CHECK_EQ(Smi::cast(*return_value)->value(), 65536.0);
1256 } 1236 }
1257 1237
1258 static const Token::Value kComparisonTypes[] = { 1238 static const Token::Value kComparisonTypes[] = {
1259 Token::Value::EQ, Token::Value::NE, Token::Value::EQ_STRICT, 1239 Token::Value::EQ, Token::Value::NE, Token::Value::EQ_STRICT,
1260 Token::Value::LT, Token::Value::LTE, Token::Value::GT, 1240 Token::Value::LT, Token::Value::LTE, Token::Value::GT,
1261 Token::Value::GTE}; 1241 Token::Value::GTE};
1262 1242
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 42, 1281 42,
1302 12345678, 1282 12345678,
1303 v8::internal::kMaxInt / 4, 1283 v8::internal::kMaxInt / 4,
1304 v8::internal::kMaxInt / 2}; 1284 v8::internal::kMaxInt / 2};
1305 1285
1306 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { 1286 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) {
1307 Token::Value comparison = kComparisonTypes[c]; 1287 Token::Value comparison = kComparisonTypes[c];
1308 for (size_t i = 0; i < arraysize(inputs); i++) { 1288 for (size_t i = 0; i < arraysize(inputs); i++) {
1309 for (size_t j = 0; j < arraysize(inputs); j++) { 1289 for (size_t j = 0; j < arraysize(inputs); j++) {
1310 HandleAndZoneScope handles; 1290 HandleAndZoneScope handles;
1311 BytecodeArrayBuilder builder(handles.main_isolate(), 1291 Isolate* isolate = handles.main_isolate();
1312 handles.main_zone(), 0, 0, 1); 1292 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1);
1313 1293
1314 Register r0(0); 1294 Register r0(0);
1315 builder.LoadLiteral(Smi::FromInt(inputs[i])) 1295 builder.LoadLiteral(Smi::FromInt(inputs[i]))
1316 .StoreAccumulatorInRegister(r0) 1296 .StoreAccumulatorInRegister(r0)
1317 .LoadLiteral(Smi::FromInt(inputs[j])) 1297 .LoadLiteral(Smi::FromInt(inputs[j]))
1318 .CompareOperation(comparison, r0) 1298 .CompareOperation(comparison, r0)
1319 .Return(); 1299 .Return();
1320 1300
1321 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1301 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1322 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1302 InterpreterTester tester(isolate, bytecode_array);
1323 auto callable = tester.GetCallable<>(); 1303 auto callable = tester.GetCallable<>();
1324 Handle<Object> return_value = callable().ToHandleChecked(); 1304 Handle<Object> return_value = callable().ToHandleChecked();
1325 CHECK(return_value->IsBoolean()); 1305 CHECK(return_value->IsBoolean());
1326 CHECK_EQ(return_value->BooleanValue(), 1306 CHECK_EQ(return_value->BooleanValue(),
1327 CompareC(comparison, inputs[i], inputs[j])); 1307 CompareC(comparison, inputs[i], inputs[j]));
1328 } 1308 }
1329 } 1309 }
1330 } 1310 }
1331 } 1311 }
1332 1312
1333 1313
1334 TEST(InterpreterHeapNumberComparisons) { 1314 TEST(InterpreterHeapNumberComparisons) {
1335 double inputs[] = {std::numeric_limits<double>::min(), 1315 double inputs[] = {std::numeric_limits<double>::min(),
1336 std::numeric_limits<double>::max(), 1316 std::numeric_limits<double>::max(),
1337 -0.001, 1317 -0.001,
1338 0.01, 1318 0.01,
1339 0.1000001, 1319 0.1000001,
1340 1e99, 1320 1e99,
1341 -1e-99}; 1321 -1e-99};
1342 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { 1322 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) {
1343 Token::Value comparison = kComparisonTypes[c]; 1323 Token::Value comparison = kComparisonTypes[c];
1344 for (size_t i = 0; i < arraysize(inputs); i++) { 1324 for (size_t i = 0; i < arraysize(inputs); i++) {
1345 for (size_t j = 0; j < arraysize(inputs); j++) { 1325 for (size_t j = 0; j < arraysize(inputs); j++) {
1346 HandleAndZoneScope handles; 1326 HandleAndZoneScope handles;
1347 i::Factory* factory = handles.main_isolate()->factory(); 1327 Isolate* isolate = handles.main_isolate();
1348 BytecodeArrayBuilder builder(handles.main_isolate(), 1328 Factory* factory = isolate->factory();
1349 handles.main_zone(), 0, 0, 1); 1329 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1);
1350 1330
1351 Register r0(0); 1331 Register r0(0);
1352 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) 1332 builder.LoadLiteral(factory->NewHeapNumber(inputs[i]))
1353 .StoreAccumulatorInRegister(r0) 1333 .StoreAccumulatorInRegister(r0)
1354 .LoadLiteral(factory->NewHeapNumber(inputs[j])) 1334 .LoadLiteral(factory->NewHeapNumber(inputs[j]))
1355 .CompareOperation(comparison, r0) 1335 .CompareOperation(comparison, r0)
1356 .Return(); 1336 .Return();
1357 1337
1358 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1338 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1359 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1339 InterpreterTester tester(isolate, bytecode_array);
1360 auto callable = tester.GetCallable<>(); 1340 auto callable = tester.GetCallable<>();
1361 Handle<Object> return_value = callable().ToHandleChecked(); 1341 Handle<Object> return_value = callable().ToHandleChecked();
1362 CHECK(return_value->IsBoolean()); 1342 CHECK(return_value->IsBoolean());
1363 CHECK_EQ(return_value->BooleanValue(), 1343 CHECK_EQ(return_value->BooleanValue(),
1364 CompareC(comparison, inputs[i], inputs[j])); 1344 CompareC(comparison, inputs[i], inputs[j]));
1365 } 1345 }
1366 } 1346 }
1367 } 1347 }
1368 } 1348 }
1369 1349
1370 1350
1371 TEST(InterpreterStringComparisons) { 1351 TEST(InterpreterStringComparisons) {
1372 HandleAndZoneScope handles; 1352 HandleAndZoneScope handles;
1373 i::Isolate* isolate = handles.main_isolate(); 1353 Isolate* isolate = handles.main_isolate();
1374 i::Factory* factory = isolate->factory(); 1354 Factory* factory = isolate->factory();
1375 1355
1376 std::string inputs[] = {"A", "abc", "z", "", "Foo!", "Foo"}; 1356 std::string inputs[] = {"A", "abc", "z", "", "Foo!", "Foo"};
1377 1357
1378 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { 1358 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) {
1379 Token::Value comparison = kComparisonTypes[c]; 1359 Token::Value comparison = kComparisonTypes[c];
1380 for (size_t i = 0; i < arraysize(inputs); i++) { 1360 for (size_t i = 0; i < arraysize(inputs); i++) {
1381 for (size_t j = 0; j < arraysize(inputs); j++) { 1361 for (size_t j = 0; j < arraysize(inputs); j++) {
1382 CanonicalHandleScope canonical(isolate); 1362 CanonicalHandleScope canonical(isolate);
1383 const char* lhs = inputs[i].c_str(); 1363 const char* lhs = inputs[i].c_str();
1384 const char* rhs = inputs[j].c_str(); 1364 const char* rhs = inputs[j].c_str();
1385 BytecodeArrayBuilder builder(handles.main_isolate(), 1365 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1);
1386 handles.main_zone(), 0, 0, 1);
1387 Register r0(0); 1366 Register r0(0);
1388 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) 1367 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs))
1389 .StoreAccumulatorInRegister(r0) 1368 .StoreAccumulatorInRegister(r0)
1390 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) 1369 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs))
1391 .CompareOperation(comparison, r0) 1370 .CompareOperation(comparison, r0)
1392 .Return(); 1371 .Return();
1393 1372
1394 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1373 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1395 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1374 InterpreterTester tester(isolate, bytecode_array);
1396 auto callable = tester.GetCallable<>(); 1375 auto callable = tester.GetCallable<>();
1397 Handle<Object> return_value = callable().ToHandleChecked(); 1376 Handle<Object> return_value = callable().ToHandleChecked();
1398 CHECK(return_value->IsBoolean()); 1377 CHECK(return_value->IsBoolean());
1399 CHECK_EQ(return_value->BooleanValue(), 1378 CHECK_EQ(return_value->BooleanValue(),
1400 CompareC(comparison, inputs[i], inputs[j])); 1379 CompareC(comparison, inputs[i], inputs[j]));
1401 } 1380 }
1402 } 1381 }
1403 } 1382 }
1404 } 1383 }
1405 1384
1406 1385
1407 TEST(InterpreterMixedComparisons) { 1386 TEST(InterpreterMixedComparisons) {
1408 // This test compares a HeapNumber with a String. The latter is 1387 // This test compares a HeapNumber with a String. The latter is
1409 // convertible to a HeapNumber so comparison will be between numeric 1388 // convertible to a HeapNumber so comparison will be between numeric
1410 // values except for the strict comparisons where no conversion is 1389 // values except for the strict comparisons where no conversion is
1411 // performed. 1390 // performed.
1412 const char* inputs[] = {"-1.77", "-40.333", "0.01", "55.77e5", "2.01"}; 1391 const char* inputs[] = {"-1.77", "-40.333", "0.01", "55.77e5", "2.01"};
1413 1392
1414 i::UnicodeCache unicode_cache; 1393 UnicodeCache unicode_cache;
1415 1394
1416 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { 1395 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) {
1417 Token::Value comparison = kComparisonTypes[c]; 1396 Token::Value comparison = kComparisonTypes[c];
1418 for (size_t i = 0; i < arraysize(inputs); i++) { 1397 for (size_t i = 0; i < arraysize(inputs); i++) {
1419 for (size_t j = 0; j < arraysize(inputs); j++) { 1398 for (size_t j = 0; j < arraysize(inputs); j++) {
1420 for (int pass = 0; pass < 2; pass++) { 1399 for (int pass = 0; pass < 2; pass++) {
1421 const char* lhs_cstr = inputs[i]; 1400 const char* lhs_cstr = inputs[i];
1422 const char* rhs_cstr = inputs[j]; 1401 const char* rhs_cstr = inputs[j];
1423 double lhs = StringToDouble(&unicode_cache, lhs_cstr, 1402 double lhs = StringToDouble(&unicode_cache, lhs_cstr,
1424 i::ConversionFlags::NO_FLAGS); 1403 ConversionFlags::NO_FLAGS);
1425 double rhs = StringToDouble(&unicode_cache, rhs_cstr, 1404 double rhs = StringToDouble(&unicode_cache, rhs_cstr,
1426 i::ConversionFlags::NO_FLAGS); 1405 ConversionFlags::NO_FLAGS);
1427 HandleAndZoneScope handles; 1406 HandleAndZoneScope handles;
1428 i::Factory* factory = handles.main_isolate()->factory(); 1407 Isolate* isolate = handles.main_isolate();
1429 BytecodeArrayBuilder builder(handles.main_isolate(), 1408 Factory* factory = isolate->factory();
1430 handles.main_zone(), 0, 0, 1); 1409 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1);
1431 1410
1432 Register r0(0); 1411 Register r0(0);
1433 if (pass == 0) { 1412 if (pass == 0) {
1434 // Comparison with HeapNumber on the lhs and String on the rhs 1413 // Comparison with HeapNumber on the lhs and String on the rhs
1435 builder.LoadLiteral(factory->NewNumber(lhs)) 1414 builder.LoadLiteral(factory->NewNumber(lhs))
1436 .StoreAccumulatorInRegister(r0) 1415 .StoreAccumulatorInRegister(r0)
1437 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) 1416 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr))
1438 .CompareOperation(comparison, r0) 1417 .CompareOperation(comparison, r0)
1439 .Return(); 1418 .Return();
1440 } else { 1419 } else {
1441 // Comparison with HeapNumber on the rhs and String on the lhs 1420 // Comparison with HeapNumber on the rhs and String on the lhs
1442 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs_cstr)) 1421 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs_cstr))
1443 .StoreAccumulatorInRegister(r0) 1422 .StoreAccumulatorInRegister(r0)
1444 .LoadLiteral(factory->NewNumber(rhs)) 1423 .LoadLiteral(factory->NewNumber(rhs))
1445 .CompareOperation(comparison, r0) 1424 .CompareOperation(comparison, r0)
1446 .Return(); 1425 .Return();
1447 } 1426 }
1448 1427
1449 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1428 Handle<BytecodeArray> bytecode_array =
1450 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1429 builder.ToBytecodeArray(isolate);
1430 InterpreterTester tester(isolate, bytecode_array);
1451 auto callable = tester.GetCallable<>(); 1431 auto callable = tester.GetCallable<>();
1452 Handle<Object> return_value = callable().ToHandleChecked(); 1432 Handle<Object> return_value = callable().ToHandleChecked();
1453 CHECK(return_value->IsBoolean()); 1433 CHECK(return_value->IsBoolean());
1454 CHECK_EQ(return_value->BooleanValue(), 1434 CHECK_EQ(return_value->BooleanValue(),
1455 CompareC(comparison, lhs, rhs, true)); 1435 CompareC(comparison, lhs, rhs, true));
1456 } 1436 }
1457 } 1437 }
1458 } 1438 }
1459 } 1439 }
1460 } 1440 }
1461 1441
1462 TEST(InterpreterStrictNotEqual) { 1442 TEST(InterpreterStrictNotEqual) {
1463 HandleAndZoneScope handles; 1443 HandleAndZoneScope handles;
1464 i::Factory* factory = handles.main_isolate()->factory(); 1444 Isolate* isolate = handles.main_isolate();
1445 Factory* factory = isolate->factory();
1465 const char* code_snippet = 1446 const char* code_snippet =
1466 "function f(lhs, rhs) {\n" 1447 "function f(lhs, rhs) {\n"
1467 " return lhs !== rhs;\n" 1448 " return lhs !== rhs;\n"
1468 "}\n" 1449 "}\n"
1469 "f(0, 0);\n"; 1450 "f(0, 0);\n";
1470 InterpreterTester tester(handles.main_isolate(), code_snippet); 1451 InterpreterTester tester(isolate, code_snippet);
1471 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); 1452 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>();
1472 1453
1473 // Test passing different types. 1454 // Test passing different types.
1474 const char* inputs[] = {"-1.77", "-40.333", "0.01", "55.77e5", "2.01"}; 1455 const char* inputs[] = {"-1.77", "-40.333", "0.01", "55.77e5", "2.01"};
1475 i::UnicodeCache unicode_cache; 1456 UnicodeCache unicode_cache;
1476 for (size_t i = 0; i < arraysize(inputs); i++) { 1457 for (size_t i = 0; i < arraysize(inputs); i++) {
1477 for (size_t j = 0; j < arraysize(inputs); j++) { 1458 for (size_t j = 0; j < arraysize(inputs); j++) {
1478 double lhs = StringToDouble(&unicode_cache, inputs[i], 1459 double lhs =
1479 i::ConversionFlags::NO_FLAGS); 1460 StringToDouble(&unicode_cache, inputs[i], ConversionFlags::NO_FLAGS);
1480 double rhs = StringToDouble(&unicode_cache, inputs[j], 1461 double rhs =
1481 i::ConversionFlags::NO_FLAGS); 1462 StringToDouble(&unicode_cache, inputs[j], ConversionFlags::NO_FLAGS);
1482 Handle<Object> lhs_obj = factory->NewNumber(lhs); 1463 Handle<Object> lhs_obj = factory->NewNumber(lhs);
1483 Handle<Object> rhs_obj = factory->NewStringFromAsciiChecked(inputs[j]); 1464 Handle<Object> rhs_obj = factory->NewStringFromAsciiChecked(inputs[j]);
1484 1465
1485 Handle<Object> return_value = 1466 Handle<Object> return_value =
1486 callable(lhs_obj, rhs_obj).ToHandleChecked(); 1467 callable(lhs_obj, rhs_obj).ToHandleChecked();
1487 CHECK(return_value->IsBoolean()); 1468 CHECK(return_value->IsBoolean());
1488 CHECK_EQ(return_value->BooleanValue(), 1469 CHECK_EQ(return_value->BooleanValue(),
1489 CompareC(Token::Value::NE_STRICT, lhs, rhs, true)); 1470 CompareC(Token::Value::NE_STRICT, lhs, rhs, true));
1490 } 1471 }
1491 } 1472 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 CHECK(return_value->IsBoolean()); 1506 CHECK(return_value->IsBoolean());
1526 CHECK_EQ(return_value->BooleanValue(), 1507 CHECK_EQ(return_value->BooleanValue(),
1527 CompareC(Token::Value::NE_STRICT, inputs_number[i], 1508 CompareC(Token::Value::NE_STRICT, inputs_number[i],
1528 inputs_number[j])); 1509 inputs_number[j]));
1529 } 1510 }
1530 } 1511 }
1531 } 1512 }
1532 1513
1533 TEST(InterpreterInstanceOf) { 1514 TEST(InterpreterInstanceOf) {
1534 HandleAndZoneScope handles; 1515 HandleAndZoneScope handles;
1535 i::Factory* factory = handles.main_isolate()->factory(); 1516 Isolate* isolate = handles.main_isolate();
1517 Factory* factory = isolate->factory();
1536 Handle<i::String> name = factory->NewStringFromAsciiChecked("cons"); 1518 Handle<i::String> name = factory->NewStringFromAsciiChecked("cons");
1537 Handle<i::JSFunction> func = factory->NewFunction(name); 1519 Handle<i::JSFunction> func = factory->NewFunction(name);
1538 Handle<i::JSObject> instance = factory->NewJSObject(func); 1520 Handle<i::JSObject> instance = factory->NewJSObject(func);
1539 Handle<i::Object> other = factory->NewNumber(3.3333); 1521 Handle<i::Object> other = factory->NewNumber(3.3333);
1540 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other}; 1522 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other};
1541 for (size_t i = 0; i < arraysize(cases); i++) { 1523 for (size_t i = 0; i < arraysize(cases); i++) {
1542 bool expected_value = (i == 0); 1524 bool expected_value = (i == 0);
1543 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1525 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1);
1544 0, 1);
1545 1526
1546 Register r0(0); 1527 Register r0(0);
1547 builder.LoadLiteral(cases[i]); 1528 builder.LoadLiteral(cases[i]);
1548 builder.StoreAccumulatorInRegister(r0) 1529 builder.StoreAccumulatorInRegister(r0)
1549 .LoadLiteral(func) 1530 .LoadLiteral(func)
1550 .CompareOperation(Token::Value::INSTANCEOF, r0) 1531 .CompareOperation(Token::Value::INSTANCEOF, r0)
1551 .Return(); 1532 .Return();
1552 1533
1553 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1534 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1554 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1535 InterpreterTester tester(isolate, bytecode_array);
1555 auto callable = tester.GetCallable<>(); 1536 auto callable = tester.GetCallable<>();
1556 Handle<Object> return_value = callable().ToHandleChecked(); 1537 Handle<Object> return_value = callable().ToHandleChecked();
1557 CHECK(return_value->IsBoolean()); 1538 CHECK(return_value->IsBoolean());
1558 CHECK_EQ(return_value->BooleanValue(), expected_value); 1539 CHECK_EQ(return_value->BooleanValue(), expected_value);
1559 } 1540 }
1560 } 1541 }
1561 1542
1562 1543
1563 TEST(InterpreterTestIn) { 1544 TEST(InterpreterTestIn) {
1564 HandleAndZoneScope handles; 1545 HandleAndZoneScope handles;
1565 i::Factory* factory = handles.main_isolate()->factory(); 1546 Isolate* isolate = handles.main_isolate();
1547 Factory* factory = isolate->factory();
1566 // Allocate an array 1548 // Allocate an array
1567 Handle<i::JSArray> array = 1549 Handle<i::JSArray> array =
1568 factory->NewJSArray(0, i::ElementsKind::FAST_SMI_ELEMENTS); 1550 factory->NewJSArray(0, i::ElementsKind::FAST_SMI_ELEMENTS);
1569 // Check for these properties on the array object 1551 // Check for these properties on the array object
1570 const char* properties[] = {"length", "fuzzle", "x", "0"}; 1552 const char* properties[] = {"length", "fuzzle", "x", "0"};
1571 for (size_t i = 0; i < arraysize(properties); i++) { 1553 for (size_t i = 0; i < arraysize(properties); i++) {
1572 bool expected_value = (i == 0); 1554 bool expected_value = (i == 0);
1573 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1555 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 1);
1574 0, 1);
1575 1556
1576 Register r0(0); 1557 Register r0(0);
1577 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i])) 1558 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i]))
1578 .StoreAccumulatorInRegister(r0) 1559 .StoreAccumulatorInRegister(r0)
1579 .LoadLiteral(Handle<Object>::cast(array)) 1560 .LoadLiteral(Handle<Object>::cast(array))
1580 .CompareOperation(Token::Value::IN, r0) 1561 .CompareOperation(Token::Value::IN, r0)
1581 .Return(); 1562 .Return();
1582 1563
1583 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1564 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1584 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1565 InterpreterTester tester(isolate, bytecode_array);
1585 auto callable = tester.GetCallable<>(); 1566 auto callable = tester.GetCallable<>();
1586 Handle<Object> return_value = callable().ToHandleChecked(); 1567 Handle<Object> return_value = callable().ToHandleChecked();
1587 CHECK(return_value->IsBoolean()); 1568 CHECK(return_value->IsBoolean());
1588 CHECK_EQ(return_value->BooleanValue(), expected_value); 1569 CHECK_EQ(return_value->BooleanValue(), expected_value);
1589 } 1570 }
1590 } 1571 }
1591 1572
1592 1573
1593 TEST(InterpreterUnaryNot) { 1574 TEST(InterpreterUnaryNot) {
1594 HandleAndZoneScope handles; 1575 HandleAndZoneScope handles;
1576 Isolate* isolate = handles.main_isolate();
1595 for (size_t i = 1; i < 10; i++) { 1577 for (size_t i = 1; i < 10; i++) {
1596 bool expected_value = ((i & 1) == 1); 1578 bool expected_value = ((i & 1) == 1);
1597 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1579 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 0);
1598 0, 0);
1599 1580
1600 Register r0(0); 1581 Register r0(0);
1601 builder.LoadFalse(); 1582 builder.LoadFalse();
1602 for (size_t j = 0; j < i; j++) { 1583 for (size_t j = 0; j < i; j++) {
1603 builder.LogicalNot(); 1584 builder.LogicalNot();
1604 } 1585 }
1605 builder.Return(); 1586 builder.Return();
1606 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1587 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1607 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1588 InterpreterTester tester(isolate, bytecode_array);
1608 auto callable = tester.GetCallable<>(); 1589 auto callable = tester.GetCallable<>();
1609 Handle<Object> return_value = callable().ToHandleChecked(); 1590 Handle<Object> return_value = callable().ToHandleChecked();
1610 CHECK(return_value->IsBoolean()); 1591 CHECK(return_value->IsBoolean());
1611 CHECK_EQ(return_value->BooleanValue(), expected_value); 1592 CHECK_EQ(return_value->BooleanValue(), expected_value);
1612 } 1593 }
1613 } 1594 }
1614 1595
1615 1596
1616 static void LoadAny(BytecodeArrayBuilder* builder, 1597 static void LoadAny(BytecodeArrayBuilder* builder,
1617 v8::internal::Factory* factory, Handle<Object> obj) { 1598 v8::internal::Factory* factory, Handle<Object> obj) {
(...skipping 14 matching lines...) Expand all
1632 } else if (obj->IsSmi()) { 1613 } else if (obj->IsSmi()) {
1633 builder->LoadLiteral(*Handle<Smi>::cast(obj)); 1614 builder->LoadLiteral(*Handle<Smi>::cast(obj));
1634 } else { 1615 } else {
1635 builder->LoadLiteral(obj); 1616 builder->LoadLiteral(obj);
1636 } 1617 }
1637 } 1618 }
1638 1619
1639 1620
1640 TEST(InterpreterUnaryNotNonBoolean) { 1621 TEST(InterpreterUnaryNotNonBoolean) {
1641 HandleAndZoneScope handles; 1622 HandleAndZoneScope handles;
1642 i::Factory* factory = handles.main_isolate()->factory(); 1623 Isolate* isolate = handles.main_isolate();
1624 Factory* factory = isolate->factory();
1643 1625
1644 std::pair<Handle<Object>, bool> object_type_tuples[] = { 1626 std::pair<Handle<Object>, bool> object_type_tuples[] = {
1645 std::make_pair(factory->undefined_value(), true), 1627 std::make_pair(factory->undefined_value(), true),
1646 std::make_pair(factory->null_value(), true), 1628 std::make_pair(factory->null_value(), true),
1647 std::make_pair(factory->false_value(), true), 1629 std::make_pair(factory->false_value(), true),
1648 std::make_pair(factory->true_value(), false), 1630 std::make_pair(factory->true_value(), false),
1649 std::make_pair(factory->NewNumber(9.1), false), 1631 std::make_pair(factory->NewNumber(9.1), false),
1650 std::make_pair(factory->NewNumberFromInt(0), true), 1632 std::make_pair(factory->NewNumberFromInt(0), true),
1651 std::make_pair( 1633 std::make_pair(
1652 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), 1634 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")),
1653 false), 1635 false),
1654 std::make_pair( 1636 std::make_pair(
1655 Handle<Object>::cast(factory->NewStringFromStaticChars("")), true), 1637 Handle<Object>::cast(factory->NewStringFromStaticChars("")), true),
1656 }; 1638 };
1657 1639
1658 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { 1640 for (size_t i = 0; i < arraysize(object_type_tuples); i++) {
1659 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, 1641 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 0, 0, 0);
1660 0, 0);
1661 1642
1662 Register r0(0); 1643 Register r0(0);
1663 LoadAny(&builder, factory, object_type_tuples[i].first); 1644 LoadAny(&builder, factory, object_type_tuples[i].first);
1664 builder.LogicalNot(); 1645 builder.LogicalNot();
1665 builder.Return(); 1646 builder.Return();
1666 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1647 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1667 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1648 InterpreterTester tester(isolate, bytecode_array);
1668 auto callable = tester.GetCallable<>(); 1649 auto callable = tester.GetCallable<>();
1669 Handle<Object> return_value = callable().ToHandleChecked(); 1650 Handle<Object> return_value = callable().ToHandleChecked();
1670 CHECK(return_value->IsBoolean()); 1651 CHECK(return_value->IsBoolean());
1671 CHECK_EQ(return_value->BooleanValue(), object_type_tuples[i].second); 1652 CHECK_EQ(return_value->BooleanValue(), object_type_tuples[i].second);
1672 } 1653 }
1673 } 1654 }
1674 1655
1675 1656
1676 TEST(InterpreterTypeof) { 1657 TEST(InterpreterTypeof) {
1677 HandleAndZoneScope handles; 1658 HandleAndZoneScope handles;
1659 Isolate* isolate = handles.main_isolate();
1678 1660
1679 std::pair<const char*, const char*> typeof_vals[] = { 1661 std::pair<const char*, const char*> typeof_vals[] = {
1680 std::make_pair("return typeof undefined;", "undefined"), 1662 std::make_pair("return typeof undefined;", "undefined"),
1681 std::make_pair("return typeof null;", "object"), 1663 std::make_pair("return typeof null;", "object"),
1682 std::make_pair("return typeof true;", "boolean"), 1664 std::make_pair("return typeof true;", "boolean"),
1683 std::make_pair("return typeof false;", "boolean"), 1665 std::make_pair("return typeof false;", "boolean"),
1684 std::make_pair("return typeof 9.1;", "number"), 1666 std::make_pair("return typeof 9.1;", "number"),
1685 std::make_pair("return typeof 7771;", "number"), 1667 std::make_pair("return typeof 7771;", "number"),
1686 std::make_pair("return typeof 'hello';", "string"), 1668 std::make_pair("return typeof 'hello';", "string"),
1687 std::make_pair("return typeof global_unallocated;", "undefined"), 1669 std::make_pair("return typeof global_unallocated;", "undefined"),
1688 }; 1670 };
1689 1671
1690 for (size_t i = 0; i < arraysize(typeof_vals); i++) { 1672 for (size_t i = 0; i < arraysize(typeof_vals); i++) {
1691 std::string source(InterpreterTester::SourceForBody(typeof_vals[i].first)); 1673 std::string source(InterpreterTester::SourceForBody(typeof_vals[i].first));
1692 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1674 InterpreterTester tester(isolate, source.c_str());
1693 1675
1694 auto callable = tester.GetCallable<>(); 1676 auto callable = tester.GetCallable<>();
1695 Handle<v8::internal::String> return_value = 1677 Handle<v8::internal::String> return_value =
1696 Handle<v8::internal::String>::cast(callable().ToHandleChecked()); 1678 Handle<v8::internal::String>::cast(callable().ToHandleChecked());
1697 auto actual = return_value->ToCString(); 1679 auto actual = return_value->ToCString();
1698 CHECK_EQ(strcmp(&actual[0], typeof_vals[i].second), 0); 1680 CHECK_EQ(strcmp(&actual[0], typeof_vals[i].second), 0);
1699 } 1681 }
1700 } 1682 }
1701 1683
1702 1684
1703 TEST(InterpreterCallRuntime) { 1685 TEST(InterpreterCallRuntime) {
1704 HandleAndZoneScope handles; 1686 HandleAndZoneScope handles;
1687 Isolate* isolate = handles.main_isolate();
1705 1688
1706 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 1689 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 2);
1707 0, 2);
1708 1690
1709 builder.LoadLiteral(Smi::FromInt(15)) 1691 builder.LoadLiteral(Smi::FromInt(15))
1710 .StoreAccumulatorInRegister(Register(0)) 1692 .StoreAccumulatorInRegister(Register(0))
1711 .LoadLiteral(Smi::FromInt(40)) 1693 .LoadLiteral(Smi::FromInt(40))
1712 .StoreAccumulatorInRegister(Register(1)) 1694 .StoreAccumulatorInRegister(Register(1))
1713 .CallRuntime(Runtime::kAdd, Register(0), 2) 1695 .CallRuntime(Runtime::kAdd, Register(0), 2)
1714 .Return(); 1696 .Return();
1715 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1697 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1716 1698
1717 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1699 InterpreterTester tester(isolate, bytecode_array);
1718 auto callable = tester.GetCallable<>(); 1700 auto callable = tester.GetCallable<>();
1719 1701
1720 Handle<Object> return_val = callable().ToHandleChecked(); 1702 Handle<Object> return_val = callable().ToHandleChecked();
1721 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(55)); 1703 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(55));
1722 } 1704 }
1723 1705
1724 TEST(InterpreterInvokeIntrinsic) { 1706 TEST(InterpreterInvokeIntrinsic) {
1725 HandleAndZoneScope handles; 1707 HandleAndZoneScope handles;
1708 Isolate* isolate = handles.main_isolate();
1726 1709
1727 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 1710 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 2);
1728 0, 2);
1729 1711
1730 builder.LoadLiteral(Smi::FromInt(15)) 1712 builder.LoadLiteral(Smi::FromInt(15))
1731 .StoreAccumulatorInRegister(Register(0)) 1713 .StoreAccumulatorInRegister(Register(0))
1732 .CallRuntime(Runtime::kInlineIsArray, Register(0), 1) 1714 .CallRuntime(Runtime::kInlineIsArray, Register(0), 1)
1733 .Return(); 1715 .Return();
1734 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1716 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate);
1735 1717
1736 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1718 InterpreterTester tester(isolate, bytecode_array);
1737 auto callable = tester.GetCallable<>(); 1719 auto callable = tester.GetCallable<>();
1738 1720
1739 Handle<Object> return_val = callable().ToHandleChecked(); 1721 Handle<Object> return_val = callable().ToHandleChecked();
1740 CHECK(return_val->IsBoolean()); 1722 CHECK(return_val->IsBoolean());
1741 CHECK_EQ(return_val->BooleanValue(), false); 1723 CHECK_EQ(return_val->BooleanValue(), false);
1742 } 1724 }
1743 1725
1744 TEST(InterpreterFunctionLiteral) { 1726 TEST(InterpreterFunctionLiteral) {
1745 HandleAndZoneScope handles; 1727 HandleAndZoneScope handles;
1728 Isolate* isolate = handles.main_isolate();
1746 1729
1747 // Test calling a function literal. 1730 // Test calling a function literal.
1748 std::string source( 1731 std::string source(
1749 "function " + InterpreterTester::function_name() + "(a) {\n" 1732 "function " + InterpreterTester::function_name() + "(a) {\n"
1750 " return (function(x){ return x + 2; })(a);\n" 1733 " return (function(x){ return x + 2; })(a);\n"
1751 "}"); 1734 "}");
1752 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1735 InterpreterTester tester(isolate, source.c_str());
1753 auto callable = tester.GetCallable<Handle<Object>>(); 1736 auto callable = tester.GetCallable<Handle<Object>>();
1754 1737
1755 Handle<i::Object> return_val = callable( 1738 Handle<i::Object> return_val = callable(
1756 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); 1739 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked();
1757 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); 1740 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5));
1758 } 1741 }
1759 1742
1760 1743
1761 TEST(InterpreterRegExpLiterals) { 1744 TEST(InterpreterRegExpLiterals) {
1762 HandleAndZoneScope handles; 1745 HandleAndZoneScope handles;
1763 i::Isolate* isolate = handles.main_isolate(); 1746 Isolate* isolate = handles.main_isolate();
1764 i::Factory* factory = isolate->factory(); 1747 Factory* factory = isolate->factory();
1765 1748
1766 std::pair<const char*, Handle<Object>> literals[] = { 1749 std::pair<const char*, Handle<Object>> literals[] = {
1767 std::make_pair("return /abd/.exec('cccabbdd');\n", 1750 std::make_pair("return /abd/.exec('cccabbdd');\n",
1768 factory->null_value()), 1751 factory->null_value()),
1769 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", 1752 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n",
1770 factory->NewStringFromStaticChars("abbd")), 1753 factory->NewStringFromStaticChars("abbd")),
1771 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", 1754 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n",
1772 factory->NewStringFromStaticChars("aBC")), 1755 factory->NewStringFromStaticChars("aBC")),
1773 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", 1756 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n",
1774 factory->NewStringFromStaticChars("aBC")), 1757 factory->NewStringFromStaticChars("aBC")),
1775 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", 1758 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n",
1776 factory->NewStringFromStaticChars("AbC")), 1759 factory->NewStringFromStaticChars("AbC")),
1777 }; 1760 };
1778 1761
1779 for (size_t i = 0; i < arraysize(literals); i++) { 1762 for (size_t i = 0; i < arraysize(literals); i++) {
1780 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 1763 std::string source(InterpreterTester::SourceForBody(literals[i].first));
1781 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1764 InterpreterTester tester(isolate, source.c_str());
1782 auto callable = tester.GetCallable<>(); 1765 auto callable = tester.GetCallable<>();
1783 1766
1784 Handle<i::Object> return_value = callable().ToHandleChecked(); 1767 Handle<i::Object> return_value = callable().ToHandleChecked();
1785 CHECK(return_value->SameValue(*literals[i].second)); 1768 CHECK(return_value->SameValue(*literals[i].second));
1786 } 1769 }
1787 } 1770 }
1788 1771
1789 1772
1790 TEST(InterpreterArrayLiterals) { 1773 TEST(InterpreterArrayLiterals) {
1791 HandleAndZoneScope handles; 1774 HandleAndZoneScope handles;
1792 i::Isolate* isolate = handles.main_isolate(); 1775 Isolate* isolate = handles.main_isolate();
1793 i::Factory* factory = isolate->factory(); 1776 Factory* factory = isolate->factory();
1794 1777
1795 std::pair<const char*, Handle<Object>> literals[] = { 1778 std::pair<const char*, Handle<Object>> literals[] = {
1796 std::make_pair("return [][0];\n", 1779 std::make_pair("return [][0];\n",
1797 factory->undefined_value()), 1780 factory->undefined_value()),
1798 std::make_pair("return [1, 3, 2][1];\n", 1781 std::make_pair("return [1, 3, 2][1];\n",
1799 handle(Smi::FromInt(3), isolate)), 1782 handle(Smi::FromInt(3), isolate)),
1800 std::make_pair("return ['a', 'b', 'c'][2];\n", 1783 std::make_pair("return ['a', 'b', 'c'][2];\n",
1801 factory->NewStringFromStaticChars("c")), 1784 factory->NewStringFromStaticChars("c")),
1802 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", 1785 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n",
1803 handle(Smi::FromInt(102), isolate)), 1786 handle(Smi::FromInt(102), isolate)),
1804 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", 1787 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n",
1805 factory->NewStringFromStaticChars("a")), 1788 factory->NewStringFromStaticChars("a")),
1806 std::make_pair("var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];\n", 1789 std::make_pair("var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];\n",
1807 factory->NewStringFromStaticChars("test")) 1790 factory->NewStringFromStaticChars("test"))
1808 }; 1791 };
1809 1792
1810 for (size_t i = 0; i < arraysize(literals); i++) { 1793 for (size_t i = 0; i < arraysize(literals); i++) {
1811 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 1794 std::string source(InterpreterTester::SourceForBody(literals[i].first));
1812 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1795 InterpreterTester tester(isolate, source.c_str());
1813 auto callable = tester.GetCallable<>(); 1796 auto callable = tester.GetCallable<>();
1814 1797
1815 Handle<i::Object> return_value = callable().ToHandleChecked(); 1798 Handle<i::Object> return_value = callable().ToHandleChecked();
1816 CHECK(return_value->SameValue(*literals[i].second)); 1799 CHECK(return_value->SameValue(*literals[i].second));
1817 } 1800 }
1818 } 1801 }
1819 1802
1820 1803
1821 TEST(InterpreterObjectLiterals) { 1804 TEST(InterpreterObjectLiterals) {
1822 HandleAndZoneScope handles; 1805 HandleAndZoneScope handles;
1823 i::Isolate* isolate = handles.main_isolate(); 1806 Isolate* isolate = handles.main_isolate();
1824 i::Factory* factory = isolate->factory(); 1807 Factory* factory = isolate->factory();
1825 1808
1826 std::pair<const char*, Handle<Object>> literals[] = { 1809 std::pair<const char*, Handle<Object>> literals[] = {
1827 std::make_pair("return { }.name;", 1810 std::make_pair("return { }.name;",
1828 factory->undefined_value()), 1811 factory->undefined_value()),
1829 std::make_pair("return { name: 'string', val: 9.2 }.name;", 1812 std::make_pair("return { name: 'string', val: 9.2 }.name;",
1830 factory->NewStringFromStaticChars("string")), 1813 factory->NewStringFromStaticChars("string")),
1831 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", 1814 std::make_pair("var a = 15; return { name: 'string', val: a }.val;",
1832 handle(Smi::FromInt(15), isolate)), 1815 handle(Smi::FromInt(15), isolate)),
1833 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", 1816 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;",
1834 handle(Smi::FromInt(6), isolate)), 1817 handle(Smi::FromInt(6), isolate)),
(...skipping 20 matching lines...) Expand all
1855 "var b = { [a]: 1, __proto__: { var : a } };\n" 1838 "var b = { [a]: 1, __proto__: { var : a } };\n"
1856 "return Object.getPrototypeOf(b).var", 1839 "return Object.getPrototypeOf(b).var",
1857 factory->NewStringFromStaticChars("proto_str")), 1840 factory->NewStringFromStaticChars("proto_str")),
1858 std::make_pair("var n = 'name';\n" 1841 std::make_pair("var n = 'name';\n"
1859 "return { [n]: 'val', get a() { return 987 } }['a'];", 1842 "return { [n]: 'val', get a() { return 987 } }['a'];",
1860 handle(Smi::FromInt(987), isolate)), 1843 handle(Smi::FromInt(987), isolate)),
1861 }; 1844 };
1862 1845
1863 for (size_t i = 0; i < arraysize(literals); i++) { 1846 for (size_t i = 0; i < arraysize(literals); i++) {
1864 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 1847 std::string source(InterpreterTester::SourceForBody(literals[i].first));
1865 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1848 InterpreterTester tester(isolate, source.c_str());
1866 auto callable = tester.GetCallable<>(); 1849 auto callable = tester.GetCallable<>();
1867 1850
1868 Handle<i::Object> return_value = callable().ToHandleChecked(); 1851 Handle<i::Object> return_value = callable().ToHandleChecked();
1869 CHECK(return_value->SameValue(*literals[i].second)); 1852 CHECK(return_value->SameValue(*literals[i].second));
1870 } 1853 }
1871 } 1854 }
1872 1855
1873 1856
1874 TEST(InterpreterConstruct) { 1857 TEST(InterpreterConstruct) {
1875 HandleAndZoneScope handles; 1858 HandleAndZoneScope handles;
1859 Isolate* isolate = handles.main_isolate();
1876 1860
1877 std::string source( 1861 std::string source(
1878 "function counter() { this.count = 0; }\n" 1862 "function counter() { this.count = 0; }\n"
1879 "function " + 1863 "function " +
1880 InterpreterTester::function_name() + 1864 InterpreterTester::function_name() +
1881 "() {\n" 1865 "() {\n"
1882 " var c = new counter();\n" 1866 " var c = new counter();\n"
1883 " return c.count;\n" 1867 " return c.count;\n"
1884 "}"); 1868 "}");
1885 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1869 InterpreterTester tester(isolate, source.c_str());
1886 auto callable = tester.GetCallable<>(); 1870 auto callable = tester.GetCallable<>();
1887 1871
1888 Handle<Object> return_val = callable().ToHandleChecked(); 1872 Handle<Object> return_val = callable().ToHandleChecked();
1889 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0)); 1873 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0));
1890 } 1874 }
1891 1875
1892 1876
1893 TEST(InterpreterConstructWithArgument) { 1877 TEST(InterpreterConstructWithArgument) {
1894 HandleAndZoneScope handles; 1878 HandleAndZoneScope handles;
1879 Isolate* isolate = handles.main_isolate();
1895 1880
1896 std::string source( 1881 std::string source(
1897 "function counter(arg0) { this.count = 17; this.x = arg0; }\n" 1882 "function counter(arg0) { this.count = 17; this.x = arg0; }\n"
1898 "function " + 1883 "function " +
1899 InterpreterTester::function_name() + 1884 InterpreterTester::function_name() +
1900 "() {\n" 1885 "() {\n"
1901 " var c = new counter(3);\n" 1886 " var c = new counter(3);\n"
1902 " return c.x;\n" 1887 " return c.x;\n"
1903 "}"); 1888 "}");
1904 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1889 InterpreterTester tester(isolate, source.c_str());
1905 auto callable = tester.GetCallable<>(); 1890 auto callable = tester.GetCallable<>();
1906 1891
1907 Handle<Object> return_val = callable().ToHandleChecked(); 1892 Handle<Object> return_val = callable().ToHandleChecked();
1908 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); 1893 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3));
1909 } 1894 }
1910 1895
1911 1896
1912 TEST(InterpreterConstructWithArguments) { 1897 TEST(InterpreterConstructWithArguments) {
1913 HandleAndZoneScope handles; 1898 HandleAndZoneScope handles;
1899 Isolate* isolate = handles.main_isolate();
1914 1900
1915 std::string source( 1901 std::string source(
1916 "function counter(arg0, arg1) {\n" 1902 "function counter(arg0, arg1) {\n"
1917 " this.count = 7; this.x = arg0; this.y = arg1;\n" 1903 " this.count = 7; this.x = arg0; this.y = arg1;\n"
1918 "}\n" 1904 "}\n"
1919 "function " + 1905 "function " +
1920 InterpreterTester::function_name() + 1906 InterpreterTester::function_name() +
1921 "() {\n" 1907 "() {\n"
1922 " var c = new counter(3, 5);\n" 1908 " var c = new counter(3, 5);\n"
1923 " return c.count + c.x + c.y;\n" 1909 " return c.count + c.x + c.y;\n"
1924 "}"); 1910 "}");
1925 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1911 InterpreterTester tester(isolate, source.c_str());
1926 auto callable = tester.GetCallable<>(); 1912 auto callable = tester.GetCallable<>();
1927 1913
1928 Handle<Object> return_val = callable().ToHandleChecked(); 1914 Handle<Object> return_val = callable().ToHandleChecked();
1929 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); 1915 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15));
1930 } 1916 }
1931 1917
1932 1918
1933 TEST(InterpreterContextVariables) { 1919 TEST(InterpreterContextVariables) {
1934 HandleAndZoneScope handles; 1920 HandleAndZoneScope handles;
1935 i::Isolate* isolate = handles.main_isolate(); 1921 Isolate* isolate = handles.main_isolate();
1936 1922
1937 std::ostringstream unique_vars; 1923 std::ostringstream unique_vars;
1938 for (int i = 0; i < 250; i++) { 1924 for (int i = 0; i < 250; i++) {
1939 unique_vars << "var a" << i << " = 0;"; 1925 unique_vars << "var a" << i << " = 0;";
1940 } 1926 }
1941 std::pair<std::string, Handle<Object>> context_vars[] = { 1927 std::pair<std::string, Handle<Object>> context_vars[] = {
1942 std::make_pair("var a; (function() { a = 1; })(); return a;", 1928 std::make_pair("var a; (function() { a = 1; })(); return a;",
1943 handle(Smi::FromInt(1), isolate)), 1929 handle(Smi::FromInt(1), isolate)),
1944 std::make_pair("var a = 10; (function() { a; })(); return a;", 1930 std::make_pair("var a = 10; (function() { a; })(); return a;",
1945 handle(Smi::FromInt(10), isolate)), 1931 handle(Smi::FromInt(10), isolate)),
1946 std::make_pair("var a = 20; var b = 30;\n" 1932 std::make_pair("var a = 20; var b = 30;\n"
1947 "return (function() { return a + b; })();", 1933 "return (function() { return a + b; })();",
1948 handle(Smi::FromInt(50), isolate)), 1934 handle(Smi::FromInt(50), isolate)),
1949 std::make_pair("'use strict'; let a = 1;\n" 1935 std::make_pair("'use strict'; let a = 1;\n"
1950 "{ let b = 2; return (function() { return a + b; })(); }", 1936 "{ let b = 2; return (function() { return a + b; })(); }",
1951 handle(Smi::FromInt(3), isolate)), 1937 handle(Smi::FromInt(3), isolate)),
1952 std::make_pair("'use strict'; let a = 10;\n" 1938 std::make_pair("'use strict'; let a = 10;\n"
1953 "{ let b = 20; var c = function() { [a, b] };\n" 1939 "{ let b = 20; var c = function() { [a, b] };\n"
1954 " return a + b; }", 1940 " return a + b; }",
1955 handle(Smi::FromInt(30), isolate)), 1941 handle(Smi::FromInt(30), isolate)),
1956 std::make_pair("'use strict';" + unique_vars.str() + 1942 std::make_pair("'use strict';" + unique_vars.str() +
1957 "eval(); var b = 100; return b;", 1943 "eval(); var b = 100; return b;",
1958 handle(Smi::FromInt(100), isolate)), 1944 handle(Smi::FromInt(100), isolate)),
1959 }; 1945 };
1960 1946
1961 for (size_t i = 0; i < arraysize(context_vars); i++) { 1947 for (size_t i = 0; i < arraysize(context_vars); i++) {
1962 std::string source( 1948 std::string source(
1963 InterpreterTester::SourceForBody(context_vars[i].first.c_str())); 1949 InterpreterTester::SourceForBody(context_vars[i].first.c_str()));
1964 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1950 InterpreterTester tester(isolate, source.c_str());
1965 auto callable = tester.GetCallable<>(); 1951 auto callable = tester.GetCallable<>();
1966 1952
1967 Handle<i::Object> return_value = callable().ToHandleChecked(); 1953 Handle<i::Object> return_value = callable().ToHandleChecked();
1968 CHECK(return_value->SameValue(*context_vars[i].second)); 1954 CHECK(return_value->SameValue(*context_vars[i].second));
1969 } 1955 }
1970 } 1956 }
1971 1957
1972 1958
1973 TEST(InterpreterContextParameters) { 1959 TEST(InterpreterContextParameters) {
1974 HandleAndZoneScope handles; 1960 HandleAndZoneScope handles;
1975 i::Isolate* isolate = handles.main_isolate(); 1961 Isolate* isolate = handles.main_isolate();
1976 1962
1977 std::pair<const char*, Handle<Object>> context_params[] = { 1963 std::pair<const char*, Handle<Object>> context_params[] = {
1978 std::make_pair("return (function() { return arg1; })();", 1964 std::make_pair("return (function() { return arg1; })();",
1979 handle(Smi::FromInt(1), isolate)), 1965 handle(Smi::FromInt(1), isolate)),
1980 std::make_pair("(function() { arg1 = 4; })(); return arg1;", 1966 std::make_pair("(function() { arg1 = 4; })(); return arg1;",
1981 handle(Smi::FromInt(4), isolate)), 1967 handle(Smi::FromInt(4), isolate)),
1982 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", 1968 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;",
1983 handle(Smi::FromInt(1), isolate)), 1969 handle(Smi::FromInt(1), isolate)),
1984 }; 1970 };
1985 1971
1986 for (size_t i = 0; i < arraysize(context_params); i++) { 1972 for (size_t i = 0; i < arraysize(context_params); i++) {
1987 std::string source = "function " + InterpreterTester::function_name() + 1973 std::string source = "function " + InterpreterTester::function_name() +
1988 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; 1974 "(arg1, arg2, arg3) {" + context_params[i].first + "}";
1989 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1975 InterpreterTester tester(isolate, source.c_str());
1990 auto callable = 1976 auto callable =
1991 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); 1977 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>();
1992 1978
1993 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); 1979 Handle<Object> a1 = handle(Smi::FromInt(1), isolate);
1994 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); 1980 Handle<Object> a2 = handle(Smi::FromInt(2), isolate);
1995 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); 1981 Handle<Object> a3 = handle(Smi::FromInt(3), isolate);
1996 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); 1982 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked();
1997 CHECK(return_value->SameValue(*context_params[i].second)); 1983 CHECK(return_value->SameValue(*context_params[i].second));
1998 } 1984 }
1999 } 1985 }
2000 1986
2001 1987
2002 TEST(InterpreterOuterContextVariables) { 1988 TEST(InterpreterOuterContextVariables) {
2003 HandleAndZoneScope handles; 1989 HandleAndZoneScope handles;
2004 i::Isolate* isolate = handles.main_isolate(); 1990 Isolate* isolate = handles.main_isolate();
2005 1991
2006 std::pair<const char*, Handle<Object>> context_vars[] = { 1992 std::pair<const char*, Handle<Object>> context_vars[] = {
2007 std::make_pair("return outerVar * innerArg;", 1993 std::make_pair("return outerVar * innerArg;",
2008 handle(Smi::FromInt(200), isolate)), 1994 handle(Smi::FromInt(200), isolate)),
2009 std::make_pair("outerVar = innerArg; return outerVar", 1995 std::make_pair("outerVar = innerArg; return outerVar",
2010 handle(Smi::FromInt(20), isolate)), 1996 handle(Smi::FromInt(20), isolate)),
2011 }; 1997 };
2012 1998
2013 std::string header( 1999 std::string header(
2014 "function Outer() {" 2000 "function Outer() {"
2015 " var outerVar = 10;" 2001 " var outerVar = 10;"
2016 " function Inner(innerArg) {" 2002 " function Inner(innerArg) {"
2017 " this.innerFunc = function() { "); 2003 " this.innerFunc = function() { ");
2018 std::string footer( 2004 std::string footer(
2019 " }}" 2005 " }}"
2020 " this.getInnerFunc = function() { return new Inner(20).innerFunc; }" 2006 " this.getInnerFunc = function() { return new Inner(20).innerFunc; }"
2021 "}" 2007 "}"
2022 "var f = new Outer().getInnerFunc();"); 2008 "var f = new Outer().getInnerFunc();");
2023 2009
2024 for (size_t i = 0; i < arraysize(context_vars); i++) { 2010 for (size_t i = 0; i < arraysize(context_vars); i++) {
2025 std::string source = header + context_vars[i].first + footer; 2011 std::string source = header + context_vars[i].first + footer;
2026 InterpreterTester tester(handles.main_isolate(), source.c_str(), "*"); 2012 InterpreterTester tester(isolate, source.c_str(), "*");
2027 auto callable = tester.GetCallable<>(); 2013 auto callable = tester.GetCallable<>();
2028 2014
2029 Handle<i::Object> return_value = callable().ToHandleChecked(); 2015 Handle<i::Object> return_value = callable().ToHandleChecked();
2030 CHECK(return_value->SameValue(*context_vars[i].second)); 2016 CHECK(return_value->SameValue(*context_vars[i].second));
2031 } 2017 }
2032 } 2018 }
2033 2019
2034 2020
2035 TEST(InterpreterComma) { 2021 TEST(InterpreterComma) {
2036 HandleAndZoneScope handles; 2022 HandleAndZoneScope handles;
2037 i::Isolate* isolate = handles.main_isolate(); 2023 Isolate* isolate = handles.main_isolate();
2038 i::Factory* factory = isolate->factory(); 2024 Factory* factory = isolate->factory();
2039 2025
2040 std::pair<const char*, Handle<Object>> literals[] = { 2026 std::pair<const char*, Handle<Object>> literals[] = {
2041 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), 2027 std::make_pair("var a; return 0, a;\n", factory->undefined_value()),
2042 std::make_pair("return 'a', 2.2, 3;\n", 2028 std::make_pair("return 'a', 2.2, 3;\n",
2043 handle(Smi::FromInt(3), isolate)), 2029 handle(Smi::FromInt(3), isolate)),
2044 std::make_pair("return 'a', 'b', 'c';\n", 2030 std::make_pair("return 'a', 'b', 'c';\n",
2045 factory->NewStringFromStaticChars("c")), 2031 factory->NewStringFromStaticChars("c")),
2046 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), 2032 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)),
2047 std::make_pair("var a = 10; return b = a, b = b+1;\n", 2033 std::make_pair("var a = 10; return b = a, b = b+1;\n",
2048 handle(Smi::FromInt(11), isolate)), 2034 handle(Smi::FromInt(11), isolate)),
2049 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", 2035 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n",
2050 handle(Smi::FromInt(21), isolate))}; 2036 handle(Smi::FromInt(21), isolate))};
2051 2037
2052 for (size_t i = 0; i < arraysize(literals); i++) { 2038 for (size_t i = 0; i < arraysize(literals); i++) {
2053 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2039 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2054 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2040 InterpreterTester tester(isolate, source.c_str());
2055 auto callable = tester.GetCallable<>(); 2041 auto callable = tester.GetCallable<>();
2056 2042
2057 Handle<i::Object> return_value = callable().ToHandleChecked(); 2043 Handle<i::Object> return_value = callable().ToHandleChecked();
2058 CHECK(return_value->SameValue(*literals[i].second)); 2044 CHECK(return_value->SameValue(*literals[i].second));
2059 } 2045 }
2060 } 2046 }
2061 2047
2062 2048
2063 TEST(InterpreterLogicalOr) { 2049 TEST(InterpreterLogicalOr) {
2064 HandleAndZoneScope handles; 2050 HandleAndZoneScope handles;
2065 i::Isolate* isolate = handles.main_isolate(); 2051 Isolate* isolate = handles.main_isolate();
2066 i::Factory* factory = isolate->factory(); 2052 Factory* factory = isolate->factory();
2067 2053
2068 std::pair<const char*, Handle<Object>> literals[] = { 2054 std::pair<const char*, Handle<Object>> literals[] = {
2069 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), 2055 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()),
2070 std::make_pair("var a, b = 10; return a || b;\n", 2056 std::make_pair("var a, b = 10; return a || b;\n",
2071 handle(Smi::FromInt(10), isolate)), 2057 handle(Smi::FromInt(10), isolate)),
2072 std::make_pair("var a = '0', b = 10; return a || b;\n", 2058 std::make_pair("var a = '0', b = 10; return a || b;\n",
2073 factory->NewStringFromStaticChars("0")), 2059 factory->NewStringFromStaticChars("0")),
2074 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), 2060 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)),
2075 std::make_pair("return 'a' || 0;\n", 2061 std::make_pair("return 'a' || 0;\n",
2076 factory->NewStringFromStaticChars("a")), 2062 factory->NewStringFromStaticChars("a")),
2077 std::make_pair("var a = '0', b = 10; return (a == 0) || b;\n", 2063 std::make_pair("var a = '0', b = 10; return (a == 0) || b;\n",
2078 factory->true_value())}; 2064 factory->true_value())};
2079 2065
2080 for (size_t i = 0; i < arraysize(literals); i++) { 2066 for (size_t i = 0; i < arraysize(literals); i++) {
2081 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2067 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2082 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2068 InterpreterTester tester(isolate, source.c_str());
2083 auto callable = tester.GetCallable<>(); 2069 auto callable = tester.GetCallable<>();
2084 2070
2085 Handle<i::Object> return_value = callable().ToHandleChecked(); 2071 Handle<i::Object> return_value = callable().ToHandleChecked();
2086 CHECK(return_value->SameValue(*literals[i].second)); 2072 CHECK(return_value->SameValue(*literals[i].second));
2087 } 2073 }
2088 } 2074 }
2089 2075
2090 2076
2091 TEST(InterpreterLogicalAnd) { 2077 TEST(InterpreterLogicalAnd) {
2092 HandleAndZoneScope handles; 2078 HandleAndZoneScope handles;
2093 i::Isolate* isolate = handles.main_isolate(); 2079 Isolate* isolate = handles.main_isolate();
2094 i::Factory* factory = isolate->factory(); 2080 Factory* factory = isolate->factory();
2095 2081
2096 std::pair<const char*, Handle<Object>> literals[] = { 2082 std::pair<const char*, Handle<Object>> literals[] = {
2097 std::make_pair("var a, b = 10; return a && b;\n", 2083 std::make_pair("var a, b = 10; return a && b;\n",
2098 factory->undefined_value()), 2084 factory->undefined_value()),
2099 std::make_pair("var a = 0, b = 10; return a && b / a;\n", 2085 std::make_pair("var a = 0, b = 10; return a && b / a;\n",
2100 handle(Smi::FromInt(0), isolate)), 2086 handle(Smi::FromInt(0), isolate)),
2101 std::make_pair("var a = '0', b = 10; return a && b;\n", 2087 std::make_pair("var a = '0', b = 10; return a && b;\n",
2102 handle(Smi::FromInt(10), isolate)), 2088 handle(Smi::FromInt(10), isolate)),
2103 std::make_pair("return 0.0 && 3.2;\n", handle(Smi::FromInt(0), isolate)), 2089 std::make_pair("return 0.0 && 3.2;\n", handle(Smi::FromInt(0), isolate)),
2104 std::make_pair("return 'a' && 'b';\n", 2090 std::make_pair("return 'a' && 'b';\n",
2105 factory->NewStringFromStaticChars("b")), 2091 factory->NewStringFromStaticChars("b")),
2106 std::make_pair("return 'a' && 0 || 'b', 'c';\n", 2092 std::make_pair("return 'a' && 0 || 'b', 'c';\n",
2107 factory->NewStringFromStaticChars("c")), 2093 factory->NewStringFromStaticChars("c")),
2108 std::make_pair("var x = 1, y = 3; return x && 0 + 1 || y;\n", 2094 std::make_pair("var x = 1, y = 3; return x && 0 + 1 || y;\n",
2109 handle(Smi::FromInt(1), isolate)), 2095 handle(Smi::FromInt(1), isolate)),
2110 std::make_pair("var x = 1, y = 3; return (x == 1) && (3 == 3) || y;\n", 2096 std::make_pair("var x = 1, y = 3; return (x == 1) && (3 == 3) || y;\n",
2111 factory->true_value())}; 2097 factory->true_value())};
2112 2098
2113 for (size_t i = 0; i < arraysize(literals); i++) { 2099 for (size_t i = 0; i < arraysize(literals); i++) {
2114 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2100 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2115 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2101 InterpreterTester tester(isolate, source.c_str());
2116 auto callable = tester.GetCallable<>(); 2102 auto callable = tester.GetCallable<>();
2117 2103
2118 Handle<i::Object> return_value = callable().ToHandleChecked(); 2104 Handle<i::Object> return_value = callable().ToHandleChecked();
2119 CHECK(return_value->SameValue(*literals[i].second)); 2105 CHECK(return_value->SameValue(*literals[i].second));
2120 } 2106 }
2121 } 2107 }
2122 2108
2123 2109
2124 TEST(InterpreterTryCatch) { 2110 TEST(InterpreterTryCatch) {
2125 HandleAndZoneScope handles; 2111 HandleAndZoneScope handles;
2126 i::Isolate* isolate = handles.main_isolate(); 2112 Isolate* isolate = handles.main_isolate();
2127 2113
2128 std::pair<const char*, Handle<Object>> catches[] = { 2114 std::pair<const char*, Handle<Object>> catches[] = {
2129 std::make_pair("var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;", 2115 std::make_pair("var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;",
2130 handle(Smi::FromInt(2), isolate)), 2116 handle(Smi::FromInt(2), isolate)),
2131 std::make_pair("var a; try { undef.x } catch(e) { a = 2 }; return a;", 2117 std::make_pair("var a; try { undef.x } catch(e) { a = 2 }; return a;",
2132 handle(Smi::FromInt(2), isolate)), 2118 handle(Smi::FromInt(2), isolate)),
2133 std::make_pair("var a; try { throw 1 } catch(e) { a = e + 2 }; return a;", 2119 std::make_pair("var a; try { throw 1 } catch(e) { a = e + 2 }; return a;",
2134 handle(Smi::FromInt(3), isolate)), 2120 handle(Smi::FromInt(3), isolate)),
2135 std::make_pair("var a; try { throw 1 } catch(e) { a = e + 2 };" 2121 std::make_pair("var a; try { throw 1 } catch(e) { a = e + 2 };"
2136 " try { throw a } catch(e) { a = e + 3 }; return a;", 2122 " try { throw a } catch(e) { a = e + 3 }; return a;",
2137 handle(Smi::FromInt(6), isolate)), 2123 handle(Smi::FromInt(6), isolate)),
2138 }; 2124 };
2139 2125
2140 for (size_t i = 0; i < arraysize(catches); i++) { 2126 for (size_t i = 0; i < arraysize(catches); i++) {
2141 std::string source(InterpreterTester::SourceForBody(catches[i].first)); 2127 std::string source(InterpreterTester::SourceForBody(catches[i].first));
2142 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2128 InterpreterTester tester(isolate, source.c_str());
2143 auto callable = tester.GetCallable<>(); 2129 auto callable = tester.GetCallable<>();
2144 2130
2145 Handle<i::Object> return_value = callable().ToHandleChecked(); 2131 Handle<i::Object> return_value = callable().ToHandleChecked();
2146 CHECK(return_value->SameValue(*catches[i].second)); 2132 CHECK(return_value->SameValue(*catches[i].second));
2147 } 2133 }
2148 } 2134 }
2149 2135
2150 2136
2151 TEST(InterpreterTryFinally) { 2137 TEST(InterpreterTryFinally) {
2152 HandleAndZoneScope handles; 2138 HandleAndZoneScope handles;
2153 i::Isolate* isolate = handles.main_isolate(); 2139 Isolate* isolate = handles.main_isolate();
2154 i::Factory* factory = isolate->factory(); 2140 Factory* factory = isolate->factory();
2155 2141
2156 std::pair<const char*, Handle<Object>> finallies[] = { 2142 std::pair<const char*, Handle<Object>> finallies[] = {
2157 std::make_pair( 2143 std::make_pair(
2158 "var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;", 2144 "var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;",
2159 factory->NewStringFromStaticChars("R4")), 2145 factory->NewStringFromStaticChars("R4")),
2160 std::make_pair( 2146 std::make_pair(
2161 "var a = 1; try { a = 2; return 23; } finally { a = 3 }; return a;", 2147 "var a = 1; try { a = 2; return 23; } finally { a = 3 }; return a;",
2162 factory->NewStringFromStaticChars("R23")), 2148 factory->NewStringFromStaticChars("R23")),
2163 std::make_pair( 2149 std::make_pair(
2164 "var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;", 2150 "var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;",
(...skipping 25 matching lines...) Expand all
2190 "tcf2();" 2176 "tcf2();"
2191 "return func_name;", 2177 "return func_name;",
2192 factory->NewStringFromStaticChars("Rtcf2")), 2178 factory->NewStringFromStaticChars("Rtcf2")),
2193 }; 2179 };
2194 2180
2195 const char* try_wrapper = 2181 const char* try_wrapper =
2196 "(function() { try { return 'R' + f() } catch(e) { return 'E' + e }})()"; 2182 "(function() { try { return 'R' + f() } catch(e) { return 'E' + e }})()";
2197 2183
2198 for (size_t i = 0; i < arraysize(finallies); i++) { 2184 for (size_t i = 0; i < arraysize(finallies); i++) {
2199 std::string source(InterpreterTester::SourceForBody(finallies[i].first)); 2185 std::string source(InterpreterTester::SourceForBody(finallies[i].first));
2200 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2186 InterpreterTester tester(isolate, source.c_str());
2201 tester.GetCallable<>(); 2187 tester.GetCallable<>();
2202 Handle<Object> wrapped = v8::Utils::OpenHandle(*CompileRun(try_wrapper)); 2188 Handle<Object> wrapped = v8::Utils::OpenHandle(*CompileRun(try_wrapper));
2203 CHECK(wrapped->SameValue(*finallies[i].second)); 2189 CHECK(wrapped->SameValue(*finallies[i].second));
2204 } 2190 }
2205 } 2191 }
2206 2192
2207 2193
2208 TEST(InterpreterThrow) { 2194 TEST(InterpreterThrow) {
2209 HandleAndZoneScope handles; 2195 HandleAndZoneScope handles;
2210 i::Isolate* isolate = handles.main_isolate(); 2196 Isolate* isolate = handles.main_isolate();
2211 i::Factory* factory = isolate->factory(); 2197 Factory* factory = isolate->factory();
2212 2198
2213 std::pair<const char*, Handle<Object>> throws[] = { 2199 std::pair<const char*, Handle<Object>> throws[] = {
2214 std::make_pair("throw undefined;\n", 2200 std::make_pair("throw undefined;\n",
2215 factory->undefined_value()), 2201 factory->undefined_value()),
2216 std::make_pair("throw 1;\n", 2202 std::make_pair("throw 1;\n",
2217 handle(Smi::FromInt(1), isolate)), 2203 handle(Smi::FromInt(1), isolate)),
2218 std::make_pair("throw 'Error';\n", 2204 std::make_pair("throw 'Error';\n",
2219 factory->NewStringFromStaticChars("Error")), 2205 factory->NewStringFromStaticChars("Error")),
2220 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", 2206 std::make_pair("var a = true; if (a) { throw 'Error'; }\n",
2221 factory->NewStringFromStaticChars("Error")), 2207 factory->NewStringFromStaticChars("Error")),
2222 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", 2208 std::make_pair("var a = false; if (a) { throw 'Error'; }\n",
2223 factory->undefined_value()), 2209 factory->undefined_value()),
2224 std::make_pair("throw 'Error1'; throw 'Error2'\n", 2210 std::make_pair("throw 'Error1'; throw 'Error2'\n",
2225 factory->NewStringFromStaticChars("Error1")), 2211 factory->NewStringFromStaticChars("Error1")),
2226 }; 2212 };
2227 2213
2228 const char* try_wrapper = 2214 const char* try_wrapper =
2229 "(function() { try { f(); } catch(e) { return e; }})()"; 2215 "(function() { try { f(); } catch(e) { return e; }})()";
2230 2216
2231 for (size_t i = 0; i < arraysize(throws); i++) { 2217 for (size_t i = 0; i < arraysize(throws); i++) {
2232 std::string source(InterpreterTester::SourceForBody(throws[i].first)); 2218 std::string source(InterpreterTester::SourceForBody(throws[i].first));
2233 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2219 InterpreterTester tester(isolate, source.c_str());
2234 tester.GetCallable<>(); 2220 tester.GetCallable<>();
2235 Handle<Object> thrown_obj = v8::Utils::OpenHandle(*CompileRun(try_wrapper)); 2221 Handle<Object> thrown_obj = v8::Utils::OpenHandle(*CompileRun(try_wrapper));
2236 CHECK(thrown_obj->SameValue(*throws[i].second)); 2222 CHECK(thrown_obj->SameValue(*throws[i].second));
2237 } 2223 }
2238 } 2224 }
2239 2225
2240 2226
2241 TEST(InterpreterCountOperators) { 2227 TEST(InterpreterCountOperators) {
2242 HandleAndZoneScope handles; 2228 HandleAndZoneScope handles;
2243 i::Isolate* isolate = handles.main_isolate(); 2229 Isolate* isolate = handles.main_isolate();
2244 i::Factory* factory = isolate->factory(); 2230 Factory* factory = isolate->factory();
2245 2231
2246 std::pair<const char*, Handle<Object>> count_ops[] = { 2232 std::pair<const char*, Handle<Object>> count_ops[] = {
2247 std::make_pair("var a = 1; return ++a;", 2233 std::make_pair("var a = 1; return ++a;",
2248 handle(Smi::FromInt(2), isolate)), 2234 handle(Smi::FromInt(2), isolate)),
2249 std::make_pair("var a = 1; return a++;", 2235 std::make_pair("var a = 1; return a++;",
2250 handle(Smi::FromInt(1), isolate)), 2236 handle(Smi::FromInt(1), isolate)),
2251 std::make_pair("var a = 5; return --a;", 2237 std::make_pair("var a = 5; return --a;",
2252 handle(Smi::FromInt(4), isolate)), 2238 handle(Smi::FromInt(4), isolate)),
2253 std::make_pair("var a = 5; return a--;", 2239 std::make_pair("var a = 5; return a--;",
2254 handle(Smi::FromInt(5), isolate)), 2240 handle(Smi::FromInt(5), isolate)),
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2286 handle(Smi::FromInt(1), isolate)), 2272 handle(Smi::FromInt(1), isolate)),
2287 std::make_pair("var i = 20; switch(i++) {\n" 2273 std::make_pair("var i = 20; switch(i++) {\n"
2288 " case 20: return 1;\n" 2274 " case 20: return 1;\n"
2289 " default: return 2;\n" 2275 " default: return 2;\n"
2290 "}", 2276 "}",
2291 handle(Smi::FromInt(1), isolate)), 2277 handle(Smi::FromInt(1), isolate)),
2292 }; 2278 };
2293 2279
2294 for (size_t i = 0; i < arraysize(count_ops); i++) { 2280 for (size_t i = 0; i < arraysize(count_ops); i++) {
2295 std::string source(InterpreterTester::SourceForBody(count_ops[i].first)); 2281 std::string source(InterpreterTester::SourceForBody(count_ops[i].first));
2296 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2282 InterpreterTester tester(isolate, source.c_str());
2297 auto callable = tester.GetCallable<>(); 2283 auto callable = tester.GetCallable<>();
2298 2284
2299 Handle<i::Object> return_value = callable().ToHandleChecked(); 2285 Handle<i::Object> return_value = callable().ToHandleChecked();
2300 CHECK(return_value->SameValue(*count_ops[i].second)); 2286 CHECK(return_value->SameValue(*count_ops[i].second));
2301 } 2287 }
2302 } 2288 }
2303 2289
2304 2290
2305 TEST(InterpreterGlobalCountOperators) { 2291 TEST(InterpreterGlobalCountOperators) {
2306 HandleAndZoneScope handles; 2292 HandleAndZoneScope handles;
2307 i::Isolate* isolate = handles.main_isolate(); 2293 Isolate* isolate = handles.main_isolate();
2308 2294
2309 std::pair<const char*, Handle<Object>> count_ops[] = { 2295 std::pair<const char*, Handle<Object>> count_ops[] = {
2310 std::make_pair("var global = 100;function f(){ return ++global; }", 2296 std::make_pair("var global = 100;function f(){ return ++global; }",
2311 handle(Smi::FromInt(101), isolate)), 2297 handle(Smi::FromInt(101), isolate)),
2312 std::make_pair("var global = 100; function f(){ return --global; }", 2298 std::make_pair("var global = 100; function f(){ return --global; }",
2313 handle(Smi::FromInt(99), isolate)), 2299 handle(Smi::FromInt(99), isolate)),
2314 std::make_pair("var global = 100; function f(){ return global++; }", 2300 std::make_pair("var global = 100; function f(){ return global++; }",
2315 handle(Smi::FromInt(100), isolate)), 2301 handle(Smi::FromInt(100), isolate)),
2316 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", 2302 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }",
2317 handle(Smi::FromInt(201), isolate)), 2303 handle(Smi::FromInt(201), isolate)),
2318 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", 2304 std::make_pair("unallocated = 200; function f(){ return --unallocated; }",
2319 handle(Smi::FromInt(199), isolate)), 2305 handle(Smi::FromInt(199), isolate)),
2320 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", 2306 std::make_pair("unallocated = 200; function f(){ return unallocated++; }",
2321 handle(Smi::FromInt(200), isolate)), 2307 handle(Smi::FromInt(200), isolate)),
2322 }; 2308 };
2323 2309
2324 for (size_t i = 0; i < arraysize(count_ops); i++) { 2310 for (size_t i = 0; i < arraysize(count_ops); i++) {
2325 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); 2311 InterpreterTester tester(isolate, count_ops[i].first);
2326 auto callable = tester.GetCallable<>(); 2312 auto callable = tester.GetCallable<>();
2327 2313
2328 Handle<i::Object> return_value = callable().ToHandleChecked(); 2314 Handle<i::Object> return_value = callable().ToHandleChecked();
2329 CHECK(return_value->SameValue(*count_ops[i].second)); 2315 CHECK(return_value->SameValue(*count_ops[i].second));
2330 } 2316 }
2331 } 2317 }
2332 2318
2333 2319
2334 TEST(InterpreterCompoundExpressions) { 2320 TEST(InterpreterCompoundExpressions) {
2335 HandleAndZoneScope handles; 2321 HandleAndZoneScope handles;
2336 i::Isolate* isolate = handles.main_isolate(); 2322 Isolate* isolate = handles.main_isolate();
2337 i::Factory* factory = isolate->factory(); 2323 Factory* factory = isolate->factory();
2338 2324
2339 std::pair<const char*, Handle<Object>> compound_expr[] = { 2325 std::pair<const char*, Handle<Object>> compound_expr[] = {
2340 std::make_pair("var a = 1; a += 2; return a;", 2326 std::make_pair("var a = 1; a += 2; return a;",
2341 Handle<Object>(Smi::FromInt(3), isolate)), 2327 Handle<Object>(Smi::FromInt(3), isolate)),
2342 std::make_pair("var a = 10; a /= 2; return a;", 2328 std::make_pair("var a = 10; a /= 2; return a;",
2343 Handle<Object>(Smi::FromInt(5), isolate)), 2329 Handle<Object>(Smi::FromInt(5), isolate)),
2344 std::make_pair("var a = 'test'; a += 'ing'; return a;", 2330 std::make_pair("var a = 'test'; a += 'ing'; return a;",
2345 factory->NewStringFromStaticChars("testing")), 2331 factory->NewStringFromStaticChars("testing")),
2346 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", 2332 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;",
2347 Handle<Object>(Smi::FromInt(4), isolate)), 2333 Handle<Object>(Smi::FromInt(4), isolate)),
2348 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" 2334 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;"
2349 "return a;", 2335 "return a;",
2350 Handle<Object>(Smi::FromInt(26), isolate)), 2336 Handle<Object>(Smi::FromInt(26), isolate)),
2351 }; 2337 };
2352 2338
2353 for (size_t i = 0; i < arraysize(compound_expr); i++) { 2339 for (size_t i = 0; i < arraysize(compound_expr); i++) {
2354 std::string source( 2340 std::string source(
2355 InterpreterTester::SourceForBody(compound_expr[i].first)); 2341 InterpreterTester::SourceForBody(compound_expr[i].first));
2356 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2342 InterpreterTester tester(isolate, source.c_str());
2357 auto callable = tester.GetCallable<>(); 2343 auto callable = tester.GetCallable<>();
2358 2344
2359 Handle<i::Object> return_value = callable().ToHandleChecked(); 2345 Handle<i::Object> return_value = callable().ToHandleChecked();
2360 CHECK(return_value->SameValue(*compound_expr[i].second)); 2346 CHECK(return_value->SameValue(*compound_expr[i].second));
2361 } 2347 }
2362 } 2348 }
2363 2349
2364 2350
2365 TEST(InterpreterGlobalCompoundExpressions) { 2351 TEST(InterpreterGlobalCompoundExpressions) {
2366 HandleAndZoneScope handles; 2352 HandleAndZoneScope handles;
2367 i::Isolate* isolate = handles.main_isolate(); 2353 Isolate* isolate = handles.main_isolate();
2368 2354
2369 std::pair<const char*, Handle<Object>> compound_expr[2] = { 2355 std::pair<const char*, Handle<Object>> compound_expr[2] = {
2370 std::make_pair("var global = 100;" 2356 std::make_pair("var global = 100;"
2371 "function f() { global += 20; return global; }", 2357 "function f() { global += 20; return global; }",
2372 Handle<Object>(Smi::FromInt(120), isolate)), 2358 Handle<Object>(Smi::FromInt(120), isolate)),
2373 std::make_pair("unallocated = 100;" 2359 std::make_pair("unallocated = 100;"
2374 "function f() { unallocated -= 20; return unallocated; }", 2360 "function f() { unallocated -= 20; return unallocated; }",
2375 Handle<Object>(Smi::FromInt(80), isolate)), 2361 Handle<Object>(Smi::FromInt(80), isolate)),
2376 }; 2362 };
2377 2363
2378 for (size_t i = 0; i < arraysize(compound_expr); i++) { 2364 for (size_t i = 0; i < arraysize(compound_expr); i++) {
2379 InterpreterTester tester(handles.main_isolate(), compound_expr[i].first); 2365 InterpreterTester tester(isolate, compound_expr[i].first);
2380 auto callable = tester.GetCallable<>(); 2366 auto callable = tester.GetCallable<>();
2381 2367
2382 Handle<i::Object> return_value = callable().ToHandleChecked(); 2368 Handle<i::Object> return_value = callable().ToHandleChecked();
2383 CHECK(return_value->SameValue(*compound_expr[i].second)); 2369 CHECK(return_value->SameValue(*compound_expr[i].second));
2384 } 2370 }
2385 } 2371 }
2386 2372
2387 2373
2388 TEST(InterpreterCreateArguments) { 2374 TEST(InterpreterCreateArguments) {
2389 HandleAndZoneScope handles; 2375 HandleAndZoneScope handles;
2390 i::Isolate* isolate = handles.main_isolate(); 2376 Isolate* isolate = handles.main_isolate();
2391 i::Factory* factory = isolate->factory(); 2377 Factory* factory = isolate->factory();
2392 2378
2393 std::pair<const char*, int> create_args[] = { 2379 std::pair<const char*, int> create_args[] = {
2394 std::make_pair("function f() { return arguments[0]; }", 0), 2380 std::make_pair("function f() { return arguments[0]; }", 0),
2395 std::make_pair("function f(a) { return arguments[0]; }", 0), 2381 std::make_pair("function f(a) { return arguments[0]; }", 0),
2396 std::make_pair("function f() { return arguments[2]; }", 2), 2382 std::make_pair("function f() { return arguments[2]; }", 2),
2397 std::make_pair("function f(a) { return arguments[2]; }", 2), 2383 std::make_pair("function f(a) { return arguments[2]; }", 2),
2398 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), 2384 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2),
2399 std::make_pair("function f(a) {" 2385 std::make_pair("function f(a) {"
2400 "'use strict'; return arguments[0]; }", 2386 "'use strict'; return arguments[0]; }",
2401 0), 2387 0),
(...skipping 15 matching lines...) Expand all
2417 std::make_pair("function f(a, ...restArray) { return arguments[0]; }", 0), 2403 std::make_pair("function f(a, ...restArray) { return arguments[0]; }", 0),
2418 std::make_pair("function f(a, ...restArray) { return arguments[1]; }", 1), 2404 std::make_pair("function f(a, ...restArray) { return arguments[1]; }", 1),
2419 std::make_pair("function f(a, ...restArray) { return restArray[1]; }", 2), 2405 std::make_pair("function f(a, ...restArray) { return restArray[1]; }", 2),
2420 std::make_pair("function f(a, ...arguments) { return arguments[0]; }", 1), 2406 std::make_pair("function f(a, ...arguments) { return arguments[0]; }", 1),
2421 std::make_pair("function f(a, b, ...restArray) { return restArray[0]; }", 2407 std::make_pair("function f(a, b, ...restArray) { return restArray[0]; }",
2422 2), 2408 2),
2423 }; 2409 };
2424 2410
2425 // Test passing no arguments. 2411 // Test passing no arguments.
2426 for (size_t i = 0; i < arraysize(create_args); i++) { 2412 for (size_t i = 0; i < arraysize(create_args); i++) {
2427 InterpreterTester tester(handles.main_isolate(), create_args[i].first); 2413 InterpreterTester tester(isolate, create_args[i].first);
2428 auto callable = tester.GetCallable<>(); 2414 auto callable = tester.GetCallable<>();
2429 Handle<Object> return_val = callable().ToHandleChecked(); 2415 Handle<Object> return_val = callable().ToHandleChecked();
2430 CHECK(return_val.is_identical_to(factory->undefined_value())); 2416 CHECK(return_val.is_identical_to(factory->undefined_value()));
2431 } 2417 }
2432 2418
2433 // Test passing one argument. 2419 // Test passing one argument.
2434 for (size_t i = 0; i < arraysize(create_args); i++) { 2420 for (size_t i = 0; i < arraysize(create_args); i++) {
2435 InterpreterTester tester(handles.main_isolate(), create_args[i].first); 2421 InterpreterTester tester(isolate, create_args[i].first);
2436 auto callable = tester.GetCallable<Handle<Object>>(); 2422 auto callable = tester.GetCallable<Handle<Object>>();
2437 Handle<Object> return_val = 2423 Handle<Object> return_val =
2438 callable(handle(Smi::FromInt(40), isolate)).ToHandleChecked(); 2424 callable(handle(Smi::FromInt(40), isolate)).ToHandleChecked();
2439 if (create_args[i].second == 0) { 2425 if (create_args[i].second == 0) {
2440 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(40)); 2426 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(40));
2441 } else { 2427 } else {
2442 CHECK(return_val.is_identical_to(factory->undefined_value())); 2428 CHECK(return_val.is_identical_to(factory->undefined_value()));
2443 } 2429 }
2444 } 2430 }
2445 2431
2446 // Test passing three argument. 2432 // Test passing three argument.
2447 for (size_t i = 0; i < arraysize(create_args); i++) { 2433 for (size_t i = 0; i < arraysize(create_args); i++) {
2448 Handle<Object> args[3] = { 2434 Handle<Object> args[3] = {
2449 handle(Smi::FromInt(40), isolate), 2435 handle(Smi::FromInt(40), isolate),
2450 handle(Smi::FromInt(60), isolate), 2436 handle(Smi::FromInt(60), isolate),
2451 handle(Smi::FromInt(80), isolate), 2437 handle(Smi::FromInt(80), isolate),
2452 }; 2438 };
2453 2439
2454 InterpreterTester tester(handles.main_isolate(), create_args[i].first); 2440 InterpreterTester tester(isolate, create_args[i].first);
2455 auto callable = 2441 auto callable =
2456 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); 2442 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>();
2457 Handle<Object> return_val = 2443 Handle<Object> return_val =
2458 callable(args[0], args[1], args[2]).ToHandleChecked(); 2444 callable(args[0], args[1], args[2]).ToHandleChecked();
2459 CHECK(return_val->SameValue(*args[create_args[i].second])); 2445 CHECK(return_val->SameValue(*args[create_args[i].second]));
2460 } 2446 }
2461 } 2447 }
2462 2448
2463 2449
2464 TEST(InterpreterConditional) { 2450 TEST(InterpreterConditional) {
2465 HandleAndZoneScope handles; 2451 HandleAndZoneScope handles;
2466 i::Isolate* isolate = handles.main_isolate(); 2452 Isolate* isolate = handles.main_isolate();
2467 2453
2468 std::pair<const char*, Handle<Object>> conditional[] = { 2454 std::pair<const char*, Handle<Object>> conditional[] = {
2469 std::make_pair("return true ? 2 : 3;", 2455 std::make_pair("return true ? 2 : 3;",
2470 handle(Smi::FromInt(2), isolate)), 2456 handle(Smi::FromInt(2), isolate)),
2471 std::make_pair("return false ? 2 : 3;", 2457 std::make_pair("return false ? 2 : 3;",
2472 handle(Smi::FromInt(3), isolate)), 2458 handle(Smi::FromInt(3), isolate)),
2473 std::make_pair("var a = 1; return a ? 20 : 30;", 2459 std::make_pair("var a = 1; return a ? 20 : 30;",
2474 handle(Smi::FromInt(20), isolate)), 2460 handle(Smi::FromInt(20), isolate)),
2475 std::make_pair("var a = 1; return a ? 20 : 30;", 2461 std::make_pair("var a = 1; return a ? 20 : 30;",
2476 handle(Smi::FromInt(20), isolate)), 2462 handle(Smi::FromInt(20), isolate)),
2477 std::make_pair("var a = 'string'; return a ? 20 : 30;", 2463 std::make_pair("var a = 'string'; return a ? 20 : 30;",
2478 handle(Smi::FromInt(20), isolate)), 2464 handle(Smi::FromInt(20), isolate)),
2479 std::make_pair("var a = undefined; return a ? 20 : 30;", 2465 std::make_pair("var a = undefined; return a ? 20 : 30;",
2480 handle(Smi::FromInt(30), isolate)), 2466 handle(Smi::FromInt(30), isolate)),
2481 std::make_pair("return 1 ? 2 ? 3 : 4 : 5;", 2467 std::make_pair("return 1 ? 2 ? 3 : 4 : 5;",
2482 handle(Smi::FromInt(3), isolate)), 2468 handle(Smi::FromInt(3), isolate)),
2483 std::make_pair("return 0 ? 2 ? 3 : 4 : 5;", 2469 std::make_pair("return 0 ? 2 ? 3 : 4 : 5;",
2484 handle(Smi::FromInt(5), isolate)), 2470 handle(Smi::FromInt(5), isolate)),
2485 }; 2471 };
2486 2472
2487 for (size_t i = 0; i < arraysize(conditional); i++) { 2473 for (size_t i = 0; i < arraysize(conditional); i++) {
2488 std::string source(InterpreterTester::SourceForBody(conditional[i].first)); 2474 std::string source(InterpreterTester::SourceForBody(conditional[i].first));
2489 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2475 InterpreterTester tester(isolate, source.c_str());
2490 auto callable = tester.GetCallable<>(); 2476 auto callable = tester.GetCallable<>();
2491 2477
2492 Handle<i::Object> return_value = callable().ToHandleChecked(); 2478 Handle<i::Object> return_value = callable().ToHandleChecked();
2493 CHECK(return_value->SameValue(*conditional[i].second)); 2479 CHECK(return_value->SameValue(*conditional[i].second));
2494 } 2480 }
2495 } 2481 }
2496 2482
2497 2483
2498 TEST(InterpreterDelete) { 2484 TEST(InterpreterDelete) {
2499 HandleAndZoneScope handles; 2485 HandleAndZoneScope handles;
2500 i::Isolate* isolate = handles.main_isolate(); 2486 Isolate* isolate = handles.main_isolate();
2501 i::Factory* factory = isolate->factory(); 2487 Factory* factory = isolate->factory();
2502 2488
2503 // Tests for delete for local variables that work both in strict 2489 // Tests for delete for local variables that work both in strict
2504 // and sloppy modes 2490 // and sloppy modes
2505 std::pair<const char*, Handle<Object>> test_delete[] = { 2491 std::pair<const char*, Handle<Object>> test_delete[] = {
2506 std::make_pair( 2492 std::make_pair(
2507 "var a = { x:10, y:'abc', z:30.2}; delete a.x; return a.x;\n", 2493 "var a = { x:10, y:'abc', z:30.2}; delete a.x; return a.x;\n",
2508 factory->undefined_value()), 2494 factory->undefined_value()),
2509 std::make_pair( 2495 std::make_pair(
2510 "var b = { x:10, y:'abc', z:30.2}; delete b.x; return b.y;\n", 2496 "var b = { x:10, y:'abc', z:30.2}; delete b.x; return b.y;\n",
2511 factory->NewStringFromStaticChars("abc")), 2497 factory->NewStringFromStaticChars("abc")),
(...skipping 11 matching lines...) Expand all
2523 std::make_pair("var a = {1:10};\n" 2509 std::make_pair("var a = {1:10};\n"
2524 "(function f1() {return a;});" 2510 "(function f1() {return a;});"
2525 "return delete a[1];", 2511 "return delete a[1];",
2526 factory->ToBoolean(true)), 2512 factory->ToBoolean(true)),
2527 std::make_pair("return delete this;", factory->ToBoolean(true)), 2513 std::make_pair("return delete this;", factory->ToBoolean(true)),
2528 std::make_pair("return delete 'test';", factory->ToBoolean(true))}; 2514 std::make_pair("return delete 'test';", factory->ToBoolean(true))};
2529 2515
2530 // Test delete in sloppy mode 2516 // Test delete in sloppy mode
2531 for (size_t i = 0; i < arraysize(test_delete); i++) { 2517 for (size_t i = 0; i < arraysize(test_delete); i++) {
2532 std::string source(InterpreterTester::SourceForBody(test_delete[i].first)); 2518 std::string source(InterpreterTester::SourceForBody(test_delete[i].first));
2533 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2519 InterpreterTester tester(isolate, source.c_str());
2534 auto callable = tester.GetCallable<>(); 2520 auto callable = tester.GetCallable<>();
2535 2521
2536 Handle<i::Object> return_value = callable().ToHandleChecked(); 2522 Handle<i::Object> return_value = callable().ToHandleChecked();
2537 CHECK(return_value->SameValue(*test_delete[i].second)); 2523 CHECK(return_value->SameValue(*test_delete[i].second));
2538 } 2524 }
2539 2525
2540 // Test delete in strict mode 2526 // Test delete in strict mode
2541 for (size_t i = 0; i < arraysize(test_delete); i++) { 2527 for (size_t i = 0; i < arraysize(test_delete); i++) {
2542 std::string strict_test = 2528 std::string strict_test =
2543 "'use strict'; " + std::string(test_delete[i].first); 2529 "'use strict'; " + std::string(test_delete[i].first);
2544 std::string source(InterpreterTester::SourceForBody(strict_test.c_str())); 2530 std::string source(InterpreterTester::SourceForBody(strict_test.c_str()));
2545 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2531 InterpreterTester tester(isolate, source.c_str());
2546 auto callable = tester.GetCallable<>(); 2532 auto callable = tester.GetCallable<>();
2547 2533
2548 Handle<i::Object> return_value = callable().ToHandleChecked(); 2534 Handle<i::Object> return_value = callable().ToHandleChecked();
2549 CHECK(return_value->SameValue(*test_delete[i].second)); 2535 CHECK(return_value->SameValue(*test_delete[i].second));
2550 } 2536 }
2551 } 2537 }
2552 2538
2553 2539
2554 TEST(InterpreterDeleteSloppyUnqualifiedIdentifier) { 2540 TEST(InterpreterDeleteSloppyUnqualifiedIdentifier) {
2555 HandleAndZoneScope handles; 2541 HandleAndZoneScope handles;
2556 i::Isolate* isolate = handles.main_isolate(); 2542 Isolate* isolate = handles.main_isolate();
2557 i::Factory* factory = isolate->factory(); 2543 Factory* factory = isolate->factory();
2558 2544
2559 // These tests generate a syntax error for strict mode. We don't 2545 // These tests generate a syntax error for strict mode. We don't
2560 // test for it here. 2546 // test for it here.
2561 std::pair<const char*, Handle<Object>> test_delete[] = { 2547 std::pair<const char*, Handle<Object>> test_delete[] = {
2562 std::make_pair("var sloppy_a = { x:10, y:'abc'};\n" 2548 std::make_pair("var sloppy_a = { x:10, y:'abc'};\n"
2563 "var sloppy_b = delete sloppy_a;\n" 2549 "var sloppy_b = delete sloppy_a;\n"
2564 "if (delete sloppy_a) {\n" 2550 "if (delete sloppy_a) {\n"
2565 " return undefined;\n" 2551 " return undefined;\n"
2566 "} else {\n" 2552 "} else {\n"
2567 " return sloppy_a.x;\n" 2553 " return sloppy_a.x;\n"
2568 "}\n", 2554 "}\n",
2569 Handle<Object>(Smi::FromInt(10), isolate)), 2555 Handle<Object>(Smi::FromInt(10), isolate)),
2570 // TODO(mythria) When try-catch is implemented change the tests to check 2556 // TODO(mythria) When try-catch is implemented change the tests to check
2571 // if delete actually deletes 2557 // if delete actually deletes
2572 std::make_pair("sloppy_a = { x:10, y:'abc'};\n" 2558 std::make_pair("sloppy_a = { x:10, y:'abc'};\n"
2573 "var sloppy_b = delete sloppy_a;\n" 2559 "var sloppy_b = delete sloppy_a;\n"
2574 // "try{return a.x;} catch(e) {return b;}\n" 2560 // "try{return a.x;} catch(e) {return b;}\n"
2575 "return sloppy_b;", 2561 "return sloppy_b;",
2576 factory->ToBoolean(true)), 2562 factory->ToBoolean(true)),
2577 std::make_pair("sloppy_a = { x:10, y:'abc'};\n" 2563 std::make_pair("sloppy_a = { x:10, y:'abc'};\n"
2578 "var sloppy_b = delete sloppy_c;\n" 2564 "var sloppy_b = delete sloppy_c;\n"
2579 "return sloppy_b;", 2565 "return sloppy_b;",
2580 factory->ToBoolean(true))}; 2566 factory->ToBoolean(true))};
2581 2567
2582 for (size_t i = 0; i < arraysize(test_delete); i++) { 2568 for (size_t i = 0; i < arraysize(test_delete); i++) {
2583 std::string source(InterpreterTester::SourceForBody(test_delete[i].first)); 2569 std::string source(InterpreterTester::SourceForBody(test_delete[i].first));
2584 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2570 InterpreterTester tester(isolate, source.c_str());
2585 auto callable = tester.GetCallable<>(); 2571 auto callable = tester.GetCallable<>();
2586 2572
2587 Handle<i::Object> return_value = callable().ToHandleChecked(); 2573 Handle<i::Object> return_value = callable().ToHandleChecked();
2588 CHECK(return_value->SameValue(*test_delete[i].second)); 2574 CHECK(return_value->SameValue(*test_delete[i].second));
2589 } 2575 }
2590 } 2576 }
2591 2577
2592 2578
2593 TEST(InterpreterGlobalDelete) { 2579 TEST(InterpreterGlobalDelete) {
2594 HandleAndZoneScope handles; 2580 HandleAndZoneScope handles;
2595 i::Isolate* isolate = handles.main_isolate(); 2581 Isolate* isolate = handles.main_isolate();
2596 i::Factory* factory = isolate->factory(); 2582 Factory* factory = isolate->factory();
2597 2583
2598 std::pair<const char*, Handle<Object>> test_global_delete[] = { 2584 std::pair<const char*, Handle<Object>> test_global_delete[] = {
2599 std::make_pair("var a = { x:10, y:'abc', z:30.2 };\n" 2585 std::make_pair("var a = { x:10, y:'abc', z:30.2 };\n"
2600 "function f() {\n" 2586 "function f() {\n"
2601 " delete a.x;\n" 2587 " delete a.x;\n"
2602 " return a.x;\n" 2588 " return a.x;\n"
2603 "}\n" 2589 "}\n"
2604 "f();\n", 2590 "f();\n",
2605 factory->undefined_value()), 2591 factory->undefined_value()),
2606 std::make_pair("var b = {1:10, 2:'abc', 3:30.2 };\n" 2592 std::make_pair("var b = {1:10, 2:'abc', 3:30.2 };\n"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2640 " var obj = {h:10,\n" 2626 " var obj = {h:10,\n"
2641 " f1() {\n" 2627 " f1() {\n"
2642 " 'use strict';\n" 2628 " 'use strict';\n"
2643 " return delete this.h;}};\n" 2629 " return delete this.h;}};\n"
2644 " return obj.f1();\n" 2630 " return obj.f1();\n"
2645 "}\n" 2631 "}\n"
2646 "f();", 2632 "f();",
2647 factory->ToBoolean(true))}; 2633 factory->ToBoolean(true))};
2648 2634
2649 for (size_t i = 0; i < arraysize(test_global_delete); i++) { 2635 for (size_t i = 0; i < arraysize(test_global_delete); i++) {
2650 InterpreterTester tester(handles.main_isolate(), 2636 InterpreterTester tester(isolate, test_global_delete[i].first);
2651 test_global_delete[i].first);
2652 auto callable = tester.GetCallable<>(); 2637 auto callable = tester.GetCallable<>();
2653 2638
2654 Handle<i::Object> return_value = callable().ToHandleChecked(); 2639 Handle<i::Object> return_value = callable().ToHandleChecked();
2655 CHECK(return_value->SameValue(*test_global_delete[i].second)); 2640 CHECK(return_value->SameValue(*test_global_delete[i].second));
2656 } 2641 }
2657 } 2642 }
2658 2643
2659 2644
2660 TEST(InterpreterBasicLoops) { 2645 TEST(InterpreterBasicLoops) {
2661 HandleAndZoneScope handles; 2646 HandleAndZoneScope handles;
2662 i::Isolate* isolate = handles.main_isolate(); 2647 Isolate* isolate = handles.main_isolate();
2663 i::Factory* factory = isolate->factory(); 2648 Factory* factory = isolate->factory();
2664 2649
2665 std::pair<const char*, Handle<Object>> loops[] = { 2650 std::pair<const char*, Handle<Object>> loops[] = {
2666 std::make_pair("var a = 10; var b = 1;\n" 2651 std::make_pair("var a = 10; var b = 1;\n"
2667 "while (a) {\n" 2652 "while (a) {\n"
2668 " b = b * 2;\n" 2653 " b = b * 2;\n"
2669 " a = a - 1;\n" 2654 " a = a - 1;\n"
2670 "};\n" 2655 "};\n"
2671 "return b;\n", 2656 "return b;\n",
2672 factory->NewHeapNumber(1024)), 2657 factory->NewHeapNumber(1024)),
2673 std::make_pair("var a = 1; var b = 1;\n" 2658 std::make_pair("var a = 1; var b = 1;\n"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2737 Handle<Object>(Smi::FromInt(2), isolate)), 2722 Handle<Object>(Smi::FromInt(2), isolate)),
2738 std::make_pair("var a = 10; var b = 1;\n" 2723 std::make_pair("var a = 10; var b = 1;\n"
2739 "for ( a = 1, b = 30; false; ) {\n" 2724 "for ( a = 1, b = 30; false; ) {\n"
2740 " b = b * 2;\n" 2725 " b = b * 2;\n"
2741 "}\n" 2726 "}\n"
2742 "return b;\n", 2727 "return b;\n",
2743 Handle<Object>(Smi::FromInt(30), isolate))}; 2728 Handle<Object>(Smi::FromInt(30), isolate))};
2744 2729
2745 for (size_t i = 0; i < arraysize(loops); i++) { 2730 for (size_t i = 0; i < arraysize(loops); i++) {
2746 std::string source(InterpreterTester::SourceForBody(loops[i].first)); 2731 std::string source(InterpreterTester::SourceForBody(loops[i].first));
2747 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2732 InterpreterTester tester(isolate, source.c_str());
2748 auto callable = tester.GetCallable<>(); 2733 auto callable = tester.GetCallable<>();
2749 2734
2750 Handle<i::Object> return_value = callable().ToHandleChecked(); 2735 Handle<i::Object> return_value = callable().ToHandleChecked();
2751 CHECK(return_value->SameValue(*loops[i].second)); 2736 CHECK(return_value->SameValue(*loops[i].second));
2752 } 2737 }
2753 } 2738 }
2754 2739
2755 2740
2756 TEST(InterpreterForIn) { 2741 TEST(InterpreterForIn) {
2757 std::pair<const char*, int> for_in_samples[] = { 2742 std::pair<const char*, int> for_in_samples[] = {
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2914 "for (o[i++] in data)\n" // This is to test if value is loaded 2899 "for (o[i++] in data)\n" // This is to test if value is loaded
2915 " result += data[o[i-1]];\n" // back from accumulator before 2900 " result += data[o[i-1]];\n" // back from accumulator before
2916 "return result;\n", // storing keyed properties. 2901 "return result;\n", // storing keyed properties.
2917 57}}; 2902 57}};
2918 2903
2919 // Two passes are made for this test. On the first, 8-bit register 2904 // Two passes are made for this test. On the first, 8-bit register
2920 // operands are employed, and on the 16-bit register operands are 2905 // operands are employed, and on the 16-bit register operands are
2921 // used. 2906 // used.
2922 for (int pass = 0; pass < 2; pass++) { 2907 for (int pass = 0; pass < 2; pass++) {
2923 HandleAndZoneScope handles; 2908 HandleAndZoneScope handles;
2909 Isolate* isolate = handles.main_isolate();
2924 std::ostringstream wide_os; 2910 std::ostringstream wide_os;
2925 if (pass == 1) { 2911 if (pass == 1) {
2926 for (int i = 0; i < 200; i++) { 2912 for (int i = 0; i < 200; i++) {
2927 wide_os << "var local" << i << " = 0;\n"; 2913 wide_os << "var local" << i << " = 0;\n";
2928 } 2914 }
2929 } 2915 }
2930 2916
2931 for (size_t i = 0; i < arraysize(for_in_samples); i++) { 2917 for (size_t i = 0; i < arraysize(for_in_samples); i++) {
2932 std::ostringstream body_os; 2918 std::ostringstream body_os;
2933 body_os << wide_os.str() << for_in_samples[i].first; 2919 body_os << wide_os.str() << for_in_samples[i].first;
2934 std::string body(body_os.str()); 2920 std::string body(body_os.str());
2935 std::string function = InterpreterTester::SourceForBody(body.c_str()); 2921 std::string function = InterpreterTester::SourceForBody(body.c_str());
2936 InterpreterTester tester(handles.main_isolate(), function.c_str()); 2922 InterpreterTester tester(isolate, function.c_str());
2937 auto callable = tester.GetCallable<>(); 2923 auto callable = tester.GetCallable<>();
2938 Handle<Object> return_val = callable().ToHandleChecked(); 2924 Handle<Object> return_val = callable().ToHandleChecked();
2939 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), 2925 CHECK_EQ(Handle<Smi>::cast(return_val)->value(),
2940 for_in_samples[i].second); 2926 for_in_samples[i].second);
2941 } 2927 }
2942 } 2928 }
2943 } 2929 }
2944 2930
2945 2931
2946 TEST(InterpreterForOf) { 2932 TEST(InterpreterForOf) {
2947 HandleAndZoneScope handles; 2933 HandleAndZoneScope handles;
2948 i::Isolate* isolate = handles.main_isolate(); 2934 Isolate* isolate = handles.main_isolate();
2949 i::Factory* factory = isolate->factory(); 2935 Factory* factory = isolate->factory();
2950 2936
2951 std::pair<const char*, Handle<Object>> for_of[] = { 2937 std::pair<const char*, Handle<Object>> for_of[] = {
2952 {"function f() {\n" 2938 {"function f() {\n"
2953 " var r = 0;\n" 2939 " var r = 0;\n"
2954 " for (var a of [0,6,7,9]) { r += a; }\n" 2940 " for (var a of [0,6,7,9]) { r += a; }\n"
2955 " return r;\n" 2941 " return r;\n"
2956 "}", 2942 "}",
2957 handle(Smi::FromInt(22), isolate)}, 2943 handle(Smi::FromInt(22), isolate)},
2958 {"function f() {\n" 2944 {"function f() {\n"
2959 " var r = '';\n" 2945 " var r = '';\n"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
3038 " }\n" 3024 " }\n"
3039 " }\n" 3025 " }\n"
3040 " }}\n" 3026 " }}\n"
3041 " for (a of obj) { r += a }\n" 3027 " for (a of obj) { r += a }\n"
3042 " return r;\n" 3028 " return r;\n"
3043 "}", 3029 "}",
3044 factory->NewStringFromStaticChars("dcba")}, 3030 factory->NewStringFromStaticChars("dcba")},
3045 }; 3031 };
3046 3032
3047 for (size_t i = 0; i < arraysize(for_of); i++) { 3033 for (size_t i = 0; i < arraysize(for_of); i++) {
3048 InterpreterTester tester(handles.main_isolate(), for_of[i].first); 3034 InterpreterTester tester(isolate, for_of[i].first);
3049 auto callable = tester.GetCallable<>(); 3035 auto callable = tester.GetCallable<>();
3050 Handle<Object> return_val = callable().ToHandleChecked(); 3036 Handle<Object> return_val = callable().ToHandleChecked();
3051 CHECK(return_val->SameValue(*for_of[i].second)); 3037 CHECK(return_val->SameValue(*for_of[i].second));
3052 } 3038 }
3053 } 3039 }
3054 3040
3055 3041
3056 TEST(InterpreterSwitch) { 3042 TEST(InterpreterSwitch) {
3057 HandleAndZoneScope handles; 3043 HandleAndZoneScope handles;
3058 i::Isolate* isolate = handles.main_isolate(); 3044 Isolate* isolate = handles.main_isolate();
3059 i::Factory* factory = isolate->factory(); 3045 Factory* factory = isolate->factory();
3060 3046
3061 std::pair<const char*, Handle<Object>> switch_ops[] = { 3047 std::pair<const char*, Handle<Object>> switch_ops[] = {
3062 std::make_pair("var a = 1;\n" 3048 std::make_pair("var a = 1;\n"
3063 "switch(a) {\n" 3049 "switch(a) {\n"
3064 " case 1: return 2;\n" 3050 " case 1: return 2;\n"
3065 " case 2: return 3;\n" 3051 " case 2: return 3;\n"
3066 "}\n", 3052 "}\n",
3067 handle(Smi::FromInt(2), isolate)), 3053 handle(Smi::FromInt(2), isolate)),
3068 std::make_pair("var a = 1;\n" 3054 std::make_pair("var a = 1;\n"
3069 "switch(a) {\n" 3055 "switch(a) {\n"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3117 " default : a += 2; break;\n" 3103 " default : a += 2; break;\n"
3118 " } // fall-through\n" 3104 " } // fall-through\n"
3119 " case 2: a += 3;\n" 3105 " case 2: a += 3;\n"
3120 "}\n" 3106 "}\n"
3121 "return a;", 3107 "return a;",
3122 handle(Smi::FromInt(5), isolate)), 3108 handle(Smi::FromInt(5), isolate)),
3123 }; 3109 };
3124 3110
3125 for (size_t i = 0; i < arraysize(switch_ops); i++) { 3111 for (size_t i = 0; i < arraysize(switch_ops); i++) {
3126 std::string source(InterpreterTester::SourceForBody(switch_ops[i].first)); 3112 std::string source(InterpreterTester::SourceForBody(switch_ops[i].first));
3127 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3113 InterpreterTester tester(isolate, source.c_str());
3128 auto callable = tester.GetCallable<>(); 3114 auto callable = tester.GetCallable<>();
3129 3115
3130 Handle<i::Object> return_value = callable().ToHandleChecked(); 3116 Handle<i::Object> return_value = callable().ToHandleChecked();
3131 CHECK(return_value->SameValue(*switch_ops[i].second)); 3117 CHECK(return_value->SameValue(*switch_ops[i].second));
3132 } 3118 }
3133 } 3119 }
3134 3120
3135 3121
3136 TEST(InterpreterSloppyThis) { 3122 TEST(InterpreterSloppyThis) {
3137 HandleAndZoneScope handles; 3123 HandleAndZoneScope handles;
3138 i::Isolate* isolate = handles.main_isolate(); 3124 Isolate* isolate = handles.main_isolate();
3139 i::Factory* factory = isolate->factory(); 3125 Factory* factory = isolate->factory();
3140 3126
3141 std::pair<const char*, Handle<Object>> sloppy_this[] = { 3127 std::pair<const char*, Handle<Object>> sloppy_this[] = {
3142 std::make_pair("var global_val = 100;\n" 3128 std::make_pair("var global_val = 100;\n"
3143 "function f() { return this.global_val; }\n", 3129 "function f() { return this.global_val; }\n",
3144 handle(Smi::FromInt(100), isolate)), 3130 handle(Smi::FromInt(100), isolate)),
3145 std::make_pair("var global_val = 110;\n" 3131 std::make_pair("var global_val = 110;\n"
3146 "function g() { return this.global_val; };" 3132 "function g() { return this.global_val; };"
3147 "function f() { return g(); }\n", 3133 "function f() { return g(); }\n",
3148 handle(Smi::FromInt(110), isolate)), 3134 handle(Smi::FromInt(110), isolate)),
3149 std::make_pair("var global_val = 110;\n" 3135 std::make_pair("var global_val = 110;\n"
3150 "function g() { return this.global_val };" 3136 "function g() { return this.global_val };"
3151 "function f() { 'use strict'; return g(); }\n", 3137 "function f() { 'use strict'; return g(); }\n",
3152 handle(Smi::FromInt(110), isolate)), 3138 handle(Smi::FromInt(110), isolate)),
3153 std::make_pair("function f() { 'use strict'; return this; }\n", 3139 std::make_pair("function f() { 'use strict'; return this; }\n",
3154 factory->undefined_value()), 3140 factory->undefined_value()),
3155 std::make_pair("function g() { 'use strict'; return this; };" 3141 std::make_pair("function g() { 'use strict'; return this; };"
3156 "function f() { return g(); }\n", 3142 "function f() { return g(); }\n",
3157 factory->undefined_value()), 3143 factory->undefined_value()),
3158 }; 3144 };
3159 3145
3160 for (size_t i = 0; i < arraysize(sloppy_this); i++) { 3146 for (size_t i = 0; i < arraysize(sloppy_this); i++) {
3161 InterpreterTester tester(handles.main_isolate(), sloppy_this[i].first); 3147 InterpreterTester tester(isolate, sloppy_this[i].first);
3162 auto callable = tester.GetCallable<>(); 3148 auto callable = tester.GetCallable<>();
3163 3149
3164 Handle<i::Object> return_value = callable().ToHandleChecked(); 3150 Handle<i::Object> return_value = callable().ToHandleChecked();
3165 CHECK(return_value->SameValue(*sloppy_this[i].second)); 3151 CHECK(return_value->SameValue(*sloppy_this[i].second));
3166 } 3152 }
3167 } 3153 }
3168 3154
3169 3155
3170 TEST(InterpreterThisFunction) { 3156 TEST(InterpreterThisFunction) {
3171 HandleAndZoneScope handles; 3157 HandleAndZoneScope handles;
3172 i::Isolate* isolate = handles.main_isolate(); 3158 Isolate* isolate = handles.main_isolate();
3173 i::Factory* factory = isolate->factory(); 3159 Factory* factory = isolate->factory();
3174 3160
3175 InterpreterTester tester(handles.main_isolate(), 3161 InterpreterTester tester(isolate,
3176 "var f;\n f = function f() { return f.name; }"); 3162 "var f;\n f = function f() { return f.name; }");
3177 auto callable = tester.GetCallable<>(); 3163 auto callable = tester.GetCallable<>();
3178 3164
3179 Handle<i::Object> return_value = callable().ToHandleChecked(); 3165 Handle<i::Object> return_value = callable().ToHandleChecked();
3180 CHECK(return_value->SameValue(*factory->NewStringFromStaticChars("f"))); 3166 CHECK(return_value->SameValue(*factory->NewStringFromStaticChars("f")));
3181 } 3167 }
3182 3168
3183 3169
3184 TEST(InterpreterNewTarget) { 3170 TEST(InterpreterNewTarget) {
3185 HandleAndZoneScope handles; 3171 HandleAndZoneScope handles;
3186 i::Isolate* isolate = handles.main_isolate(); 3172 Isolate* isolate = handles.main_isolate();
3187 i::Factory* factory = isolate->factory(); 3173 Factory* factory = isolate->factory();
3188 3174
3189 // TODO(rmcilroy): Add tests that we get the original constructor for 3175 // TODO(rmcilroy): Add tests that we get the original constructor for
3190 // superclass constructors once we have class support. 3176 // superclass constructors once we have class support.
3191 InterpreterTester tester(handles.main_isolate(), 3177 InterpreterTester tester(isolate, "function f() { this.a = new.target; }");
3192 "function f() { this.a = new.target; }");
3193 auto callable = tester.GetCallable<>(); 3178 auto callable = tester.GetCallable<>();
3194 callable().ToHandleChecked(); 3179 callable().ToHandleChecked();
3195 3180
3196 Handle<Object> new_target_name = v8::Utils::OpenHandle( 3181 Handle<Object> new_target_name = v8::Utils::OpenHandle(
3197 *CompileRun("(function() { return (new f()).a.name; })();")); 3182 *CompileRun("(function() { return (new f()).a.name; })();"));
3198 CHECK(new_target_name->SameValue(*factory->NewStringFromStaticChars("f"))); 3183 CHECK(new_target_name->SameValue(*factory->NewStringFromStaticChars("f")));
3199 } 3184 }
3200 3185
3201 3186
3202 TEST(InterpreterAssignmentInExpressions) { 3187 TEST(InterpreterAssignmentInExpressions) {
3203 HandleAndZoneScope handles; 3188 HandleAndZoneScope handles;
3189 Isolate* isolate = handles.main_isolate();
3204 3190
3205 std::pair<const char*, int> samples[] = { 3191 std::pair<const char*, int> samples[] = {
3206 {"function f() {\n" 3192 {"function f() {\n"
3207 " var x = 7;\n" 3193 " var x = 7;\n"
3208 " var y = x + (x = 1) + (x = 2);\n" 3194 " var y = x + (x = 1) + (x = 2);\n"
3209 " return y;\n" 3195 " return y;\n"
3210 "}", 3196 "}",
3211 10}, 3197 10},
3212 {"function f() {\n" 3198 {"function f() {\n"
3213 " var x = 7;\n" 3199 " var x = 7;\n"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
3323 "}", 3309 "}",
3324 60}, 3310 60},
3325 {"function f(a) {\n" 3311 {"function f(a) {\n"
3326 " return a + (arguments[0] = 10) + arguments[0];\n" 3312 " return a + (arguments[0] = 10) + arguments[0];\n"
3327 "}", 3313 "}",
3328 60}, 3314 60},
3329 }; 3315 };
3330 3316
3331 const int arg_value = 40; 3317 const int arg_value = 40;
3332 for (size_t i = 0; i < arraysize(samples); i++) { 3318 for (size_t i = 0; i < arraysize(samples); i++) {
3333 InterpreterTester tester(handles.main_isolate(), samples[i].first); 3319 InterpreterTester tester(isolate, samples[i].first);
3334 auto callable = tester.GetCallable<Handle<Object>>(); 3320 auto callable = tester.GetCallable<Handle<Object>>();
3335 Handle<Object> return_val = 3321 Handle<Object> return_val =
3336 callable(handle(Smi::FromInt(arg_value), handles.main_isolate())) 3322 callable(handle(Smi::FromInt(arg_value), handles.main_isolate()))
3337 .ToHandleChecked(); 3323 .ToHandleChecked();
3338 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), samples[i].second); 3324 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), samples[i].second);
3339 } 3325 }
3340 } 3326 }
3341 3327
3342 3328
3343 TEST(InterpreterToName) { 3329 TEST(InterpreterToName) {
3344 HandleAndZoneScope handles; 3330 HandleAndZoneScope handles;
3345 i::Isolate* isolate = handles.main_isolate(); 3331 Isolate* isolate = handles.main_isolate();
3346 i::Factory* factory = isolate->factory(); 3332 Factory* factory = isolate->factory();
3347 3333
3348 std::pair<const char*, Handle<Object>> to_name_tests[] = { 3334 std::pair<const char*, Handle<Object>> to_name_tests[] = {
3349 {"var a = 'val'; var obj = {[a] : 10}; return obj.val;", 3335 {"var a = 'val'; var obj = {[a] : 10}; return obj.val;",
3350 factory->NewNumberFromInt(10)}, 3336 factory->NewNumberFromInt(10)},
3351 {"var a = 20; var obj = {[a] : 10}; return obj['20'];", 3337 {"var a = 20; var obj = {[a] : 10}; return obj['20'];",
3352 factory->NewNumberFromInt(10)}, 3338 factory->NewNumberFromInt(10)},
3353 {"var a = 20; var obj = {[a] : 10}; return obj[20];", 3339 {"var a = 20; var obj = {[a] : 10}; return obj[20];",
3354 factory->NewNumberFromInt(10)}, 3340 factory->NewNumberFromInt(10)},
3355 {"var a = {val:23}; var obj = {[a] : 10}; return obj[a];", 3341 {"var a = {val:23}; var obj = {[a] : 10}; return obj[a];",
3356 factory->NewNumberFromInt(10)}, 3342 factory->NewNumberFromInt(10)},
(...skipping 10 matching lines...) Expand all
3367 factory->undefined_value()}, 3353 factory->undefined_value()},
3368 {"var a = {[Symbol.toPrimitive] : function() { return 'x'}};\n" 3354 {"var a = {[Symbol.toPrimitive] : function() { return 'x'}};\n"
3369 "var obj = {[a] : 10};\n" 3355 "var obj = {[a] : 10};\n"
3370 "return obj.x;", 3356 "return obj.x;",
3371 factory->NewNumberFromInt(10)}, 3357 factory->NewNumberFromInt(10)},
3372 }; 3358 };
3373 3359
3374 for (size_t i = 0; i < arraysize(to_name_tests); i++) { 3360 for (size_t i = 0; i < arraysize(to_name_tests); i++) {
3375 std::string source( 3361 std::string source(
3376 InterpreterTester::SourceForBody(to_name_tests[i].first)); 3362 InterpreterTester::SourceForBody(to_name_tests[i].first));
3377 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3363 InterpreterTester tester(isolate, source.c_str());
3378 auto callable = tester.GetCallable<>(); 3364 auto callable = tester.GetCallable<>();
3379 3365
3380 Handle<i::Object> return_value = callable().ToHandleChecked(); 3366 Handle<i::Object> return_value = callable().ToHandleChecked();
3381 CHECK(return_value->SameValue(*to_name_tests[i].second)); 3367 CHECK(return_value->SameValue(*to_name_tests[i].second));
3382 } 3368 }
3383 } 3369 }
3384 3370
3385 3371
3386 TEST(TemporaryRegisterAllocation) { 3372 TEST(TemporaryRegisterAllocation) {
3387 HandleAndZoneScope handles; 3373 HandleAndZoneScope handles;
3388 i::Isolate* isolate = handles.main_isolate(); 3374 Isolate* isolate = handles.main_isolate();
3389 i::Factory* factory = isolate->factory(); 3375 Factory* factory = isolate->factory();
3390 3376
3391 std::pair<const char*, Handle<Object>> reg_tests[] = { 3377 std::pair<const char*, Handle<Object>> reg_tests[] = {
3392 {"function add(a, b, c) {" 3378 {"function add(a, b, c) {"
3393 " return a + b + c;" 3379 " return a + b + c;"
3394 "}" 3380 "}"
3395 "function f() {" 3381 "function f() {"
3396 " var a = 10, b = 10;" 3382 " var a = 10, b = 10;"
3397 " return add(a, b++, b);" 3383 " return add(a, b++, b);"
3398 "}", 3384 "}",
3399 factory->NewNumberFromInt(31)}, 3385 factory->NewNumberFromInt(31)},
3400 {"function add(a, b, c, d) {" 3386 {"function add(a, b, c, d) {"
3401 " return a + b + c + d;" 3387 " return a + b + c + d;"
3402 "}" 3388 "}"
3403 "function f() {" 3389 "function f() {"
3404 " var x = 10, y = 20, z = 30;" 3390 " var x = 10, y = 20, z = 30;"
3405 " return x + add(x, (y= x++), x, z);" 3391 " return x + add(x, (y= x++), x, z);"
3406 "}", 3392 "}",
3407 factory->NewNumberFromInt(71)}, 3393 factory->NewNumberFromInt(71)},
3408 }; 3394 };
3409 3395
3410 for (size_t i = 0; i < arraysize(reg_tests); i++) { 3396 for (size_t i = 0; i < arraysize(reg_tests); i++) {
3411 InterpreterTester tester(handles.main_isolate(), reg_tests[i].first); 3397 InterpreterTester tester(isolate, reg_tests[i].first);
3412 auto callable = tester.GetCallable<>(); 3398 auto callable = tester.GetCallable<>();
3413 3399
3414 Handle<i::Object> return_value = callable().ToHandleChecked(); 3400 Handle<i::Object> return_value = callable().ToHandleChecked();
3415 CHECK(return_value->SameValue(*reg_tests[i].second)); 3401 CHECK(return_value->SameValue(*reg_tests[i].second));
3416 } 3402 }
3417 } 3403 }
3418 3404
3419 3405
3420 TEST(InterpreterLookupSlot) { 3406 TEST(InterpreterLookupSlot) {
3421 HandleAndZoneScope handles; 3407 HandleAndZoneScope handles;
3422 i::Isolate* isolate = handles.main_isolate(); 3408 Isolate* isolate = handles.main_isolate();
3423 i::Factory* factory = isolate->factory(); 3409 Factory* factory = isolate->factory();
3424 3410
3425 // TODO(mythria): Add more tests when we have support for eval/with. 3411 // TODO(mythria): Add more tests when we have support for eval/with.
3426 const char* function_prologue = "var f;" 3412 const char* function_prologue = "var f;"
3427 "var x = 1;" 3413 "var x = 1;"
3428 "function f1() {" 3414 "function f1() {"
3429 " eval(\"function t() {"; 3415 " eval(\"function t() {";
3430 const char* function_epilogue = " }; f = t;\");" 3416 const char* function_epilogue = " }; f = t;\");"
3431 "}" 3417 "}"
3432 "f1();"; 3418 "f1();";
3433 3419
3434 3420
3435 std::pair<const char*, Handle<Object>> lookup_slot[] = { 3421 std::pair<const char*, Handle<Object>> lookup_slot[] = {
3436 {"return x;", handle(Smi::FromInt(1), isolate)}, 3422 {"return x;", handle(Smi::FromInt(1), isolate)},
3437 {"return typeof x;", factory->NewStringFromStaticChars("number")}, 3423 {"return typeof x;", factory->NewStringFromStaticChars("number")},
3438 {"return typeof dummy;", factory->NewStringFromStaticChars("undefined")}, 3424 {"return typeof dummy;", factory->NewStringFromStaticChars("undefined")},
3439 {"x = 10; return x;", handle(Smi::FromInt(10), isolate)}, 3425 {"x = 10; return x;", handle(Smi::FromInt(10), isolate)},
3440 {"'use strict'; x = 20; return x;", handle(Smi::FromInt(20), isolate)}, 3426 {"'use strict'; x = 20; return x;", handle(Smi::FromInt(20), isolate)},
3441 }; 3427 };
3442 3428
3443 for (size_t i = 0; i < arraysize(lookup_slot); i++) { 3429 for (size_t i = 0; i < arraysize(lookup_slot); i++) {
3444 std::string script = std::string(function_prologue) + 3430 std::string script = std::string(function_prologue) +
3445 std::string(lookup_slot[i].first) + 3431 std::string(lookup_slot[i].first) +
3446 std::string(function_epilogue); 3432 std::string(function_epilogue);
3447 3433
3448 InterpreterTester tester(handles.main_isolate(), script.c_str(), "t"); 3434 InterpreterTester tester(isolate, script.c_str(), "t");
3449 auto callable = tester.GetCallable<>(); 3435 auto callable = tester.GetCallable<>();
3450 3436
3451 Handle<i::Object> return_value = callable().ToHandleChecked(); 3437 Handle<i::Object> return_value = callable().ToHandleChecked();
3452 CHECK(return_value->SameValue(*lookup_slot[i].second)); 3438 CHECK(return_value->SameValue(*lookup_slot[i].second));
3453 } 3439 }
3454 } 3440 }
3455 3441
3456 3442
3457 TEST(InterpreterCallLookupSlot) { 3443 TEST(InterpreterCallLookupSlot) {
3458 HandleAndZoneScope handles; 3444 HandleAndZoneScope handles;
3459 i::Isolate* isolate = handles.main_isolate(); 3445 Isolate* isolate = handles.main_isolate();
3460 3446
3461 std::pair<const char*, Handle<Object>> call_lookup[] = { 3447 std::pair<const char*, Handle<Object>> call_lookup[] = {
3462 {"g = function(){ return 2 }; eval(''); return g();", 3448 {"g = function(){ return 2 }; eval(''); return g();",
3463 handle(Smi::FromInt(2), isolate)}, 3449 handle(Smi::FromInt(2), isolate)},
3464 {"g = function(){ return 2 }; eval('g = function() {return 3}');\n" 3450 {"g = function(){ return 2 }; eval('g = function() {return 3}');\n"
3465 "return g();", 3451 "return g();",
3466 handle(Smi::FromInt(3), isolate)}, 3452 handle(Smi::FromInt(3), isolate)},
3467 {"g = { x: function(){ return this.y }, y: 20 };\n" 3453 {"g = { x: function(){ return this.y }, y: 20 };\n"
3468 "eval('g = { x: g.x, y: 30 }');\n" 3454 "eval('g = { x: g.x, y: 30 }');\n"
3469 "return g.x();", 3455 "return g.x();",
3470 handle(Smi::FromInt(30), isolate)}, 3456 handle(Smi::FromInt(30), isolate)},
3471 }; 3457 };
3472 3458
3473 for (size_t i = 0; i < arraysize(call_lookup); i++) { 3459 for (size_t i = 0; i < arraysize(call_lookup); i++) {
3474 std::string source(InterpreterTester::SourceForBody(call_lookup[i].first)); 3460 std::string source(InterpreterTester::SourceForBody(call_lookup[i].first));
3475 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3461 InterpreterTester tester(isolate, source.c_str());
3476 auto callable = tester.GetCallable<>(); 3462 auto callable = tester.GetCallable<>();
3477 3463
3478 Handle<i::Object> return_value = callable().ToHandleChecked(); 3464 Handle<i::Object> return_value = callable().ToHandleChecked();
3479 CHECK(return_value->SameValue(*call_lookup[i].second)); 3465 CHECK(return_value->SameValue(*call_lookup[i].second));
3480 } 3466 }
3481 } 3467 }
3482 3468
3483 3469
3484 TEST(InterpreterLookupSlotWide) { 3470 TEST(InterpreterLookupSlotWide) {
3485 HandleAndZoneScope handles; 3471 HandleAndZoneScope handles;
3486 i::Isolate* isolate = handles.main_isolate(); 3472 Isolate* isolate = handles.main_isolate();
3487 i::Factory* factory = isolate->factory(); 3473 Factory* factory = isolate->factory();
3488 3474
3489 const char* function_prologue = 3475 const char* function_prologue =
3490 "var f;" 3476 "var f;"
3491 "var x = 1;" 3477 "var x = 1;"
3492 "function f1() {" 3478 "function f1() {"
3493 " eval(\"function t() {"; 3479 " eval(\"function t() {";
3494 const char* function_epilogue = 3480 const char* function_epilogue =
3495 " }; f = t;\");" 3481 " }; f = t;\");"
3496 "}" 3482 "}"
3497 "f1();"; 3483 "f1();";
(...skipping 11 matching lines...) Expand all
3509 {init_function_body + "return x = 10;", 3495 {init_function_body + "return x = 10;",
3510 handle(Smi::FromInt(10), isolate)}, 3496 handle(Smi::FromInt(10), isolate)},
3511 {"'use strict';" + init_function_body + "x = 20; return x;", 3497 {"'use strict';" + init_function_body + "x = 20; return x;",
3512 handle(Smi::FromInt(20), isolate)}, 3498 handle(Smi::FromInt(20), isolate)},
3513 }; 3499 };
3514 3500
3515 for (size_t i = 0; i < arraysize(lookup_slot); i++) { 3501 for (size_t i = 0; i < arraysize(lookup_slot); i++) {
3516 std::string script = std::string(function_prologue) + lookup_slot[i].first + 3502 std::string script = std::string(function_prologue) + lookup_slot[i].first +
3517 std::string(function_epilogue); 3503 std::string(function_epilogue);
3518 3504
3519 InterpreterTester tester(handles.main_isolate(), script.c_str(), "t"); 3505 InterpreterTester tester(isolate, script.c_str(), "t");
3520 auto callable = tester.GetCallable<>(); 3506 auto callable = tester.GetCallable<>();
3521 3507
3522 Handle<i::Object> return_value = callable().ToHandleChecked(); 3508 Handle<i::Object> return_value = callable().ToHandleChecked();
3523 CHECK(return_value->SameValue(*lookup_slot[i].second)); 3509 CHECK(return_value->SameValue(*lookup_slot[i].second));
3524 } 3510 }
3525 } 3511 }
3526 3512
3527 3513
3528 TEST(InterpreterDeleteLookupSlot) { 3514 TEST(InterpreterDeleteLookupSlot) {
3529 HandleAndZoneScope handles; 3515 HandleAndZoneScope handles;
3530 i::Isolate* isolate = handles.main_isolate(); 3516 Isolate* isolate = handles.main_isolate();
3531 i::Factory* factory = isolate->factory(); 3517 Factory* factory = isolate->factory();
3532 3518
3533 // TODO(mythria): Add more tests when we have support for eval/with. 3519 // TODO(mythria): Add more tests when we have support for eval/with.
3534 const char* function_prologue = "var f;" 3520 const char* function_prologue = "var f;"
3535 "var x = 1;" 3521 "var x = 1;"
3536 "y = 10;" 3522 "y = 10;"
3537 "var obj = {val:10};" 3523 "var obj = {val:10};"
3538 "var z = 30;" 3524 "var z = 30;"
3539 "function f1() {" 3525 "function f1() {"
3540 " var z = 20;" 3526 " var z = 20;"
3541 " eval(\"function t() {"; 3527 " eval(\"function t() {";
3542 const char* function_epilogue = " }; f = t;\");" 3528 const char* function_epilogue = " }; f = t;\");"
3543 "}" 3529 "}"
3544 "f1();"; 3530 "f1();";
3545 3531
3546 3532
3547 std::pair<const char*, Handle<Object>> delete_lookup_slot[] = { 3533 std::pair<const char*, Handle<Object>> delete_lookup_slot[] = {
3548 {"return delete x;", factory->false_value()}, 3534 {"return delete x;", factory->false_value()},
3549 {"return delete y;", factory->true_value()}, 3535 {"return delete y;", factory->true_value()},
3550 {"return delete z;", factory->false_value()}, 3536 {"return delete z;", factory->false_value()},
3551 {"return delete obj.val;", factory->true_value()}, 3537 {"return delete obj.val;", factory->true_value()},
3552 {"'use strict'; return delete obj.val;", factory->true_value()}, 3538 {"'use strict'; return delete obj.val;", factory->true_value()},
3553 }; 3539 };
3554 3540
3555 for (size_t i = 0; i < arraysize(delete_lookup_slot); i++) { 3541 for (size_t i = 0; i < arraysize(delete_lookup_slot); i++) {
3556 std::string script = std::string(function_prologue) + 3542 std::string script = std::string(function_prologue) +
3557 std::string(delete_lookup_slot[i].first) + 3543 std::string(delete_lookup_slot[i].first) +
3558 std::string(function_epilogue); 3544 std::string(function_epilogue);
3559 3545
3560 InterpreterTester tester(handles.main_isolate(), script.c_str(), "t"); 3546 InterpreterTester tester(isolate, script.c_str(), "t");
3561 auto callable = tester.GetCallable<>(); 3547 auto callable = tester.GetCallable<>();
3562 3548
3563 Handle<i::Object> return_value = callable().ToHandleChecked(); 3549 Handle<i::Object> return_value = callable().ToHandleChecked();
3564 CHECK(return_value->SameValue(*delete_lookup_slot[i].second)); 3550 CHECK(return_value->SameValue(*delete_lookup_slot[i].second));
3565 } 3551 }
3566 } 3552 }
3567 3553
3568 3554
3569 TEST(JumpWithConstantsAndWideConstants) { 3555 TEST(JumpWithConstantsAndWideConstants) {
3570 HandleAndZoneScope handles; 3556 HandleAndZoneScope handles;
3557 Isolate* isolate = handles.main_isolate();
3558 Factory* factory = isolate->factory();
3571 const int kStep = 13; 3559 const int kStep = 13;
3572 for (int constants = 11; constants < 256 + 3 * kStep; constants += kStep) { 3560 for (int constants = 11; constants < 256 + 3 * kStep; constants += kStep) {
3573 auto isolate = handles.main_isolate();
3574 auto factory = isolate->factory();
3575 std::ostringstream filler_os; 3561 std::ostringstream filler_os;
3576 // Generate a string that consumes constant pool entries and 3562 // Generate a string that consumes constant pool entries and
3577 // spread out branch distances in script below. 3563 // spread out branch distances in script below.
3578 for (int i = 0; i < constants; i++) { 3564 for (int i = 0; i < constants; i++) {
3579 filler_os << "var x_ = 'x_" << i << "';\n"; 3565 filler_os << "var x_ = 'x_" << i << "';\n";
3580 } 3566 }
3581 std::string filler(filler_os.str()); 3567 std::string filler(filler_os.str());
3582 std::ostringstream script_os; 3568 std::ostringstream script_os;
3583 script_os << "function " << InterpreterTester::function_name() << "(a) {\n"; 3569 script_os << "function " << InterpreterTester::function_name() << "(a) {\n";
3584 script_os << " " << filler; 3570 script_os << " " << filler;
3585 script_os << " for (var i = a; i < 2; i++) {\n"; 3571 script_os << " for (var i = a; i < 2; i++) {\n";
3586 script_os << " " << filler; 3572 script_os << " " << filler;
3587 script_os << " if (i == 0) { " << filler << "i = 10; continue; }\n"; 3573 script_os << " if (i == 0) { " << filler << "i = 10; continue; }\n";
3588 script_os << " else if (i == a) { " << filler << "i = 12; break; }\n"; 3574 script_os << " else if (i == a) { " << filler << "i = 12; break; }\n";
3589 script_os << " else { " << filler << " }\n"; 3575 script_os << " else { " << filler << " }\n";
3590 script_os << " }\n"; 3576 script_os << " }\n";
3591 script_os << " return i;\n"; 3577 script_os << " return i;\n";
3592 script_os << "}\n"; 3578 script_os << "}\n";
3593 std::string script(script_os.str()); 3579 std::string script(script_os.str());
3594 for (int a = 0; a < 3; a++) { 3580 for (int a = 0; a < 3; a++) {
3595 InterpreterTester tester(handles.main_isolate(), script.c_str()); 3581 InterpreterTester tester(isolate, script.c_str());
3596 auto callable = tester.GetCallable<Handle<Object>>(); 3582 auto callable = tester.GetCallable<Handle<Object>>();
3597 Handle<Object> argument = factory->NewNumberFromInt(a); 3583 Handle<Object> argument = factory->NewNumberFromInt(a);
3598 Handle<Object> return_val = callable(argument).ToHandleChecked(); 3584 Handle<Object> return_val = callable(argument).ToHandleChecked();
3599 static const int results[] = {11, 12, 2}; 3585 static const int results[] = {11, 12, 2};
3600 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); 3586 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]);
3601 } 3587 }
3602 } 3588 }
3603 } 3589 }
3604 3590
3605 3591
3606 TEST(InterpreterEval) { 3592 TEST(InterpreterEval) {
3607 HandleAndZoneScope handles; 3593 HandleAndZoneScope handles;
3608 i::Isolate* isolate = handles.main_isolate(); 3594 Isolate* isolate = handles.main_isolate();
3609 i::Factory* factory = isolate->factory(); 3595 Factory* factory = isolate->factory();
3610 3596
3611 std::pair<const char*, Handle<Object>> eval[] = { 3597 std::pair<const char*, Handle<Object>> eval[] = {
3612 {"return eval('1;');", handle(Smi::FromInt(1), isolate)}, 3598 {"return eval('1;');", handle(Smi::FromInt(1), isolate)},
3613 {"return eval('100 * 20;');", handle(Smi::FromInt(2000), isolate)}, 3599 {"return eval('100 * 20;');", handle(Smi::FromInt(2000), isolate)},
3614 {"var x = 10; return eval('x + 20;');", 3600 {"var x = 10; return eval('x + 20;');",
3615 handle(Smi::FromInt(30), isolate)}, 3601 handle(Smi::FromInt(30), isolate)},
3616 {"var x = 10; eval('x = 33;'); return x;", 3602 {"var x = 10; eval('x = 33;'); return x;",
3617 handle(Smi::FromInt(33), isolate)}, 3603 handle(Smi::FromInt(33), isolate)},
3618 {"'use strict'; var x = 20; var z = 0;\n" 3604 {"'use strict'; var x = 20; var z = 0;\n"
3619 "eval('var x = 33; z = x;'); return x + z;", 3605 "eval('var x = 33; z = x;'); return x + z;",
(...skipping 17 matching lines...) Expand all
3637 {"eval('var x = 10;'); return typeof x;", 3623 {"eval('var x = 10;'); return typeof x;",
3638 factory->NewStringFromStaticChars("number")}, 3624 factory->NewStringFromStaticChars("number")},
3639 {"var x = {}; eval('var x = 10;'); return typeof x;", 3625 {"var x = {}; eval('var x = 10;'); return typeof x;",
3640 factory->NewStringFromStaticChars("number")}, 3626 factory->NewStringFromStaticChars("number")},
3641 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;", 3627 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;",
3642 factory->NewStringFromStaticChars("object")}, 3628 factory->NewStringFromStaticChars("object")},
3643 }; 3629 };
3644 3630
3645 for (size_t i = 0; i < arraysize(eval); i++) { 3631 for (size_t i = 0; i < arraysize(eval); i++) {
3646 std::string source(InterpreterTester::SourceForBody(eval[i].first)); 3632 std::string source(InterpreterTester::SourceForBody(eval[i].first));
3647 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3633 InterpreterTester tester(isolate, source.c_str());
3648 auto callable = tester.GetCallable<>(); 3634 auto callable = tester.GetCallable<>();
3649 Handle<i::Object> return_value = callable().ToHandleChecked(); 3635 Handle<i::Object> return_value = callable().ToHandleChecked();
3650 CHECK(return_value->SameValue(*eval[i].second)); 3636 CHECK(return_value->SameValue(*eval[i].second));
3651 } 3637 }
3652 } 3638 }
3653 3639
3654 3640
3655 TEST(InterpreterEvalParams) { 3641 TEST(InterpreterEvalParams) {
3656 HandleAndZoneScope handles; 3642 HandleAndZoneScope handles;
3657 i::Isolate* isolate = handles.main_isolate(); 3643 Isolate* isolate = handles.main_isolate();
3658 3644
3659 std::pair<const char*, Handle<Object>> eval_params[] = { 3645 std::pair<const char*, Handle<Object>> eval_params[] = {
3660 {"var x = 10; return eval('x + p1;');", 3646 {"var x = 10; return eval('x + p1;');",
3661 handle(Smi::FromInt(30), isolate)}, 3647 handle(Smi::FromInt(30), isolate)},
3662 {"var x = 10; eval('p1 = x;'); return p1;", 3648 {"var x = 10; eval('p1 = x;'); return p1;",
3663 handle(Smi::FromInt(10), isolate)}, 3649 handle(Smi::FromInt(10), isolate)},
3664 {"var a = 10;" 3650 {"var a = 10;"
3665 "function inner() { return eval('a + p1;');}" 3651 "function inner() { return eval('a + p1;');}"
3666 "return inner();", 3652 "return inner();",
3667 handle(Smi::FromInt(30), isolate)}, 3653 handle(Smi::FromInt(30), isolate)},
3668 }; 3654 };
3669 3655
3670 for (size_t i = 0; i < arraysize(eval_params); i++) { 3656 for (size_t i = 0; i < arraysize(eval_params); i++) {
3671 std::string source = "function " + InterpreterTester::function_name() + 3657 std::string source = "function " + InterpreterTester::function_name() +
3672 "(p1) {" + eval_params[i].first + "}"; 3658 "(p1) {" + eval_params[i].first + "}";
3673 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3659 InterpreterTester tester(isolate, source.c_str());
3674 auto callable = tester.GetCallable<Handle<Object>>(); 3660 auto callable = tester.GetCallable<Handle<Object>>();
3675 3661
3676 Handle<i::Object> return_value = 3662 Handle<i::Object> return_value =
3677 callable(handle(Smi::FromInt(20), isolate)).ToHandleChecked(); 3663 callable(handle(Smi::FromInt(20), isolate)).ToHandleChecked();
3678 CHECK(return_value->SameValue(*eval_params[i].second)); 3664 CHECK(return_value->SameValue(*eval_params[i].second));
3679 } 3665 }
3680 } 3666 }
3681 3667
3682 3668
3683 TEST(InterpreterEvalGlobal) { 3669 TEST(InterpreterEvalGlobal) {
3684 HandleAndZoneScope handles; 3670 HandleAndZoneScope handles;
3685 i::Isolate* isolate = handles.main_isolate(); 3671 Isolate* isolate = handles.main_isolate();
3686 i::Factory* factory = isolate->factory(); 3672 Factory* factory = isolate->factory();
3687 3673
3688 std::pair<const char*, Handle<Object>> eval_global[] = { 3674 std::pair<const char*, Handle<Object>> eval_global[] = {
3689 {"function add_global() { eval('function test() { z = 33; }; test()'); };" 3675 {"function add_global() { eval('function test() { z = 33; }; test()'); };"
3690 "function f() { add_global(); return z; }; f();", 3676 "function f() { add_global(); return z; }; f();",
3691 handle(Smi::FromInt(33), isolate)}, 3677 handle(Smi::FromInt(33), isolate)},
3692 {"function add_global() {\n" 3678 {"function add_global() {\n"
3693 " eval('\"use strict\"; function test() { y = 33; };" 3679 " eval('\"use strict\"; function test() { y = 33; };"
3694 " try { test() } catch(e) {}');\n" 3680 " try { test() } catch(e) {}');\n"
3695 "}\n" 3681 "}\n"
3696 "function f() { add_global(); return typeof y; } f();", 3682 "function f() { add_global(); return typeof y; } f();",
3697 factory->NewStringFromStaticChars("undefined")}, 3683 factory->NewStringFromStaticChars("undefined")},
3698 }; 3684 };
3699 3685
3700 for (size_t i = 0; i < arraysize(eval_global); i++) { 3686 for (size_t i = 0; i < arraysize(eval_global); i++) {
3701 InterpreterTester tester(handles.main_isolate(), eval_global[i].first, 3687 InterpreterTester tester(isolate, eval_global[i].first, "test");
3702 "test");
3703 auto callable = tester.GetCallable<>(); 3688 auto callable = tester.GetCallable<>();
3704 3689
3705 Handle<i::Object> return_value = callable().ToHandleChecked(); 3690 Handle<i::Object> return_value = callable().ToHandleChecked();
3706 CHECK(return_value->SameValue(*eval_global[i].second)); 3691 CHECK(return_value->SameValue(*eval_global[i].second));
3707 } 3692 }
3708 } 3693 }
3709 3694
3710 3695
3711 TEST(InterpreterEvalVariableDecl) { 3696 TEST(InterpreterEvalVariableDecl) {
3712 HandleAndZoneScope handles; 3697 HandleAndZoneScope handles;
3713 i::Isolate* isolate = handles.main_isolate(); 3698 Isolate* isolate = handles.main_isolate();
3714 i::Factory* factory = isolate->factory(); 3699 Factory* factory = isolate->factory();
3715 3700
3716 std::pair<const char*, Handle<Object>> eval_global[] = { 3701 std::pair<const char*, Handle<Object>> eval_global[] = {
3717 {"function f() { eval('var x = 10; x++;'); return x; }", 3702 {"function f() { eval('var x = 10; x++;'); return x; }",
3718 handle(Smi::FromInt(11), isolate)}, 3703 handle(Smi::FromInt(11), isolate)},
3719 {"function f() { var x = 20; eval('var x = 10; x++;'); return x; }", 3704 {"function f() { var x = 20; eval('var x = 10; x++;'); return x; }",
3720 handle(Smi::FromInt(11), isolate)}, 3705 handle(Smi::FromInt(11), isolate)},
3721 {"function f() {" 3706 {"function f() {"
3722 " var x = 20;" 3707 " var x = 20;"
3723 " eval('\"use strict\"; var x = 10; x++;');" 3708 " eval('\"use strict\"; var x = 10; x++;');"
3724 " return x; }", 3709 " return x; }",
(...skipping 17 matching lines...) Expand all
3742 " eval('\"use strict\"; " 3727 " eval('\"use strict\"; "
3743 " var x = 20; " 3728 " var x = 20; "
3744 " get_eval_x = function func() {return x;};');\n" 3729 " get_eval_x = function func() {return x;};');\n"
3745 " return get_eval_x() + x;\n" 3730 " return get_eval_x() + x;\n"
3746 "}", 3731 "}",
3747 handle(Smi::FromInt(23), isolate)}, 3732 handle(Smi::FromInt(23), isolate)},
3748 // TODO(mythria): Add tests with const declarations. 3733 // TODO(mythria): Add tests with const declarations.
3749 }; 3734 };
3750 3735
3751 for (size_t i = 0; i < arraysize(eval_global); i++) { 3736 for (size_t i = 0; i < arraysize(eval_global); i++) {
3752 InterpreterTester tester(handles.main_isolate(), eval_global[i].first, "*"); 3737 InterpreterTester tester(isolate, eval_global[i].first, "*");
3753 auto callable = tester.GetCallable<>(); 3738 auto callable = tester.GetCallable<>();
3754 3739
3755 Handle<i::Object> return_value = callable().ToHandleChecked(); 3740 Handle<i::Object> return_value = callable().ToHandleChecked();
3756 CHECK(return_value->SameValue(*eval_global[i].second)); 3741 CHECK(return_value->SameValue(*eval_global[i].second));
3757 } 3742 }
3758 } 3743 }
3759 3744
3760 3745
3761 TEST(InterpreterEvalFunctionDecl) { 3746 TEST(InterpreterEvalFunctionDecl) {
3762 HandleAndZoneScope handles; 3747 HandleAndZoneScope handles;
3763 i::Isolate* isolate = handles.main_isolate(); 3748 Isolate* isolate = handles.main_isolate();
3764 3749
3765 std::pair<const char*, Handle<Object>> eval_func_decl[] = { 3750 std::pair<const char*, Handle<Object>> eval_func_decl[] = {
3766 {"function f() {\n" 3751 {"function f() {\n"
3767 " var x = 3;\n" 3752 " var x = 3;\n"
3768 " eval('var x = 20;" 3753 " eval('var x = 20;"
3769 " function get_x() {return x;};');\n" 3754 " function get_x() {return x;};');\n"
3770 " return get_x() + x;\n" 3755 " return get_x() + x;\n"
3771 "}", 3756 "}",
3772 handle(Smi::FromInt(40), isolate)}, 3757 handle(Smi::FromInt(40), isolate)},
3773 }; 3758 };
3774 3759
3775 for (size_t i = 0; i < arraysize(eval_func_decl); i++) { 3760 for (size_t i = 0; i < arraysize(eval_func_decl); i++) {
3776 InterpreterTester tester(handles.main_isolate(), eval_func_decl[i].first, 3761 InterpreterTester tester(isolate, eval_func_decl[i].first, "*");
3777 "*");
3778 auto callable = tester.GetCallable<>(); 3762 auto callable = tester.GetCallable<>();
3779 3763
3780 Handle<i::Object> return_value = callable().ToHandleChecked(); 3764 Handle<i::Object> return_value = callable().ToHandleChecked();
3781 CHECK(return_value->SameValue(*eval_func_decl[i].second)); 3765 CHECK(return_value->SameValue(*eval_func_decl[i].second));
3782 } 3766 }
3783 } 3767 }
3784 3768
3785 TEST(InterpreterWideRegisterArithmetic) { 3769 TEST(InterpreterWideRegisterArithmetic) {
3786 HandleAndZoneScope handles; 3770 HandleAndZoneScope handles;
3787 i::Isolate* isolate = handles.main_isolate(); 3771 Isolate* isolate = handles.main_isolate();
3788 3772
3789 static const size_t kMaxRegisterForTest = 150; 3773 static const size_t kMaxRegisterForTest = 150;
3790 std::ostringstream os; 3774 std::ostringstream os;
3791 os << "function " << InterpreterTester::function_name() << "(arg) {\n"; 3775 os << "function " << InterpreterTester::function_name() << "(arg) {\n";
3792 os << " var retval = -77;\n"; 3776 os << " var retval = -77;\n";
3793 for (size_t i = 0; i < kMaxRegisterForTest; i++) { 3777 for (size_t i = 0; i < kMaxRegisterForTest; i++) {
3794 os << " var x" << i << " = " << i << ";\n"; 3778 os << " var x" << i << " = " << i << ";\n";
3795 } 3779 }
3796 for (size_t i = 0; i < kMaxRegisterForTest / 2; i++) { 3780 for (size_t i = 0; i < kMaxRegisterForTest / 2; i++) {
3797 size_t j = kMaxRegisterForTest - i - 1; 3781 size_t j = kMaxRegisterForTest - i - 1;
3798 os << " var tmp = x" << j << ";\n"; 3782 os << " var tmp = x" << j << ";\n";
3799 os << " var x" << j << " = x" << i << ";\n"; 3783 os << " var x" << j << " = x" << i << ";\n";
3800 os << " var x" << i << " = tmp;\n"; 3784 os << " var x" << i << " = tmp;\n";
3801 } 3785 }
3802 for (size_t i = 0; i < kMaxRegisterForTest / 2; i++) { 3786 for (size_t i = 0; i < kMaxRegisterForTest / 2; i++) {
3803 size_t j = kMaxRegisterForTest - i - 1; 3787 size_t j = kMaxRegisterForTest - i - 1;
3804 os << " var tmp = x" << j << ";\n"; 3788 os << " var tmp = x" << j << ";\n";
3805 os << " var x" << j << " = x" << i << ";\n"; 3789 os << " var x" << j << " = x" << i << ";\n";
3806 os << " var x" << i << " = tmp;\n"; 3790 os << " var x" << i << " = tmp;\n";
3807 } 3791 }
3808 for (size_t i = 0; i < kMaxRegisterForTest; i++) { 3792 for (size_t i = 0; i < kMaxRegisterForTest; i++) {
3809 os << " if (arg == " << i << ") {\n" // 3793 os << " if (arg == " << i << ") {\n" //
3810 << " retval = x" << i << ";\n" // 3794 << " retval = x" << i << ";\n" //
3811 << " }\n"; // 3795 << " }\n"; //
3812 } 3796 }
3813 os << " return retval;\n"; 3797 os << " return retval;\n";
3814 os << "}\n"; 3798 os << "}\n";
3815 3799
3816 std::string source = os.str(); 3800 std::string source = os.str();
3817 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3801 InterpreterTester tester(isolate, source.c_str());
3818 auto callable = tester.GetCallable<Handle<Object>>(); 3802 auto callable = tester.GetCallable<Handle<Object>>();
3819 for (size_t i = 0; i < kMaxRegisterForTest; i++) { 3803 for (size_t i = 0; i < kMaxRegisterForTest; i++) {
3820 Handle<Object> arg = handle(Smi::FromInt(static_cast<int>(i)), isolate); 3804 Handle<Object> arg = handle(Smi::FromInt(static_cast<int>(i)), isolate);
3821 Handle<Object> return_value = callable(arg).ToHandleChecked(); 3805 Handle<Object> return_value = callable(arg).ToHandleChecked();
3822 CHECK(return_value->SameValue(*arg)); 3806 CHECK(return_value->SameValue(*arg));
3823 } 3807 }
3824 } 3808 }
3825 3809
3826 TEST(InterpreterCallWideRegisters) { 3810 TEST(InterpreterCallWideRegisters) {
3827 static const int kPeriod = 25; 3811 static const int kPeriod = 25;
3828 static const int kLength = 512; 3812 static const int kLength = 512;
3829 static const int kStartChar = 65; 3813 static const int kStartChar = 65;
3830 3814
3815 HandleAndZoneScope handles;
3816 Isolate* isolate = handles.main_isolate();
3817
3831 for (int pass = 0; pass < 3; pass += 1) { 3818 for (int pass = 0; pass < 3; pass += 1) {
3832 std::ostringstream os; 3819 std::ostringstream os;
3833 for (int i = 0; i < pass * 97; i += 1) { 3820 for (int i = 0; i < pass * 97; i += 1) {
3834 os << "var x" << i << " = " << i << "\n"; 3821 os << "var x" << i << " = " << i << "\n";
3835 } 3822 }
3836 os << "return String.fromCharCode("; 3823 os << "return String.fromCharCode(";
3837 os << kStartChar; 3824 os << kStartChar;
3838 for (int i = 1; i < kLength; i += 1) { 3825 for (int i = 1; i < kLength; i += 1) {
3839 os << "," << kStartChar + (i % kPeriod); 3826 os << "," << kStartChar + (i % kPeriod);
3840 } 3827 }
3841 os << ");"; 3828 os << ");";
3842 std::string source = InterpreterTester::SourceForBody(os.str().c_str()); 3829 std::string source = InterpreterTester::SourceForBody(os.str().c_str());
3843 HandleAndZoneScope handles; 3830 InterpreterTester tester(isolate, source.c_str());
3844 InterpreterTester tester(handles.main_isolate(), source.c_str());
3845 auto callable = tester.GetCallable(); 3831 auto callable = tester.GetCallable();
3846 Handle<Object> return_val = callable().ToHandleChecked(); 3832 Handle<Object> return_val = callable().ToHandleChecked();
3847 Handle<String> return_string = Handle<String>::cast(return_val); 3833 Handle<String> return_string = Handle<String>::cast(return_val);
3848 CHECK_EQ(return_string->length(), kLength); 3834 CHECK_EQ(return_string->length(), kLength);
3849 for (int i = 0; i < kLength; i += 1) { 3835 for (int i = 0; i < kLength; i += 1) {
3850 CHECK_EQ(return_string->Get(i), 65 + (i % kPeriod)); 3836 CHECK_EQ(return_string->Get(i), 65 + (i % kPeriod));
3851 } 3837 }
3852 } 3838 }
3853 } 3839 }
3854 3840
3855 TEST(InterpreterWideParametersPickOne) { 3841 TEST(InterpreterWideParametersPickOne) {
3842 HandleAndZoneScope handles;
3843 Isolate* isolate = handles.main_isolate();
3856 static const int kParameterCount = 130; 3844 static const int kParameterCount = 130;
3857 for (int parameter = 0; parameter < 10; parameter++) { 3845 for (int parameter = 0; parameter < 10; parameter++) {
3858 HandleAndZoneScope handles;
3859 i::Isolate* isolate = handles.main_isolate();
3860 std::ostringstream os; 3846 std::ostringstream os;
3861 os << "function " << InterpreterTester::function_name() << "(arg) {\n"; 3847 os << "function " << InterpreterTester::function_name() << "(arg) {\n";
3862 os << " function selector(i"; 3848 os << " function selector(i";
3863 for (int i = 0; i < kParameterCount; i++) { 3849 for (int i = 0; i < kParameterCount; i++) {
3864 os << "," 3850 os << ","
3865 << "a" << i; 3851 << "a" << i;
3866 } 3852 }
3867 os << ") {\n"; 3853 os << ") {\n";
3868 os << " return a" << parameter << ";\n"; 3854 os << " return a" << parameter << ";\n";
3869 os << " };\n"; 3855 os << " };\n";
3870 os << " return selector(arg"; 3856 os << " return selector(arg";
3871 for (int i = 0; i < kParameterCount; i++) { 3857 for (int i = 0; i < kParameterCount; i++) {
3872 os << "," << i; 3858 os << "," << i;
3873 } 3859 }
3874 os << ");"; 3860 os << ");";
3875 os << "}\n"; 3861 os << "}\n";
3876 3862
3877 std::string source = os.str(); 3863 std::string source = os.str();
3878 InterpreterTester tester(handles.main_isolate(), source.c_str(), "*"); 3864 InterpreterTester tester(isolate, source.c_str(), "*");
3879 auto callable = tester.GetCallable<Handle<Object>>(); 3865 auto callable = tester.GetCallable<Handle<Object>>();
3880 Handle<Object> arg = handle(Smi::FromInt(0xaa55), isolate); 3866 Handle<Object> arg = handle(Smi::FromInt(0xaa55), isolate);
3881 Handle<Object> return_value = callable(arg).ToHandleChecked(); 3867 Handle<Object> return_value = callable(arg).ToHandleChecked();
3882 Handle<Smi> actual = Handle<Smi>::cast(return_value); 3868 Handle<Smi> actual = Handle<Smi>::cast(return_value);
3883 CHECK_EQ(actual->value(), parameter); 3869 CHECK_EQ(actual->value(), parameter);
3884 } 3870 }
3885 } 3871 }
3886 3872
3887 TEST(InterpreterWideParametersSummation) { 3873 TEST(InterpreterWideParametersSummation) {
3888 static int kParameterCount = 200; 3874 static int kParameterCount = 200;
3889 static int kBaseValue = 17000; 3875 static int kBaseValue = 17000;
3890 HandleAndZoneScope handles; 3876 HandleAndZoneScope handles;
3891 i::Isolate* isolate = handles.main_isolate(); 3877 Isolate* isolate = handles.main_isolate();
3892 std::ostringstream os; 3878 std::ostringstream os;
3893 os << "function " << InterpreterTester::function_name() << "(arg) {\n"; 3879 os << "function " << InterpreterTester::function_name() << "(arg) {\n";
3894 os << " function summation(i"; 3880 os << " function summation(i";
3895 for (int i = 0; i < kParameterCount; i++) { 3881 for (int i = 0; i < kParameterCount; i++) {
3896 os << "," 3882 os << ","
3897 << "a" << i; 3883 << "a" << i;
3898 } 3884 }
3899 os << ") {\n"; 3885 os << ") {\n";
3900 os << " var sum = " << kBaseValue << ";\n"; 3886 os << " var sum = " << kBaseValue << ";\n";
3901 os << " switch(i) {\n"; 3887 os << " switch(i) {\n";
3902 for (int i = 0; i < kParameterCount; i++) { 3888 for (int i = 0; i < kParameterCount; i++) {
3903 int j = kParameterCount - i - 1; 3889 int j = kParameterCount - i - 1;
3904 os << " case " << j << ": sum += a" << j << ";\n"; 3890 os << " case " << j << ": sum += a" << j << ";\n";
3905 } 3891 }
3906 os << " }\n"; 3892 os << " }\n";
3907 os << " return sum;\n"; 3893 os << " return sum;\n";
3908 os << " };\n"; 3894 os << " };\n";
3909 os << " return summation(arg"; 3895 os << " return summation(arg";
3910 for (int i = 0; i < kParameterCount; i++) { 3896 for (int i = 0; i < kParameterCount; i++) {
3911 os << "," << i; 3897 os << "," << i;
3912 } 3898 }
3913 os << ");"; 3899 os << ");";
3914 os << "}\n"; 3900 os << "}\n";
3915 3901
3916 std::string source = os.str(); 3902 std::string source = os.str();
3917 InterpreterTester tester(handles.main_isolate(), source.c_str(), "*"); 3903 InterpreterTester tester(isolate, source.c_str(), "*");
3918 auto callable = tester.GetCallable<Handle<Object>>(); 3904 auto callable = tester.GetCallable<Handle<Object>>();
3919 for (int i = 0; i < kParameterCount; i++) { 3905 for (int i = 0; i < kParameterCount; i++) {
3920 Handle<Object> arg = handle(Smi::FromInt(i), isolate); 3906 Handle<Object> arg = handle(Smi::FromInt(i), isolate);
3921 Handle<Object> return_value = callable(arg).ToHandleChecked(); 3907 Handle<Object> return_value = callable(arg).ToHandleChecked();
3922 int expected = kBaseValue + i * (i + 1) / 2; 3908 int expected = kBaseValue + i * (i + 1) / 2;
3923 Handle<Smi> actual = Handle<Smi>::cast(return_value); 3909 Handle<Smi> actual = Handle<Smi>::cast(return_value);
3924 CHECK_EQ(actual->value(), expected); 3910 CHECK_EQ(actual->value(), expected);
3925 } 3911 }
3926 } 3912 }
3927 3913
3928 TEST(InterpreterDoExpression) { 3914 TEST(InterpreterDoExpression) {
3929 bool old_flag = FLAG_harmony_do_expressions; 3915 bool old_flag = FLAG_harmony_do_expressions;
3930 FLAG_harmony_do_expressions = true; 3916 FLAG_harmony_do_expressions = true;
3931 3917
3932 HandleAndZoneScope handles; 3918 HandleAndZoneScope handles;
3933 i::Isolate* isolate = handles.main_isolate(); 3919 Isolate* isolate = handles.main_isolate();
3934 Factory* factory = isolate->factory(); 3920 Factory* factory = isolate->factory();
3935 3921
3936 std::pair<const char*, Handle<Object>> do_expr[] = { 3922 std::pair<const char*, Handle<Object>> do_expr[] = {
3937 {"var a = do {}; return a;", factory->undefined_value()}, 3923 {"var a = do {}; return a;", factory->undefined_value()},
3938 {"var a = do { var x = 100; }; return a;", factory->undefined_value()}, 3924 {"var a = do { var x = 100; }; return a;", factory->undefined_value()},
3939 {"var a = do { var x = 100; }; return a;", factory->undefined_value()}, 3925 {"var a = do { var x = 100; }; return a;", factory->undefined_value()},
3940 {"var a = do { var x = 100; x++; }; return a;", 3926 {"var a = do { var x = 100; x++; }; return a;",
3941 handle(Smi::FromInt(100), isolate)}, 3927 handle(Smi::FromInt(100), isolate)},
3942 {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};" 3928 {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};"
3943 "return i;", 3929 "return i;",
3944 handle(Smi::FromInt(3), isolate)}, 3930 handle(Smi::FromInt(3), isolate)},
3945 }; 3931 };
3946 3932
3947 for (size_t i = 0; i < arraysize(do_expr); i++) { 3933 for (size_t i = 0; i < arraysize(do_expr); i++) {
3948 std::string source(InterpreterTester::SourceForBody(do_expr[i].first)); 3934 std::string source(InterpreterTester::SourceForBody(do_expr[i].first));
3949 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3935 InterpreterTester tester(isolate, source.c_str());
3950 auto callable = tester.GetCallable<>(); 3936 auto callable = tester.GetCallable<>();
3951 3937
3952 Handle<i::Object> return_value = callable().ToHandleChecked(); 3938 Handle<i::Object> return_value = callable().ToHandleChecked();
3953 CHECK(return_value->SameValue(*do_expr[i].second)); 3939 CHECK(return_value->SameValue(*do_expr[i].second));
3954 } 3940 }
3955 3941
3956 FLAG_harmony_do_expressions = old_flag; 3942 FLAG_harmony_do_expressions = old_flag;
3957 } 3943 }
3958 3944
3959 TEST(InterpreterWithStatement) { 3945 TEST(InterpreterWithStatement) {
3960 HandleAndZoneScope handles; 3946 HandleAndZoneScope handles;
3961 i::Isolate* isolate = handles.main_isolate(); 3947 Isolate* isolate = handles.main_isolate();
3962 3948
3963 std::pair<const char*, Handle<Object>> with_stmt[] = { 3949 std::pair<const char*, Handle<Object>> with_stmt[] = {
3964 {"with({x:42}) return x;", handle(Smi::FromInt(42), isolate)}, 3950 {"with({x:42}) return x;", handle(Smi::FromInt(42), isolate)},
3965 {"with({}) { var y = 10; return y;}", handle(Smi::FromInt(10), isolate)}, 3951 {"with({}) { var y = 10; return y;}", handle(Smi::FromInt(10), isolate)},
3966 {"var y = {x:42};" 3952 {"var y = {x:42};"
3967 " function inner() {" 3953 " function inner() {"
3968 " var x = 20;" 3954 " var x = 20;"
3969 " with(y) return x;" 3955 " with(y) return x;"
3970 "}" 3956 "}"
3971 "return inner();", 3957 "return inner();",
3972 handle(Smi::FromInt(42), isolate)}, 3958 handle(Smi::FromInt(42), isolate)},
3973 {"var y = {x:42};" 3959 {"var y = {x:42};"
3974 " function inner(o) {" 3960 " function inner(o) {"
3975 " var x = 20;" 3961 " var x = 20;"
3976 " with(o) return x;" 3962 " with(o) return x;"
3977 "}" 3963 "}"
3978 "return inner(y);", 3964 "return inner(y);",
3979 handle(Smi::FromInt(42), isolate)}, 3965 handle(Smi::FromInt(42), isolate)},
3980 }; 3966 };
3981 3967
3982 for (size_t i = 0; i < arraysize(with_stmt); i++) { 3968 for (size_t i = 0; i < arraysize(with_stmt); i++) {
3983 std::string source(InterpreterTester::SourceForBody(with_stmt[i].first)); 3969 std::string source(InterpreterTester::SourceForBody(with_stmt[i].first));
3984 InterpreterTester tester(handles.main_isolate(), source.c_str()); 3970 InterpreterTester tester(isolate, source.c_str());
3985 auto callable = tester.GetCallable<>(); 3971 auto callable = tester.GetCallable<>();
3986 3972
3987 Handle<i::Object> return_value = callable().ToHandleChecked(); 3973 Handle<i::Object> return_value = callable().ToHandleChecked();
3988 CHECK(return_value->SameValue(*with_stmt[i].second)); 3974 CHECK(return_value->SameValue(*with_stmt[i].second));
3989 } 3975 }
3990 } 3976 }
3991 3977
3992 TEST(InterpreterClassLiterals) { 3978 TEST(InterpreterClassLiterals) {
3993 HandleAndZoneScope handles; 3979 HandleAndZoneScope handles;
3994 i::Isolate* isolate = handles.main_isolate(); 3980 Isolate* isolate = handles.main_isolate();
3995 std::pair<const char*, Handle<Object>> examples[] = { 3981 std::pair<const char*, Handle<Object>> examples[] = {
3996 {"class C {\n" 3982 {"class C {\n"
3997 " constructor(x) { this.x_ = x; }\n" 3983 " constructor(x) { this.x_ = x; }\n"
3998 " method() { return this.x_; }\n" 3984 " method() { return this.x_; }\n"
3999 "}\n" 3985 "}\n"
4000 "return new C(99).method();", 3986 "return new C(99).method();",
4001 handle(Smi::FromInt(99), isolate)}, 3987 handle(Smi::FromInt(99), isolate)},
4002 {"class C {\n" 3988 {"class C {\n"
4003 " constructor(x) { this.x_ = x; }\n" 3989 " constructor(x) { this.x_ = x; }\n"
4004 " static static_method(x) { return x; }\n" 3990 " static static_method(x) { return x; }\n"
(...skipping 30 matching lines...) Expand all
4035 {"var method = 'f';" 4021 {"var method = 'f';"
4036 "class C {\n" 4022 "class C {\n"
4037 " [method]() { return 106; }\n" 4023 " [method]() { return 106; }\n"
4038 "}\n" 4024 "}\n"
4039 "return new C().f();", 4025 "return new C().f();",
4040 handle(Smi::FromInt(106), isolate)}, 4026 handle(Smi::FromInt(106), isolate)},
4041 }; 4027 };
4042 4028
4043 for (size_t i = 0; i < arraysize(examples); ++i) { 4029 for (size_t i = 0; i < arraysize(examples); ++i) {
4044 std::string source(InterpreterTester::SourceForBody(examples[i].first)); 4030 std::string source(InterpreterTester::SourceForBody(examples[i].first));
4045 InterpreterTester tester(handles.main_isolate(), source.c_str(), "*"); 4031 InterpreterTester tester(isolate, source.c_str(), "*");
4046 auto callable = tester.GetCallable<>(); 4032 auto callable = tester.GetCallable<>();
4047 4033
4048 Handle<i::Object> return_value = callable().ToHandleChecked(); 4034 Handle<i::Object> return_value = callable().ToHandleChecked();
4049 CHECK(return_value->SameValue(*examples[i].second)); 4035 CHECK(return_value->SameValue(*examples[i].second));
4050 } 4036 }
4051 } 4037 }
4052 4038
4053 TEST(InterpreterClassAndSuperClass) { 4039 TEST(InterpreterClassAndSuperClass) {
4054 HandleAndZoneScope handles; 4040 HandleAndZoneScope handles;
4055 i::Isolate* isolate = handles.main_isolate(); 4041 Isolate* isolate = handles.main_isolate();
4056 std::pair<const char*, Handle<Object>> examples[] = { 4042 std::pair<const char*, Handle<Object>> examples[] = {
4057 {"class A {\n" 4043 {"class A {\n"
4058 " constructor(x) { this.x_ = x; }\n" 4044 " constructor(x) { this.x_ = x; }\n"
4059 " method() { return this.x_; }\n" 4045 " method() { return this.x_; }\n"
4060 "}\n" 4046 "}\n"
4061 "class B extends A {\n" 4047 "class B extends A {\n"
4062 " constructor(x, y) { super(x); this.y_ = y; }\n" 4048 " constructor(x, y) { super(x); this.y_ = y; }\n"
4063 " method() { return super.method() + 1; }\n" 4049 " method() { return super.method() + 1; }\n"
4064 "}\n" 4050 "}\n"
4065 "return new B(998, 0).method();\n", 4051 "return new B(998, 0).method();\n",
(...skipping 29 matching lines...) Expand all
4095 "return new B().method();\n", 4081 "return new B().method();\n",
4096 handle(Smi::FromInt(1), isolate)}, 4082 handle(Smi::FromInt(1), isolate)},
4097 {"var object = { setY(v) { super.y = v; }};\n" 4083 {"var object = { setY(v) { super.y = v; }};\n"
4098 "object.setY(10);\n" 4084 "object.setY(10);\n"
4099 "return object.y;\n", 4085 "return object.y;\n",
4100 handle(Smi::FromInt(10), isolate)}, 4086 handle(Smi::FromInt(10), isolate)},
4101 }; 4087 };
4102 4088
4103 for (size_t i = 0; i < arraysize(examples); ++i) { 4089 for (size_t i = 0; i < arraysize(examples); ++i) {
4104 std::string source(InterpreterTester::SourceForBody(examples[i].first)); 4090 std::string source(InterpreterTester::SourceForBody(examples[i].first));
4105 InterpreterTester tester(handles.main_isolate(), source.c_str(), "*"); 4091 InterpreterTester tester(isolate, source.c_str(), "*");
4106 auto callable = tester.GetCallable<>(); 4092 auto callable = tester.GetCallable<>();
4107 Handle<i::Object> return_value = callable().ToHandleChecked(); 4093 Handle<i::Object> return_value = callable().ToHandleChecked();
4108 CHECK(return_value->SameValue(*examples[i].second)); 4094 CHECK(return_value->SameValue(*examples[i].second));
4109 } 4095 }
4110 } 4096 }
4111 4097
4112 TEST(InterpreterConstDeclaration) { 4098 TEST(InterpreterConstDeclaration) {
4113 HandleAndZoneScope handles; 4099 HandleAndZoneScope handles;
4114 i::Isolate* isolate = handles.main_isolate(); 4100 Isolate* isolate = handles.main_isolate();
4115 i::Factory* factory = isolate->factory(); 4101 Factory* factory = isolate->factory();
4116 4102
4117 std::pair<const char*, Handle<Object>> const_decl[] = { 4103 std::pair<const char*, Handle<Object>> const_decl[] = {
4118 {"const x = 3; return x;", handle(Smi::FromInt(3), isolate)}, 4104 {"const x = 3; return x;", handle(Smi::FromInt(3), isolate)},
4119 {"let x = 10; x = x + 20; return x;", handle(Smi::FromInt(30), isolate)}, 4105 {"let x = 10; x = x + 20; return x;", handle(Smi::FromInt(30), isolate)},
4120 {"let x = 10; x = 20; return x;", handle(Smi::FromInt(20), isolate)}, 4106 {"let x = 10; x = 20; return x;", handle(Smi::FromInt(20), isolate)},
4121 {"let x; x = 20; return x;", handle(Smi::FromInt(20), isolate)}, 4107 {"let x; x = 20; return x;", handle(Smi::FromInt(20), isolate)},
4122 {"let x; return x;", factory->undefined_value()}, 4108 {"let x; return x;", factory->undefined_value()},
4123 {"var x = 10; { let x = 30; } return x;", 4109 {"var x = 10; { let x = 30; } return x;",
4124 handle(Smi::FromInt(10), isolate)}, 4110 handle(Smi::FromInt(10), isolate)},
4125 {"let x = 10; { let x = 20; } return x;", 4111 {"let x = 10; { let x = 20; } return x;",
(...skipping 11 matching lines...) Expand all
4137 " const x = i;\n" // const declarations are block scoped. 4123 " const x = i;\n" // const declarations are block scoped.
4138 " a = a + x;\n" 4124 " a = a + x;\n"
4139 "}\n" 4125 "}\n"
4140 "return a;\n", 4126 "return a;\n",
4141 handle(Smi::FromInt(55), isolate)}, 4127 handle(Smi::FromInt(55), isolate)},
4142 }; 4128 };
4143 4129
4144 // Tests for sloppy mode. 4130 // Tests for sloppy mode.
4145 for (size_t i = 0; i < arraysize(const_decl); i++) { 4131 for (size_t i = 0; i < arraysize(const_decl); i++) {
4146 std::string source(InterpreterTester::SourceForBody(const_decl[i].first)); 4132 std::string source(InterpreterTester::SourceForBody(const_decl[i].first));
4147 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4133 InterpreterTester tester(isolate, source.c_str());
4148 auto callable = tester.GetCallable<>(); 4134 auto callable = tester.GetCallable<>();
4149 4135
4150 Handle<i::Object> return_value = callable().ToHandleChecked(); 4136 Handle<i::Object> return_value = callable().ToHandleChecked();
4151 CHECK(return_value->SameValue(*const_decl[i].second)); 4137 CHECK(return_value->SameValue(*const_decl[i].second));
4152 } 4138 }
4153 4139
4154 // Tests for strict mode. 4140 // Tests for strict mode.
4155 for (size_t i = 0; i < arraysize(const_decl); i++) { 4141 for (size_t i = 0; i < arraysize(const_decl); i++) {
4156 std::string strict_body = 4142 std::string strict_body =
4157 "'use strict'; " + std::string(const_decl[i].first); 4143 "'use strict'; " + std::string(const_decl[i].first);
4158 std::string source(InterpreterTester::SourceForBody(strict_body.c_str())); 4144 std::string source(InterpreterTester::SourceForBody(strict_body.c_str()));
4159 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4145 InterpreterTester tester(isolate, source.c_str());
4160 auto callable = tester.GetCallable<>(); 4146 auto callable = tester.GetCallable<>();
4161 4147
4162 Handle<i::Object> return_value = callable().ToHandleChecked(); 4148 Handle<i::Object> return_value = callable().ToHandleChecked();
4163 CHECK(return_value->SameValue(*const_decl[i].second)); 4149 CHECK(return_value->SameValue(*const_decl[i].second));
4164 } 4150 }
4165 } 4151 }
4166 4152
4167 TEST(InterpreterConstDeclarationLookupSlots) { 4153 TEST(InterpreterConstDeclarationLookupSlots) {
4168 HandleAndZoneScope handles; 4154 HandleAndZoneScope handles;
4169 i::Isolate* isolate = handles.main_isolate(); 4155 Isolate* isolate = handles.main_isolate();
4170 i::Factory* factory = isolate->factory(); 4156 Factory* factory = isolate->factory();
4171 4157
4172 std::pair<const char*, Handle<Object>> const_decl[] = { 4158 std::pair<const char*, Handle<Object>> const_decl[] = {
4173 {"const x = 3; function f1() {return x;}; return x;", 4159 {"const x = 3; function f1() {return x;}; return x;",
4174 handle(Smi::FromInt(3), isolate)}, 4160 handle(Smi::FromInt(3), isolate)},
4175 {"let x = 10; x = x + 20; function f1() {return x;}; return x;", 4161 {"let x = 10; x = x + 20; function f1() {return x;}; return x;",
4176 handle(Smi::FromInt(30), isolate)}, 4162 handle(Smi::FromInt(30), isolate)},
4177 {"let x; x = 20; function f1() {return x;}; return x;", 4163 {"let x; x = 20; function f1() {return x;}; return x;",
4178 handle(Smi::FromInt(20), isolate)}, 4164 handle(Smi::FromInt(20), isolate)},
4179 {"let x; function f1() {return x;}; return x;", 4165 {"let x; function f1() {return x;}; return x;",
4180 factory->undefined_value()}, 4166 factory->undefined_value()},
4181 }; 4167 };
4182 4168
4183 // Tests for sloppy mode. 4169 // Tests for sloppy mode.
4184 for (size_t i = 0; i < arraysize(const_decl); i++) { 4170 for (size_t i = 0; i < arraysize(const_decl); i++) {
4185 std::string source(InterpreterTester::SourceForBody(const_decl[i].first)); 4171 std::string source(InterpreterTester::SourceForBody(const_decl[i].first));
4186 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4172 InterpreterTester tester(isolate, source.c_str());
4187 auto callable = tester.GetCallable<>(); 4173 auto callable = tester.GetCallable<>();
4188 4174
4189 Handle<i::Object> return_value = callable().ToHandleChecked(); 4175 Handle<i::Object> return_value = callable().ToHandleChecked();
4190 CHECK(return_value->SameValue(*const_decl[i].second)); 4176 CHECK(return_value->SameValue(*const_decl[i].second));
4191 } 4177 }
4192 4178
4193 // Tests for strict mode. 4179 // Tests for strict mode.
4194 for (size_t i = 0; i < arraysize(const_decl); i++) { 4180 for (size_t i = 0; i < arraysize(const_decl); i++) {
4195 std::string strict_body = 4181 std::string strict_body =
4196 "'use strict'; " + std::string(const_decl[i].first); 4182 "'use strict'; " + std::string(const_decl[i].first);
4197 std::string source(InterpreterTester::SourceForBody(strict_body.c_str())); 4183 std::string source(InterpreterTester::SourceForBody(strict_body.c_str()));
4198 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4184 InterpreterTester tester(isolate, source.c_str());
4199 auto callable = tester.GetCallable<>(); 4185 auto callable = tester.GetCallable<>();
4200 4186
4201 Handle<i::Object> return_value = callable().ToHandleChecked(); 4187 Handle<i::Object> return_value = callable().ToHandleChecked();
4202 CHECK(return_value->SameValue(*const_decl[i].second)); 4188 CHECK(return_value->SameValue(*const_decl[i].second));
4203 } 4189 }
4204 } 4190 }
4205 4191
4206 TEST(InterpreterConstInLookupContextChain) { 4192 TEST(InterpreterConstInLookupContextChain) {
4207 HandleAndZoneScope handles; 4193 HandleAndZoneScope handles;
4208 i::Isolate* isolate = handles.main_isolate(); 4194 Isolate* isolate = handles.main_isolate();
4209 4195
4210 const char* prologue = 4196 const char* prologue =
4211 "function OuterMost() {\n" 4197 "function OuterMost() {\n"
4212 " const outerConst = 10;\n" 4198 " const outerConst = 10;\n"
4213 " let outerLet = 20;\n" 4199 " let outerLet = 20;\n"
4214 " function Outer() {\n" 4200 " function Outer() {\n"
4215 " function Inner() {\n" 4201 " function Inner() {\n"
4216 " this.innerFunc = function() { "; 4202 " this.innerFunc = function() { ";
4217 const char* epilogue = 4203 const char* epilogue =
4218 " }\n" 4204 " }\n"
(...skipping 14 matching lines...) Expand all
4233 handle(Smi::FromInt(40), isolate)}, 4219 handle(Smi::FromInt(40), isolate)},
4234 {"var outerConst = 50; return outerConst;", 4220 {"var outerConst = 50; return outerConst;",
4235 handle(Smi::FromInt(50), isolate)}, 4221 handle(Smi::FromInt(50), isolate)},
4236 {"try { outerConst = 30 } catch(e) { return -1; }", 4222 {"try { outerConst = 30 } catch(e) { return -1; }",
4237 handle(Smi::FromInt(-1), isolate)}}; 4223 handle(Smi::FromInt(-1), isolate)}};
4238 4224
4239 for (size_t i = 0; i < arraysize(const_decl); i++) { 4225 for (size_t i = 0; i < arraysize(const_decl); i++) {
4240 std::string script = std::string(prologue) + 4226 std::string script = std::string(prologue) +
4241 std::string(const_decl[i].first) + 4227 std::string(const_decl[i].first) +
4242 std::string(epilogue); 4228 std::string(epilogue);
4243 InterpreterTester tester(handles.main_isolate(), script.c_str(), "*"); 4229 InterpreterTester tester(isolate, script.c_str(), "*");
4244 auto callable = tester.GetCallable<>(); 4230 auto callable = tester.GetCallable<>();
4245 4231
4246 Handle<i::Object> return_value = callable().ToHandleChecked(); 4232 Handle<i::Object> return_value = callable().ToHandleChecked();
4247 CHECK(return_value->SameValue(*const_decl[i].second)); 4233 CHECK(return_value->SameValue(*const_decl[i].second));
4248 } 4234 }
4249 } 4235 }
4250 4236
4251 TEST(InterpreterIllegalConstDeclaration) { 4237 TEST(InterpreterIllegalConstDeclaration) {
4252 HandleAndZoneScope handles; 4238 HandleAndZoneScope handles;
4239 Isolate* isolate = handles.main_isolate();
4253 4240
4254 std::pair<const char*, const char*> const_decl[] = { 4241 std::pair<const char*, const char*> const_decl[] = {
4255 {"const x = x = 10 + 3; return x;", 4242 {"const x = x = 10 + 3; return x;",
4256 "Uncaught ReferenceError: x is not defined"}, 4243 "Uncaught ReferenceError: x is not defined"},
4257 {"const x = 10; x = 20; return x;", 4244 {"const x = 10; x = 20; return x;",
4258 "Uncaught TypeError: Assignment to constant variable."}, 4245 "Uncaught TypeError: Assignment to constant variable."},
4259 {"const x = 10; { x = 20; } return x;", 4246 {"const x = 10; { x = 20; } return x;",
4260 "Uncaught TypeError: Assignment to constant variable."}, 4247 "Uncaught TypeError: Assignment to constant variable."},
4261 {"const x = 10; eval('x = 20;'); return x;", 4248 {"const x = 10; eval('x = 20;'); return x;",
4262 "Uncaught TypeError: Assignment to constant variable."}, 4249 "Uncaught TypeError: Assignment to constant variable."},
4263 {"let x = x + 10; return x;", 4250 {"let x = x + 10; return x;",
4264 "Uncaught ReferenceError: x is not defined"}, 4251 "Uncaught ReferenceError: x is not defined"},
4265 {"'use strict'; (function f1() { f1 = 123; })() ", 4252 {"'use strict'; (function f1() { f1 = 123; })() ",
4266 "Uncaught TypeError: Assignment to constant variable."}, 4253 "Uncaught TypeError: Assignment to constant variable."},
4267 }; 4254 };
4268 4255
4269 // Tests for sloppy mode. 4256 // Tests for sloppy mode.
4270 for (size_t i = 0; i < arraysize(const_decl); i++) { 4257 for (size_t i = 0; i < arraysize(const_decl); i++) {
4271 std::string source(InterpreterTester::SourceForBody(const_decl[i].first)); 4258 std::string source(InterpreterTester::SourceForBody(const_decl[i].first));
4272 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4259 InterpreterTester tester(isolate, source.c_str());
4273 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); 4260 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
4274 v8::Local<v8::String> expected_string = v8_str(const_decl[i].second); 4261 v8::Local<v8::String> expected_string = v8_str(const_decl[i].second);
4275 CHECK( 4262 CHECK(
4276 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) 4263 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
4277 .FromJust()); 4264 .FromJust());
4278 } 4265 }
4279 4266
4280 // Tests for strict mode. 4267 // Tests for strict mode.
4281 for (size_t i = 0; i < arraysize(const_decl); i++) { 4268 for (size_t i = 0; i < arraysize(const_decl); i++) {
4282 std::string strict_body = 4269 std::string strict_body =
4283 "'use strict'; " + std::string(const_decl[i].first); 4270 "'use strict'; " + std::string(const_decl[i].first);
4284 std::string source(InterpreterTester::SourceForBody(strict_body.c_str())); 4271 std::string source(InterpreterTester::SourceForBody(strict_body.c_str()));
4285 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4272 InterpreterTester tester(isolate, source.c_str());
4286 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); 4273 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
4287 v8::Local<v8::String> expected_string = v8_str(const_decl[i].second); 4274 v8::Local<v8::String> expected_string = v8_str(const_decl[i].second);
4288 CHECK( 4275 CHECK(
4289 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) 4276 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
4290 .FromJust()); 4277 .FromJust());
4291 } 4278 }
4292 } 4279 }
4293 4280
4294 TEST(InterpreterGenerators) { 4281 TEST(InterpreterGenerators) {
4295 HandleAndZoneScope handles; 4282 HandleAndZoneScope handles;
4296 i::Isolate* isolate = handles.main_isolate(); 4283 Isolate* isolate = handles.main_isolate();
4297 i::Factory* factory = isolate->factory(); 4284 Factory* factory = isolate->factory();
4298 4285
4299 std::pair<const char*, Handle<Object>> tests[] = { 4286 std::pair<const char*, Handle<Object>> tests[] = {
4300 {"function* f() { }; return f().next().value", 4287 {"function* f() { }; return f().next().value",
4301 factory->undefined_value()}, 4288 factory->undefined_value()},
4302 {"function* f() { yield 42 }; return f().next().value", 4289 {"function* f() { yield 42 }; return f().next().value",
4303 factory->NewNumberFromInt(42)}, 4290 factory->NewNumberFromInt(42)},
4304 {"function* f() { for (let x of [42]) yield x}; return f().next().value", 4291 {"function* f() { for (let x of [42]) yield x}; return f().next().value",
4305 factory->NewNumberFromInt(42)}, 4292 factory->NewNumberFromInt(42)},
4306 }; 4293 };
4307 4294
4308 for (size_t i = 0; i < arraysize(tests); i++) { 4295 for (size_t i = 0; i < arraysize(tests); i++) {
4309 std::string source(InterpreterTester::SourceForBody(tests[i].first)); 4296 std::string source(InterpreterTester::SourceForBody(tests[i].first));
4310 InterpreterTester tester(handles.main_isolate(), source.c_str()); 4297 InterpreterTester tester(isolate, source.c_str());
4311 auto callable = tester.GetCallable<>(); 4298 auto callable = tester.GetCallable<>();
4312 4299
4313 Handle<i::Object> return_value = callable().ToHandleChecked(); 4300 Handle<i::Object> return_value = callable().ToHandleChecked();
4314 CHECK(return_value->SameValue(*tests[i].second)); 4301 CHECK(return_value->SameValue(*tests[i].second));
4315 } 4302 }
4316 } 4303 }
4317 4304
4318 } // namespace interpreter 4305 } // namespace interpreter
4319 } // namespace internal 4306 } // namespace internal
4320 } // namespace v8 4307 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698