| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 DECLARE_FLAG(bool, write_protect_code); | 22 DECLARE_FLAG(bool, write_protect_code); |
| 23 | 23 |
| 24 static RawLibrary* CreateDummyLibrary(const String& library_name) { | 24 static RawLibrary* CreateDummyLibrary(const String& library_name) { |
| 25 return Library::New(library_name); | 25 return Library::New(library_name); |
| 26 } | 26 } |
| 27 | 27 |
| 28 | 28 |
| 29 static RawClass* CreateDummyClass(const String& class_name, | 29 static RawClass* CreateDummyClass(const String& class_name, |
| 30 const Script& script) { | 30 const Script& script) { |
| 31 const Class& cls = Class::Handle( | 31 const Class& cls = Class::Handle( |
| 32 Class::New(class_name, script, Token::kNoSourcePos)); | 32 Class::New(class_name, script, TokenDescriptor::kNoSource)); |
| 33 cls.set_is_synthesized_class(); // Dummy class for testing. | 33 cls.set_is_synthesized_class(); // Dummy class for testing. |
| 34 return cls.raw(); | 34 return cls.raw(); |
| 35 } | 35 } |
| 36 | 36 |
| 37 | 37 |
| 38 TEST_CASE(Class) { | 38 TEST_CASE(Class) { |
| 39 // Allocate the class first. | 39 // Allocate the class first. |
| 40 const String& class_name = String::Handle(Symbols::New("MyClass")); | 40 const String& class_name = String::Handle(Symbols::New("MyClass")); |
| 41 const Script& script = Script::Handle(); | 41 const Script& script = Script::Handle(); |
| 42 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); | 42 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 61 // parsed. | 61 // parsed. |
| 62 ClassFinalizer::FinalizeTypesInClass(cls); | 62 ClassFinalizer::FinalizeTypesInClass(cls); |
| 63 | 63 |
| 64 // Create and populate the function arrays. | 64 // Create and populate the function arrays. |
| 65 const Array& functions = Array::Handle(Array::New(6)); | 65 const Array& functions = Array::Handle(Array::New(6)); |
| 66 Function& function = Function::Handle(); | 66 Function& function = Function::Handle(); |
| 67 String& function_name = String::Handle(); | 67 String& function_name = String::Handle(); |
| 68 function_name = Symbols::New("foo"); | 68 function_name = Symbols::New("foo"); |
| 69 function = Function::New( | 69 function = Function::New( |
| 70 function_name, RawFunction::kRegularFunction, | 70 function_name, RawFunction::kRegularFunction, |
| 71 false, false, false, false, false, cls, 0); | 71 false, false, false, false, false, cls, TokenDescriptor::kMinSource); |
| 72 functions.SetAt(0, function); | 72 functions.SetAt(0, function); |
| 73 function_name = Symbols::New("bar"); | 73 function_name = Symbols::New("bar"); |
| 74 function = Function::New( | 74 function = Function::New( |
| 75 function_name, RawFunction::kRegularFunction, | 75 function_name, RawFunction::kRegularFunction, |
| 76 false, false, false, false, false, cls, 0); | 76 false, false, false, false, false, cls, TokenDescriptor::kMinSource); |
| 77 | 77 |
| 78 const int kNumFixedParameters = 2; | 78 const int kNumFixedParameters = 2; |
| 79 const int kNumOptionalParameters = 3; | 79 const int kNumOptionalParameters = 3; |
| 80 const bool kAreOptionalPositional = true; | 80 const bool kAreOptionalPositional = true; |
| 81 function.set_num_fixed_parameters(kNumFixedParameters); | 81 function.set_num_fixed_parameters(kNumFixedParameters); |
| 82 function.SetNumOptionalParameters(kNumOptionalParameters, | 82 function.SetNumOptionalParameters(kNumOptionalParameters, |
| 83 kAreOptionalPositional); | 83 kAreOptionalPositional); |
| 84 functions.SetAt(1, function); | 84 functions.SetAt(1, function); |
| 85 | 85 |
| 86 function_name = Symbols::New("baz"); | 86 function_name = Symbols::New("baz"); |
| 87 function = Function::New( | 87 function = Function::New( |
| 88 function_name, RawFunction::kRegularFunction, | 88 function_name, RawFunction::kRegularFunction, |
| 89 false, false, false, false, false, cls, 0); | 89 false, false, false, false, false, cls, TokenDescriptor::kMinSource); |
| 90 functions.SetAt(2, function); | 90 functions.SetAt(2, function); |
| 91 | 91 |
| 92 function_name = Symbols::New("Foo"); | 92 function_name = Symbols::New("Foo"); |
| 93 function = Function::New( | 93 function = Function::New( |
| 94 function_name, RawFunction::kRegularFunction, | 94 function_name, RawFunction::kRegularFunction, |
| 95 true, false, false, false, false, cls, 0); | 95 true, false, false, false, false, cls, TokenDescriptor::kMinSource); |
| 96 | 96 |
| 97 functions.SetAt(3, function); | 97 functions.SetAt(3, function); |
| 98 function_name = Symbols::New("Bar"); | 98 function_name = Symbols::New("Bar"); |
| 99 function = Function::New( | 99 function = Function::New( |
| 100 function_name, RawFunction::kRegularFunction, | 100 function_name, RawFunction::kRegularFunction, |
| 101 true, false, false, false, false, cls, 0); | 101 true, false, false, false, false, cls, TokenDescriptor::kMinSource); |
| 102 functions.SetAt(4, function); | 102 functions.SetAt(4, function); |
| 103 function_name = Symbols::New("BaZ"); | 103 function_name = Symbols::New("BaZ"); |
| 104 function = Function::New( | 104 function = Function::New( |
| 105 function_name, RawFunction::kRegularFunction, | 105 function_name, RawFunction::kRegularFunction, |
| 106 true, false, false, false, false, cls, 0); | 106 true, false, false, false, false, cls, TokenDescriptor::kMinSource); |
| 107 functions.SetAt(5, function); | 107 functions.SetAt(5, function); |
| 108 | 108 |
| 109 // Setup the functions in the class. | 109 // Setup the functions in the class. |
| 110 cls.SetFunctions(functions); | 110 cls.SetFunctions(functions); |
| 111 | 111 |
| 112 // The class can now be finalized. | 112 // The class can now be finalized. |
| 113 cls.Finalize(); | 113 cls.Finalize(); |
| 114 | 114 |
| 115 function_name = String::New("Foo"); | 115 function_name = String::New("Foo"); |
| 116 function = cls.LookupDynamicFunction(function_name); | 116 function = cls.LookupDynamicFunction(function_name); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 " var baz = \"${foo('}')}\";\n" | 234 " var baz = \"${foo('}')}\";\n" |
| 235 "}\n"; | 235 "}\n"; |
| 236 Dart_Handle lib_h = TestCase::LoadTestScript(kScript, NULL); | 236 Dart_Handle lib_h = TestCase::LoadTestScript(kScript, NULL); |
| 237 EXPECT_VALID(lib_h); | 237 EXPECT_VALID(lib_h); |
| 238 Library& lib = Library::Handle(); | 238 Library& lib = Library::Handle(); |
| 239 lib ^= Api::UnwrapHandle(lib_h); | 239 lib ^= Api::UnwrapHandle(lib_h); |
| 240 EXPECT(!lib.IsNull()); | 240 EXPECT(!lib.IsNull()); |
| 241 const Class& cls = Class::Handle( | 241 const Class& cls = Class::Handle( |
| 242 lib.LookupClass(String::Handle(String::New("A")))); | 242 lib.LookupClass(String::Handle(String::New("A")))); |
| 243 EXPECT(!cls.IsNull()); | 243 EXPECT(!cls.IsNull()); |
| 244 const intptr_t end_token_pos = cls.ComputeEndTokenPos(); | 244 const TokenDescriptor end_token_pos = cls.ComputeEndTokenPos(); |
| 245 const Script& scr = Script::Handle(cls.script()); | 245 const Script& scr = Script::Handle(cls.script()); |
| 246 intptr_t line; | 246 intptr_t line; |
| 247 intptr_t col; | 247 intptr_t col; |
| 248 scr.GetTokenLocation(end_token_pos, &line, &col); | 248 scr.GetTokenLocation(end_token_pos, &line, &col); |
| 249 EXPECT(line == 10 && col == 1); | 249 EXPECT(line == 10 && col == 1); |
| 250 } | 250 } |
| 251 | 251 |
| 252 | 252 |
| 253 TEST_CASE(InstanceClass) { | 253 TEST_CASE(InstanceClass) { |
| 254 // Allocate the class first. | 254 // Allocate the class first. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 275 // No fields, functions, or super type for the OneFieldClass. | 275 // No fields, functions, or super type for the OneFieldClass. |
| 276 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0); | 276 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0); |
| 277 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0); | 277 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0); |
| 278 EXPECT_EQ(empty_class.super_type(), AbstractType::null()); | 278 EXPECT_EQ(empty_class.super_type(), AbstractType::null()); |
| 279 ClassFinalizer::FinalizeTypesInClass(one_field_class); | 279 ClassFinalizer::FinalizeTypesInClass(one_field_class); |
| 280 | 280 |
| 281 const Array& one_fields = Array::Handle(Array::New(1)); | 281 const Array& one_fields = Array::Handle(Array::New(1)); |
| 282 const String& field_name = String::Handle(Symbols::New("the_field")); | 282 const String& field_name = String::Handle(Symbols::New("the_field")); |
| 283 const Field& field = Field::Handle( | 283 const Field& field = Field::Handle( |
| 284 Field::New(field_name, false, false, false, true, one_field_class, | 284 Field::New(field_name, false, false, false, true, one_field_class, |
| 285 Object::dynamic_type(), 0)); | 285 Object::dynamic_type(), TokenDescriptor::kMinSource)); |
| 286 one_fields.SetAt(0, field); | 286 one_fields.SetAt(0, field); |
| 287 one_field_class.SetFields(one_fields); | 287 one_field_class.SetFields(one_fields); |
| 288 one_field_class.Finalize(); | 288 one_field_class.Finalize(); |
| 289 intptr_t header_size = sizeof(RawObject); | 289 intptr_t header_size = sizeof(RawObject); |
| 290 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), | 290 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), |
| 291 one_field_class.instance_size()); | 291 one_field_class.instance_size()); |
| 292 EXPECT_EQ(header_size, field.Offset()); | 292 EXPECT_EQ(header_size, field.Offset()); |
| 293 EXPECT(!one_field_class.is_implemented()); | 293 EXPECT(!one_field_class.is_implemented()); |
| 294 one_field_class.set_is_implemented(); | 294 one_field_class.set_is_implemented(); |
| 295 EXPECT(one_field_class.is_implemented()); | 295 EXPECT(one_field_class.is_implemented()); |
| (...skipping 2159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2455 str = script.GetLine(last_dart_line); | 2455 str = script.GetLine(last_dart_line); |
| 2456 EXPECT_STREQ(" }", str.ToCString()); | 2456 EXPECT_STREQ(" }", str.ToCString()); |
| 2457 | 2457 |
| 2458 script.Tokenize(String::Handle(String::New("ABC"))); | 2458 script.Tokenize(String::Handle(String::New("ABC"))); |
| 2459 // Tokens: 0: kIDENT, 1: kLPAREN, 2: kRPAREN, 3: kLBRACE, 4: kNEWLINE, | 2459 // Tokens: 0: kIDENT, 1: kLPAREN, 2: kRPAREN, 3: kLBRACE, 4: kNEWLINE, |
| 2460 // 5: kRETURN, 6: kSTRING, 7: kSEMICOLON, 8: kNEWLINE, | 2460 // 5: kRETURN, 6: kSTRING, 7: kSEMICOLON, 8: kNEWLINE, |
| 2461 // 9: kRBRACE, 10: kNEWLINE | 2461 // 9: kRBRACE, 10: kNEWLINE |
| 2462 | 2462 |
| 2463 intptr_t line, col; | 2463 intptr_t line, col; |
| 2464 intptr_t fast_line; | 2464 intptr_t fast_line; |
| 2465 script.GetTokenLocation(0, &line, &col); | 2465 script.GetTokenLocation(TokenDescriptor(0), &line, &col); |
| 2466 EXPECT_EQ(first_dart_line, line); | 2466 EXPECT_EQ(first_dart_line, line); |
| 2467 EXPECT_EQ(col, col_offset + 1); | 2467 EXPECT_EQ(col, col_offset + 1); |
| 2468 | 2468 |
| 2469 // We allow asking for only the line number, which only scans the token stream | 2469 // We allow asking for only the line number, which only scans the token stream |
| 2470 // instead of rescanning the script. | 2470 // instead of rescanning the script. |
| 2471 script.GetTokenLocation(0, &fast_line, NULL); | 2471 script.GetTokenLocation(TokenDescriptor(0), &fast_line, NULL); |
| 2472 EXPECT_EQ(line, fast_line); | 2472 EXPECT_EQ(line, fast_line); |
| 2473 | 2473 |
| 2474 script.GetTokenLocation(5, &line, &col); // Token 'return' | 2474 script.GetTokenLocation(TokenDescriptor(5), &line, &col); // Token 'return' |
| 2475 EXPECT_EQ(4, line); // 'return' is in line 4. | 2475 EXPECT_EQ(4, line); // 'return' is in line 4. |
| 2476 EXPECT_EQ(5, col); // Four spaces before 'return'. | 2476 EXPECT_EQ(5, col); // Four spaces before 'return'. |
| 2477 | 2477 |
| 2478 // We allow asking for only the line number, which only scans the token stream | 2478 // We allow asking for only the line number, which only scans the token stream |
| 2479 // instead of rescanning the script. | 2479 // instead of rescanning the script. |
| 2480 script.GetTokenLocation(5, &fast_line, NULL); | 2480 script.GetTokenLocation(TokenDescriptor(5), &fast_line, NULL); |
| 2481 EXPECT_EQ(line, fast_line); | 2481 EXPECT_EQ(line, fast_line); |
| 2482 | 2482 |
| 2483 intptr_t first_idx, last_idx; | 2483 TokenDescriptor first_idx, last_idx; |
| 2484 script.TokenRangeAtLine(3, &first_idx, &last_idx); | 2484 script.TokenRangeAtLine(3, &first_idx, &last_idx); |
| 2485 EXPECT_EQ(0, first_idx); // Token 'main' is first token. | 2485 EXPECT_EQ(0, first_idx.value()); // Token 'main' is first token. |
| 2486 EXPECT_EQ(3, last_idx); // Token { is last token. | 2486 EXPECT_EQ(3, last_idx.value()); // Token { is last token. |
| 2487 script.TokenRangeAtLine(4, &first_idx, &last_idx); | 2487 script.TokenRangeAtLine(4, &first_idx, &last_idx); |
| 2488 EXPECT_EQ(5, first_idx); // Token 'return' is first token. | 2488 EXPECT_EQ(5, first_idx.value()); // Token 'return' is first token. |
| 2489 EXPECT_EQ(7, last_idx); // Token ; is last token. | 2489 EXPECT_EQ(7, last_idx.value()); // Token ; is last token. |
| 2490 script.TokenRangeAtLine(5, &first_idx, &last_idx); | 2490 script.TokenRangeAtLine(5, &first_idx, &last_idx); |
| 2491 EXPECT_EQ(9, first_idx); // Token } is first and only token. | 2491 EXPECT_EQ(9, first_idx.value()); // Token } is first and only token. |
| 2492 EXPECT_EQ(9, last_idx); | 2492 EXPECT_EQ(9, last_idx.value()); |
| 2493 script.TokenRangeAtLine(1, &first_idx, &last_idx); | 2493 script.TokenRangeAtLine(1, &first_idx, &last_idx); |
| 2494 EXPECT_EQ(0, first_idx); | 2494 EXPECT_EQ(0, first_idx.value()); |
| 2495 EXPECT_EQ(3, last_idx); | 2495 EXPECT_EQ(3, last_idx.value()); |
| 2496 script.TokenRangeAtLine(6, &first_idx, &last_idx); | 2496 script.TokenRangeAtLine(6, &first_idx, &last_idx); |
| 2497 EXPECT_EQ(-1, first_idx); | 2497 EXPECT_EQ(-1, first_idx.value()); |
| 2498 EXPECT_EQ(-1, last_idx); | 2498 EXPECT_EQ(-1, last_idx.value()); |
| 2499 script.TokenRangeAtLine(1000, &first_idx, &last_idx); | 2499 script.TokenRangeAtLine(1000, &first_idx, &last_idx); |
| 2500 EXPECT_EQ(-1, first_idx); | 2500 EXPECT_EQ(-1, first_idx.value()); |
| 2501 EXPECT_EQ(-1, last_idx); | 2501 EXPECT_EQ(-1, last_idx.value()); |
| 2502 } | 2502 } |
| 2503 | 2503 |
| 2504 | 2504 |
| 2505 TEST_CASE(Context) { | 2505 TEST_CASE(Context) { |
| 2506 const int kNumVariables = 5; | 2506 const int kNumVariables = 5; |
| 2507 const Context& parent_context = Context::Handle(Context::New(0)); | 2507 const Context& parent_context = Context::Handle(Context::New(0)); |
| 2508 const Context& context = Context::Handle(Context::New(kNumVariables)); | 2508 const Context& context = Context::Handle(Context::New(kNumVariables)); |
| 2509 context.set_parent(parent_context); | 2509 context.set_parent(parent_context); |
| 2510 EXPECT_EQ(kNumVariables, context.num_variables()); | 2510 EXPECT_EQ(kNumVariables, context.num_variables()); |
| 2511 EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw()); | 2511 EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2530 LocalScope* parent_scope = | 2530 LocalScope* parent_scope = |
| 2531 new LocalScope(NULL, parent_scope_function_level, 0); | 2531 new LocalScope(NULL, parent_scope_function_level, 0); |
| 2532 | 2532 |
| 2533 const intptr_t local_scope_function_level = 1; | 2533 const intptr_t local_scope_function_level = 1; |
| 2534 LocalScope* local_scope = | 2534 LocalScope* local_scope = |
| 2535 new LocalScope(parent_scope, local_scope_function_level, 0); | 2535 new LocalScope(parent_scope, local_scope_function_level, 0); |
| 2536 | 2536 |
| 2537 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); | 2537 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); |
| 2538 const String& a = String::ZoneHandle(Symbols::New("a")); | 2538 const String& a = String::ZoneHandle(Symbols::New("a")); |
| 2539 LocalVariable* var_a = | 2539 LocalVariable* var_a = |
| 2540 new LocalVariable(Token::kNoSourcePos, a, dynamic_type); | 2540 new LocalVariable(TokenDescriptor::kNoSource, a, dynamic_type); |
| 2541 parent_scope->AddVariable(var_a); | 2541 parent_scope->AddVariable(var_a); |
| 2542 | 2542 |
| 2543 const String& b = String::ZoneHandle(Symbols::New("b")); | 2543 const String& b = String::ZoneHandle(Symbols::New("b")); |
| 2544 LocalVariable* var_b = | 2544 LocalVariable* var_b = |
| 2545 new LocalVariable(Token::kNoSourcePos, b, dynamic_type); | 2545 new LocalVariable(TokenDescriptor::kNoSource, b, dynamic_type); |
| 2546 local_scope->AddVariable(var_b); | 2546 local_scope->AddVariable(var_b); |
| 2547 | 2547 |
| 2548 const String& c = String::ZoneHandle(Symbols::New("c")); | 2548 const String& c = String::ZoneHandle(Symbols::New("c")); |
| 2549 LocalVariable* var_c = | 2549 LocalVariable* var_c = |
| 2550 new LocalVariable(Token::kNoSourcePos, c, dynamic_type); | 2550 new LocalVariable(TokenDescriptor::kNoSource, c, dynamic_type); |
| 2551 parent_scope->AddVariable(var_c); | 2551 parent_scope->AddVariable(var_c); |
| 2552 | 2552 |
| 2553 bool test_only = false; // Please, insert alias. | 2553 bool test_only = false; // Please, insert alias. |
| 2554 var_a = local_scope->LookupVariable(a, test_only); | 2554 var_a = local_scope->LookupVariable(a, test_only); |
| 2555 EXPECT(var_a->is_captured()); | 2555 EXPECT(var_a->is_captured()); |
| 2556 EXPECT_EQ(parent_scope_function_level, var_a->owner()->function_level()); | 2556 EXPECT_EQ(parent_scope_function_level, var_a->owner()->function_level()); |
| 2557 EXPECT(local_scope->LocalLookupVariable(a) == var_a); // Alias. | 2557 EXPECT(local_scope->LocalLookupVariable(a) == var_a); // Alias. |
| 2558 | 2558 |
| 2559 var_b = local_scope->LookupVariable(b, test_only); | 2559 var_b = local_scope->LookupVariable(b, test_only); |
| 2560 EXPECT(!var_b->is_captured()); | 2560 EXPECT(!var_b->is_captured()); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2616 // Allocate the class first. | 2616 // Allocate the class first. |
| 2617 const String& class_name = String::Handle(Symbols::New("MyClass")); | 2617 const String& class_name = String::Handle(Symbols::New("MyClass")); |
| 2618 const Script& script = Script::Handle(); | 2618 const Script& script = Script::Handle(); |
| 2619 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); | 2619 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); |
| 2620 const Array& functions = Array::Handle(Array::New(1)); | 2620 const Array& functions = Array::Handle(Array::New(1)); |
| 2621 | 2621 |
| 2622 const Context& context = Context::Handle(Context::New(0)); | 2622 const Context& context = Context::Handle(Context::New(0)); |
| 2623 Function& parent = Function::Handle(); | 2623 Function& parent = Function::Handle(); |
| 2624 const String& parent_name = String::Handle(Symbols::New("foo_papa")); | 2624 const String& parent_name = String::Handle(Symbols::New("foo_papa")); |
| 2625 parent = Function::New(parent_name, RawFunction::kRegularFunction, | 2625 parent = Function::New(parent_name, RawFunction::kRegularFunction, |
| 2626 false, false, false, false, false, cls, 0); | 2626 false, false, false, false, false, cls, |
| 2627 TokenDescriptor::kMinSource); |
| 2627 functions.SetAt(0, parent); | 2628 functions.SetAt(0, parent); |
| 2628 cls.SetFunctions(functions); | 2629 cls.SetFunctions(functions); |
| 2629 | 2630 |
| 2630 Function& function = Function::Handle(); | 2631 Function& function = Function::Handle(); |
| 2631 const String& function_name = String::Handle(Symbols::New("foo")); | 2632 const String& function_name = String::Handle(Symbols::New("foo")); |
| 2632 function = Function::NewClosureFunction(function_name, parent, 0); | 2633 function = Function::NewClosureFunction( |
| 2634 function_name, parent, TokenDescriptor::kMinSource); |
| 2633 const Closure& closure = Closure::Handle(Closure::New(function, context)); | 2635 const Closure& closure = Closure::Handle(Closure::New(function, context)); |
| 2634 const Class& closure_class = Class::Handle(closure.clazz()); | 2636 const Class& closure_class = Class::Handle(closure.clazz()); |
| 2635 EXPECT_EQ(closure_class.id(), kClosureCid); | 2637 EXPECT_EQ(closure_class.id(), kClosureCid); |
| 2636 const Function& closure_function = Function::Handle(closure.function()); | 2638 const Function& closure_function = Function::Handle(closure.function()); |
| 2637 EXPECT_EQ(closure_function.raw(), function.raw()); | 2639 EXPECT_EQ(closure_function.raw(), function.raw()); |
| 2638 const Context& closure_context = Context::Handle(closure.context()); | 2640 const Context& closure_context = Context::Handle(closure.context()); |
| 2639 EXPECT_EQ(closure_context.raw(), context.raw()); | 2641 EXPECT_EQ(closure_context.raw(), context.raw()); |
| 2640 } | 2642 } |
| 2641 | 2643 |
| 2642 | 2644 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2685 const String& class_name = String::Handle(Symbols::New("ownerClass")); | 2687 const String& class_name = String::Handle(Symbols::New("ownerClass")); |
| 2686 const String& lib_name = String::Handle(Symbols::New("ownerLibrary")); | 2688 const String& lib_name = String::Handle(Symbols::New("ownerLibrary")); |
| 2687 const Script& script = Script::Handle(); | 2689 const Script& script = Script::Handle(); |
| 2688 const Class& owner_class = | 2690 const Class& owner_class = |
| 2689 Class::Handle(CreateDummyClass(class_name, script)); | 2691 Class::Handle(CreateDummyClass(class_name, script)); |
| 2690 const Library& owner_library = | 2692 const Library& owner_library = |
| 2691 Library::Handle(CreateDummyLibrary(lib_name)); | 2693 Library::Handle(CreateDummyLibrary(lib_name)); |
| 2692 owner_class.set_library(owner_library); | 2694 owner_class.set_library(owner_library); |
| 2693 const String& function_name = String::ZoneHandle(Symbols::New(name)); | 2695 const String& function_name = String::ZoneHandle(Symbols::New(name)); |
| 2694 return Function::New(function_name, RawFunction::kRegularFunction, | 2696 return Function::New(function_name, RawFunction::kRegularFunction, |
| 2695 true, false, false, false, false, owner_class, 0); | 2697 true, false, false, false, false, owner_class, |
| 2698 TokenDescriptor::kMinSource); |
| 2696 } | 2699 } |
| 2697 | 2700 |
| 2698 | 2701 |
| 2699 // Test for Code and Instruction object creation. | 2702 // Test for Code and Instruction object creation. |
| 2700 TEST_CASE(Code) { | 2703 TEST_CASE(Code) { |
| 2701 extern void GenerateIncrement(Assembler* assembler); | 2704 extern void GenerateIncrement(Assembler* assembler); |
| 2702 Assembler _assembler_; | 2705 Assembler _assembler_; |
| 2703 GenerateIncrement(&_assembler_); | 2706 GenerateIncrement(&_assembler_); |
| 2704 const Function& function = Function::Handle(CreateFunction("Test_Code")); | 2707 const Function& function = Function::Handle(CreateFunction("Test_Code")); |
| 2705 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); | 2708 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2828 EXPECT_EQ(150u, handlers.HandlerPCOffset(3)); | 2831 EXPECT_EQ(150u, handlers.HandlerPCOffset(3)); |
| 2829 EXPECT(!handlers.NeedsStacktrace(3)); | 2832 EXPECT(!handlers.NeedsStacktrace(3)); |
| 2830 EXPECT(handlers.HasCatchAll(3)); | 2833 EXPECT(handlers.HasCatchAll(3)); |
| 2831 } | 2834 } |
| 2832 | 2835 |
| 2833 | 2836 |
| 2834 TEST_CASE(PcDescriptors) { | 2837 TEST_CASE(PcDescriptors) { |
| 2835 DescriptorList* builder = new DescriptorList(0); | 2838 DescriptorList* builder = new DescriptorList(0); |
| 2836 | 2839 |
| 2837 // kind, pc_offset, deopt_id, token_pos, try_index | 2840 // kind, pc_offset, deopt_id, token_pos, try_index |
| 2838 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, 20, 1); | 2841 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2839 builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, 30, 0); | 2842 10, 1, TokenDescriptor(20), 1); |
| 2840 builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, 40, 1); | 2843 builder->AddDescriptor(RawPcDescriptors::kDeopt, |
| 2841 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, 40, 2); | 2844 20, 2, TokenDescriptor(30), 0); |
| 2842 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, 80, 3); | 2845 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2843 builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, 150, 3); | 2846 30, 3, TokenDescriptor(40), 1); |
| 2847 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2848 10, 4, TokenDescriptor(40), 2); |
| 2849 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2850 10, 5, TokenDescriptor(80), 3); |
| 2851 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2852 80, 6, TokenDescriptor(150), 3); |
| 2844 | 2853 |
| 2845 PcDescriptors& descriptors = PcDescriptors::Handle(); | 2854 PcDescriptors& descriptors = PcDescriptors::Handle(); |
| 2846 descriptors ^= builder->FinalizePcDescriptors(0); | 2855 descriptors ^= builder->FinalizePcDescriptors(0); |
| 2847 | 2856 |
| 2848 extern void GenerateIncrement(Assembler* assembler); | 2857 extern void GenerateIncrement(Assembler* assembler); |
| 2849 Assembler _assembler_; | 2858 Assembler _assembler_; |
| 2850 GenerateIncrement(&_assembler_); | 2859 GenerateIncrement(&_assembler_); |
| 2851 Code& code = Code::Handle(Code::FinalizeCode( | 2860 Code& code = Code::Handle(Code::FinalizeCode( |
| 2852 Function::Handle(CreateFunction("Test_Code")), &_assembler_)); | 2861 Function::Handle(CreateFunction("Test_Code")), &_assembler_)); |
| 2853 code.set_pc_descriptors(descriptors); | 2862 code.set_pc_descriptors(descriptors); |
| 2854 | 2863 |
| 2855 // Verify the PcDescriptor entries by accessing them. | 2864 // Verify the PcDescriptor entries by accessing them. |
| 2856 const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors()); | 2865 const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors()); |
| 2857 PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind); | 2866 PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind); |
| 2858 | 2867 |
| 2859 EXPECT_EQ(true, iter.MoveNext()); | 2868 EXPECT_EQ(true, iter.MoveNext()); |
| 2860 EXPECT_EQ(20, iter.TokenPos()); | 2869 EXPECT_EQ(20, iter.TokenPos().value()); |
| 2861 EXPECT_EQ(1, iter.TryIndex()); | 2870 EXPECT_EQ(1, iter.TryIndex()); |
| 2862 EXPECT_EQ(static_cast<uword>(10), iter.PcOffset()); | 2871 EXPECT_EQ(static_cast<uword>(10), iter.PcOffset()); |
| 2863 EXPECT_EQ(1, iter.DeoptId()); | 2872 EXPECT_EQ(1, iter.DeoptId()); |
| 2864 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); | 2873 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); |
| 2865 | 2874 |
| 2866 EXPECT_EQ(true, iter.MoveNext()); | 2875 EXPECT_EQ(true, iter.MoveNext()); |
| 2867 EXPECT_EQ(30, iter.TokenPos()); | 2876 EXPECT_EQ(30, iter.TokenPos().value()); |
| 2868 EXPECT_EQ(RawPcDescriptors::kDeopt, iter.Kind()); | 2877 EXPECT_EQ(RawPcDescriptors::kDeopt, iter.Kind()); |
| 2869 | 2878 |
| 2870 EXPECT_EQ(true, iter.MoveNext()); | 2879 EXPECT_EQ(true, iter.MoveNext()); |
| 2871 EXPECT_EQ(40, iter.TokenPos()); | 2880 EXPECT_EQ(40, iter.TokenPos().value()); |
| 2872 | 2881 |
| 2873 EXPECT_EQ(true, iter.MoveNext()); | 2882 EXPECT_EQ(true, iter.MoveNext()); |
| 2874 EXPECT_EQ(40, iter.TokenPos()); | 2883 EXPECT_EQ(40, iter.TokenPos().value()); |
| 2875 | 2884 |
| 2876 EXPECT_EQ(true, iter.MoveNext()); | 2885 EXPECT_EQ(true, iter.MoveNext()); |
| 2877 EXPECT_EQ(80, iter.TokenPos()); | 2886 EXPECT_EQ(80, iter.TokenPos().value()); |
| 2878 | 2887 |
| 2879 EXPECT_EQ(true, iter.MoveNext()); | 2888 EXPECT_EQ(true, iter.MoveNext()); |
| 2880 EXPECT_EQ(150, iter.TokenPos()); | 2889 EXPECT_EQ(150, iter.TokenPos().value()); |
| 2881 | 2890 |
| 2882 EXPECT_EQ(3, iter.TryIndex()); | 2891 EXPECT_EQ(3, iter.TryIndex()); |
| 2883 EXPECT_EQ(static_cast<uword>(80), iter.PcOffset()); | 2892 EXPECT_EQ(static_cast<uword>(80), iter.PcOffset()); |
| 2884 EXPECT_EQ(150, iter.TokenPos()); | 2893 EXPECT_EQ(150, iter.TokenPos().value()); |
| 2885 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); | 2894 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); |
| 2886 | 2895 |
| 2887 EXPECT_EQ(false, iter.MoveNext()); | 2896 EXPECT_EQ(false, iter.MoveNext()); |
| 2888 } | 2897 } |
| 2889 | 2898 |
| 2890 | 2899 |
| 2891 TEST_CASE(PcDescriptorsLargeDeltas) { | 2900 TEST_CASE(PcDescriptorsLargeDeltas) { |
| 2892 DescriptorList* builder = new DescriptorList(0); | 2901 DescriptorList* builder = new DescriptorList(0); |
| 2893 | 2902 |
| 2894 // kind, pc_offset, deopt_id, token_pos, try_index | 2903 // kind, pc_offset, deopt_id, token_pos, try_index |
| 2895 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, 200, 1); | 2904 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2896 builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, 300, 0); | 2905 100, 1, TokenDescriptor(200), 1); |
| 2897 builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, 400, 1); | 2906 builder->AddDescriptor(RawPcDescriptors::kDeopt, |
| 2898 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 4, 0, 2); | 2907 200, 2, TokenDescriptor(300), 0); |
| 2899 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 5, 800, 3); | 2908 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2900 builder->AddDescriptor(RawPcDescriptors::kOther, 800, 6, 150, 3); | 2909 300, 3, TokenDescriptor(400), 1); |
| 2910 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2911 100, 4, TokenDescriptor(0), 2); |
| 2912 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2913 100, 5, TokenDescriptor(800), 3); |
| 2914 builder->AddDescriptor(RawPcDescriptors::kOther, |
| 2915 800, 6, TokenDescriptor(150), 3); |
| 2901 | 2916 |
| 2902 PcDescriptors& descriptors = PcDescriptors::Handle(); | 2917 PcDescriptors& descriptors = PcDescriptors::Handle(); |
| 2903 descriptors ^= builder->FinalizePcDescriptors(0); | 2918 descriptors ^= builder->FinalizePcDescriptors(0); |
| 2904 | 2919 |
| 2905 extern void GenerateIncrement(Assembler* assembler); | 2920 extern void GenerateIncrement(Assembler* assembler); |
| 2906 Assembler _assembler_; | 2921 Assembler _assembler_; |
| 2907 GenerateIncrement(&_assembler_); | 2922 GenerateIncrement(&_assembler_); |
| 2908 Code& code = Code::Handle(Code::FinalizeCode( | 2923 Code& code = Code::Handle(Code::FinalizeCode( |
| 2909 Function::Handle(CreateFunction("Test_Code")), &_assembler_)); | 2924 Function::Handle(CreateFunction("Test_Code")), &_assembler_)); |
| 2910 code.set_pc_descriptors(descriptors); | 2925 code.set_pc_descriptors(descriptors); |
| 2911 | 2926 |
| 2912 // Verify the PcDescriptor entries by accessing them. | 2927 // Verify the PcDescriptor entries by accessing them. |
| 2913 const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors()); | 2928 const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors()); |
| 2914 PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind); | 2929 PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind); |
| 2915 | 2930 |
| 2916 EXPECT_EQ(true, iter.MoveNext()); | 2931 EXPECT_EQ(true, iter.MoveNext()); |
| 2917 EXPECT_EQ(200, iter.TokenPos()); | 2932 EXPECT_EQ(200, iter.TokenPos().value()); |
| 2918 EXPECT_EQ(1, iter.TryIndex()); | 2933 EXPECT_EQ(1, iter.TryIndex()); |
| 2919 EXPECT_EQ(static_cast<uword>(100), iter.PcOffset()); | 2934 EXPECT_EQ(static_cast<uword>(100), iter.PcOffset()); |
| 2920 EXPECT_EQ(1, iter.DeoptId()); | 2935 EXPECT_EQ(1, iter.DeoptId()); |
| 2921 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); | 2936 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); |
| 2922 | 2937 |
| 2923 EXPECT_EQ(true, iter.MoveNext()); | 2938 EXPECT_EQ(true, iter.MoveNext()); |
| 2924 EXPECT_EQ(300, iter.TokenPos()); | 2939 EXPECT_EQ(300, iter.TokenPos().value()); |
| 2925 EXPECT_EQ(RawPcDescriptors::kDeopt, iter.Kind()); | 2940 EXPECT_EQ(RawPcDescriptors::kDeopt, iter.Kind()); |
| 2926 | 2941 |
| 2927 EXPECT_EQ(true, iter.MoveNext()); | 2942 EXPECT_EQ(true, iter.MoveNext()); |
| 2928 EXPECT_EQ(400, iter.TokenPos()); | 2943 EXPECT_EQ(400, iter.TokenPos().value()); |
| 2929 | 2944 |
| 2930 EXPECT_EQ(true, iter.MoveNext()); | 2945 EXPECT_EQ(true, iter.MoveNext()); |
| 2931 EXPECT_EQ(0, iter.TokenPos()); | 2946 EXPECT_EQ(0, iter.TokenPos().value()); |
| 2932 | 2947 |
| 2933 EXPECT_EQ(true, iter.MoveNext()); | 2948 EXPECT_EQ(true, iter.MoveNext()); |
| 2934 EXPECT_EQ(800, iter.TokenPos()); | 2949 EXPECT_EQ(800, iter.TokenPos().value()); |
| 2935 | 2950 |
| 2936 EXPECT_EQ(true, iter.MoveNext()); | 2951 EXPECT_EQ(true, iter.MoveNext()); |
| 2937 EXPECT_EQ(150, iter.TokenPos()); | 2952 EXPECT_EQ(150, iter.TokenPos().value()); |
| 2938 | 2953 |
| 2939 EXPECT_EQ(3, iter.TryIndex()); | 2954 EXPECT_EQ(3, iter.TryIndex()); |
| 2940 EXPECT_EQ(static_cast<uword>(800), iter.PcOffset()); | 2955 EXPECT_EQ(static_cast<uword>(800), iter.PcOffset()); |
| 2941 EXPECT_EQ(150, iter.TokenPos()); | 2956 EXPECT_EQ(150, iter.TokenPos().value()); |
| 2942 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); | 2957 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); |
| 2943 | 2958 |
| 2944 EXPECT_EQ(false, iter.MoveNext()); | 2959 EXPECT_EQ(false, iter.MoveNext()); |
| 2945 } | 2960 } |
| 2946 | 2961 |
| 2947 | 2962 |
| 2948 static RawClass* CreateTestClass(const char* name) { | 2963 static RawClass* CreateTestClass(const char* name) { |
| 2949 const String& class_name = String::Handle(Symbols::New(name)); | 2964 const String& class_name = String::Handle(Symbols::New(name)); |
| 2950 const Class& cls = Class::Handle( | 2965 const Class& cls = Class::Handle( |
| 2951 CreateDummyClass(class_name, Script::Handle())); | 2966 CreateDummyClass(class_name, Script::Handle())); |
| 2952 return cls.raw(); | 2967 return cls.raw(); |
| 2953 } | 2968 } |
| 2954 | 2969 |
| 2955 | 2970 |
| 2956 static RawField* CreateTestField(const char* name) { | 2971 static RawField* CreateTestField(const char* name) { |
| 2957 const Class& cls = Class::Handle(CreateTestClass("global:")); | 2972 const Class& cls = Class::Handle(CreateTestClass("global:")); |
| 2958 const String& field_name = String::Handle(Symbols::New(name)); | 2973 const String& field_name = String::Handle(Symbols::New(name)); |
| 2959 const Field& field = | 2974 const Field& field = |
| 2960 Field::Handle(Field::New(field_name, true, false, false, true, cls, | 2975 Field::Handle(Field::New(field_name, true, false, false, true, cls, |
| 2961 Object::dynamic_type(), 0)); | 2976 Object::dynamic_type(), TokenDescriptor::kMinSource)); |
| 2962 return field.raw(); | 2977 return field.raw(); |
| 2963 } | 2978 } |
| 2964 | 2979 |
| 2965 | 2980 |
| 2966 TEST_CASE(ClassDictionaryIterator) { | 2981 TEST_CASE(ClassDictionaryIterator) { |
| 2967 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6")); | 2982 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6")); |
| 2968 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4")); | 2983 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4")); |
| 2969 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8")); | 2984 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8")); |
| 2970 Field& tee = Field::ZoneHandle(CreateTestField("TEE")); | 2985 Field& tee = Field::ZoneHandle(CreateTestField("TEE")); |
| 2971 String& url = String::ZoneHandle(String::New("SBB")); | 2986 String& url = String::ZoneHandle(String::New("SBB")); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2996 const bool is_external = false; | 3011 const bool is_external = false; |
| 2997 const bool is_native = false; | 3012 const bool is_native = false; |
| 2998 return Function::New(function_name, | 3013 return Function::New(function_name, |
| 2999 RawFunction::kRegularFunction, | 3014 RawFunction::kRegularFunction, |
| 3000 is_static, | 3015 is_static, |
| 3001 is_const, | 3016 is_const, |
| 3002 is_abstract, | 3017 is_abstract, |
| 3003 is_external, | 3018 is_external, |
| 3004 is_native, | 3019 is_native, |
| 3005 cls, | 3020 cls, |
| 3006 0); | 3021 TokenDescriptor::kMinSource); |
| 3007 } | 3022 } |
| 3008 | 3023 |
| 3009 | 3024 |
| 3010 TEST_CASE(ICData) { | 3025 TEST_CASE(ICData) { |
| 3011 Function& function = Function::Handle(GetDummyTarget("Bern")); | 3026 Function& function = Function::Handle(GetDummyTarget("Bern")); |
| 3012 const intptr_t id = 12; | 3027 const intptr_t id = 12; |
| 3013 const intptr_t num_args_tested = 1; | 3028 const intptr_t num_args_tested = 1; |
| 3014 const String& target_name = String::Handle(Symbols::New("Thun")); | 3029 const String& target_name = String::Handle(Symbols::New("Thun")); |
| 3015 const Array& args_descriptor = | 3030 const Array& args_descriptor = |
| 3016 Array::Handle(ArgumentsDescriptor::New(1, Object::null_array())); | 3031 Array::Handle(ArgumentsDescriptor::New(1, Object::null_array())); |
| (...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3770 // Allocate the class first. | 3785 // Allocate the class first. |
| 3771 const String& class_name = String::Handle(Symbols::New("MyClass")); | 3786 const String& class_name = String::Handle(Symbols::New("MyClass")); |
| 3772 const Script& script = Script::Handle(); | 3787 const Script& script = Script::Handle(); |
| 3773 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); | 3788 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); |
| 3774 const Array& functions = Array::Handle(Array::New(1)); | 3789 const Array& functions = Array::Handle(Array::New(1)); |
| 3775 const Isolate* iso = Isolate::Current(); | 3790 const Isolate* iso = Isolate::Current(); |
| 3776 | 3791 |
| 3777 Function& parent = Function::Handle(); | 3792 Function& parent = Function::Handle(); |
| 3778 const String& parent_name = String::Handle(Symbols::New("foo_papa")); | 3793 const String& parent_name = String::Handle(Symbols::New("foo_papa")); |
| 3779 parent = Function::New(parent_name, RawFunction::kRegularFunction, | 3794 parent = Function::New(parent_name, RawFunction::kRegularFunction, |
| 3780 false, false, false, false, false, cls, 0); | 3795 false, false, false, false, false, cls, |
| 3796 TokenDescriptor::kMinSource); |
| 3781 functions.SetAt(0, parent); | 3797 functions.SetAt(0, parent); |
| 3782 cls.SetFunctions(functions); | 3798 cls.SetFunctions(functions); |
| 3783 | 3799 |
| 3784 Function& function = Function::Handle(); | 3800 Function& function = Function::Handle(); |
| 3785 const String& function_name = String::Handle(Symbols::New("foo")); | 3801 const String& function_name = String::Handle(Symbols::New("foo")); |
| 3786 function = Function::NewClosureFunction(function_name, parent, 0); | 3802 function = Function::NewClosureFunction(function_name, parent, |
| 3803 TokenDescriptor::kMinSource); |
| 3787 // Add closure function to class. | 3804 // Add closure function to class. |
| 3788 iso->AddClosureFunction(function); | 3805 iso->AddClosureFunction(function); |
| 3789 | 3806 |
| 3790 // The closure should return a valid index. | 3807 // The closure should return a valid index. |
| 3791 intptr_t good_closure_index = iso->FindClosureIndex(function); | 3808 intptr_t good_closure_index = iso->FindClosureIndex(function); |
| 3792 EXPECT_GE(good_closure_index, 0); | 3809 EXPECT_GE(good_closure_index, 0); |
| 3793 // The parent function should return an invalid index. | 3810 // The parent function should return an invalid index. |
| 3794 intptr_t bad_closure_index = iso->FindClosureIndex(parent); | 3811 intptr_t bad_closure_index = iso->FindClosureIndex(parent); |
| 3795 EXPECT_EQ(bad_closure_index, -1); | 3812 EXPECT_EQ(bad_closure_index, -1); |
| 3796 | 3813 |
| 3797 // Retrieve closure function via index. | 3814 // Retrieve closure function via index. |
| 3798 Function& func_from_index = Function::Handle(); | 3815 Function& func_from_index = Function::Handle(); |
| 3799 func_from_index ^= iso->ClosureFunctionFromIndex(good_closure_index); | 3816 func_from_index ^= iso->ClosureFunctionFromIndex(good_closure_index); |
| 3800 // Same closure function. | 3817 // Same closure function. |
| 3801 EXPECT_EQ(func_from_index.raw(), function.raw()); | 3818 EXPECT_EQ(func_from_index.raw(), function.raw()); |
| 3802 } | 3819 } |
| 3803 | 3820 |
| 3804 | 3821 |
| 3805 TEST_CASE(FindInvocationDispatcherFunctionIndex) { | 3822 TEST_CASE(FindInvocationDispatcherFunctionIndex) { |
| 3806 const String& class_name = String::Handle(Symbols::New("MyClass")); | 3823 const String& class_name = String::Handle(Symbols::New("MyClass")); |
| 3807 const Script& script = Script::Handle(); | 3824 const Script& script = Script::Handle(); |
| 3808 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); | 3825 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); |
| 3809 ClassFinalizer::FinalizeTypesInClass(cls); | 3826 ClassFinalizer::FinalizeTypesInClass(cls); |
| 3810 | 3827 |
| 3811 const Array& functions = Array::Handle(Array::New(1)); | 3828 const Array& functions = Array::Handle(Array::New(1)); |
| 3812 Function& parent = Function::Handle(); | 3829 Function& parent = Function::Handle(); |
| 3813 const String& parent_name = String::Handle(Symbols::New("foo_papa")); | 3830 const String& parent_name = String::Handle(Symbols::New("foo_papa")); |
| 3814 parent = Function::New(parent_name, RawFunction::kRegularFunction, | 3831 parent = Function::New(parent_name, RawFunction::kRegularFunction, |
| 3815 false, false, false, false, false, cls, 0); | 3832 false, false, false, false, false, cls, |
| 3833 TokenDescriptor::kMinSource); |
| 3816 functions.SetAt(0, parent); | 3834 functions.SetAt(0, parent); |
| 3817 cls.SetFunctions(functions); | 3835 cls.SetFunctions(functions); |
| 3818 cls.Finalize(); | 3836 cls.Finalize(); |
| 3819 | 3837 |
| 3820 // Add invocation dispatcher. | 3838 // Add invocation dispatcher. |
| 3821 const String& invocation_dispatcher_name = | 3839 const String& invocation_dispatcher_name = |
| 3822 String::Handle(Symbols::New("myMethod")); | 3840 String::Handle(Symbols::New("myMethod")); |
| 3823 const Array& args_desc = Array::Handle(ArgumentsDescriptor::New(1)); | 3841 const Array& args_desc = Array::Handle(ArgumentsDescriptor::New(1)); |
| 3824 Function& invocation_dispatcher = Function::Handle(); | 3842 Function& invocation_dispatcher = Function::Handle(); |
| 3825 invocation_dispatcher ^= | 3843 invocation_dispatcher ^= |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4678 String& test = String::Handle(); | 4696 String& test = String::Handle(); |
| 4679 String& result = String::Handle(); | 4697 String& result = String::Handle(); |
| 4680 for (size_t i = 0; i < ARRAY_SIZE(tests); i++) { | 4698 for (size_t i = 0; i < ARRAY_SIZE(tests); i++) { |
| 4681 test = String::New(tests[i].in); | 4699 test = String::New(tests[i].in); |
| 4682 result = String::IdentifierPrettyName(test); | 4700 result = String::IdentifierPrettyName(test); |
| 4683 EXPECT_STREQ(tests[i].out, result.ToCString()); | 4701 EXPECT_STREQ(tests[i].out, result.ToCString()); |
| 4684 } | 4702 } |
| 4685 } | 4703 } |
| 4686 | 4704 |
| 4687 } // namespace dart | 4705 } // namespace dart |
| OLD | NEW |