Chromium Code Reviews| Index: runtime/vm/object_test.cc |
| diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc |
| index 8d93d307a97299637be975a8f285a4787bca1082..b4ab957b650d88d0528d3f0ce3eb52addc45180a 100644 |
| --- a/runtime/vm/object_test.cc |
| +++ b/runtime/vm/object_test.cc |
| @@ -3468,17 +3468,21 @@ TEST_CASE(FindFieldIndex) { |
| TEST_CASE(FindFunctionIndex) { |
| + // Tests both FindFunctionIndex and FindImplicitClosureFunctionIndex. |
|
Ivan Posva
2014/01/03 01:52:17
Can you add the dispatcher lookups to the tests as
Cutch
2014/01/03 16:01:56
Done.
|
| const char* kScriptChars = |
| "class A {\n" |
| " void a() {}\n" |
| - " void b() {}\n" |
| + " void b() { return a; }\n" |
| "}\n" |
| "class B {\n" |
| " dynamic d() {}\n" |
| "}\n" |
| + "var x;\n" |
| "test() {\n" |
| - " new A();\n" |
| + " x = new A().b();\n" |
| + " x();\n" |
| " new B();\n" |
| + " return x;\n" |
| "}"; |
| Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| EXPECT_VALID(h_lib); |
| @@ -3493,25 +3497,37 @@ TEST_CASE(FindFunctionIndex) { |
| const Function& func_a = Function::Handle(GetFunction(class_a, "a")); |
| const Function& func_b = Function::Handle(GetFunction(class_a, "b")); |
| const Function& func_d = Function::Handle(GetFunction(class_b, "d")); |
| + EXPECT(func_a.HasImplicitClosureFunction()); |
| + const Function& func_x = Function::Handle(func_a.ImplicitClosureFunction()); |
| intptr_t func_a_index = class_a.FindFunctionIndex(func_a); |
| intptr_t func_b_index = class_a.FindFunctionIndex(func_b); |
| intptr_t func_d_index = class_a.FindFunctionIndex(func_d); |
| + intptr_t func_x_index = class_a.FindImplicitClosureFunctionIndex(func_x); |
| // Valid index. |
| EXPECT_GE(func_a_index, 0); |
| // Valid index. |
| EXPECT_GE(func_b_index, 0); |
| // Invalid index. |
| EXPECT_EQ(func_d_index, -1); |
| + // Valid index. |
| + EXPECT_GE(func_x_index, 0); |
| Function& func_a_from_index = Function::Handle(); |
| func_a_from_index ^= class_a_funcs.At(func_a_index); |
| - ASSERT(!func_a_from_index.IsNull()); |
| + EXPECT(!func_a_from_index.IsNull()); |
| // Same function. |
| EXPECT_EQ(func_a.raw(), func_a_from_index.raw()); |
| Function& func_b_from_index = Function::Handle(); |
| func_b_from_index ^= class_a_funcs.At(func_b_index); |
| - ASSERT(!func_b_from_index.IsNull()); |
| + EXPECT(!func_b_from_index.IsNull()); |
| // Same function. |
| EXPECT_EQ(func_b.raw(), func_b_from_index.raw()); |
| + // Retrieve function a from x's index. |
| + func_a_from_index ^= class_a_funcs.At(func_x_index); |
| + EXPECT_EQ(func_a.raw(), func_a_from_index.raw()); |
| + EXPECT(func_a.HasImplicitClosureFunction()); |
| + Function& func_x_from_index = Function::Handle(); |
| + func_x_from_index ^= func_a_from_index.ImplicitClosureFunction(); |
| + EXPECT_EQ(func_x.raw(), func_x_from_index.raw()); |
| } |
| @@ -3535,11 +3551,11 @@ TEST_CASE(FindClosureIndex) { |
| // Add closure function to class. |
| cls.AddClosureFunction(function); |
| - // Token position 0 should return a valid index. |
| - intptr_t good_closure_index = cls.FindClosureIndex(0); |
| + // The closure should return a valid index. |
| + intptr_t good_closure_index = cls.FindClosureIndex(function); |
| EXPECT_GE(good_closure_index, 0); |
| - // Token position 1 should return an invalid index. |
| - intptr_t bad_closure_index = cls.FindClosureIndex(1); |
| + // The parent function should return an invalid index. |
| + intptr_t bad_closure_index = cls.FindClosureIndex(parent); |
| EXPECT_EQ(bad_closure_index, -1); |
| // Retrieve closure function via index. |