| 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 2506 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  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  Loading... | 
|  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 | 
| OLD | NEW |