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

Side by Side Diff: runtime/vm/object_test.cc

Issue 2941643002: Check for a passed-in type argument vector in the prolog of generic functions. (Closed)
Patch Set: address review comments Created 3 years, 6 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
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2506 matching lines...) Expand 10 before | Expand all | Expand 10 after
2517 ISOLATE_UNIT_TEST_CASE(ContextScope) { 2517 ISOLATE_UNIT_TEST_CASE(ContextScope) {
2518 const intptr_t parent_scope_function_level = 0; 2518 const intptr_t parent_scope_function_level = 0;
2519 LocalScope* parent_scope = 2519 LocalScope* parent_scope =
2520 new LocalScope(NULL, parent_scope_function_level, 0); 2520 new LocalScope(NULL, parent_scope_function_level, 0);
2521 2521
2522 const intptr_t local_scope_function_level = 1; 2522 const intptr_t local_scope_function_level = 1;
2523 LocalScope* local_scope = 2523 LocalScope* local_scope =
2524 new LocalScope(parent_scope, local_scope_function_level, 0); 2524 new LocalScope(parent_scope, local_scope_function_level, 0);
2525 2525
2526 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); 2526 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
2527 const String& ta = Symbols::FunctionTypeArgumentsVar();
2528 LocalVariable* var_ta = new LocalVariable(
2529 TokenPosition::kNoSource, TokenPosition::kNoSource, ta, dynamic_type);
2530 parent_scope->AddVariable(var_ta);
2531
2527 const String& a = String::ZoneHandle(Symbols::New(thread, "a")); 2532 const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
2528 LocalVariable* var_a = new LocalVariable( 2533 LocalVariable* var_a = new LocalVariable(
2529 TokenPosition::kNoSource, TokenPosition::kNoSource, a, dynamic_type); 2534 TokenPosition::kNoSource, TokenPosition::kNoSource, a, dynamic_type);
2530 parent_scope->AddVariable(var_a); 2535 parent_scope->AddVariable(var_a);
2531 2536
2532 const String& b = String::ZoneHandle(Symbols::New(thread, "b")); 2537 const String& b = String::ZoneHandle(Symbols::New(thread, "b"));
2533 LocalVariable* var_b = new LocalVariable( 2538 LocalVariable* var_b = new LocalVariable(
2534 TokenPosition::kNoSource, TokenPosition::kNoSource, b, dynamic_type); 2539 TokenPosition::kNoSource, TokenPosition::kNoSource, b, dynamic_type);
2535 local_scope->AddVariable(var_b); 2540 local_scope->AddVariable(var_b);
2536 2541
2537 const String& c = String::ZoneHandle(Symbols::New(thread, "c")); 2542 const String& c = String::ZoneHandle(Symbols::New(thread, "c"));
2538 LocalVariable* var_c = new LocalVariable( 2543 LocalVariable* var_c = new LocalVariable(
2539 TokenPosition::kNoSource, TokenPosition::kNoSource, c, dynamic_type); 2544 TokenPosition::kNoSource, TokenPosition::kNoSource, c, dynamic_type);
2540 parent_scope->AddVariable(var_c); 2545 parent_scope->AddVariable(var_c);
2541 2546
2542 bool test_only = false; // Please, insert alias. 2547 bool test_only = false; // Please, insert alias.
2548 var_ta = local_scope->LookupVariable(ta, test_only);
2549 EXPECT(var_ta->is_captured());
2550 EXPECT_EQ(parent_scope_function_level, var_ta->owner()->function_level());
2551 EXPECT(local_scope->LocalLookupVariable(ta) == var_ta); // Alias.
2552
2543 var_a = local_scope->LookupVariable(a, test_only); 2553 var_a = local_scope->LookupVariable(a, test_only);
2544 EXPECT(var_a->is_captured()); 2554 EXPECT(var_a->is_captured());
2545 EXPECT_EQ(parent_scope_function_level, var_a->owner()->function_level()); 2555 EXPECT_EQ(parent_scope_function_level, var_a->owner()->function_level());
2546 EXPECT(local_scope->LocalLookupVariable(a) == var_a); // Alias. 2556 EXPECT(local_scope->LocalLookupVariable(a) == var_a); // Alias.
2547 2557
2548 var_b = local_scope->LookupVariable(b, test_only); 2558 var_b = local_scope->LookupVariable(b, test_only);
2549 EXPECT(!var_b->is_captured()); 2559 EXPECT(!var_b->is_captured());
2550 EXPECT_EQ(local_scope_function_level, var_b->owner()->function_level()); 2560 EXPECT_EQ(local_scope_function_level, var_b->owner()->function_level());
2551 EXPECT(local_scope->LocalLookupVariable(b) == var_b); 2561 EXPECT(local_scope->LocalLookupVariable(b) == var_b);
2552 2562
2553 test_only = true; // Please, do not insert alias. 2563 test_only = true; // Please, do not insert alias.
2554 var_c = local_scope->LookupVariable(c, test_only); 2564 var_c = local_scope->LookupVariable(c, test_only);
2555 EXPECT(!var_c->is_captured()); 2565 EXPECT(!var_c->is_captured());
2556 EXPECT_EQ(parent_scope_function_level, var_c->owner()->function_level()); 2566 EXPECT_EQ(parent_scope_function_level, var_c->owner()->function_level());
2557 // c is not in local_scope. 2567 // c is not in local_scope.
2558 EXPECT(local_scope->LocalLookupVariable(c) == NULL); 2568 EXPECT(local_scope->LocalLookupVariable(c) == NULL);
2559 2569
2560 test_only = false; // Please, insert alias. 2570 test_only = false; // Please, insert alias.
2561 var_c = local_scope->LookupVariable(c, test_only); 2571 var_c = local_scope->LookupVariable(c, test_only);
2562 EXPECT(var_c->is_captured()); 2572 EXPECT(var_c->is_captured());
2563 2573
2564 EXPECT_EQ(3, local_scope->num_variables()); // a, b, and c alias. 2574 EXPECT_EQ(4, local_scope->num_variables()); // ta, a, b, c.
2565 EXPECT_EQ(2, local_scope->NumCapturedVariables()); // a, c alias. 2575 EXPECT_EQ(3, local_scope->NumCapturedVariables()); // ta, a, c.
2566 2576
2567 const int first_parameter_index = 0; 2577 const int first_parameter_index = 0;
2568 const int num_parameters = 0; 2578 const int num_parameters = 0;
2569 const int first_frame_index = -1; 2579 const int first_frame_index = -1;
2570 bool found_captured_vars = false; 2580 bool found_captured_vars = false;
2571 int next_frame_index = parent_scope->AllocateVariables( 2581 int next_frame_index = parent_scope->AllocateVariables(
2572 first_parameter_index, num_parameters, first_frame_index, NULL, 2582 first_parameter_index, num_parameters, first_frame_index, NULL,
2573 &found_captured_vars); 2583 &found_captured_vars);
2574 EXPECT_EQ(first_frame_index, next_frame_index); // a and c not in frame. 2584 // Variables a and c are captured, therefore are not allocated in frame.
2585 // Variable var_ta, although captured, still requires a slot in frame.
2586 EXPECT_EQ(-1, next_frame_index - first_frame_index); // Indices in frame < 0.
2575 const intptr_t parent_scope_context_level = 1; 2587 const intptr_t parent_scope_context_level = 1;
2576 EXPECT_EQ(parent_scope_context_level, parent_scope->context_level()); 2588 EXPECT_EQ(parent_scope_context_level, parent_scope->context_level());
2577 EXPECT(found_captured_vars); 2589 EXPECT(found_captured_vars);
2578 2590
2579 const intptr_t local_scope_context_level = 5; 2591 const intptr_t local_scope_context_level = 5;
2580 const ContextScope& context_scope = ContextScope::Handle( 2592 const ContextScope& context_scope = ContextScope::Handle(
2581 local_scope->PreserveOuterScope(local_scope_context_level)); 2593 local_scope->PreserveOuterScope(local_scope_context_level));
2582 LocalScope* outer_scope = LocalScope::RestoreOuterScope(context_scope); 2594 LocalScope* outer_scope = LocalScope::RestoreOuterScope(context_scope);
2583 EXPECT_EQ(2, outer_scope->num_variables()); 2595 EXPECT_EQ(3, outer_scope->num_variables());
2596
2597 var_ta = outer_scope->LocalLookupVariable(ta);
2598 EXPECT(var_ta->is_captured());
2599 EXPECT_EQ(0, var_ta->index()); // First index.
2600 EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
2601 var_ta->owner()->context_level()); // Adjusted context level.
2584 2602
2585 var_a = outer_scope->LocalLookupVariable(a); 2603 var_a = outer_scope->LocalLookupVariable(a);
2586 EXPECT(var_a->is_captured()); 2604 EXPECT(var_a->is_captured());
2587 EXPECT_EQ(0, var_a->index()); // First index. 2605 EXPECT_EQ(1, var_a->index()); // First index.
2588 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, 2606 EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
2589 var_a->owner()->context_level()); // Adjusted context level. 2607 var_a->owner()->context_level()); // Adjusted context level.
2590 2608
2591 // var b was not captured. 2609 // var b was not captured.
2592 EXPECT(outer_scope->LocalLookupVariable(b) == NULL); 2610 EXPECT(outer_scope->LocalLookupVariable(b) == NULL);
2593 2611
2594 var_c = outer_scope->LocalLookupVariable(c); 2612 var_c = outer_scope->LocalLookupVariable(c);
2595 EXPECT(var_c->is_captured()); 2613 EXPECT(var_c->is_captured());
2596 EXPECT_EQ(1, var_c->index()); 2614 EXPECT_EQ(2, var_c->index());
2597 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, 2615 EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
2598 var_c->owner()->context_level()); // Adjusted context level. 2616 var_c->owner()->context_level()); // Adjusted context level.
2599 } 2617 }
2600 2618
2601 2619
2602 ISOLATE_UNIT_TEST_CASE(Closure) { 2620 ISOLATE_UNIT_TEST_CASE(Closure) {
2603 // Allocate the class first. 2621 // Allocate the class first.
2604 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 2622 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
2605 const Script& script = Script::Handle(); 2623 const Script& script = Script::Handle();
2606 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 2624 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
(...skipping 2115 matching lines...) Expand 10 before | Expand all | Expand 10 after
4722 // utf32->utf16 conversion. 4740 // utf32->utf16 conversion.
4723 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff, 4741 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff,
4724 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff}; 4742 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff};
4725 4743
4726 const String& str = 4744 const String& str =
4727 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes))); 4745 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes)));
4728 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes))); 4746 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes)));
4729 } 4747 }
4730 4748
4731 } // namespace dart 4749 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698