Chromium Code Reviews| Index: runtime/vm/assembler_dbc_test.cc |
| diff --git a/runtime/vm/assembler_dbc_test.cc b/runtime/vm/assembler_dbc_test.cc |
| index 11e579e1caeb8939be57071ee8a495f9d0a5a70d..3d5b7514249bef94e77a36f5181e68c69cebebd4 100644 |
| --- a/runtime/vm/assembler_dbc_test.cc |
| +++ b/runtime/vm/assembler_dbc_test.cc |
| @@ -32,6 +32,81 @@ static RawObject* ExecuteTest(const Code& code) { |
| #define __ assembler-> |
| +static RawClass* CreateDummyClass(const String& class_name, |
| + const Script& script) { |
| + const Class& cls = Class::Handle(Class::New( |
| + Library::Handle(), class_name, script, TokenPosition::kNoSource)); |
| + cls.set_is_synthesized_class(); // Dummy class for testing. |
| + return cls.raw(); |
| +} |
| + |
| + |
| +static RawLibrary* CreateDummyLibrary(const String& library_name) { |
| + return Library::New(library_name); |
| +} |
| + |
| + |
| +static RawFunction* CreateFunction(const char* name) { |
| + Thread* thread = Thread::Current(); |
| + const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); |
| + const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary")); |
| + const Script& script = Script::Handle(); |
| + const Class& owner_class = |
| + Class::Handle(CreateDummyClass(class_name, script)); |
| + const Library& owner_library = |
| + Library::Handle(CreateDummyLibrary(lib_name)); |
| + owner_class.set_library(owner_library); |
| + const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); |
| + return Function::New(function_name, RawFunction::kRegularFunction, |
| + true, false, false, false, false, owner_class, |
| + TokenPosition::kMinSource); |
| +} |
| + |
| + |
| +static void GenerateDummyCode(Assembler* assembler, const Object& result) { |
| + __ PushConstant(result); |
| + __ ReturnTOS(); |
| +} |
| + |
| + |
| +static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) { |
| + // Make a dummy function. |
| + Assembler _assembler_; |
| + GenerateDummyCode(&_assembler_, result); |
| + const char* dummy_function_name = "dummy_instance_function"; |
| + const Function& dummy_instance_function = |
| + Function::Handle(CreateFunction(dummy_function_name)); |
| + Code& code = |
| + Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_)); |
| + dummy_instance_function.AttachCode(code); |
| + |
| + // Make a dummy ICData. |
| + const Array& dummy_arguments_descriptor = |
| + Array::Handle(ArgumentsDescriptor::New(2)); |
| + const ICData& ic_data = ICData::Handle(ICData::New( |
| + dummy_instance_function, |
| + String::Handle(dummy_instance_function.name()), |
| + dummy_arguments_descriptor, |
| + Thread::kNoDeoptId, |
| + 2)); |
| + |
| + // Wire up the Function in the ICData. |
| + GrowableArray<intptr_t> cids(2); |
| + cids.Add(kSmiCid); |
| + cids.Add(kSmiCid); |
| + ic_data.AddCheck(cids, dummy_instance_function); |
| + |
| + // For the non-Smi tests. |
| + cids[0] = kBigintCid; |
| + ic_data.AddCheck(cids, dummy_instance_function); |
|
Vyacheslav Egorov (Google)
2016/06/01 22:41:10
Might be good to put something else - just to make
zra
2016/06/03 16:08:57
Since we have to test the case where there is a no
|
| + ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original()); |
| + |
| + // Generate the instance call. |
| + const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data); |
| + __ InstanceCall2(2, call_ic_data_kidx); |
| +} |
| + |
| + |
| ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| @@ -66,7 +141,8 @@ ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ PushConstant(Smi::Handle(Smi::New(84))); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -80,7 +156,8 @@ ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -96,7 +173,8 @@ ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -110,7 +188,8 @@ ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(30))); |
| __ PushConstant(Smi::Handle(Smi::New(-12))); |
| __ SubTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -124,7 +203,8 @@ ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ SubTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -140,7 +220,8 @@ ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ SubTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -154,7 +235,8 @@ ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(-6))); |
| __ PushConstant(Smi::Handle(Smi::New(-7))); |
| __ MulTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -168,7 +250,8 @@ ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| __ PushConstant(Smi::Handle(Smi::New(-8))); |
| __ MulTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -184,7 +267,8 @@ ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ MulTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -198,7 +282,8 @@ ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(0x22))); |
| __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| __ BitOrTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -214,7 +299,8 @@ ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| __ BitOrTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -228,7 +314,8 @@ ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(0x2a))); |
| __ PushConstant(Smi::Handle(Smi::New(0xaa))); |
| __ BitAndTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -244,7 +331,8 @@ ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| __ BitAndTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(42))); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| __ ReturnTOS(); |
| } |
| @@ -258,7 +346,8 @@ ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ EqualTOS(); |
| - __ PushConstant(Bool::False()); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::False()); |
| __ ReturnTOS(); |
| } |
| @@ -272,7 +361,8 @@ ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ EqualTOS(); |
| - __ PushConstant(Bool::True()); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::True()); |
| __ ReturnTOS(); |
| } |
| @@ -288,7 +378,8 @@ ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ EqualTOS(); |
| - __ PushConstant(Bool::True()); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::True()); |
| __ ReturnTOS(); |
| } |
| @@ -302,7 +393,8 @@ ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ LessThanTOS(); |
| - __ PushConstant(Bool::False()); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::False()); |
| __ ReturnTOS(); |
| } |
| @@ -316,7 +408,8 @@ ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ LessThanTOS(); |
| - __ PushConstant(Bool::False()); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::False()); |
| __ ReturnTOS(); |
| } |
| @@ -332,7 +425,8 @@ ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ LessThanTOS(); |
| - __ PushConstant(Bool::True()); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::True()); |
| __ ReturnTOS(); |
| } |
| @@ -346,7 +440,8 @@ ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ GreaterThanTOS(); |
| - __ PushConstant(Bool::False()); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::False()); |
| __ ReturnTOS(); |
| } |
| @@ -360,7 +455,8 @@ ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ PushConstant(Smi::Handle(Smi::New(42))); |
| __ GreaterThanTOS(); |
| - __ PushConstant(Bool::False()); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::False()); |
| __ ReturnTOS(); |
| } |
| @@ -376,7 +472,8 @@ ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { |
| __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| __ PushConstant(Smi::Handle(Smi::New(-42))); |
| __ GreaterThanTOS(); |
| - __ PushConstant(Bool::True()); // Shouldn't be skipped. |
| + // Shouldn't be skipped. |
| + MakeDummyInstanceCall(assembler, Bool::True()); |
| __ ReturnTOS(); |
| } |
| @@ -777,7 +874,7 @@ ASSEMBLER_TEST_GENERATE(DropR, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(41))); |
| __ DropR(11); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -840,11 +937,13 @@ ASSEMBLER_TEST_RUN(FrameInitialized, test) { |
| // Push FP[rX] to the stack. |
| ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) { |
| __ Frame(1); |
| + __ PushConstant(Smi::Handle(Smi::New(37))); |
| __ PushConstant(Smi::Handle(Smi::New(21))); |
| __ StoreLocal(0); |
| __ Push(0); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -861,7 +960,8 @@ ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) { |
| __ Push(0); |
| __ Push(0); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -877,7 +977,8 @@ ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) { |
| __ Push(0); |
| __ Push(0); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -900,7 +1001,8 @@ ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) { |
| __ Push(0); |
| __ Push(1); |
| __ AddTOS(); |
| - __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped. |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| __ ReturnTOS(); |
| } |
| @@ -951,14 +1053,16 @@ ASSEMBLER_TEST_GENERATE(Loop, assembler) { |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ Push(1); |
| __ AddTOS(); |
| - __ Jump(&error); |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1))); |
| __ PopLocal(1); |
| // Subtract 1 from FP[0]. |
| __ Push(0); |
| __ PushConstant(Smi::Handle(Smi::New(1))); |
| __ SubTOS(); |
| - __ Jump(&error); |
| + // Should be skipped. |
| + MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(-1))); |
| // Jump to loop_entry if FP[0] != 0. |
| __ StoreLocal(0); |