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

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

Issue 1385623002: [Interpreter]: Add support for strict mode load / store ICs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 BytecodeArrayBuilder builder(handles.main_isolate(), 384 BytecodeArrayBuilder builder(handles.main_isolate(),
385 handles.main_zone()); 385 handles.main_zone());
386 builder.set_locals_count(1); 386 builder.set_locals_count(1);
387 builder.set_parameter_count(1); 387 builder.set_parameter_count(1);
388 Register reg(0); 388 Register reg(0);
389 int lhs = lhs_inputs[l]; 389 int lhs = lhs_inputs[l];
390 int rhs = rhs_inputs[l]; 390 int rhs = rhs_inputs[l];
391 builder.LoadLiteral(Smi::FromInt(lhs)) 391 builder.LoadLiteral(Smi::FromInt(lhs))
392 .StoreAccumulatorInRegister(reg) 392 .StoreAccumulatorInRegister(reg)
393 .LoadLiteral(Smi::FromInt(rhs)) 393 .LoadLiteral(Smi::FromInt(rhs))
394 .BinaryOperation(kArithmeticOperators[o], reg) 394 .BinaryOperation(kArithmeticOperators[o], reg, i::SLOPPY)
395 .Return(); 395 .Return();
396 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 396 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
397 397
398 InterpreterTester tester(handles.main_isolate(), bytecode_array); 398 InterpreterTester tester(handles.main_isolate(), bytecode_array);
399 auto callable = tester.GetCallable<>(); 399 auto callable = tester.GetCallable<>();
400 Handle<Object> return_value = callable().ToHandleChecked(); 400 Handle<Object> return_value = callable().ToHandleChecked();
401 Handle<Object> expected_value = 401 Handle<Object> expected_value =
402 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); 402 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs));
403 CHECK(return_value->SameValue(*expected_value)); 403 CHECK(return_value->SameValue(*expected_value));
404 } 404 }
(...skipping 14 matching lines...) Expand all
419 BytecodeArrayBuilder builder(handles.main_isolate(), 419 BytecodeArrayBuilder builder(handles.main_isolate(),
420 handles.main_zone()); 420 handles.main_zone());
421 builder.set_locals_count(1); 421 builder.set_locals_count(1);
422 builder.set_parameter_count(1); 422 builder.set_parameter_count(1);
423 Register reg(0); 423 Register reg(0);
424 double lhs = lhs_inputs[l]; 424 double lhs = lhs_inputs[l];
425 double rhs = rhs_inputs[l]; 425 double rhs = rhs_inputs[l];
426 builder.LoadLiteral(factory->NewNumber(lhs)) 426 builder.LoadLiteral(factory->NewNumber(lhs))
427 .StoreAccumulatorInRegister(reg) 427 .StoreAccumulatorInRegister(reg)
428 .LoadLiteral(factory->NewNumber(rhs)) 428 .LoadLiteral(factory->NewNumber(rhs))
429 .BinaryOperation(kArithmeticOperators[o], reg) 429 .BinaryOperation(kArithmeticOperators[o], reg, i::SLOPPY)
430 .Return(); 430 .Return();
431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
432 432
433 InterpreterTester tester(handles.main_isolate(), bytecode_array); 433 InterpreterTester tester(handles.main_isolate(), bytecode_array);
434 auto callable = tester.GetCallable<>(); 434 auto callable = tester.GetCallable<>();
435 Handle<Object> return_value = callable().ToHandleChecked(); 435 Handle<Object> return_value = callable().ToHandleChecked();
436 Handle<Object> expected_value = 436 Handle<Object> expected_value =
437 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); 437 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs));
438 CHECK(return_value->SameValue(*expected_value)); 438 CHECK(return_value->SameValue(*expected_value));
439 } 439 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 }; 475 };
476 476
477 for (size_t i = 0; i < arraysize(test_cases); i++) { 477 for (size_t i = 0; i < arraysize(test_cases); i++) {
478 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 478 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
479 builder.set_locals_count(1); 479 builder.set_locals_count(1);
480 builder.set_parameter_count(1); 480 builder.set_parameter_count(1);
481 Register reg(0); 481 Register reg(0);
482 builder.LoadLiteral(test_cases[i].lhs) 482 builder.LoadLiteral(test_cases[i].lhs)
483 .StoreAccumulatorInRegister(reg) 483 .StoreAccumulatorInRegister(reg)
484 .LoadLiteral(test_cases[i].rhs) 484 .LoadLiteral(test_cases[i].rhs)
485 .BinaryOperation(Token::Value::ADD, reg) 485 .BinaryOperation(Token::Value::ADD, reg, i::SLOPPY)
486 .Return(); 486 .Return();
487 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 487 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
488 488
489 InterpreterTester tester(handles.main_isolate(), bytecode_array); 489 InterpreterTester tester(handles.main_isolate(), bytecode_array);
490 auto callable = tester.GetCallable<>(); 490 auto callable = tester.GetCallable<>();
491 Handle<Object> return_value = callable().ToHandleChecked(); 491 Handle<Object> return_value = callable().ToHandleChecked();
492 CHECK(return_value->SameValue(*test_cases[i].expected_value)); 492 CHECK(return_value->SameValue(*test_cases[i].expected_value));
493 } 493 }
494 } 494 }
495 495
(...skipping 20 matching lines...) Expand all
516 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); 516 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3));
517 } 517 }
518 518
519 519
520 TEST(InterpreterParameter8) { 520 TEST(InterpreterParameter8) {
521 HandleAndZoneScope handles; 521 HandleAndZoneScope handles;
522 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 522 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
523 builder.set_locals_count(0); 523 builder.set_locals_count(0);
524 builder.set_parameter_count(8); 524 builder.set_parameter_count(8);
525 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) 525 builder.LoadAccumulatorWithRegister(builder.Parameter(0))
526 .BinaryOperation(Token::Value::ADD, builder.Parameter(1)) 526 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), i::SLOPPY)
527 .BinaryOperation(Token::Value::ADD, builder.Parameter(2)) 527 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), i::SLOPPY)
528 .BinaryOperation(Token::Value::ADD, builder.Parameter(3)) 528 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), i::SLOPPY)
529 .BinaryOperation(Token::Value::ADD, builder.Parameter(4)) 529 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), i::SLOPPY)
530 .BinaryOperation(Token::Value::ADD, builder.Parameter(5)) 530 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), i::SLOPPY)
531 .BinaryOperation(Token::Value::ADD, builder.Parameter(6)) 531 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), i::SLOPPY)
532 .BinaryOperation(Token::Value::ADD, builder.Parameter(7)) 532 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), i::SLOPPY)
533 .Return(); 533 .Return();
534 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 534 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
535 535
536 InterpreterTester tester(handles.main_isolate(), bytecode_array); 536 InterpreterTester tester(handles.main_isolate(), bytecode_array);
537 typedef Handle<Object> H; 537 typedef Handle<Object> H;
538 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>(); 538 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>();
539 539
540 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate()); 540 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate());
541 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate()); 541 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate());
542 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate()); 542 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate());
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 i::TypeFeedbackVector::New(isolate, &feedback_spec); 656 i::TypeFeedbackVector::New(isolate, &feedback_spec);
657 657
658 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); 658 Handle<i::String> key = factory->NewStringFromAsciiChecked("key");
659 key = factory->string_table()->LookupString(isolate, key); 659 key = factory->string_table()->LookupString(isolate, key);
660 660
661 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 661 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
662 builder.set_locals_count(1); 662 builder.set_locals_count(1);
663 builder.set_parameter_count(1); 663 builder.set_parameter_count(1);
664 builder.LoadLiteral(key) 664 builder.LoadLiteral(key)
665 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), 665 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot),
666 i::SLOPPY) 666 i::STRICT)
667 .Return(); 667 .Return();
668 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 668 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
669 669
670 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 670 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
671 auto callable = tester.GetCallable<Handle<Object>>(); 671 auto callable = tester.GetCallable<Handle<Object>>();
672 672
673 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })"); 673 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })");
674 // Test IC miss. 674 // Test IC miss.
675 Handle<Object> return_val = callable(object).ToHandleChecked(); 675 Handle<Object> return_val = callable(object).ToHandleChecked();
676 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); 676 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123));
(...skipping 25 matching lines...) Expand all
702 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); 702 Handle<i::String> name = factory->NewStringFromAsciiChecked("val");
703 name = factory->string_table()->LookupString(isolate, name); 703 name = factory->string_table()->LookupString(isolate, name);
704 704
705 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 705 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
706 builder.set_locals_count(1); 706 builder.set_locals_count(1);
707 builder.set_parameter_count(1); 707 builder.set_parameter_count(1);
708 builder.LoadLiteral(name) 708 builder.LoadLiteral(name)
709 .StoreAccumulatorInRegister(Register(0)) 709 .StoreAccumulatorInRegister(Register(0))
710 .LoadLiteral(Smi::FromInt(999)) 710 .LoadLiteral(Smi::FromInt(999))
711 .StoreNamedProperty(builder.Parameter(0), Register(0), 711 .StoreNamedProperty(builder.Parameter(0), Register(0),
712 vector->GetIndex(slot), i::SLOPPY) 712 vector->GetIndex(slot), i::STRICT)
713 .Return(); 713 .Return();
714 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 714 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
715 715
716 InterpreterTester tester(isolate, bytecode_array, vector); 716 InterpreterTester tester(isolate, bytecode_array, vector);
717 auto callable = tester.GetCallable<Handle<Object>>(); 717 auto callable = tester.GetCallable<Handle<Object>>();
718 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); 718 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })");
719 // Test IC miss. 719 // Test IC miss.
720 Handle<Object> result; 720 Handle<Object> result;
721 callable(object).ToHandleChecked(); 721 callable(object).ToHandleChecked();
722 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); 722 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result));
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 .StoreAccumulatorInRegister(reg) 948 .StoreAccumulatorInRegister(reg)
949 .LoadAccumulatorWithRegister(scratch); 949 .LoadAccumulatorWithRegister(scratch);
950 } 950 }
951 951
952 952
953 static BytecodeArrayBuilder& IncrementRegister(BytecodeArrayBuilder& builder, 953 static BytecodeArrayBuilder& IncrementRegister(BytecodeArrayBuilder& builder,
954 Register reg, int value, 954 Register reg, int value,
955 Register scratch) { 955 Register scratch) {
956 return builder.StoreAccumulatorInRegister(scratch) 956 return builder.StoreAccumulatorInRegister(scratch)
957 .LoadLiteral(Smi::FromInt(value)) 957 .LoadLiteral(Smi::FromInt(value))
958 .BinaryOperation(Token::Value::ADD, reg) 958 .BinaryOperation(Token::Value::ADD, reg, i::SLOPPY)
959 .StoreAccumulatorInRegister(reg) 959 .StoreAccumulatorInRegister(reg)
960 .LoadAccumulatorWithRegister(scratch); 960 .LoadAccumulatorWithRegister(scratch);
961 } 961 }
962 962
963 963
964 TEST(InterpreterJumps) { 964 TEST(InterpreterJumps) {
965 HandleAndZoneScope handles; 965 HandleAndZoneScope handles;
966 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); 966 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone());
967 builder.set_locals_count(2); 967 builder.set_locals_count(2);
968 builder.set_parameter_count(0); 968 builder.set_parameter_count(0);
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 .Return(); 1282 .Return();
1283 1283
1284 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1284 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1285 InterpreterTester tester(handles.main_isolate(), bytecode_array); 1285 InterpreterTester tester(handles.main_isolate(), bytecode_array);
1286 auto callable = tester.GetCallable<>(); 1286 auto callable = tester.GetCallable<>();
1287 Handle<Object> return_value = callable().ToHandleChecked(); 1287 Handle<Object> return_value = callable().ToHandleChecked();
1288 CHECK(return_value->IsBoolean()); 1288 CHECK(return_value->IsBoolean());
1289 CHECK_EQ(return_value->BooleanValue(), expected_value); 1289 CHECK_EQ(return_value->BooleanValue(), expected_value);
1290 } 1290 }
1291 } 1291 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698