Index: vm/ic_stubs_ia32_test.cc |
=================================================================== |
--- vm/ic_stubs_ia32_test.cc (revision 700) |
+++ vm/ic_stubs_ia32_test.cc (working copy) |
@@ -1,205 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-#include "vm/globals.h" |
-#if defined(TARGET_ARCH_IA32) |
- |
-#include "vm/assembler.h" |
-#include "vm/code_index_table.h" |
-#include "vm/ic_stubs.h" |
-#include "vm/stub_code.h" |
-#include "vm/unit_test.h" |
- |
-namespace dart { |
- |
- |
-#define __ assembler-> |
- |
-ASSEMBLER_TEST_GENERATE(NotAnIc, assembler) { |
- __ nop(); |
- __ addl(EAX, Immediate(1)); |
- __ ret(); |
-} |
- |
-#undef __ |
- |
-ASSEMBLER_TEST_RUN(NotAnIc, entry) { |
- GrowableArray<const Class*> classes; |
- GrowableArray<const Function*> targets; |
- bool is_ic = ICStubs::RecognizeICStub(entry, &classes, &targets); |
- EXPECT_EQ(false, is_ic); |
- EXPECT_EQ(0, classes.length()); |
- EXPECT_EQ(0, targets.length()); |
-} |
- |
- |
-TEST_CASE(UnresolvedIcTest) { |
- GrowableArray<const Class*> classes; |
- GrowableArray<const Function*> targets; |
- uword entry = StubCode::CallInstanceFunctionLabel().address(); |
- bool is_ic = ICStubs::RecognizeICStub(entry, &classes, &targets); |
- EXPECT_EQ(true, is_ic); |
- EXPECT_EQ(0, classes.length()); |
- EXPECT_EQ(0, targets.length()); |
-} |
- |
- |
-static RawFunction* GetDummyTarget(const char* name) { |
- Assembler assembler; |
- assembler.ret(); |
- const Code& code = |
- Code::Handle(Code::FinalizeCode(name, &assembler)); |
- const String& function_name = |
- String::ZoneHandle(String::NewSymbol(name)); |
- const Function& function = Function::Handle(Function::New( |
- function_name, RawFunction::kFunction, true, false, 0)); |
- function.SetCode(code); |
- CodeIndexTable* code_index_table = Isolate::Current()->code_index_table(); |
- ASSERT(code_index_table != NULL); |
- code_index_table->AddFunction(function); |
- return function.raw(); |
-} |
- |
- |
-TEST_CASE(SmiIcTest) { |
- const Function& function = Function::Handle(GetDummyTarget("Dummy")); |
- GrowableArray<const Class*> classes; |
- GrowableArray<const Function*> targets; |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->smi_class())); |
- targets.Add(&function); |
- const Code& ic_stub = |
- Code::Handle(ICStubs::GetICStub(classes, targets)); |
- ASSERT(!ic_stub.IsNull()); |
- classes.Clear(); |
- targets.Clear(); |
- bool is_ic = ICStubs::RecognizeICStub( |
- ic_stub.EntryPoint(), &classes, &targets); |
- EXPECT_EQ(true, is_ic); |
- EXPECT(classes.length() == targets.length()); |
- EXPECT_EQ(1, classes.length()); |
- EXPECT(classes[0]->raw() == Isolate::Current()->object_store()->smi_class()); |
- EXPECT(targets[0]->raw() == function.raw()); |
-} |
- |
- |
-TEST_CASE(NonSmiIcTest) { |
- const Function& function = Function::Handle(GetDummyTarget("Dummy")); |
- GrowableArray<const Class*> classes; |
- GrowableArray<const Function*> targets; |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->array_class())); |
- targets.Add(&function); |
- Code& ic_stub = Code::Handle(ICStubs::GetICStub(classes, targets)); |
- ASSERT(!ic_stub.IsNull()); |
- classes.Clear(); |
- targets.Clear(); |
- bool is_ic = |
- ICStubs::RecognizeICStub(ic_stub.EntryPoint(), &classes, &targets); |
- EXPECT_EQ(true, is_ic); |
- EXPECT(classes.length() == targets.length()); |
- EXPECT_EQ(1, classes.length()); |
- EXPECT(classes[0]->raw() == |
- Isolate::Current()->object_store()->array_class()); |
- EXPECT(targets[0]->raw() == function.raw()); |
- |
- // Also check for always-ic-miss case (e.g. with null receiver). |
- classes.Clear(); |
- targets.Clear(); |
- ic_stub = ICStubs::GetICStub(classes, targets); |
- EXPECT(classes.length() == targets.length()); |
- EXPECT(classes.is_empty()); |
-} |
- |
-TEST_CASE(MixedIcTest) { |
- const Function& function = Function::Handle(GetDummyTarget("Dummy")); |
- GrowableArray<const Class*> classes; |
- GrowableArray<const Function*> targets; |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->array_class())); |
- targets.Add(&function); |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->smi_class())); |
- targets.Add(&function); |
- const Code& ic_stub = Code::Handle(ICStubs::GetICStub(classes, targets)); |
- ASSERT(!ic_stub.IsNull()); |
- GrowableArray<const Class*> new_classes; |
- GrowableArray<const Function*> new_targets; |
- bool is_ic = ICStubs::RecognizeICStub( |
- ic_stub.EntryPoint(), &new_classes, &new_targets); |
- EXPECT_EQ(true, is_ic); |
- EXPECT(new_classes.length() == new_targets.length()); |
- EXPECT_EQ(2, new_classes.length()); |
- for (int i = 0; i < classes.length(); i++) { |
- EXPECT(ICStubs::IndexOfClass(new_classes, *classes[i]) >= 0); |
- EXPECT(targets[i]->raw() == function.raw()); |
- } |
-} |
- |
- |
-TEST_CASE(ManyClassesICTest) { |
- const Function& function1 = Function::Handle(GetDummyTarget("Dummy1")); |
- const Function& function2 = Function::Handle(GetDummyTarget("Dummy2")); |
- GrowableArray<const Class*> classes; |
- GrowableArray<const Function*> targets; |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->array_class())); |
- targets.Add(&function1); |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->double_class())); |
- targets.Add(&function1); |
- classes.Add( |
- &Class::ZoneHandle(Isolate::Current()->object_store()->bool_class())); |
- targets.Add(&function2); |
- EXPECT_EQ(3, classes.length()); |
- const Code& ic_stub = Code::Handle(ICStubs::GetICStub(classes, targets)); |
- ASSERT(!ic_stub.IsNull()); |
- GrowableArray<const Class*> new_classes; |
- GrowableArray<const Function*> new_targets; |
- bool is_ic = ICStubs::RecognizeICStub( |
- ic_stub.EntryPoint(), &new_classes, &new_targets); |
- EXPECT_EQ(true, is_ic); |
- EXPECT(new_classes.length() == new_targets.length()); |
- EXPECT_EQ(3, new_classes.length()); |
- for (int i = 0; i < new_classes.length(); i++) { |
- if (new_classes[i]->raw() == |
- Isolate::Current()->object_store()->array_class()) { |
- EXPECT_EQ(function1.raw(), new_targets[i]->raw()); |
- } else if (new_classes[i]->raw() == |
- Isolate::Current()->object_store()->double_class()) { |
- EXPECT_EQ(function1.raw(), new_targets[i]->raw()); |
- } else if (new_classes[i]->raw() == |
- Isolate::Current()->object_store()->bool_class()) { |
- EXPECT_EQ(function2.raw(), new_targets[i]->raw()); |
- } else { |
- UNREACHABLE(); |
- } |
- } |
- ICStubs::PatchTargets(ic_stub.EntryPoint(), |
- Code::Handle(function1.code()).EntryPoint(), |
- Code::Handle(function2.code()).EntryPoint()); |
- is_ic = ICStubs::RecognizeICStub( |
- ic_stub.EntryPoint(), &new_classes, &new_targets); |
- EXPECT_EQ(true, is_ic); |
- EXPECT(new_classes.length() == new_targets.length()); |
- EXPECT_EQ(3, new_classes.length()); |
- for (int i = 0; i < new_classes.length(); i++) { |
- if (new_classes[i]->raw() == |
- Isolate::Current()->object_store()->array_class()) { |
- EXPECT_EQ(function2.raw(), new_targets[i]->raw()); |
- } else if (new_classes[i]->raw() == |
- Isolate::Current()->object_store()->double_class()) { |
- EXPECT_EQ(function2.raw(), new_targets[i]->raw()); |
- } else if (new_classes[i]->raw() == |
- Isolate::Current()->object_store()->bool_class()) { |
- EXPECT_EQ(function2.raw(), new_targets[i]->raw()); |
- } else { |
- UNREACHABLE(); |
- } |
- } |
-} |
- |
-} // namespace dart |
- |
-#endif // defined TARGET_ARCH_IA32 |