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

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

Issue 1403943004: [Interpreter] Add support for local context loads and stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_contextchain
Patch Set: Add back outer_ &&] Created 5 years, 2 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/interpreter.h" 10 #include "src/interpreter/interpreter.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 using v8::internal::Token; 165 using v8::internal::Token;
166 using namespace v8::internal::interpreter; 166 using namespace v8::internal::interpreter;
167 167
168 TEST(InterpreterReturn) { 168 TEST(InterpreterReturn) {
169 HandleAndZoneScope handles; 169 HandleAndZoneScope handles;
170 Handle<Object> undefined_value = 170 Handle<Object> undefined_value =
171 handles.main_isolate()->factory()->undefined_value(); 171 handles.main_isolate()->factory()->undefined_value();
172 172
173 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 173 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
174 builder.set_locals_count(0); 174 builder.set_locals_count(0);
175 builder.set_context_count(0);
175 builder.set_parameter_count(1); 176 builder.set_parameter_count(1);
176 builder.Return(); 177 builder.Return();
177 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 178 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
178 179
179 InterpreterTester tester(handles.main_isolate(), bytecode_array); 180 InterpreterTester tester(handles.main_isolate(), bytecode_array);
180 auto callable = tester.GetCallable<>(); 181 auto callable = tester.GetCallable<>();
181 Handle<Object> return_val = callable().ToHandleChecked(); 182 Handle<Object> return_val = callable().ToHandleChecked();
182 CHECK(return_val.is_identical_to(undefined_value)); 183 CHECK(return_val.is_identical_to(undefined_value));
183 } 184 }
184 185
185 186
186 TEST(InterpreterLoadUndefined) { 187 TEST(InterpreterLoadUndefined) {
187 HandleAndZoneScope handles; 188 HandleAndZoneScope handles;
188 Handle<Object> undefined_value = 189 Handle<Object> undefined_value =
189 handles.main_isolate()->factory()->undefined_value(); 190 handles.main_isolate()->factory()->undefined_value();
190 191
191 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 192 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
192 builder.set_locals_count(0); 193 builder.set_locals_count(0);
194 builder.set_context_count(0);
193 builder.set_parameter_count(1); 195 builder.set_parameter_count(1);
194 builder.LoadUndefined().Return(); 196 builder.LoadUndefined().Return();
195 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 197 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
196 198
197 InterpreterTester tester(handles.main_isolate(), bytecode_array); 199 InterpreterTester tester(handles.main_isolate(), bytecode_array);
198 auto callable = tester.GetCallable<>(); 200 auto callable = tester.GetCallable<>();
199 Handle<Object> return_val = callable().ToHandleChecked(); 201 Handle<Object> return_val = callable().ToHandleChecked();
200 CHECK(return_val.is_identical_to(undefined_value)); 202 CHECK(return_val.is_identical_to(undefined_value));
201 } 203 }
202 204
203 205
204 TEST(InterpreterLoadNull) { 206 TEST(InterpreterLoadNull) {
205 HandleAndZoneScope handles; 207 HandleAndZoneScope handles;
206 Handle<Object> null_value = handles.main_isolate()->factory()->null_value(); 208 Handle<Object> null_value = handles.main_isolate()->factory()->null_value();
207 209
208 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 210 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
209 builder.set_locals_count(0); 211 builder.set_locals_count(0);
212 builder.set_context_count(0);
210 builder.set_parameter_count(1); 213 builder.set_parameter_count(1);
211 builder.LoadNull().Return(); 214 builder.LoadNull().Return();
212 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 215 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
213 216
214 InterpreterTester tester(handles.main_isolate(), bytecode_array); 217 InterpreterTester tester(handles.main_isolate(), bytecode_array);
215 auto callable = tester.GetCallable<>(); 218 auto callable = tester.GetCallable<>();
216 Handle<Object> return_val = callable().ToHandleChecked(); 219 Handle<Object> return_val = callable().ToHandleChecked();
217 CHECK(return_val.is_identical_to(null_value)); 220 CHECK(return_val.is_identical_to(null_value));
218 } 221 }
219 222
220 223
221 TEST(InterpreterLoadTheHole) { 224 TEST(InterpreterLoadTheHole) {
222 HandleAndZoneScope handles; 225 HandleAndZoneScope handles;
223 Handle<Object> the_hole_value = 226 Handle<Object> the_hole_value =
224 handles.main_isolate()->factory()->the_hole_value(); 227 handles.main_isolate()->factory()->the_hole_value();
225 228
226 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 229 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
227 builder.set_locals_count(0); 230 builder.set_locals_count(0);
231 builder.set_context_count(0);
228 builder.set_parameter_count(1); 232 builder.set_parameter_count(1);
229 builder.LoadTheHole().Return(); 233 builder.LoadTheHole().Return();
230 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 234 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
231 235
232 InterpreterTester tester(handles.main_isolate(), bytecode_array); 236 InterpreterTester tester(handles.main_isolate(), bytecode_array);
233 auto callable = tester.GetCallable<>(); 237 auto callable = tester.GetCallable<>();
234 Handle<Object> return_val = callable().ToHandleChecked(); 238 Handle<Object> return_val = callable().ToHandleChecked();
235 CHECK(return_val.is_identical_to(the_hole_value)); 239 CHECK(return_val.is_identical_to(the_hole_value));
236 } 240 }
237 241
238 242
239 TEST(InterpreterLoadTrue) { 243 TEST(InterpreterLoadTrue) {
240 HandleAndZoneScope handles; 244 HandleAndZoneScope handles;
241 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); 245 Handle<Object> true_value = handles.main_isolate()->factory()->true_value();
242 246
243 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 247 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
244 builder.set_locals_count(0); 248 builder.set_locals_count(0);
249 builder.set_context_count(0);
245 builder.set_parameter_count(1); 250 builder.set_parameter_count(1);
246 builder.LoadTrue().Return(); 251 builder.LoadTrue().Return();
247 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 252 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
248 253
249 InterpreterTester tester(handles.main_isolate(), bytecode_array); 254 InterpreterTester tester(handles.main_isolate(), bytecode_array);
250 auto callable = tester.GetCallable<>(); 255 auto callable = tester.GetCallable<>();
251 Handle<Object> return_val = callable().ToHandleChecked(); 256 Handle<Object> return_val = callable().ToHandleChecked();
252 CHECK(return_val.is_identical_to(true_value)); 257 CHECK(return_val.is_identical_to(true_value));
253 } 258 }
254 259
255 260
256 TEST(InterpreterLoadFalse) { 261 TEST(InterpreterLoadFalse) {
257 HandleAndZoneScope handles; 262 HandleAndZoneScope handles;
258 Handle<Object> false_value = handles.main_isolate()->factory()->false_value(); 263 Handle<Object> false_value = handles.main_isolate()->factory()->false_value();
259 264
260 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 265 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
261 builder.set_locals_count(0); 266 builder.set_locals_count(0);
267 builder.set_context_count(0);
262 builder.set_parameter_count(1); 268 builder.set_parameter_count(1);
263 builder.LoadFalse().Return(); 269 builder.LoadFalse().Return();
264 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 270 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
265 271
266 InterpreterTester tester(handles.main_isolate(), bytecode_array); 272 InterpreterTester tester(handles.main_isolate(), bytecode_array);
267 auto callable = tester.GetCallable<>(); 273 auto callable = tester.GetCallable<>();
268 Handle<Object> return_val = callable().ToHandleChecked(); 274 Handle<Object> return_val = callable().ToHandleChecked();
269 CHECK(return_val.is_identical_to(false_value)); 275 CHECK(return_val.is_identical_to(false_value));
270 } 276 }
271 277
272 278
273 TEST(InterpreterLoadLiteral) { 279 TEST(InterpreterLoadLiteral) {
274 HandleAndZoneScope handles; 280 HandleAndZoneScope handles;
275 i::Factory* factory = handles.main_isolate()->factory(); 281 i::Factory* factory = handles.main_isolate()->factory();
276 282
277 // Small Smis. 283 // Small Smis.
278 for (int i = -128; i < 128; i++) { 284 for (int i = -128; i < 128; i++) {
279 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 285 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
280 builder.set_locals_count(0); 286 builder.set_locals_count(0);
287 builder.set_context_count(0);
281 builder.set_parameter_count(1); 288 builder.set_parameter_count(1);
282 builder.LoadLiteral(Smi::FromInt(i)).Return(); 289 builder.LoadLiteral(Smi::FromInt(i)).Return();
283 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 290 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
284 291
285 InterpreterTester tester(handles.main_isolate(), bytecode_array); 292 InterpreterTester tester(handles.main_isolate(), bytecode_array);
286 auto callable = tester.GetCallable<>(); 293 auto callable = tester.GetCallable<>();
287 Handle<Object> return_val = callable().ToHandleChecked(); 294 Handle<Object> return_val = callable().ToHandleChecked();
288 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(i)); 295 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(i));
289 } 296 }
290 297
291 // Large Smis. 298 // Large Smis.
292 { 299 {
293 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 300 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
294 builder.set_locals_count(0); 301 builder.set_locals_count(0);
302 builder.set_context_count(0);
295 builder.set_parameter_count(1); 303 builder.set_parameter_count(1);
296 builder.LoadLiteral(Smi::FromInt(0x12345678)).Return(); 304 builder.LoadLiteral(Smi::FromInt(0x12345678)).Return();
297 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 305 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
298 306
299 InterpreterTester tester(handles.main_isolate(), bytecode_array); 307 InterpreterTester tester(handles.main_isolate(), bytecode_array);
300 auto callable = tester.GetCallable<>(); 308 auto callable = tester.GetCallable<>();
301 Handle<Object> return_val = callable().ToHandleChecked(); 309 Handle<Object> return_val = callable().ToHandleChecked();
302 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x12345678)); 310 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x12345678));
303 } 311 }
304 312
305 // Heap numbers. 313 // Heap numbers.
306 { 314 {
307 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 315 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
308 builder.set_locals_count(0); 316 builder.set_locals_count(0);
317 builder.set_context_count(0);
309 builder.set_parameter_count(1); 318 builder.set_parameter_count(1);
310 builder.LoadLiteral(factory->NewHeapNumber(-2.1e19)).Return(); 319 builder.LoadLiteral(factory->NewHeapNumber(-2.1e19)).Return();
311 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 320 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
312 321
313 InterpreterTester tester(handles.main_isolate(), bytecode_array); 322 InterpreterTester tester(handles.main_isolate(), bytecode_array);
314 auto callable = tester.GetCallable<>(); 323 auto callable = tester.GetCallable<>();
315 Handle<Object> return_val = callable().ToHandleChecked(); 324 Handle<Object> return_val = callable().ToHandleChecked();
316 CHECK_EQ(i::HeapNumber::cast(*return_val)->value(), -2.1e19); 325 CHECK_EQ(i::HeapNumber::cast(*return_val)->value(), -2.1e19);
317 } 326 }
318 327
319 // Strings. 328 // Strings.
320 { 329 {
321 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 330 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
322 builder.set_locals_count(0); 331 builder.set_locals_count(0);
332 builder.set_context_count(0);
323 builder.set_parameter_count(1); 333 builder.set_parameter_count(1);
324 Handle<i::String> string = factory->NewStringFromAsciiChecked("String"); 334 Handle<i::String> string = factory->NewStringFromAsciiChecked("String");
325 builder.LoadLiteral(string).Return(); 335 builder.LoadLiteral(string).Return();
326 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 336 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
327 337
328 InterpreterTester tester(handles.main_isolate(), bytecode_array); 338 InterpreterTester tester(handles.main_isolate(), bytecode_array);
329 auto callable = tester.GetCallable<>(); 339 auto callable = tester.GetCallable<>();
330 Handle<Object> return_val = callable().ToHandleChecked(); 340 Handle<Object> return_val = callable().ToHandleChecked();
331 CHECK(i::String::cast(*return_val)->Equals(*string)); 341 CHECK(i::String::cast(*return_val)->Equals(*string));
332 } 342 }
333 } 343 }
334 344
335 345
336 TEST(InterpreterLoadStoreRegisters) { 346 TEST(InterpreterLoadStoreRegisters) {
337 HandleAndZoneScope handles; 347 HandleAndZoneScope handles;
338 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); 348 Handle<Object> true_value = handles.main_isolate()->factory()->true_value();
339 for (int i = 0; i <= Register::kMaxRegisterIndex; i++) { 349 for (int i = 0; i <= Register::kMaxRegisterIndex; i++) {
340 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 350 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
341 builder.set_locals_count(i + 1); 351 builder.set_locals_count(i + 1);
352 builder.set_context_count(0);
342 builder.set_parameter_count(1); 353 builder.set_parameter_count(1);
343 Register reg(i); 354 Register reg(i);
344 builder.LoadTrue() 355 builder.LoadTrue()
345 .StoreAccumulatorInRegister(reg) 356 .StoreAccumulatorInRegister(reg)
346 .LoadFalse() 357 .LoadFalse()
347 .LoadAccumulatorWithRegister(reg) 358 .LoadAccumulatorWithRegister(reg)
348 .Return(); 359 .Return();
349 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 360 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
350 361
351 InterpreterTester tester(handles.main_isolate(), bytecode_array); 362 InterpreterTester tester(handles.main_isolate(), bytecode_array);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 int lhs_inputs[] = {0, -17, -182, 1073741823, -1}; 428 int lhs_inputs[] = {0, -17, -182, 1073741823, -1};
418 int rhs_inputs[] = {5, 2, 1, -1, -2, 0, 31, 32, -32, 64, 37}; 429 int rhs_inputs[] = {5, 2, 1, -1, -2, 0, 31, 32, -32, 64, 37};
419 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { 430 for (size_t l = 0; l < arraysize(lhs_inputs); l++) {
420 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { 431 for (size_t r = 0; r < arraysize(rhs_inputs); r++) {
421 for (size_t o = 0; o < arraysize(kShiftOperators); o++) { 432 for (size_t o = 0; o < arraysize(kShiftOperators); o++) {
422 HandleAndZoneScope handles; 433 HandleAndZoneScope handles;
423 i::Factory* factory = handles.main_isolate()->factory(); 434 i::Factory* factory = handles.main_isolate()->factory();
424 BytecodeArrayBuilder builder(handles.main_isolate(), 435 BytecodeArrayBuilder builder(handles.main_isolate(),
425 handles.main_zone()); 436 handles.main_zone());
426 builder.set_locals_count(1); 437 builder.set_locals_count(1);
438 builder.set_context_count(0);
427 builder.set_parameter_count(1); 439 builder.set_parameter_count(1);
428 Register reg(0); 440 Register reg(0);
429 int lhs = lhs_inputs[l]; 441 int lhs = lhs_inputs[l];
430 int rhs = rhs_inputs[r]; 442 int rhs = rhs_inputs[r];
431 builder.LoadLiteral(Smi::FromInt(lhs)) 443 builder.LoadLiteral(Smi::FromInt(lhs))
432 .StoreAccumulatorInRegister(reg) 444 .StoreAccumulatorInRegister(reg)
433 .LoadLiteral(Smi::FromInt(rhs)) 445 .LoadLiteral(Smi::FromInt(rhs))
434 .BinaryOperation(kShiftOperators[o], reg, Strength::WEAK) 446 .BinaryOperation(kShiftOperators[o], reg, Strength::WEAK)
435 .Return(); 447 .Return();
436 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 448 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
(...skipping 14 matching lines...) Expand all
451 int lhs_inputs[] = {3266, 1024, 0, -17, -18000}; 463 int lhs_inputs[] = {3266, 1024, 0, -17, -18000};
452 int rhs_inputs[] = {3266, 5, 4, 3, 2, 1, -1, -2}; 464 int rhs_inputs[] = {3266, 5, 4, 3, 2, 1, -1, -2};
453 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { 465 for (size_t l = 0; l < arraysize(lhs_inputs); l++) {
454 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { 466 for (size_t r = 0; r < arraysize(rhs_inputs); r++) {
455 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { 467 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) {
456 HandleAndZoneScope handles; 468 HandleAndZoneScope handles;
457 i::Factory* factory = handles.main_isolate()->factory(); 469 i::Factory* factory = handles.main_isolate()->factory();
458 BytecodeArrayBuilder builder(handles.main_isolate(), 470 BytecodeArrayBuilder builder(handles.main_isolate(),
459 handles.main_zone()); 471 handles.main_zone());
460 builder.set_locals_count(1); 472 builder.set_locals_count(1);
473 builder.set_context_count(0);
461 builder.set_parameter_count(1); 474 builder.set_parameter_count(1);
462 Register reg(0); 475 Register reg(0);
463 int lhs = lhs_inputs[l]; 476 int lhs = lhs_inputs[l];
464 int rhs = rhs_inputs[r]; 477 int rhs = rhs_inputs[r];
465 builder.LoadLiteral(Smi::FromInt(lhs)) 478 builder.LoadLiteral(Smi::FromInt(lhs))
466 .StoreAccumulatorInRegister(reg) 479 .StoreAccumulatorInRegister(reg)
467 .LoadLiteral(Smi::FromInt(rhs)) 480 .LoadLiteral(Smi::FromInt(rhs))
468 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) 481 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK)
469 .Return(); 482 .Return();
470 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 483 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
(...skipping 15 matching lines...) Expand all
486 double rhs_inputs[] = {3266.101, 5.999, 4.778, 3.331, 2.643, 499 double rhs_inputs[] = {3266.101, 5.999, 4.778, 3.331, 2.643,
487 1.1, -1.8, -2.9, 8.3e-27}; 500 1.1, -1.8, -2.9, 8.3e-27};
488 for (size_t l = 0; l < arraysize(lhs_inputs); l++) { 501 for (size_t l = 0; l < arraysize(lhs_inputs); l++) {
489 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { 502 for (size_t r = 0; r < arraysize(rhs_inputs); r++) {
490 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { 503 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) {
491 HandleAndZoneScope handles; 504 HandleAndZoneScope handles;
492 i::Factory* factory = handles.main_isolate()->factory(); 505 i::Factory* factory = handles.main_isolate()->factory();
493 BytecodeArrayBuilder builder(handles.main_isolate(), 506 BytecodeArrayBuilder builder(handles.main_isolate(),
494 handles.main_zone()); 507 handles.main_zone());
495 builder.set_locals_count(1); 508 builder.set_locals_count(1);
509 builder.set_context_count(0);
496 builder.set_parameter_count(1); 510 builder.set_parameter_count(1);
497 Register reg(0); 511 Register reg(0);
498 double lhs = lhs_inputs[l]; 512 double lhs = lhs_inputs[l];
499 double rhs = rhs_inputs[r]; 513 double rhs = rhs_inputs[r];
500 builder.LoadLiteral(factory->NewNumber(lhs)) 514 builder.LoadLiteral(factory->NewNumber(lhs))
501 .StoreAccumulatorInRegister(reg) 515 .StoreAccumulatorInRegister(reg)
502 .LoadLiteral(factory->NewNumber(rhs)) 516 .LoadLiteral(factory->NewNumber(rhs))
503 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) 517 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK)
504 .Return(); 518 .Return();
505 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 519 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 factory->NewStringFromStaticChars("1.112.5")}, 558 factory->NewStringFromStaticChars("1.112.5")},
545 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56), 559 {factory->NewStringFromStaticChars("-1.11"), factory->NewHeapNumber(2.56),
546 factory->NewStringFromStaticChars("-1.112.56")}, 560 factory->NewStringFromStaticChars("-1.112.56")},
547 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5), 561 {factory->NewStringFromStaticChars(""), factory->NewHeapNumber(2.5),
548 factory->NewStringFromStaticChars("2.5")}, 562 factory->NewStringFromStaticChars("2.5")},
549 }; 563 };
550 564
551 for (size_t i = 0; i < arraysize(test_cases); i++) { 565 for (size_t i = 0; i < arraysize(test_cases); i++) {
552 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 566 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
553 builder.set_locals_count(1); 567 builder.set_locals_count(1);
568 builder.set_context_count(0);
554 builder.set_parameter_count(1); 569 builder.set_parameter_count(1);
555 Register reg(0); 570 Register reg(0);
556 builder.LoadLiteral(test_cases[i].lhs) 571 builder.LoadLiteral(test_cases[i].lhs)
557 .StoreAccumulatorInRegister(reg) 572 .StoreAccumulatorInRegister(reg)
558 .LoadLiteral(test_cases[i].rhs) 573 .LoadLiteral(test_cases[i].rhs)
559 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) 574 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
560 .Return(); 575 .Return();
561 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 576 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
562 577
563 InterpreterTester tester(handles.main_isolate(), bytecode_array); 578 InterpreterTester tester(handles.main_isolate(), bytecode_array);
564 auto callable = tester.GetCallable<>(); 579 auto callable = tester.GetCallable<>();
565 Handle<Object> return_value = callable().ToHandleChecked(); 580 Handle<Object> return_value = callable().ToHandleChecked();
566 CHECK(return_value->SameValue(*test_cases[i].expected_value)); 581 CHECK(return_value->SameValue(*test_cases[i].expected_value));
567 } 582 }
568 } 583 }
569 584
570 585
571 TEST(InterpreterParameter1) { 586 TEST(InterpreterParameter1) {
572 HandleAndZoneScope handles; 587 HandleAndZoneScope handles;
573 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 588 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
574 builder.set_locals_count(0); 589 builder.set_locals_count(0);
590 builder.set_context_count(0);
575 builder.set_parameter_count(1); 591 builder.set_parameter_count(1);
576 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return(); 592 builder.LoadAccumulatorWithRegister(builder.Parameter(0)).Return();
577 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 593 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
578 594
579 InterpreterTester tester(handles.main_isolate(), bytecode_array); 595 InterpreterTester tester(handles.main_isolate(), bytecode_array);
580 auto callable = tester.GetCallable<Handle<Object>>(); 596 auto callable = tester.GetCallable<Handle<Object>>();
581 597
582 // Check for heap objects. 598 // Check for heap objects.
583 Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); 599 Handle<Object> true_value = handles.main_isolate()->factory()->true_value();
584 Handle<Object> return_val = callable(true_value).ToHandleChecked(); 600 Handle<Object> return_val = callable(true_value).ToHandleChecked();
585 CHECK(return_val.is_identical_to(true_value)); 601 CHECK(return_val.is_identical_to(true_value));
586 602
587 // Check for Smis. 603 // Check for Smis.
588 return_val = callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate())) 604 return_val = callable(Handle<Smi>(Smi::FromInt(3), handles.main_isolate()))
589 .ToHandleChecked(); 605 .ToHandleChecked();
590 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); 606 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3));
591 } 607 }
592 608
593 609
594 TEST(InterpreterParameter8) { 610 TEST(InterpreterParameter8) {
595 HandleAndZoneScope handles; 611 HandleAndZoneScope handles;
596 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 612 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
597 builder.set_locals_count(0); 613 builder.set_locals_count(0);
614 builder.set_context_count(0);
598 builder.set_parameter_count(8); 615 builder.set_parameter_count(8);
599 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) 616 builder.LoadAccumulatorWithRegister(builder.Parameter(0))
600 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), Strength::WEAK) 617 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), Strength::WEAK)
601 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), Strength::WEAK) 618 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), Strength::WEAK)
602 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), Strength::WEAK) 619 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), Strength::WEAK)
603 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), Strength::WEAK) 620 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), Strength::WEAK)
604 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), Strength::WEAK) 621 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), Strength::WEAK)
605 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), Strength::WEAK) 622 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), Strength::WEAK)
606 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), Strength::WEAK) 623 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), Strength::WEAK)
607 .Return(); 624 .Return();
(...skipping 16 matching lines...) Expand all
624 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) 641 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
625 .ToHandleChecked(); 642 .ToHandleChecked();
626 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36)); 643 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36));
627 } 644 }
628 645
629 646
630 TEST(InterpreterParameter1Assign) { 647 TEST(InterpreterParameter1Assign) {
631 HandleAndZoneScope handles; 648 HandleAndZoneScope handles;
632 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 649 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
633 builder.set_locals_count(0); 650 builder.set_locals_count(0);
651 builder.set_context_count(0);
634 builder.set_parameter_count(1); 652 builder.set_parameter_count(1);
635 builder.LoadLiteral(Smi::FromInt(5)) 653 builder.LoadLiteral(Smi::FromInt(5))
636 .StoreAccumulatorInRegister(builder.Parameter(0)) 654 .StoreAccumulatorInRegister(builder.Parameter(0))
637 .LoadAccumulatorWithRegister(builder.Parameter(0)) 655 .LoadAccumulatorWithRegister(builder.Parameter(0))
638 .Return(); 656 .Return();
639 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 657 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
640 658
641 InterpreterTester tester(handles.main_isolate(), bytecode_array); 659 InterpreterTester tester(handles.main_isolate(), bytecode_array);
642 auto callable = tester.GetCallable<Handle<Object>>(); 660 auto callable = tester.GetCallable<Handle<Object>>();
643 661
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); 771 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot();
754 772
755 Handle<i::TypeFeedbackVector> vector = 773 Handle<i::TypeFeedbackVector> vector =
756 i::NewTypeFeedbackVector(isolate, &feedback_spec); 774 i::NewTypeFeedbackVector(isolate, &feedback_spec);
757 775
758 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 776 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
759 name = factory->string_table()->LookupString(isolate, name); 777 name = factory->string_table()->LookupString(isolate, name);
760 778
761 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 779 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
762 builder.set_locals_count(0); 780 builder.set_locals_count(0);
781 builder.set_context_count(0);
763 builder.set_parameter_count(1); 782 builder.set_parameter_count(1);
764 builder.LoadLiteral(name) 783 builder.LoadLiteral(name)
765 .LoadNamedProperty(builder.Parameter(0), vector->GetIndex(slot), 784 .LoadNamedProperty(builder.Parameter(0), vector->GetIndex(slot),
766 i::SLOPPY) 785 i::SLOPPY)
767 .Return(); 786 .Return();
768 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 787 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
769 788
770 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 789 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
771 auto callable = tester.GetCallable<Handle<Object>>(); 790 auto callable = tester.GetCallable<Handle<Object>>();
772 791
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot(); 828 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot();
810 829
811 Handle<i::TypeFeedbackVector> vector = 830 Handle<i::TypeFeedbackVector> vector =
812 i::NewTypeFeedbackVector(isolate, &feedback_spec); 831 i::NewTypeFeedbackVector(isolate, &feedback_spec);
813 832
814 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); 833 Handle<i::String> key = factory->NewStringFromAsciiChecked("key");
815 key = factory->string_table()->LookupString(isolate, key); 834 key = factory->string_table()->LookupString(isolate, key);
816 835
817 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 836 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
818 builder.set_locals_count(1); 837 builder.set_locals_count(1);
838 builder.set_context_count(0);
819 builder.set_parameter_count(1); 839 builder.set_parameter_count(1);
820 builder.LoadLiteral(key) 840 builder.LoadLiteral(key)
821 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), 841 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot),
822 i::STRICT) 842 i::STRICT)
823 .Return(); 843 .Return();
824 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 844 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
825 845
826 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 846 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
827 auto callable = tester.GetCallable<Handle<Object>>(); 847 auto callable = tester.GetCallable<Handle<Object>>();
828 848
(...skipping 24 matching lines...) Expand all
853 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); 873 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot();
854 874
855 Handle<i::TypeFeedbackVector> vector = 875 Handle<i::TypeFeedbackVector> vector =
856 i::NewTypeFeedbackVector(isolate, &feedback_spec); 876 i::NewTypeFeedbackVector(isolate, &feedback_spec);
857 877
858 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 878 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
859 name = factory->string_table()->LookupString(isolate, name); 879 name = factory->string_table()->LookupString(isolate, name);
860 880
861 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 881 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
862 builder.set_locals_count(1); 882 builder.set_locals_count(1);
883 builder.set_context_count(0);
863 builder.set_parameter_count(1); 884 builder.set_parameter_count(1);
864 builder.LoadLiteral(name) 885 builder.LoadLiteral(name)
865 .StoreAccumulatorInRegister(Register(0)) 886 .StoreAccumulatorInRegister(Register(0))
866 .LoadLiteral(Smi::FromInt(999)) 887 .LoadLiteral(Smi::FromInt(999))
867 .StoreNamedProperty(builder.Parameter(0), Register(0), 888 .StoreNamedProperty(builder.Parameter(0), Register(0),
868 vector->GetIndex(slot), i::STRICT) 889 vector->GetIndex(slot), i::STRICT)
869 .Return(); 890 .Return();
870 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 891 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
871 892
872 InterpreterTester tester(isolate, bytecode_array, vector); 893 InterpreterTester tester(isolate, bytecode_array, vector);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedStoreICSlot(); 936 i::FeedbackVectorSlot slot = feedback_spec.AddKeyedStoreICSlot();
916 937
917 Handle<i::TypeFeedbackVector> vector = 938 Handle<i::TypeFeedbackVector> vector =
918 i::NewTypeFeedbackVector(isolate, &feedback_spec); 939 i::NewTypeFeedbackVector(isolate, &feedback_spec);
919 940
920 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 941 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
921 name = factory->string_table()->LookupString(isolate, name); 942 name = factory->string_table()->LookupString(isolate, name);
922 943
923 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 944 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
924 builder.set_locals_count(1); 945 builder.set_locals_count(1);
946 builder.set_context_count(0);
925 builder.set_parameter_count(1); 947 builder.set_parameter_count(1);
926 builder.LoadLiteral(name) 948 builder.LoadLiteral(name)
927 .StoreAccumulatorInRegister(Register(0)) 949 .StoreAccumulatorInRegister(Register(0))
928 .LoadLiteral(Smi::FromInt(999)) 950 .LoadLiteral(Smi::FromInt(999))
929 .StoreKeyedProperty(builder.Parameter(0), Register(0), 951 .StoreKeyedProperty(builder.Parameter(0), Register(0),
930 vector->GetIndex(slot), i::SLOPPY) 952 vector->GetIndex(slot), i::SLOPPY)
931 .Return(); 953 .Return();
932 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 954 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
933 955
934 InterpreterTester tester(isolate, bytecode_array, vector); 956 InterpreterTester tester(isolate, bytecode_array, vector);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 i::NewTypeFeedbackVector(isolate, &feedback_spec); 989 i::NewTypeFeedbackVector(isolate, &feedback_spec);
968 int slot_index = vector->GetIndex(slot); 990 int slot_index = vector->GetIndex(slot);
969 991
970 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); 992 Handle<i::String> name = factory->NewStringFromAsciiChecked("func");
971 name = factory->string_table()->LookupString(isolate, name); 993 name = factory->string_table()->LookupString(isolate, name);
972 994
973 // Check with no args. 995 // Check with no args.
974 { 996 {
975 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 997 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
976 builder.set_locals_count(1); 998 builder.set_locals_count(1);
999 builder.set_context_count(0);
977 builder.set_parameter_count(1); 1000 builder.set_parameter_count(1);
978 builder.LoadLiteral(name) 1001 builder.LoadLiteral(name)
979 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) 1002 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY)
980 .StoreAccumulatorInRegister(Register(0)) 1003 .StoreAccumulatorInRegister(Register(0))
981 .Call(Register(0), builder.Parameter(0), 0) 1004 .Call(Register(0), builder.Parameter(0), 0)
982 .Return(); 1005 .Return();
983 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1006 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
984 1007
985 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 1008 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
986 auto callable = tester.GetCallable<Handle<Object>>(); 1009 auto callable = tester.GetCallable<Handle<Object>>();
987 1010
988 Handle<Object> object = InterpreterTester::NewObject( 1011 Handle<Object> object = InterpreterTester::NewObject(
989 "new (function Obj() { this.func = function() { return 0x265; }})()"); 1012 "new (function Obj() { this.func = function() { return 0x265; }})()");
990 Handle<Object> return_val = callable(object).ToHandleChecked(); 1013 Handle<Object> return_val = callable(object).ToHandleChecked();
991 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); 1014 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265));
992 } 1015 }
993 1016
994 // Check that receiver is passed properly. 1017 // Check that receiver is passed properly.
995 { 1018 {
996 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1019 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
997 builder.set_locals_count(1); 1020 builder.set_locals_count(1);
1021 builder.set_context_count(0);
998 builder.set_parameter_count(1); 1022 builder.set_parameter_count(1);
999 builder.LoadLiteral(name) 1023 builder.LoadLiteral(name)
1000 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) 1024 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY)
1001 .StoreAccumulatorInRegister(Register(0)) 1025 .StoreAccumulatorInRegister(Register(0))
1002 .Call(Register(0), builder.Parameter(0), 0) 1026 .Call(Register(0), builder.Parameter(0), 0)
1003 .Return(); 1027 .Return();
1004 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1028 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1005 1029
1006 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 1030 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
1007 auto callable = tester.GetCallable<Handle<Object>>(); 1031 auto callable = tester.GetCallable<Handle<Object>>();
1008 1032
1009 Handle<Object> object = InterpreterTester::NewObject( 1033 Handle<Object> object = InterpreterTester::NewObject(
1010 "new (function Obj() {" 1034 "new (function Obj() {"
1011 " this.val = 1234;" 1035 " this.val = 1234;"
1012 " this.func = function() { return this.val; };" 1036 " this.func = function() { return this.val; };"
1013 "})()"); 1037 "})()");
1014 Handle<Object> return_val = callable(object).ToHandleChecked(); 1038 Handle<Object> return_val = callable(object).ToHandleChecked();
1015 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); 1039 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234));
1016 } 1040 }
1017 1041
1018 // Check with two parameters (+ receiver). 1042 // Check with two parameters (+ receiver).
1019 { 1043 {
1020 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1044 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1021 builder.set_locals_count(4); 1045 builder.set_locals_count(4);
1046 builder.set_context_count(0);
1022 builder.set_parameter_count(1); 1047 builder.set_parameter_count(1);
1023 builder.LoadLiteral(name) 1048 builder.LoadLiteral(name)
1024 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) 1049 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY)
1025 .StoreAccumulatorInRegister(Register(0)) 1050 .StoreAccumulatorInRegister(Register(0))
1026 .LoadAccumulatorWithRegister(builder.Parameter(0)) 1051 .LoadAccumulatorWithRegister(builder.Parameter(0))
1027 .StoreAccumulatorInRegister(Register(1)) 1052 .StoreAccumulatorInRegister(Register(1))
1028 .LoadLiteral(Smi::FromInt(51)) 1053 .LoadLiteral(Smi::FromInt(51))
1029 .StoreAccumulatorInRegister(Register(2)) 1054 .StoreAccumulatorInRegister(Register(2))
1030 .LoadLiteral(Smi::FromInt(11)) 1055 .LoadLiteral(Smi::FromInt(11))
1031 .StoreAccumulatorInRegister(Register(3)) 1056 .StoreAccumulatorInRegister(Register(3))
1032 .Call(Register(0), Register(1), 2) 1057 .Call(Register(0), Register(1), 2)
1033 .Return(); 1058 .Return();
1034 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1059 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1035 1060
1036 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 1061 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
1037 auto callable = tester.GetCallable<Handle<Object>>(); 1062 auto callable = tester.GetCallable<Handle<Object>>();
1038 1063
1039 Handle<Object> object = InterpreterTester::NewObject( 1064 Handle<Object> object = InterpreterTester::NewObject(
1040 "new (function Obj() { " 1065 "new (function Obj() { "
1041 " this.func = function(a, b) { return a - b; }" 1066 " this.func = function(a, b) { return a - b; }"
1042 "})()"); 1067 "})()");
1043 Handle<Object> return_val = callable(object).ToHandleChecked(); 1068 Handle<Object> return_val = callable(object).ToHandleChecked();
1044 CHECK(return_val->SameValue(Smi::FromInt(40))); 1069 CHECK(return_val->SameValue(Smi::FromInt(40)));
1045 } 1070 }
1046 1071
1047 // Check with 10 parameters (+ receiver). 1072 // Check with 10 parameters (+ receiver).
1048 { 1073 {
1049 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1074 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1050 builder.set_locals_count(12); 1075 builder.set_locals_count(12);
1076 builder.set_context_count(0);
1051 builder.set_parameter_count(1); 1077 builder.set_parameter_count(1);
1052 builder.LoadLiteral(name) 1078 builder.LoadLiteral(name)
1053 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) 1079 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY)
1054 .StoreAccumulatorInRegister(Register(0)) 1080 .StoreAccumulatorInRegister(Register(0))
1055 .LoadAccumulatorWithRegister(builder.Parameter(0)) 1081 .LoadAccumulatorWithRegister(builder.Parameter(0))
1056 .StoreAccumulatorInRegister(Register(1)) 1082 .StoreAccumulatorInRegister(Register(1))
1057 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) 1083 .LoadLiteral(factory->NewStringFromAsciiChecked("a"))
1058 .StoreAccumulatorInRegister(Register(2)) 1084 .StoreAccumulatorInRegister(Register(2))
1059 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) 1085 .LoadLiteral(factory->NewStringFromAsciiChecked("b"))
1060 .StoreAccumulatorInRegister(Register(3)) 1086 .StoreAccumulatorInRegister(Register(3))
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) 1140 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK)
1115 .StoreAccumulatorInRegister(reg) 1141 .StoreAccumulatorInRegister(reg)
1116 .LoadAccumulatorWithRegister(scratch); 1142 .LoadAccumulatorWithRegister(scratch);
1117 } 1143 }
1118 1144
1119 1145
1120 TEST(InterpreterJumps) { 1146 TEST(InterpreterJumps) {
1121 HandleAndZoneScope handles; 1147 HandleAndZoneScope handles;
1122 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1148 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1123 builder.set_locals_count(2); 1149 builder.set_locals_count(2);
1150 builder.set_context_count(0);
1124 builder.set_parameter_count(0); 1151 builder.set_parameter_count(0);
1125 Register reg(0), scratch(1); 1152 Register reg(0), scratch(1);
1126 BytecodeLabel label[3]; 1153 BytecodeLabel label[3];
1127 1154
1128 builder.LoadLiteral(Smi::FromInt(0)) 1155 builder.LoadLiteral(Smi::FromInt(0))
1129 .StoreAccumulatorInRegister(reg) 1156 .StoreAccumulatorInRegister(reg)
1130 .Jump(&label[1]); 1157 .Jump(&label[1]);
1131 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]); 1158 SetRegister(builder, reg, 1024, scratch).Bind(&label[0]);
1132 IncrementRegister(builder, reg, 1, scratch).Jump(&label[2]); 1159 IncrementRegister(builder, reg, 1, scratch).Jump(&label[2]);
1133 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); 1160 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]);
1134 IncrementRegister(builder, reg, 2, scratch).Jump(&label[0]); 1161 IncrementRegister(builder, reg, 2, scratch).Jump(&label[0]);
1135 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); 1162 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]);
1136 IncrementRegister(builder, reg, 4, scratch) 1163 IncrementRegister(builder, reg, 4, scratch)
1137 .LoadAccumulatorWithRegister(reg) 1164 .LoadAccumulatorWithRegister(reg)
1138 .Return(); 1165 .Return();
1139 1166
1140 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1167 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1141 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1168 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1142 auto callable = tester.GetCallable<>(); 1169 auto callable = tester.GetCallable<>();
1143 Handle<Object> return_value = callable().ToHandleChecked(); 1170 Handle<Object> return_value = callable().ToHandleChecked();
1144 CHECK_EQ(Smi::cast(*return_value)->value(), 7); 1171 CHECK_EQ(Smi::cast(*return_value)->value(), 7);
1145 } 1172 }
1146 1173
1147 1174
1148 TEST(InterpreterConditionalJumps) { 1175 TEST(InterpreterConditionalJumps) {
1149 HandleAndZoneScope handles; 1176 HandleAndZoneScope handles;
1150 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1177 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1151 builder.set_locals_count(2); 1178 builder.set_locals_count(2);
1179 builder.set_context_count(0);
1152 builder.set_parameter_count(0); 1180 builder.set_parameter_count(0);
1153 Register reg(0), scratch(1); 1181 Register reg(0), scratch(1);
1154 BytecodeLabel label[2]; 1182 BytecodeLabel label[2];
1155 BytecodeLabel done, done1; 1183 BytecodeLabel done, done1;
1156 1184
1157 builder.LoadLiteral(Smi::FromInt(0)) 1185 builder.LoadLiteral(Smi::FromInt(0))
1158 .StoreAccumulatorInRegister(reg) 1186 .StoreAccumulatorInRegister(reg)
1159 .LoadFalse() 1187 .LoadFalse()
1160 .JumpIfFalse(&label[0]); 1188 .JumpIfFalse(&label[0]);
1161 IncrementRegister(builder, reg, 1024, scratch) 1189 IncrementRegister(builder, reg, 1024, scratch)
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 1258
1231 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { 1259 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) {
1232 Token::Value comparison = kComparisonTypes[c]; 1260 Token::Value comparison = kComparisonTypes[c];
1233 for (size_t i = 0; i < arraysize(inputs); i++) { 1261 for (size_t i = 0; i < arraysize(inputs); i++) {
1234 for (size_t j = 0; j < arraysize(inputs); j++) { 1262 for (size_t j = 0; j < arraysize(inputs); j++) {
1235 HandleAndZoneScope handles; 1263 HandleAndZoneScope handles;
1236 BytecodeArrayBuilder builder(handles.main_isolate(), 1264 BytecodeArrayBuilder builder(handles.main_isolate(),
1237 handles.main_zone()); 1265 handles.main_zone());
1238 Register r0(0); 1266 Register r0(0);
1239 builder.set_locals_count(1); 1267 builder.set_locals_count(1);
1268 builder.set_context_count(0);
1240 builder.set_parameter_count(0); 1269 builder.set_parameter_count(0);
1241 builder.LoadLiteral(Smi::FromInt(inputs[i])) 1270 builder.LoadLiteral(Smi::FromInt(inputs[i]))
1242 .StoreAccumulatorInRegister(r0) 1271 .StoreAccumulatorInRegister(r0)
1243 .LoadLiteral(Smi::FromInt(inputs[j])) 1272 .LoadLiteral(Smi::FromInt(inputs[j]))
1244 .CompareOperation(comparison, r0, Strength::WEAK) 1273 .CompareOperation(comparison, r0, Strength::WEAK)
1245 .Return(); 1274 .Return();
1246 1275
1247 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1276 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1248 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1277 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1249 auto callable = tester.GetCallable<>(); 1278 auto callable = tester.GetCallable<>();
(...skipping 18 matching lines...) Expand all
1268 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) { 1297 for (size_t c = 0; c < arraysize(kComparisonTypes); c++) {
1269 Token::Value comparison = kComparisonTypes[c]; 1298 Token::Value comparison = kComparisonTypes[c];
1270 for (size_t i = 0; i < arraysize(inputs); i++) { 1299 for (size_t i = 0; i < arraysize(inputs); i++) {
1271 for (size_t j = 0; j < arraysize(inputs); j++) { 1300 for (size_t j = 0; j < arraysize(inputs); j++) {
1272 HandleAndZoneScope handles; 1301 HandleAndZoneScope handles;
1273 i::Factory* factory = handles.main_isolate()->factory(); 1302 i::Factory* factory = handles.main_isolate()->factory();
1274 BytecodeArrayBuilder builder(handles.main_isolate(), 1303 BytecodeArrayBuilder builder(handles.main_isolate(),
1275 handles.main_zone()); 1304 handles.main_zone());
1276 Register r0(0); 1305 Register r0(0);
1277 builder.set_locals_count(1); 1306 builder.set_locals_count(1);
1307 builder.set_context_count(0);
1278 builder.set_parameter_count(0); 1308 builder.set_parameter_count(0);
1279 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) 1309 builder.LoadLiteral(factory->NewHeapNumber(inputs[i]))
1280 .StoreAccumulatorInRegister(r0) 1310 .StoreAccumulatorInRegister(r0)
1281 .LoadLiteral(factory->NewHeapNumber(inputs[j])) 1311 .LoadLiteral(factory->NewHeapNumber(inputs[j]))
1282 .CompareOperation(comparison, r0, Strength::WEAK) 1312 .CompareOperation(comparison, r0, Strength::WEAK)
1283 .Return(); 1313 .Return();
1284 1314
1285 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1315 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1286 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1316 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1287 auto callable = tester.GetCallable<>(); 1317 auto callable = tester.GetCallable<>();
(...skipping 15 matching lines...) Expand all
1303 for (size_t i = 0; i < arraysize(inputs); i++) { 1333 for (size_t i = 0; i < arraysize(inputs); i++) {
1304 for (size_t j = 0; j < arraysize(inputs); j++) { 1334 for (size_t j = 0; j < arraysize(inputs); j++) {
1305 const char* lhs = inputs[i].c_str(); 1335 const char* lhs = inputs[i].c_str();
1306 const char* rhs = inputs[j].c_str(); 1336 const char* rhs = inputs[j].c_str();
1307 HandleAndZoneScope handles; 1337 HandleAndZoneScope handles;
1308 i::Factory* factory = handles.main_isolate()->factory(); 1338 i::Factory* factory = handles.main_isolate()->factory();
1309 BytecodeArrayBuilder builder(handles.main_isolate(), 1339 BytecodeArrayBuilder builder(handles.main_isolate(),
1310 handles.main_zone()); 1340 handles.main_zone());
1311 Register r0(0); 1341 Register r0(0);
1312 builder.set_locals_count(1); 1342 builder.set_locals_count(1);
1343 builder.set_context_count(0);
1313 builder.set_parameter_count(0); 1344 builder.set_parameter_count(0);
1314 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) 1345 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs))
1315 .StoreAccumulatorInRegister(r0) 1346 .StoreAccumulatorInRegister(r0)
1316 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) 1347 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs))
1317 .CompareOperation(comparison, r0, Strength::WEAK) 1348 .CompareOperation(comparison, r0, Strength::WEAK)
1318 .Return(); 1349 .Return();
1319 1350
1320 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1351 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1321 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1352 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1322 auto callable = tester.GetCallable<>(); 1353 auto callable = tester.GetCallable<>();
(...skipping 26 matching lines...) Expand all
1349 double lhs = StringToDouble(&unicode_cache, lhs_cstr, 1380 double lhs = StringToDouble(&unicode_cache, lhs_cstr,
1350 i::ConversionFlags::NO_FLAGS); 1381 i::ConversionFlags::NO_FLAGS);
1351 double rhs = StringToDouble(&unicode_cache, rhs_cstr, 1382 double rhs = StringToDouble(&unicode_cache, rhs_cstr,
1352 i::ConversionFlags::NO_FLAGS); 1383 i::ConversionFlags::NO_FLAGS);
1353 HandleAndZoneScope handles; 1384 HandleAndZoneScope handles;
1354 i::Factory* factory = handles.main_isolate()->factory(); 1385 i::Factory* factory = handles.main_isolate()->factory();
1355 BytecodeArrayBuilder builder(handles.main_isolate(), 1386 BytecodeArrayBuilder builder(handles.main_isolate(),
1356 handles.main_zone()); 1387 handles.main_zone());
1357 Register r0(0); 1388 Register r0(0);
1358 builder.set_locals_count(1); 1389 builder.set_locals_count(1);
1390 builder.set_context_count(0);
1359 builder.set_parameter_count(0); 1391 builder.set_parameter_count(0);
1360 if (pass == 0) { 1392 if (pass == 0) {
1361 // Comparison with HeapNumber on the lhs and String on the rhs 1393 // Comparison with HeapNumber on the lhs and String on the rhs
1362 builder.LoadLiteral(factory->NewNumber(lhs)) 1394 builder.LoadLiteral(factory->NewNumber(lhs))
1363 .StoreAccumulatorInRegister(r0) 1395 .StoreAccumulatorInRegister(r0)
1364 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) 1396 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr))
1365 .CompareOperation(comparison, r0, Strength::WEAK) 1397 .CompareOperation(comparison, r0, Strength::WEAK)
1366 .Return(); 1398 .Return();
1367 } else { 1399 } else {
1368 // Comparison with HeapNumber on the rhs and String on the lhs 1400 // Comparison with HeapNumber on the rhs and String on the lhs
(...skipping 24 matching lines...) Expand all
1393 Handle<i::String> name = factory->NewStringFromAsciiChecked("cons"); 1425 Handle<i::String> name = factory->NewStringFromAsciiChecked("cons");
1394 Handle<i::JSFunction> func = factory->NewFunction(name); 1426 Handle<i::JSFunction> func = factory->NewFunction(name);
1395 Handle<i::JSObject> instance = factory->NewJSObject(func); 1427 Handle<i::JSObject> instance = factory->NewJSObject(func);
1396 Handle<i::Object> other = factory->NewNumber(3.3333); 1428 Handle<i::Object> other = factory->NewNumber(3.3333);
1397 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other}; 1429 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other};
1398 for (size_t i = 0; i < arraysize(cases); i++) { 1430 for (size_t i = 0; i < arraysize(cases); i++) {
1399 bool expected_value = (i == 0); 1431 bool expected_value = (i == 0);
1400 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1432 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1401 Register r0(0); 1433 Register r0(0);
1402 builder.set_locals_count(1); 1434 builder.set_locals_count(1);
1435 builder.set_context_count(0);
1403 builder.set_parameter_count(0); 1436 builder.set_parameter_count(0);
1404 builder.LoadLiteral(cases[i]); 1437 builder.LoadLiteral(cases[i]);
1405 builder.StoreAccumulatorInRegister(r0) 1438 builder.StoreAccumulatorInRegister(r0)
1406 .LoadLiteral(func) 1439 .LoadLiteral(func)
1407 .CompareOperation(Token::Value::INSTANCEOF, r0, Strength::WEAK) 1440 .CompareOperation(Token::Value::INSTANCEOF, r0, Strength::WEAK)
1408 .Return(); 1441 .Return();
1409 1442
1410 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1443 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1411 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1444 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1412 auto callable = tester.GetCallable<>(); 1445 auto callable = tester.GetCallable<>();
(...skipping 10 matching lines...) Expand all
1423 // Allocate an array 1456 // Allocate an array
1424 Handle<i::JSArray> array = 1457 Handle<i::JSArray> array =
1425 factory->NewJSArray(i::ElementsKind::FAST_SMI_ELEMENTS); 1458 factory->NewJSArray(i::ElementsKind::FAST_SMI_ELEMENTS);
1426 // Check for these properties on the array object 1459 // Check for these properties on the array object
1427 const char* properties[] = {"length", "fuzzle", "x", "0"}; 1460 const char* properties[] = {"length", "fuzzle", "x", "0"};
1428 for (size_t i = 0; i < arraysize(properties); i++) { 1461 for (size_t i = 0; i < arraysize(properties); i++) {
1429 bool expected_value = (i == 0); 1462 bool expected_value = (i == 0);
1430 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1463 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1431 Register r0(0); 1464 Register r0(0);
1432 builder.set_locals_count(1); 1465 builder.set_locals_count(1);
1466 builder.set_context_count(0);
1433 builder.set_parameter_count(0); 1467 builder.set_parameter_count(0);
1434 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i])) 1468 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i]))
1435 .StoreAccumulatorInRegister(r0) 1469 .StoreAccumulatorInRegister(r0)
1436 .LoadLiteral(Handle<Object>::cast(array)) 1470 .LoadLiteral(Handle<Object>::cast(array))
1437 .CompareOperation(Token::Value::IN, r0, Strength::WEAK) 1471 .CompareOperation(Token::Value::IN, r0, Strength::WEAK)
1438 .Return(); 1472 .Return();
1439 1473
1440 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1474 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1441 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1475 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1442 auto callable = tester.GetCallable<>(); 1476 auto callable = tester.GetCallable<>();
1443 Handle<Object> return_value = callable().ToHandleChecked(); 1477 Handle<Object> return_value = callable().ToHandleChecked();
1444 CHECK(return_value->IsBoolean()); 1478 CHECK(return_value->IsBoolean());
1445 CHECK_EQ(return_value->BooleanValue(), expected_value); 1479 CHECK_EQ(return_value->BooleanValue(), expected_value);
1446 } 1480 }
1447 } 1481 }
1448 1482
1449 1483
1450 TEST(InterpreterUnaryNot) { 1484 TEST(InterpreterUnaryNot) {
1451 HandleAndZoneScope handles; 1485 HandleAndZoneScope handles;
1452 for (size_t i = 1; i < 10; i++) { 1486 for (size_t i = 1; i < 10; i++) {
1453 bool expected_value = ((i & 1) == 1); 1487 bool expected_value = ((i & 1) == 1);
1454 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1488 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1455 Register r0(0); 1489 Register r0(0);
1456 builder.set_locals_count(0); 1490 builder.set_locals_count(0);
1491 builder.set_context_count(0);
1457 builder.set_parameter_count(0); 1492 builder.set_parameter_count(0);
1458 builder.EnterBlock(); 1493 builder.EnterBlock();
1459 builder.LoadFalse(); 1494 builder.LoadFalse();
1460 for (size_t j = 0; j < i; j++) { 1495 for (size_t j = 0; j < i; j++) {
1461 builder.LogicalNot(); 1496 builder.LogicalNot();
1462 } 1497 }
1463 builder.LeaveBlock().Return(); 1498 builder.LeaveBlock().Return();
1464 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1499 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1465 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1500 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1466 auto callable = tester.GetCallable<>(); 1501 auto callable = tester.GetCallable<>();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), 1545 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")),
1511 true), 1546 true),
1512 std::make_pair( 1547 std::make_pair(
1513 Handle<Object>::cast(factory->NewStringFromStaticChars("")), false), 1548 Handle<Object>::cast(factory->NewStringFromStaticChars("")), false),
1514 }; 1549 };
1515 1550
1516 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { 1551 for (size_t i = 0; i < arraysize(object_type_tuples); i++) {
1517 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1552 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1518 Register r0(0); 1553 Register r0(0);
1519 builder.set_locals_count(0); 1554 builder.set_locals_count(0);
1555 builder.set_context_count(0);
1520 builder.set_parameter_count(0); 1556 builder.set_parameter_count(0);
1521 builder.EnterBlock(); 1557 builder.EnterBlock();
1522 LoadAny(&builder, factory, object_type_tuples[i].first); 1558 LoadAny(&builder, factory, object_type_tuples[i].first);
1523 builder.CastAccumulatorToBoolean(); 1559 builder.CastAccumulatorToBoolean();
1524 builder.LeaveBlock().Return(); 1560 builder.LeaveBlock().Return();
1525 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1561 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1526 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1562 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1527 auto callable = tester.GetCallable<>(); 1563 auto callable = tester.GetCallable<>();
1528 Handle<Object> return_value = callable().ToHandleChecked(); 1564 Handle<Object> return_value = callable().ToHandleChecked();
1529 CHECK(return_value->IsBoolean()); 1565 CHECK(return_value->IsBoolean());
(...skipping 17 matching lines...) Expand all
1547 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), 1583 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")),
1548 false), 1584 false),
1549 std::make_pair( 1585 std::make_pair(
1550 Handle<Object>::cast(factory->NewStringFromStaticChars("")), true), 1586 Handle<Object>::cast(factory->NewStringFromStaticChars("")), true),
1551 }; 1587 };
1552 1588
1553 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { 1589 for (size_t i = 0; i < arraysize(object_type_tuples); i++) {
1554 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1590 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1555 Register r0(0); 1591 Register r0(0);
1556 builder.set_locals_count(0); 1592 builder.set_locals_count(0);
1593 builder.set_context_count(0);
1557 builder.set_parameter_count(0); 1594 builder.set_parameter_count(0);
1558 builder.EnterBlock(); 1595 builder.EnterBlock();
1559 LoadAny(&builder, factory, object_type_tuples[i].first); 1596 LoadAny(&builder, factory, object_type_tuples[i].first);
1560 builder.LogicalNot(); 1597 builder.LogicalNot();
1561 builder.LeaveBlock().Return(); 1598 builder.LeaveBlock().Return();
1562 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1599 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1563 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1600 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1564 auto callable = tester.GetCallable<>(); 1601 auto callable = tester.GetCallable<>();
1565 Handle<Object> return_value = callable().ToHandleChecked(); 1602 Handle<Object> return_value = callable().ToHandleChecked();
1566 CHECK(return_value->IsBoolean()); 1603 CHECK(return_value->IsBoolean());
(...skipping 15 matching lines...) Expand all
1582 std::make_pair(factory->NewNumberFromInt(7771), "number"), 1619 std::make_pair(factory->NewNumberFromInt(7771), "number"),
1583 std::make_pair( 1620 std::make_pair(
1584 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), 1621 Handle<Object>::cast(factory->NewStringFromStaticChars("hello")),
1585 "string"), 1622 "string"),
1586 }; 1623 };
1587 1624
1588 for (size_t i = 0; i < arraysize(object_type_tuples); i++) { 1625 for (size_t i = 0; i < arraysize(object_type_tuples); i++) {
1589 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1626 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1590 Register r0(0); 1627 Register r0(0);
1591 builder.set_locals_count(0); 1628 builder.set_locals_count(0);
1629 builder.set_context_count(0);
1592 builder.set_parameter_count(0); 1630 builder.set_parameter_count(0);
1593 builder.EnterBlock(); 1631 builder.EnterBlock();
1594 LoadAny(&builder, factory, object_type_tuples[i].first); 1632 LoadAny(&builder, factory, object_type_tuples[i].first);
1595 builder.TypeOf(); 1633 builder.TypeOf();
1596 builder.LeaveBlock().Return(); 1634 builder.LeaveBlock().Return();
1597 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1635 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1598 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1636 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1599 auto callable = tester.GetCallable<>(); 1637 auto callable = tester.GetCallable<>();
1600 Handle<v8::internal::String> return_value = 1638 Handle<v8::internal::String> return_value =
1601 Handle<v8::internal::String>::cast(callable().ToHandleChecked()); 1639 Handle<v8::internal::String>::cast(callable().ToHandleChecked());
1602 auto actual = return_value->ToCString(); 1640 auto actual = return_value->ToCString();
1603 CHECK_EQ(strcmp(&actual[0], object_type_tuples[i].second), 0); 1641 CHECK_EQ(strcmp(&actual[0], object_type_tuples[i].second), 0);
1604 } 1642 }
1605 } 1643 }
1606 1644
1607 1645
1608 TEST(InterpreterCallRuntime) { 1646 TEST(InterpreterCallRuntime) {
1609 HandleAndZoneScope handles; 1647 HandleAndZoneScope handles;
1610 1648
1611 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 1649 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
1612 builder.set_locals_count(2); 1650 builder.set_locals_count(2);
1651 builder.set_context_count(0);
1613 builder.set_parameter_count(1); 1652 builder.set_parameter_count(1);
1614 builder.LoadLiteral(Smi::FromInt(15)) 1653 builder.LoadLiteral(Smi::FromInt(15))
1615 .StoreAccumulatorInRegister(Register(0)) 1654 .StoreAccumulatorInRegister(Register(0))
1616 .LoadLiteral(Smi::FromInt(40)) 1655 .LoadLiteral(Smi::FromInt(40))
1617 .StoreAccumulatorInRegister(Register(1)) 1656 .StoreAccumulatorInRegister(Register(1))
1618 .CallRuntime(Runtime::kAdd, Register(0), 2) 1657 .CallRuntime(Runtime::kAdd, Register(0), 2)
1619 .Return(); 1658 .Return();
1620 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1659 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1621 1660
1622 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1661 InterpreterTester tester(handles.main_isolate(), bytecode_array);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 1760 std::string source(InterpreterTester::SourceForBody(literals[i].first));
1722 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1761 InterpreterTester tester(handles.main_isolate(), source.c_str());
1723 auto callable = tester.GetCallable<>(); 1762 auto callable = tester.GetCallable<>();
1724 1763
1725 Handle<i::Object> return_value = callable().ToHandleChecked(); 1764 Handle<i::Object> return_value = callable().ToHandleChecked();
1726 CHECK(return_value->SameValue(*literals[i].second)); 1765 CHECK(return_value->SameValue(*literals[i].second));
1727 } 1766 }
1728 } 1767 }
1729 1768
1730 1769
1770 TEST(InterpreterContextVariables) {
1771 HandleAndZoneScope handles;
1772 i::Isolate* isolate = handles.main_isolate();
1773
1774 std::pair<const char*, Handle<Object>> context_vars[5] = {
1775 std::make_pair("var a; (function() { a = 1; })(); return a;",
1776 Handle<Object>(Smi::FromInt(1), isolate)),
1777 std::make_pair("var a = 10; (function() { a; })(); return a;",
1778 Handle<Object>(Smi::FromInt(10), isolate)),
1779 std::make_pair("var a = 20; var b = 30;\n"
1780 "return (function() { return a + b; })();",
1781 Handle<Object>(Smi::FromInt(50), isolate)),
1782 std::make_pair("'use strict'; let a = 1;\n"
1783 "{ let b = 2; return (function() { return a + b; })(); }",
1784 Handle<Object>(Smi::FromInt(3), isolate)),
1785 std::make_pair("'use strict'; let a = 10;\n"
1786 "{ let b = 20; var c = function() { [a, b] };\n"
1787 " return a + b; }",
1788 Handle<Object>(Smi::FromInt(30), isolate)),
1789 };
1790
1791 for (size_t i = 0; i < arraysize(context_vars); i++) {
1792 std::string source(InterpreterTester::SourceForBody(context_vars[i].first));
1793 InterpreterTester tester(handles.main_isolate(), source.c_str());
1794 auto callable = tester.GetCallable<>();
1795
1796 Handle<i::Object> return_value = callable().ToHandleChecked();
1797 CHECK(return_value->SameValue(*context_vars[i].second));
1798 }
1799 }
1800
1801
1802 TEST(InterpreterContextParameters) {
1803 HandleAndZoneScope handles;
1804 i::Isolate* isolate = handles.main_isolate();
1805
1806 std::pair<const char*, Handle<Object>> context_params[3] = {
1807 std::make_pair("return (function() { return arg1; })();",
1808 Handle<Object>(Smi::FromInt(1), isolate)),
1809 std::make_pair("(function() { arg1 = 4; })(); return arg1;",
1810 Handle<Object>(Smi::FromInt(4), isolate)),
1811 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;",
1812 Handle<Object>(Smi::FromInt(1), isolate)),
1813 };
1814
1815 for (size_t i = 0; i < arraysize(context_params); i++) {
1816 std::string source = "function " + InterpreterTester::function_name() +
1817 "(arg1, arg2, arg3) {" + context_params[i].first + "}";
1818 InterpreterTester tester(handles.main_isolate(), source.c_str());
1819 auto callable =
1820 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>();
1821
1822 Handle<Object> a1 = Handle<Object>(Smi::FromInt(1), isolate);
1823 Handle<Object> a2 = Handle<Object>(Smi::FromInt(2), isolate);
1824 Handle<Object> a3 = Handle<Object>(Smi::FromInt(3), isolate);
1825 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked();
1826 CHECK(return_value->SameValue(*context_params[i].second));
1827 }
1828 }
1829
1830
1731 TEST(InterpreterComma) { 1831 TEST(InterpreterComma) {
1732 HandleAndZoneScope handles; 1832 HandleAndZoneScope handles;
1733 i::Isolate* isolate = handles.main_isolate(); 1833 i::Isolate* isolate = handles.main_isolate();
1734 i::Factory* factory = isolate->factory(); 1834 i::Factory* factory = isolate->factory();
1735 1835
1736 std::pair<const char*, Handle<Object>> literals[6] = { 1836 std::pair<const char*, Handle<Object>> literals[6] = {
1737 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), 1837 std::make_pair("var a; return 0, a;\n", factory->undefined_value()),
1738 std::make_pair("return 'a', 2.2, 3;\n", 1838 std::make_pair("return 'a', 2.2, 3;\n",
1739 Handle<Object>(Smi::FromInt(3), isolate)), 1839 Handle<Object>(Smi::FromInt(3), isolate)),
1740 std::make_pair("return 'a', 'b', 'c';\n", 1840 std::make_pair("return 'a', 'b', 'c';\n",
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1833 1933
1834 // TODO(rmcilroy): modify tests when we have real try finally support. 1934 // TODO(rmcilroy): modify tests when we have real try finally support.
1835 std::string source(InterpreterTester::SourceForBody( 1935 std::string source(InterpreterTester::SourceForBody(
1836 "var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;")); 1936 "var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;"));
1837 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1937 InterpreterTester tester(handles.main_isolate(), source.c_str());
1838 auto callable = tester.GetCallable<>(); 1938 auto callable = tester.GetCallable<>();
1839 1939
1840 Handle<Object> return_val = callable().ToHandleChecked(); 1940 Handle<Object> return_val = callable().ToHandleChecked();
1841 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); 1941 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4));
1842 } 1942 }
OLDNEW
« no previous file with comments | « test/cctest/interpreter/test-bytecode-generator.cc ('k') | test/unittests/compiler/bytecode-graph-builder-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698