| OLD | NEW | 
|---|
| 1 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 "vm/kernel_binary_flowgraph.h" | 5 #include "vm/kernel_binary_flowgraph.h" | 
| 6 | 6 | 
| 7 #include "vm/compiler.h" | 7 #include "vm/compiler.h" | 
| 8 #include "vm/longjump.h" | 8 #include "vm/longjump.h" | 
| 9 #include "vm/object_store.h" | 9 #include "vm/object_store.h" | 
| 10 | 10 | 
| (...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 811       // TODO(jensj): From kernel_binary.cc | 811       // TODO(jensj): From kernel_binary.cc | 
| 812       // forinstmt->variable_->set_end_position(forinstmt->position_); | 812       // forinstmt->variable_->set_end_position(forinstmt->position_); | 
| 813       ExitScope(position, builder_->reader_->max_position()); | 813       ExitScope(position, builder_->reader_->max_position()); | 
| 814       --depth_.loop_; | 814       --depth_.loop_; | 
| 815       --depth_.for_in_; | 815       --depth_.for_in_; | 
| 816       return; | 816       return; | 
| 817     } | 817     } | 
| 818     case kSwitchStatement: { | 818     case kSwitchStatement: { | 
| 819       AddSwitchVariable(); | 819       AddSwitchVariable(); | 
| 820       VisitExpression();                           // read condition. | 820       VisitExpression();                           // read condition. | 
| 821       int num_cases = builder_->ReadListLength();  // read number of cases. | 821       int case_count = builder_->ReadListLength();  // read number of cases. | 
| 822       for (intptr_t i = 0; i < num_cases; ++i) { | 822       for (intptr_t i = 0; i < case_count; ++i) { | 
| 823         int num_expressions = | 823         int expression_count = | 
| 824             builder_->ReadListLength();  // read number of expressions. | 824             builder_->ReadListLength();  // read number of expressions. | 
| 825         for (intptr_t j = 0; j < num_expressions; ++j) { | 825         for (intptr_t j = 0; j < expression_count; ++j) { | 
| 826           builder_->ReadPosition();  // read jth position. | 826           builder_->ReadPosition();  // read jth position. | 
| 827           VisitExpression();         // read jth expression. | 827           VisitExpression();         // read jth expression. | 
| 828         } | 828         } | 
| 829         builder_->ReadBool();  // read is_default. | 829         builder_->ReadBool();  // read is_default. | 
| 830         VisitStatement();      // read body. | 830         VisitStatement();      // read body. | 
| 831       } | 831       } | 
| 832       return; | 832       return; | 
| 833     } | 833     } | 
| 834     case kContinueSwitchStatement: | 834     case kContinueSwitchStatement: | 
| 835       builder_->ReadUInt();  // read target_index. | 835       builder_->ReadUInt();  // read target_index. | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 860     case kTryCatch: { | 860     case kTryCatch: { | 
| 861       ++depth_.try_; | 861       ++depth_.try_; | 
| 862       AddTryVariables(); | 862       AddTryVariables(); | 
| 863       VisitStatement();  // read body. | 863       VisitStatement();  // read body. | 
| 864       --depth_.try_; | 864       --depth_.try_; | 
| 865 | 865 | 
| 866       ++depth_.catch_; | 866       ++depth_.catch_; | 
| 867       AddCatchVariables(); | 867       AddCatchVariables(); | 
| 868 | 868 | 
| 869       builder_->ReadBool();  // read any_catch_needs_stack_trace. | 869       builder_->ReadBool();  // read any_catch_needs_stack_trace. | 
| 870       intptr_t num_catches = | 870       intptr_t catch_count = | 
| 871           builder_->ReadListLength();  // read number of catches. | 871           builder_->ReadListLength();  // read number of catches. | 
| 872       for (intptr_t i = 0; i < num_catches; ++i) { | 872       for (intptr_t i = 0; i < catch_count; ++i) { | 
| 873         PositionScope scope(builder_->reader_); | 873         PositionScope scope(builder_->reader_); | 
| 874         intptr_t offset = builder_->ReaderOffset();  // Catch has no tag. | 874         intptr_t offset = builder_->ReaderOffset();  // Catch has no tag. | 
| 875 | 875 | 
| 876         EnterScope(offset); | 876         EnterScope(offset); | 
| 877 | 877 | 
| 878         VisitDartType();            // Read the guard. | 878         VisitDartType();            // Read the guard. | 
| 879         tag = builder_->ReadTag();  // read first part of exception. | 879         tag = builder_->ReadTag();  // read first part of exception. | 
| 880         if (tag == kSomething) { | 880         if (tag == kSomething) { | 
| 881           VisitVariableDeclaration();  // read exception. | 881           VisitVariableDeclaration();  // read exception. | 
| 882         } | 882         } | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 937       VisitVariableDeclaration();        // read variable declaration. | 937       VisitVariableDeclaration();        // read variable declaration. | 
| 938       HandleLocalFunction(offset);       // read function node. | 938       HandleLocalFunction(offset);       // read function node. | 
| 939       return; | 939       return; | 
| 940     } | 940     } | 
| 941     default: | 941     default: | 
| 942       UNREACHABLE(); | 942       UNREACHABLE(); | 
| 943   } | 943   } | 
| 944 } | 944 } | 
| 945 | 945 | 
| 946 void StreamingScopeBuilder::VisitArguments() { | 946 void StreamingScopeBuilder::VisitArguments() { | 
| 947   builder_->ReadUInt();  // read num_arguments. | 947   builder_->ReadUInt();  // read argument_count. | 
| 948 | 948 | 
| 949   // Types | 949   // Types | 
| 950   intptr_t list_length = builder_->ReadListLength();  // read list length. | 950   intptr_t list_length = builder_->ReadListLength();  // read list length. | 
| 951   for (intptr_t i = 0; i < list_length; ++i) { | 951   for (intptr_t i = 0; i < list_length; ++i) { | 
| 952     VisitDartType();  // read ith type. | 952     VisitDartType();  // read ith type. | 
| 953   } | 953   } | 
| 954 | 954 | 
| 955   // Positional. | 955   // Positional. | 
| 956   list_length = builder_->ReadListLength();  // read list length. | 956   list_length = builder_->ReadListLength();  // read list length. | 
| 957   for (intptr_t i = 0; i < list_length; ++i) { | 957   for (intptr_t i = 0; i < list_length; ++i) { | 
| (...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2346 RawObject* StreamingConstantEvaluator::EvaluateConstConstructorCall( | 2346 RawObject* StreamingConstantEvaluator::EvaluateConstConstructorCall( | 
| 2347     const dart::Class& type_class, | 2347     const dart::Class& type_class, | 
| 2348     const TypeArguments& type_arguments, | 2348     const TypeArguments& type_arguments, | 
| 2349     const Function& constructor, | 2349     const Function& constructor, | 
| 2350     const Object& argument) { | 2350     const Object& argument) { | 
| 2351   // Factories have one extra argument: the type arguments. | 2351   // Factories have one extra argument: the type arguments. | 
| 2352   // Constructors have 1 extra arguments: receiver. | 2352   // Constructors have 1 extra arguments: receiver. | 
| 2353   const int kTypeArgsLen = 0; | 2353   const int kTypeArgsLen = 0; | 
| 2354   const int kNumArgs = 1; | 2354   const int kNumArgs = 1; | 
| 2355   const int kNumExtraArgs = 1; | 2355   const int kNumExtraArgs = 1; | 
| 2356   const int num_arguments = kNumArgs + kNumExtraArgs; | 2356   const int argument_count = kNumArgs + kNumExtraArgs; | 
| 2357   const Array& arg_values = | 2357   const Array& arg_values = | 
| 2358       Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); | 2358       Array::Handle(Z, Array::New(argument_count, Heap::kOld)); | 
| 2359   Instance& instance = Instance::Handle(Z); | 2359   Instance& instance = Instance::Handle(Z); | 
| 2360   if (!constructor.IsFactory()) { | 2360   if (!constructor.IsFactory()) { | 
| 2361     instance = Instance::New(type_class, Heap::kOld); | 2361     instance = Instance::New(type_class, Heap::kOld); | 
| 2362     if (!type_arguments.IsNull()) { | 2362     if (!type_arguments.IsNull()) { | 
| 2363       ASSERT(type_arguments.IsInstantiated()); | 2363       ASSERT(type_arguments.IsInstantiated()); | 
| 2364       instance.SetTypeArguments( | 2364       instance.SetTypeArguments( | 
| 2365           TypeArguments::Handle(Z, type_arguments.Canonicalize())); | 2365           TypeArguments::Handle(Z, type_arguments.Canonicalize())); | 
| 2366     } | 2366     } | 
| 2367     arg_values.SetAt(0, instance); | 2367     arg_values.SetAt(0, instance); | 
| 2368   } else { | 2368   } else { | 
| 2369     // Prepend type_arguments to list of arguments to factory. | 2369     // Prepend type_arguments to list of arguments to factory. | 
| 2370     ASSERT(type_arguments.IsZoneHandle()); | 2370     ASSERT(type_arguments.IsZoneHandle()); | 
| 2371     arg_values.SetAt(0, type_arguments); | 2371     arg_values.SetAt(0, type_arguments); | 
| 2372   } | 2372   } | 
| 2373   arg_values.SetAt((0 + kNumExtraArgs), argument); | 2373   arg_values.SetAt((0 + kNumExtraArgs), argument); | 
| 2374   const Array& args_descriptor = | 2374   const Array& args_descriptor = | 
| 2375       Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, num_arguments, | 2375       Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, argument_count, | 
| 2376                                                 Object::empty_array())); | 2376                                                 Object::empty_array())); | 
| 2377   const Object& result = Object::Handle( | 2377   const Object& result = Object::Handle( | 
| 2378       Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); | 2378       Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); | 
| 2379   ASSERT(!result.IsError()); | 2379   ASSERT(!result.IsError()); | 
| 2380   if (constructor.IsFactory()) { | 2380   if (constructor.IsFactory()) { | 
| 2381     // The factory method returns the allocated object. | 2381     // The factory method returns the allocated object. | 
| 2382     instance ^= result.raw(); | 2382     instance ^= result.raw(); | 
| 2383   } | 2383   } | 
| 2384   return H.Canonicalize(instance); | 2384   return H.Canonicalize(instance); | 
| 2385 } | 2385 } | 
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2671     body += LoadStaticField(); | 2671     body += LoadStaticField(); | 
| 2672   } | 2672   } | 
| 2673   body += Return(TokenPosition::kNoSource); | 2673   body += Return(TokenPosition::kNoSource); | 
| 2674 | 2674 | 
| 2675   return new (Z) | 2675   return new (Z) | 
| 2676       FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, | 2676       FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, | 
| 2677                 flow_graph_builder_->next_block_id_ - 1); | 2677                 flow_graph_builder_->next_block_id_ - 1); | 
| 2678 } | 2678 } | 
| 2679 | 2679 | 
| 2680 void StreamingFlowGraphBuilder::SetupDefaultParameterValues() { | 2680 void StreamingFlowGraphBuilder::SetupDefaultParameterValues() { | 
| 2681   intptr_t num_optional_parameters = | 2681   intptr_t optional_parameter_count = | 
| 2682       parsed_function()->function().NumOptionalParameters(); | 2682       parsed_function()->function().NumOptionalParameters(); | 
| 2683   if (num_optional_parameters > 0) { | 2683   if (optional_parameter_count > 0) { | 
| 2684     ZoneGrowableArray<const Instance*>* default_values = | 2684     ZoneGrowableArray<const Instance*>* default_values = | 
| 2685         new ZoneGrowableArray<const Instance*>(Z, num_optional_parameters); | 2685         new ZoneGrowableArray<const Instance*>(Z, optional_parameter_count); | 
| 2686 | 2686 | 
| 2687     AlternativeReadingScope alt(reader_); | 2687     AlternativeReadingScope alt(reader_); | 
| 2688     FunctionNodeHelper function_node_helper(this); | 2688     FunctionNodeHelper function_node_helper(this); | 
| 2689     function_node_helper.ReadUntilExcluding( | 2689     function_node_helper.ReadUntilExcluding( | 
| 2690         FunctionNodeHelper::kPositionalParameters); | 2690         FunctionNodeHelper::kPositionalParameters); | 
| 2691 | 2691 | 
| 2692     if (parsed_function()->function().HasOptionalNamedParameters()) { | 2692     if (parsed_function()->function().HasOptionalNamedParameters()) { | 
| 2693       // List of positional. | 2693       // List of positional. | 
| 2694       intptr_t list_length = ReadListLength();  // read list length. | 2694       intptr_t list_length = ReadListLength();  // read list length. | 
| 2695       for (intptr_t i = 0; i < list_length; ++i) { | 2695       for (intptr_t i = 0; i < list_length; ++i) { | 
| 2696         SkipVariableDeclaration();  // read ith variable declaration. | 2696         SkipVariableDeclaration();  // read ith variable declaration. | 
| 2697       } | 2697       } | 
| 2698 | 2698 | 
| 2699       // List of named. | 2699       // List of named. | 
| 2700       list_length = ReadListLength();  // read list length. | 2700       list_length = ReadListLength();  // read list length. | 
| 2701       ASSERT(num_optional_parameters == list_length); | 2701       ASSERT(optional_parameter_count == list_length); | 
| 2702       ASSERT(!parsed_function()->function().HasOptionalPositionalParameters()); | 2702       ASSERT(!parsed_function()->function().HasOptionalPositionalParameters()); | 
| 2703       for (intptr_t i = 0; i < list_length; ++i) { | 2703       for (intptr_t i = 0; i < list_length; ++i) { | 
| 2704         Instance* default_value; | 2704         Instance* default_value; | 
| 2705 | 2705 | 
| 2706         // Read ith variable declaration | 2706         // Read ith variable declaration | 
| 2707         VariableDeclarationHelper helper(this); | 2707         VariableDeclarationHelper helper(this); | 
| 2708         helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); | 2708         helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); | 
| 2709         Tag tag = ReadTag();  // read (first part of) initializer. | 2709         Tag tag = ReadTag();  // read (first part of) initializer. | 
| 2710         if (tag == kSomething) { | 2710         if (tag == kSomething) { | 
| 2711           // this will (potentially) read the initializer, | 2711           // this will (potentially) read the initializer, | 
| 2712           // but reset the position. | 2712           // but reset the position. | 
| 2713           default_value = | 2713           default_value = | 
| 2714               &constant_evaluator_.EvaluateExpression(ReaderOffset()); | 2714               &constant_evaluator_.EvaluateExpression(ReaderOffset()); | 
| 2715           SkipExpression();  // read (actual) initializer. | 2715           SkipExpression();  // read (actual) initializer. | 
| 2716         } else { | 2716         } else { | 
| 2717           default_value = &Instance::ZoneHandle(Z, Instance::null()); | 2717           default_value = &Instance::ZoneHandle(Z, Instance::null()); | 
| 2718         } | 2718         } | 
| 2719         default_values->Add(default_value); | 2719         default_values->Add(default_value); | 
| 2720       } | 2720       } | 
| 2721     } else { | 2721     } else { | 
| 2722       // List of positional. | 2722       // List of positional. | 
| 2723       intptr_t list_length = ReadListLength();  // read list length. | 2723       intptr_t list_length = ReadListLength();  // read list length. | 
| 2724       ASSERT(list_length == function_node_helper.required_parameter_count_ + | 2724       ASSERT(list_length == function_node_helper.required_parameter_count_ + | 
| 2725                                 num_optional_parameters); | 2725                                 optional_parameter_count); | 
| 2726       ASSERT(parsed_function()->function().HasOptionalPositionalParameters()); | 2726       ASSERT(parsed_function()->function().HasOptionalPositionalParameters()); | 
| 2727       for (intptr_t i = 0; i < function_node_helper.required_parameter_count_; | 2727       for (intptr_t i = 0; i < function_node_helper.required_parameter_count_; | 
| 2728            ++i) { | 2728            ++i) { | 
| 2729         SkipVariableDeclaration();  // read ith variable declaration. | 2729         SkipVariableDeclaration();  // read ith variable declaration. | 
| 2730       } | 2730       } | 
| 2731       for (intptr_t i = 0; i < num_optional_parameters; ++i) { | 2731       for (intptr_t i = 0; i < optional_parameter_count; ++i) { | 
| 2732         Instance* default_value; | 2732         Instance* default_value; | 
| 2733 | 2733 | 
| 2734         // Read ith variable declaration | 2734         // Read ith variable declaration | 
| 2735         VariableDeclarationHelper helper(this); | 2735         VariableDeclarationHelper helper(this); | 
| 2736         helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); | 2736         helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); | 
| 2737         Tag tag = ReadTag();  // read (first part of) initializer. | 2737         Tag tag = ReadTag();  // read (first part of) initializer. | 
| 2738         if (tag == kSomething) { | 2738         if (tag == kSomething) { | 
| 2739           // this will (potentially) read the initializer, | 2739           // this will (potentially) read the initializer, | 
| 2740           // but reset the position. | 2740           // but reset the position. | 
| 2741           default_value = | 2741           default_value = | 
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2987                      argument_names); | 2987                      argument_names); | 
| 2988 | 2988 | 
| 2989   // Return the result. | 2989   // Return the result. | 
| 2990   body += Return(function_node_helper.end_position_); | 2990   body += Return(function_node_helper.end_position_); | 
| 2991 | 2991 | 
| 2992   return new (Z) | 2992   return new (Z) | 
| 2993       FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, | 2993       FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, | 
| 2994                 flow_graph_builder_->next_block_id_ - 1); | 2994                 flow_graph_builder_->next_block_id_ - 1); | 
| 2995 } | 2995 } | 
| 2996 | 2996 | 
| 2997 static bool IsGetMainClosure(const String& name) { |  | 
| 2998   if (name.Length() < 16) return false; |  | 
| 2999   const char* cstr = "_getMainClosure@"; |  | 
| 3000   for (intptr_t i = 0; i < 16; ++i) { |  | 
| 3001     if (name.CharAt(i) != cstr[i]) return false; |  | 
| 3002   } |  | 
| 3003   return true; |  | 
| 3004 } |  | 
| 3005 |  | 
| 3006 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( | 2997 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( | 
| 3007     bool is_in_builtin_library_toplevel, |  | 
| 3008     intptr_t constructor_class_parent_offset) { | 2998     intptr_t constructor_class_parent_offset) { | 
| 3009   const Function& dart_function = parsed_function()->function(); | 2999   const Function& dart_function = parsed_function()->function(); | 
| 3010   TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry(); | 3000   TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry(); | 
| 3011   flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr( | 3001   flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr( | 
| 3012       *parsed_function(), normal_entry, flow_graph_builder_->osr_id_); | 3002       *parsed_function(), normal_entry, flow_graph_builder_->osr_id_); | 
| 3013 | 3003 | 
| 3014   SetupDefaultParameterValues(); | 3004   SetupDefaultParameterValues(); | 
| 3015 | 3005 | 
| 3016   Fragment body; | 3006   Fragment body; | 
| 3017   if (!dart_function.is_native()) | 3007   if (!dart_function.is_native()) | 
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3159     body += StoreLocal(TokenPosition::kNoSource, async_stack_trace_var); | 3149     body += StoreLocal(TokenPosition::kNoSource, async_stack_trace_var); | 
| 3160     body += Drop(); | 3150     body += Drop(); | 
| 3161   } | 3151   } | 
| 3162 | 3152 | 
| 3163   bool has_body = ReadTag() == kSomething;  // read first part of body. | 3153   bool has_body = ReadTag() == kSomething;  // read first part of body. | 
| 3164 | 3154 | 
| 3165   if (dart_function.is_native()) { | 3155   if (dart_function.is_native()) { | 
| 3166     body += flow_graph_builder_->NativeFunctionBody(first_parameter_offset, | 3156     body += flow_graph_builder_->NativeFunctionBody(first_parameter_offset, | 
| 3167                                                     dart_function); | 3157                                                     dart_function); | 
| 3168   } else if (has_body) { | 3158   } else if (has_body) { | 
| 3169     if (is_in_builtin_library_toplevel && | 3159     body += BuildStatement();  // read body. | 
| 3170         IsGetMainClosure(dart::String::Handle(Z, dart_function.name()))) { |  | 
| 3171       body += BuildGetMainClosure(); |  | 
| 3172     } else { |  | 
| 3173       body += BuildStatement();  // read body. |  | 
| 3174     } |  | 
| 3175   } | 3160   } | 
| 3176   if (body.is_open()) { | 3161   if (body.is_open()) { | 
| 3177     body += NullConstant(); | 3162     body += NullConstant(); | 
| 3178     body += Return(dart_function.end_token_pos()); | 3163     body += Return(dart_function.end_token_pos()); | 
| 3179   } | 3164   } | 
| 3180 | 3165 | 
| 3181   // If functions body contains any yield points build switch statement that | 3166   // If functions body contains any yield points build switch statement that | 
| 3182   // selects a continuation point based on the value of :await_jump_var. | 3167   // selects a continuation point based on the value of :await_jump_var. | 
| 3183   if (!yield_continuations().is_empty()) { | 3168   if (!yield_continuations().is_empty()) { | 
| 3184     // The code we are building will be executed right after we enter | 3169     // The code we are building will be executed right after we enter | 
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3286   if (NeedsDebugStepCheck(dart_function, function_node_helper.position_)) { | 3271   if (NeedsDebugStepCheck(dart_function, function_node_helper.position_)) { | 
| 3287     const intptr_t current_context_depth = flow_graph_builder_->context_depth_; | 3272     const intptr_t current_context_depth = flow_graph_builder_->context_depth_; | 
| 3288     flow_graph_builder_->context_depth_ = 0; | 3273     flow_graph_builder_->context_depth_ = 0; | 
| 3289     // If a switch was added above: Start the switch by injecting a debuggable | 3274     // If a switch was added above: Start the switch by injecting a debuggable | 
| 3290     // safepoint so stepping over an await works. | 3275     // safepoint so stepping over an await works. | 
| 3291     // If not, still start the body with a debuggable safepoint to ensure | 3276     // If not, still start the body with a debuggable safepoint to ensure | 
| 3292     // breaking on a method always happens, even if there are no | 3277     // breaking on a method always happens, even if there are no | 
| 3293     // assignments/calls/runtimecalls in the first basic block. | 3278     // assignments/calls/runtimecalls in the first basic block. | 
| 3294     // Place this check at the last parameter to ensure parameters | 3279     // Place this check at the last parameter to ensure parameters | 
| 3295     // are in scope in the debugger at method entry. | 3280     // are in scope in the debugger at method entry. | 
| 3296     const int num_params = dart_function.NumParameters(); | 3281     const int parameter_count = dart_function.NumParameters(); | 
| 3297     TokenPosition check_pos = TokenPosition::kNoSource; | 3282     TokenPosition check_pos = TokenPosition::kNoSource; | 
| 3298     if (num_params > 0) { | 3283     if (parameter_count > 0) { | 
| 3299       LocalScope* scope = parsed_function()->node_sequence()->scope(); | 3284       LocalScope* scope = parsed_function()->node_sequence()->scope(); | 
| 3300       const LocalVariable& parameter = *scope->VariableAt(num_params - 1); | 3285       const LocalVariable& parameter = *scope->VariableAt(parameter_count - 1); | 
| 3301       check_pos = parameter.token_pos(); | 3286       check_pos = parameter.token_pos(); | 
| 3302     } | 3287     } | 
| 3303     if (!check_pos.IsDebugPause()) { | 3288     if (!check_pos.IsDebugPause()) { | 
| 3304       // No parameters or synthetic parameters. | 3289       // No parameters or synthetic parameters. | 
| 3305       check_pos = function_node_helper.position_; | 3290       check_pos = function_node_helper.position_; | 
| 3306       ASSERT(check_pos.IsDebugPause()); | 3291       ASSERT(check_pos.IsDebugPause()); | 
| 3307     } | 3292     } | 
| 3308 | 3293 | 
| 3309     // TODO(29737): This sequence should be generated in order. | 3294     // TODO(29737): This sequence should be generated in order. | 
| 3310     body = DebugStepCheck(check_pos) + body; | 3295     body = DebugStepCheck(check_pos) + body; | 
| 3311     flow_graph_builder_->context_depth_ = current_context_depth; | 3296     flow_graph_builder_->context_depth_ = current_context_depth; | 
| 3312   } | 3297   } | 
| 3313 | 3298 | 
| 3314   normal_entry->LinkTo(body.entry); | 3299   normal_entry->LinkTo(body.entry); | 
| 3315 | 3300 | 
| 3316   GraphEntryInstr* graph_entry = flow_graph_builder_->graph_entry_; | 3301   GraphEntryInstr* graph_entry = flow_graph_builder_->graph_entry_; | 
| 3317   // When compiling for OSR, use a depth first search to find the OSR | 3302   // When compiling for OSR, use a depth first search to find the OSR | 
| 3318   // entry and make graph entry jump to it instead of normal entry. | 3303   // entry and make graph entry jump to it instead of normal entry. | 
| 3319   // Catch entries are always considered reachable, even if they | 3304   // Catch entries are always considered reachable, even if they | 
| 3320   // become unreachable after OSR. | 3305   // become unreachable after OSR. | 
| 3321   if (flow_graph_builder_->osr_id_ != Compiler::kNoOSRDeoptId) { | 3306   if (flow_graph_builder_->osr_id_ != Compiler::kNoOSRDeoptId) { | 
| 3322     graph_entry->RelinkToOsrEntry(Z, flow_graph_builder_->next_block_id_); | 3307     graph_entry->RelinkToOsrEntry(Z, flow_graph_builder_->next_block_id_); | 
| 3323   } | 3308   } | 
| 3324   return new (Z) FlowGraph(*parsed_function(), graph_entry, | 3309   return new (Z) FlowGraph(*parsed_function(), graph_entry, | 
| 3325                            flow_graph_builder_->next_block_id_ - 1); | 3310                            flow_graph_builder_->next_block_id_ - 1); | 
| 3326 } | 3311 } | 
| 3327 | 3312 | 
| 3328 Fragment StreamingFlowGraphBuilder::BuildGetMainClosure() { |  | 
| 3329   // _getMainClosure in dart:_builtin. Compile that one specially here. |  | 
| 3330   const dart::Library& builtin = |  | 
| 3331       dart::Library::Handle(Z, I->object_store()->builtin_library()); |  | 
| 3332   const Object& main = |  | 
| 3333       Object::Handle(Z, builtin.LookupObjectAllowPrivate(dart::String::Handle( |  | 
| 3334                             Z, dart::String::New("main")))); |  | 
| 3335   if (main.IsField()) { |  | 
| 3336     UNIMPLEMENTED(); |  | 
| 3337   } else if (main.IsFunction()) { |  | 
| 3338     const Function& function = Function::Cast(main); |  | 
| 3339     if (function.kind() == RawFunction::kRegularFunction) { |  | 
| 3340       const Function& closure_function = |  | 
| 3341           Function::Handle(Z, function.ImplicitClosureFunction()); |  | 
| 3342       const Instance& closure = |  | 
| 3343           Instance::ZoneHandle(Z, closure_function.ImplicitStaticClosure()); |  | 
| 3344       Fragment instructions = Constant(closure); |  | 
| 3345       instructions += Return(TokenPosition::kNoSource); |  | 
| 3346       return instructions; |  | 
| 3347     } else { |  | 
| 3348       UNIMPLEMENTED(); |  | 
| 3349     } |  | 
| 3350   } else { |  | 
| 3351     UNIMPLEMENTED(); |  | 
| 3352   } |  | 
| 3353   return Fragment(); |  | 
| 3354 } |  | 
| 3355 |  | 
| 3356 FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) { | 3313 FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) { | 
| 3357   const Function& function = parsed_function()->function(); | 3314   const Function& function = parsed_function()->function(); | 
| 3358 | 3315 | 
| 3359   // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used | 3316   // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used | 
| 3360   // e.g. for type translation. | 3317   // e.g. for type translation. | 
| 3361   const dart::Class& klass = | 3318   const dart::Class& klass = | 
| 3362       dart::Class::Handle(zone_, parsed_function()->function().Owner()); | 3319       dart::Class::Handle(zone_, parsed_function()->function().Owner()); | 
| 3363   bool is_in_builtin_library_toplevel = |  | 
| 3364       klass.library() == I->object_store()->builtin_library() && |  | 
| 3365       klass.IsTopLevel(); |  | 
| 3366 | 3320 | 
| 3367   Function& outermost_function = Function::Handle(Z); | 3321   Function& outermost_function = Function::Handle(Z); | 
| 3368   intptr_t outermost_kernel_offset = -1; | 3322   intptr_t outermost_kernel_offset = -1; | 
| 3369   intptr_t parent_class_offset = -1; | 3323   intptr_t parent_class_offset = -1; | 
| 3370   DiscoverEnclosingElements(Z, function, &outermost_function, | 3324   DiscoverEnclosingElements(Z, function, &outermost_function, | 
| 3371                             &outermost_kernel_offset, &parent_class_offset); | 3325                             &outermost_kernel_offset, &parent_class_offset); | 
| 3372   // Use [klass]/[kernel_class] as active class.  Type parameters will get | 3326   // Use [klass]/[kernel_class] as active class.  Type parameters will get | 
| 3373   // resolved via [kernel_class] unless we are nested inside a static factory | 3327   // resolved via [kernel_class] unless we are nested inside a static factory | 
| 3374   // in which case we will use [member]. | 3328   // in which case we will use [member]. | 
| 3375   intptr_t class_type_parameters = 0; | 3329   intptr_t class_type_parameters = 0; | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 3405   SetOffset(kernel_offset); | 3359   SetOffset(kernel_offset); | 
| 3406 | 3360 | 
| 3407   switch (function.kind()) { | 3361   switch (function.kind()) { | 
| 3408     case RawFunction::kClosureFunction: | 3362     case RawFunction::kClosureFunction: | 
| 3409     case RawFunction::kRegularFunction: | 3363     case RawFunction::kRegularFunction: | 
| 3410     case RawFunction::kGetterFunction: | 3364     case RawFunction::kGetterFunction: | 
| 3411     case RawFunction::kSetterFunction: { | 3365     case RawFunction::kSetterFunction: { | 
| 3412       ReadUntilFunctionNode();  // read until function node. | 3366       ReadUntilFunctionNode();  // read until function node. | 
| 3413       return function.IsImplicitClosureFunction() | 3367       return function.IsImplicitClosureFunction() | 
| 3414                  ? BuildGraphOfImplicitClosureFunction(function) | 3368                  ? BuildGraphOfImplicitClosureFunction(function) | 
| 3415                  : BuildGraphOfFunction(is_in_builtin_library_toplevel); | 3369                  : BuildGraphOfFunction(); | 
| 3416     } | 3370     } | 
| 3417     case RawFunction::kConstructor: { | 3371     case RawFunction::kConstructor: { | 
| 3418       bool is_factory = function.IsFactory(); | 3372       bool is_factory = function.IsFactory(); | 
| 3419       if (is_factory) { | 3373       if (is_factory) { | 
| 3420         ReadUntilFunctionNode();  // read until function node. | 3374         ReadUntilFunctionNode();  // read until function node. | 
| 3421         return BuildGraphOfFunction(is_in_builtin_library_toplevel); | 3375         return BuildGraphOfFunction(); | 
| 3422       } else { | 3376       } else { | 
| 3423         // Constructor: Pass offset to parent class. | 3377         // Constructor: Pass offset to parent class. | 
| 3424         return BuildGraphOfFunction( | 3378         return BuildGraphOfFunction( | 
| 3425             is_in_builtin_library_toplevel, |  | 
| 3426             ReadUntilFunctionNode());  // read until function node. | 3379             ReadUntilFunctionNode());  // read until function node. | 
| 3427       } | 3380       } | 
| 3428     } | 3381     } | 
| 3429     case RawFunction::kImplicitGetter: | 3382     case RawFunction::kImplicitGetter: | 
| 3430     case RawFunction::kImplicitStaticFinalGetter: | 3383     case RawFunction::kImplicitStaticFinalGetter: | 
| 3431     case RawFunction::kImplicitSetter: { | 3384     case RawFunction::kImplicitSetter: { | 
| 3432       return IsStaticInitializer(function, Z) | 3385       return IsStaticInitializer(function, Z) | 
| 3433                  ? BuildGraphOfStaticFieldInitializer() | 3386                  ? BuildGraphOfStaticFieldInitializer() | 
| 3434                  : BuildGraphOfFieldAccessor(scopes()->setter_value); | 3387                  : BuildGraphOfFieldAccessor(scopes()->setter_value); | 
| 3435     } | 3388     } | 
| (...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4039     } | 3992     } | 
| 4040     case kForInStatement: | 3993     case kForInStatement: | 
| 4041     case kAsyncForInStatement: | 3994     case kAsyncForInStatement: | 
| 4042       ReadPosition();             // read position. | 3995       ReadPosition();             // read position. | 
| 4043       SkipVariableDeclaration();  // read variable. | 3996       SkipVariableDeclaration();  // read variable. | 
| 4044       SkipExpression();           // read iterable. | 3997       SkipExpression();           // read iterable. | 
| 4045       SkipStatement();            // read body. | 3998       SkipStatement();            // read body. | 
| 4046       return; | 3999       return; | 
| 4047     case kSwitchStatement: { | 4000     case kSwitchStatement: { | 
| 4048       SkipExpression();                  // read condition. | 4001       SkipExpression();                  // read condition. | 
| 4049       int num_cases = ReadListLength();  // read number of cases. | 4002       int case_count = ReadListLength();  // read number of cases. | 
| 4050       for (intptr_t i = 0; i < num_cases; ++i) { | 4003       for (intptr_t i = 0; i < case_count; ++i) { | 
| 4051         int num_expressions = ReadListLength();  // read number of expressions. | 4004         int expression_count = ReadListLength();  // read number of expressions. | 
| 4052         for (intptr_t j = 0; j < num_expressions; ++j) { | 4005         for (intptr_t j = 0; j < expression_count; ++j) { | 
| 4053           ReadPosition();    // read jth position. | 4006           ReadPosition();    // read jth position. | 
| 4054           SkipExpression();  // read jth expression. | 4007           SkipExpression();  // read jth expression. | 
| 4055         } | 4008         } | 
| 4056         ReadBool();       // read is_default. | 4009         ReadBool();       // read is_default. | 
| 4057         SkipStatement();  // read body. | 4010         SkipStatement();  // read body. | 
| 4058       } | 4011       } | 
| 4059       return; | 4012       return; | 
| 4060     } | 4013     } | 
| 4061     case kContinueSwitchStatement: | 4014     case kContinueSwitchStatement: | 
| 4062       ReadUInt();  // read target_index. | 4015       ReadUInt();  // read target_index. | 
| 4063       return; | 4016       return; | 
| 4064     case kIfStatement: | 4017     case kIfStatement: | 
| 4065       SkipExpression();  // read condition. | 4018       SkipExpression();  // read condition. | 
| 4066       SkipStatement();   // read then. | 4019       SkipStatement();   // read then. | 
| 4067       SkipStatement();   // read otherwise. | 4020       SkipStatement();   // read otherwise. | 
| 4068       return; | 4021       return; | 
| 4069     case kReturnStatement: { | 4022     case kReturnStatement: { | 
| 4070       ReadPosition();       // read position | 4023       ReadPosition();       // read position | 
| 4071       Tag tag = ReadTag();  // read (first part of) expression. | 4024       Tag tag = ReadTag();  // read (first part of) expression. | 
| 4072       if (tag == kSomething) { | 4025       if (tag == kSomething) { | 
| 4073         SkipExpression();  // read (rest of) expression. | 4026         SkipExpression();  // read (rest of) expression. | 
| 4074       } | 4027       } | 
| 4075       return; | 4028       return; | 
| 4076     } | 4029     } | 
| 4077     case kTryCatch: { | 4030     case kTryCatch: { | 
| 4078       SkipStatement();  // read body. | 4031       SkipStatement();  // read body. | 
| 4079       ReadBool();       // read any_catch_needs_stack_trace. | 4032       ReadBool();       // read any_catch_needs_stack_trace. | 
| 4080       intptr_t num_catches = ReadListLength();  // read number of catches. | 4033       intptr_t catch_count = ReadListLength();  // read number of catches. | 
| 4081       for (intptr_t i = 0; i < num_catches; ++i) { | 4034       for (intptr_t i = 0; i < catch_count; ++i) { | 
| 4082         SkipDartType();   // read guard. | 4035         SkipDartType();   // read guard. | 
| 4083         tag = ReadTag();  // read first part of exception. | 4036         tag = ReadTag();  // read first part of exception. | 
| 4084         if (tag == kSomething) { | 4037         if (tag == kSomething) { | 
| 4085           SkipVariableDeclaration();  // read exception. | 4038           SkipVariableDeclaration();  // read exception. | 
| 4086         } | 4039         } | 
| 4087         tag = ReadTag();  // read first part of stack trace. | 4040         tag = ReadTag();  // read first part of stack trace. | 
| 4088         if (tag == kSomething) { | 4041         if (tag == kSomething) { | 
| 4089           SkipVariableDeclaration();  // read stack trace. | 4042           SkipVariableDeclaration();  // read stack trace. | 
| 4090         } | 4043         } | 
| 4091         SkipStatement();  // read body. | 4044         SkipStatement();  // read body. | 
| 4092       } | 4045       } | 
| 4093       return; | 4046       return; | 
| 4094     } | 4047     } | 
| 4095     case kTryFinally: | 4048     case kTryFinally: | 
| 4096       SkipStatement();  // read body. | 4049       SkipStatement();  // read body. | 
| 4097       SkipStatement();  // read finalizer. | 4050       SkipStatement();  // read finalizer. | 
| 4098       return; | 4051       return; | 
| 4099     case kYieldStatement: | 4052     case kYieldStatement: { | 
| 4100       ReadPosition();    // read position. | 4053       TokenPosition position = ReadPosition();  // read position. | 
|  | 4054       record_yield_position(position); | 
| 4101       ReadByte();        // read flags. | 4055       ReadByte();        // read flags. | 
| 4102       SkipExpression();  // read expression. | 4056       SkipExpression();  // read expression. | 
| 4103       return; | 4057       return; | 
|  | 4058     } | 
| 4104     case kVariableDeclaration: | 4059     case kVariableDeclaration: | 
| 4105       SkipVariableDeclaration();  // read variable declaration. | 4060       SkipVariableDeclaration();  // read variable declaration. | 
| 4106       return; | 4061       return; | 
| 4107     case kFunctionDeclaration: | 4062     case kFunctionDeclaration: | 
| 4108       ReadPosition();             // read position. | 4063       ReadPosition();             // read position. | 
| 4109       SkipVariableDeclaration();  // read variable. | 4064       SkipVariableDeclaration();  // read variable. | 
| 4110       SkipFunctionNode();         // read function node. | 4065       SkipFunctionNode();         // read function node. | 
| 4111       return; | 4066       return; | 
| 4112     default: | 4067     default: | 
| 4113       UNREACHABLE(); | 4068       UNREACHABLE(); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 4138     SkipStringReference();  // read ith name index. | 4093     SkipStringReference();  // read ith name index. | 
| 4139     SkipExpression();       // read ith expression. | 4094     SkipExpression();       // read ith expression. | 
| 4140   } | 4095   } | 
| 4141 } | 4096 } | 
| 4142 | 4097 | 
| 4143 void StreamingFlowGraphBuilder::SkipVariableDeclaration() { | 4098 void StreamingFlowGraphBuilder::SkipVariableDeclaration() { | 
| 4144   VariableDeclarationHelper helper(this); | 4099   VariableDeclarationHelper helper(this); | 
| 4145   helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd); | 4100   helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd); | 
| 4146 } | 4101 } | 
| 4147 | 4102 | 
|  | 4103 void StreamingFlowGraphBuilder::SkipLibraryCombinator() { | 
|  | 4104   ReadBool();                        // read is_show. | 
|  | 4105   intptr_t name_count = ReadUInt();  // read list length. | 
|  | 4106   for (intptr_t j = 0; j < name_count; ++j) { | 
|  | 4107     ReadUInt();  // read ith entry of name_indices. | 
|  | 4108   } | 
|  | 4109 } | 
|  | 4110 | 
|  | 4111 void StreamingFlowGraphBuilder::SkipLibraryDependency() { | 
|  | 4112   ReadFlags();                                   // read flags. | 
|  | 4113   SkipListOfExpressions();                       // Read annotations. | 
|  | 4114   ReadCanonicalNameReference();                  // read target_reference. | 
|  | 4115   ReadStringReference();                         // read name_index. | 
|  | 4116   intptr_t combinator_count = ReadListLength();  // read list length. | 
|  | 4117   for (intptr_t i = 0; i < combinator_count; ++i) { | 
|  | 4118     SkipLibraryCombinator(); | 
|  | 4119   } | 
|  | 4120 } | 
|  | 4121 | 
|  | 4122 void StreamingFlowGraphBuilder::SkipLibraryTypedef() { | 
|  | 4123   SkipCanonicalNameReference();  // read canonical name. | 
|  | 4124   ReadPosition();                // read position. | 
|  | 4125   SkipStringReference();         // read name index. | 
|  | 4126   ReadUInt();                    // read source_uri_index. | 
|  | 4127   SkipListOfDartTypes();         // read type parameters. | 
|  | 4128   SkipDartType();                // read type. | 
|  | 4129 } | 
|  | 4130 | 
| 4148 TokenPosition StreamingFlowGraphBuilder::ReadPosition(bool record) { | 4131 TokenPosition StreamingFlowGraphBuilder::ReadPosition(bool record) { | 
| 4149   return reader_->ReadPosition(record); | 4132   TokenPosition position = reader_->ReadPosition(); | 
|  | 4133   if (record) { | 
|  | 4134     record_token_position(position); | 
|  | 4135   } | 
|  | 4136   return position; | 
|  | 4137 } | 
|  | 4138 | 
|  | 4139 void StreamingFlowGraphBuilder::record_token_position(TokenPosition position) { | 
|  | 4140   if (record_for_script_id_ == current_script_id_ && | 
|  | 4141       record_token_positions_into_ != NULL) { | 
|  | 4142     record_token_positions_into_->Add(position.value()); | 
|  | 4143   } | 
|  | 4144 } | 
|  | 4145 | 
|  | 4146 void StreamingFlowGraphBuilder::record_yield_position(TokenPosition position) { | 
|  | 4147   if (record_for_script_id_ == current_script_id_ && | 
|  | 4148       record_yield_positions_into_ != NULL) { | 
|  | 4149     record_yield_positions_into_->Add(position.value()); | 
|  | 4150   } | 
| 4150 } | 4151 } | 
| 4151 | 4152 | 
| 4152 Tag StreamingFlowGraphBuilder::ReadTag(uint8_t* payload) { | 4153 Tag StreamingFlowGraphBuilder::ReadTag(uint8_t* payload) { | 
| 4153   return reader_->ReadTag(payload); | 4154   return reader_->ReadTag(payload); | 
| 4154 } | 4155 } | 
| 4155 | 4156 | 
| 4156 Tag StreamingFlowGraphBuilder::PeekTag(uint8_t* payload) { | 4157 Tag StreamingFlowGraphBuilder::PeekTag(uint8_t* payload) { | 
| 4157   return reader_->PeekTag(payload); | 4158   return reader_->PeekTag(payload); | 
| 4158 } | 4159 } | 
| 4159 | 4160 | 
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4380 } | 4381 } | 
| 4381 | 4382 | 
| 4382 Fragment StreamingFlowGraphBuilder::StaticCall(TokenPosition position, | 4383 Fragment StreamingFlowGraphBuilder::StaticCall(TokenPosition position, | 
| 4383                                                const Function& target, | 4384                                                const Function& target, | 
| 4384                                                intptr_t argument_count, | 4385                                                intptr_t argument_count, | 
| 4385                                                const Array& argument_names) { | 4386                                                const Array& argument_names) { | 
| 4386   return flow_graph_builder_->StaticCall(position, target, argument_count, | 4387   return flow_graph_builder_->StaticCall(position, target, argument_count, | 
| 4387                                          argument_names); | 4388                                          argument_names); | 
| 4388 } | 4389 } | 
| 4389 | 4390 | 
| 4390 Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, | 4391 Fragment StreamingFlowGraphBuilder::InstanceCall( | 
| 4391                                                  const dart::String& name, | 4392     TokenPosition position, | 
| 4392                                                  Token::Kind kind, | 4393     const dart::String& name, | 
| 4393                                                  intptr_t argument_count, | 4394     Token::Kind kind, | 
| 4394                                                  intptr_t num_args_checked) { | 4395     intptr_t argument_count, | 
|  | 4396     intptr_t checked_argument_count) { | 
| 4395   return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, | 4397   return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, | 
| 4396                                            num_args_checked); | 4398                                            checked_argument_count); | 
| 4397 } | 4399 } | 
| 4398 | 4400 | 
| 4399 Fragment StreamingFlowGraphBuilder::ThrowException(TokenPosition position) { | 4401 Fragment StreamingFlowGraphBuilder::ThrowException(TokenPosition position) { | 
| 4400   return flow_graph_builder_->ThrowException(position); | 4402   return flow_graph_builder_->ThrowException(position); | 
| 4401 } | 4403 } | 
| 4402 | 4404 | 
| 4403 Fragment StreamingFlowGraphBuilder::BooleanNegate() { | 4405 Fragment StreamingFlowGraphBuilder::BooleanNegate() { | 
| 4404   return flow_graph_builder_->BooleanNegate(); | 4406   return flow_graph_builder_->BooleanNegate(); | 
| 4405 } | 4407 } | 
| 4406 | 4408 | 
| 4407 Fragment StreamingFlowGraphBuilder::TranslateInstantiatedTypeArguments( | 4409 Fragment StreamingFlowGraphBuilder::TranslateInstantiatedTypeArguments( | 
| 4408     const TypeArguments& type_arguments) { | 4410     const TypeArguments& type_arguments) { | 
| 4409   return flow_graph_builder_->TranslateInstantiatedTypeArguments( | 4411   return flow_graph_builder_->TranslateInstantiatedTypeArguments( | 
| 4410       type_arguments); | 4412       type_arguments); | 
| 4411 } | 4413 } | 
| 4412 | 4414 | 
| 4413 Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind, | 4415 Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind, | 
| 4414                                                   bool number_check) { | 4416                                                   bool number_check) { | 
| 4415   return flow_graph_builder_->StrictCompare(kind, number_check); | 4417   return flow_graph_builder_->StrictCompare(kind, number_check); | 
| 4416 } | 4418 } | 
| 4417 | 4419 | 
| 4418 Fragment StreamingFlowGraphBuilder::AllocateObject(TokenPosition position, | 4420 Fragment StreamingFlowGraphBuilder::AllocateObject(TokenPosition position, | 
| 4419                                                    const dart::Class& klass, | 4421                                                    const dart::Class& klass, | 
| 4420                                                    intptr_t argument_count) { | 4422                                                    intptr_t argument_count) { | 
| 4421   return flow_graph_builder_->AllocateObject(position, klass, argument_count); | 4423   return flow_graph_builder_->AllocateObject(position, klass, argument_count); | 
| 4422 } | 4424 } | 
| 4423 | 4425 | 
| 4424 Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, | 4426 Fragment StreamingFlowGraphBuilder::InstanceCall( | 
| 4425                                                  const dart::String& name, | 4427     TokenPosition position, | 
| 4426                                                  Token::Kind kind, | 4428     const dart::String& name, | 
| 4427                                                  intptr_t argument_count, | 4429     Token::Kind kind, | 
| 4428                                                  const Array& argument_names, | 4430     intptr_t argument_count, | 
| 4429                                                  intptr_t num_args_checked) { | 4431     const Array& argument_names, | 
|  | 4432     intptr_t checked_argument_count) { | 
| 4430   return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, | 4433   return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, | 
| 4431                                            argument_names, num_args_checked); | 4434                                            argument_names, | 
|  | 4435                                            checked_argument_count); | 
| 4432 } | 4436 } | 
| 4433 | 4437 | 
| 4434 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, | 4438 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, | 
| 4435                                                LocalVariable* variable) { | 4439                                                LocalVariable* variable) { | 
| 4436   return flow_graph_builder_->StoreLocal(position, variable); | 4440   return flow_graph_builder_->StoreLocal(position, variable); | 
| 4437 } | 4441 } | 
| 4438 | 4442 | 
| 4439 Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position, | 4443 Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position, | 
| 4440                                                      const dart::Field& field) { | 4444                                                      const dart::Field& field) { | 
| 4441   return flow_graph_builder_->StoreStaticField(position, field); | 4445   return flow_graph_builder_->StoreStaticField(position, field); | 
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4951 | 4955 | 
| 4952   instructions += PushArgument();  // push receiver as argument. | 4956   instructions += PushArgument();  // push receiver as argument. | 
| 4953 | 4957 | 
| 4954   // TODO(28109) Support generic methods in the VM or reify them away. | 4958   // TODO(28109) Support generic methods in the VM or reify them away. | 
| 4955   Array& argument_names = Array::ZoneHandle(Z); | 4959   Array& argument_names = Array::ZoneHandle(Z); | 
| 4956   intptr_t argument_count; | 4960   intptr_t argument_count; | 
| 4957   instructions += | 4961   instructions += | 
| 4958       BuildArguments(&argument_names, &argument_count);  // read arguments. | 4962       BuildArguments(&argument_names, &argument_count);  // read arguments. | 
| 4959   ++argument_count; | 4963   ++argument_count; | 
| 4960 | 4964 | 
| 4961   intptr_t num_args_checked = 1; | 4965   intptr_t checked_argument_count = 1; | 
| 4962   // If we have a special operation (e.g. +/-/==) we mark both arguments as | 4966   // If we have a special operation (e.g. +/-/==) we mark both arguments as | 
| 4963   // to be checked. | 4967   // to be checked. | 
| 4964   if (token_kind != Token::kILLEGAL) { | 4968   if (token_kind != Token::kILLEGAL) { | 
| 4965     ASSERT(argument_count <= 2); | 4969     ASSERT(argument_count <= 2); | 
| 4966     num_args_checked = argument_count; | 4970     checked_argument_count = argument_count; | 
| 4967   } | 4971   } | 
| 4968 | 4972 | 
| 4969   instructions += InstanceCall(position, name, token_kind, argument_count, | 4973   instructions += InstanceCall(position, name, token_kind, argument_count, | 
| 4970                                argument_names, num_args_checked); | 4974                                argument_names, checked_argument_count); | 
| 4971   // Later optimization passes assume that result of a x.[]=(...) call is not | 4975   // Later optimization passes assume that result of a x.[]=(...) call is not | 
| 4972   // used. We must guarantee this invariant because violation will lead to an | 4976   // used. We must guarantee this invariant because violation will lead to an | 
| 4973   // illegal IL once we replace x.[]=(...) with a sequence that does not | 4977   // illegal IL once we replace x.[]=(...) with a sequence that does not | 
| 4974   // actually produce any value. See http://dartbug.com/29135 for more details. | 4978   // actually produce any value. See http://dartbug.com/29135 for more details. | 
| 4975   if (name.raw() == Symbols::AssignIndexToken().raw()) { | 4979   if (name.raw() == Symbols::AssignIndexToken().raw()) { | 
| 4976     instructions += Drop(); | 4980     instructions += Drop(); | 
| 4977     instructions += NullConstant(); | 4981     instructions += NullConstant(); | 
| 4978   } | 4982   } | 
| 4979 | 4983 | 
| 4980   SkipCanonicalNameReference();  // read unused "interface_target_reference". | 4984   SkipCanonicalNameReference();  // read unused "interface_target_reference". | 
| (...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6006 | 6010 | 
| 6007   loop_depth_dec(); | 6011   loop_depth_dec(); | 
| 6008   for_in_depth_dec(); | 6012   for_in_depth_dec(); | 
| 6009   return Fragment(instructions.entry, loop_exit); | 6013   return Fragment(instructions.entry, loop_exit); | 
| 6010 } | 6014 } | 
| 6011 | 6015 | 
| 6012 Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { | 6016 Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { | 
| 6013   // We need the number of cases. So start by getting that, then go back. | 6017   // We need the number of cases. So start by getting that, then go back. | 
| 6014   intptr_t offset = ReaderOffset(); | 6018   intptr_t offset = ReaderOffset(); | 
| 6015   SkipExpression();                  // temporarily skip condition | 6019   SkipExpression();                  // temporarily skip condition | 
| 6016   int num_cases = ReadListLength();  // read number of cases. | 6020   int case_count = ReadListLength();  // read number of cases. | 
| 6017   SetOffset(offset); | 6021   SetOffset(offset); | 
| 6018 | 6022 | 
| 6019   SwitchBlock block(flow_graph_builder_, num_cases); | 6023   SwitchBlock block(flow_graph_builder_, case_count); | 
| 6020 | 6024 | 
| 6021   // Instead of using a variable we should reuse the expression on the stack, | 6025   // Instead of using a variable we should reuse the expression on the stack, | 
| 6022   // since it won't be assigned again, we don't need phi nodes. | 6026   // since it won't be assigned again, we don't need phi nodes. | 
| 6023   Fragment head_instructions = BuildExpression();  // read condition. | 6027   Fragment head_instructions = BuildExpression();  // read condition. | 
| 6024   head_instructions += | 6028   head_instructions += | 
| 6025       StoreLocal(TokenPosition::kNoSource, scopes()->switch_variable); | 6029       StoreLocal(TokenPosition::kNoSource, scopes()->switch_variable); | 
| 6026   head_instructions += Drop(); | 6030   head_instructions += Drop(); | 
| 6027 | 6031 | 
| 6028   num_cases = ReadListLength();  // read number of cases. | 6032   case_count = ReadListLength();  // read number of cases. | 
| 6029 | 6033 | 
| 6030   // Phase 1: Generate bodies and try to find out whether a body will be target | 6034   // Phase 1: Generate bodies and try to find out whether a body will be target | 
| 6031   // of a jump due to: | 6035   // of a jump due to: | 
| 6032   //   * `continue case_label` | 6036   //   * `continue case_label` | 
| 6033   //   * `case e1: case e2: body` | 6037   //   * `case e1: case e2: body` | 
| 6034   Fragment* body_fragments = new Fragment[num_cases]; | 6038   Fragment* body_fragments = new Fragment[case_count]; | 
| 6035   intptr_t* case_expression_offsets = new intptr_t[num_cases]; | 6039   intptr_t* case_expression_offsets = new intptr_t[case_count]; | 
| 6036   int default_case = -1; | 6040   int default_case = -1; | 
| 6037 | 6041 | 
| 6038   for (intptr_t i = 0; i < num_cases; ++i) { | 6042   for (intptr_t i = 0; i < case_count; ++i) { | 
| 6039     case_expression_offsets[i] = ReaderOffset(); | 6043     case_expression_offsets[i] = ReaderOffset(); | 
| 6040     int num_expressions = ReadListLength();  // read number of expressions. | 6044     int expression_count = ReadListLength();  // read number of expressions. | 
| 6041     for (intptr_t j = 0; j < num_expressions; ++j) { | 6045     for (intptr_t j = 0; j < expression_count; ++j) { | 
| 6042       ReadPosition();    // read jth position. | 6046       ReadPosition();    // read jth position. | 
| 6043       SkipExpression();  // read jth expression. | 6047       SkipExpression();  // read jth expression. | 
| 6044     } | 6048     } | 
| 6045     bool is_default = ReadBool();  // read is_default. | 6049     bool is_default = ReadBool();  // read is_default. | 
| 6046     if (is_default) default_case = i; | 6050     if (is_default) default_case = i; | 
| 6047     Fragment& body_fragment = body_fragments[i] = | 6051     Fragment& body_fragment = body_fragments[i] = | 
| 6048         BuildStatement();  // read body. | 6052         BuildStatement();  // read body. | 
| 6049 | 6053 | 
| 6050     if (body_fragment.entry == NULL) { | 6054     if (body_fragment.entry == NULL) { | 
| 6051       // Make a NOP in order to ensure linking works properly. | 6055       // Make a NOP in order to ensure linking works properly. | 
| 6052       body_fragment = NullConstant(); | 6056       body_fragment = NullConstant(); | 
| 6053       body_fragment += Drop(); | 6057       body_fragment += Drop(); | 
| 6054     } | 6058     } | 
| 6055 | 6059 | 
| 6056     // The Dart language specification mandates fall-throughs in [SwitchCase]es | 6060     // The Dart language specification mandates fall-throughs in [SwitchCase]es | 
| 6057     // to be runtime errors. | 6061     // to be runtime errors. | 
| 6058     if (!is_default && body_fragment.is_open() && (i < (num_cases - 1))) { | 6062     if (!is_default && body_fragment.is_open() && (i < (case_count - 1))) { | 
| 6059       const dart::Class& klass = dart::Class::ZoneHandle( | 6063       const dart::Class& klass = dart::Class::ZoneHandle( | 
| 6060           Z, dart::Library::LookupCoreClass(Symbols::FallThroughError())); | 6064           Z, dart::Library::LookupCoreClass(Symbols::FallThroughError())); | 
| 6061       ASSERT(!klass.IsNull()); | 6065       ASSERT(!klass.IsNull()); | 
| 6062       const dart::Function& constructor = dart::Function::ZoneHandle( | 6066       const dart::Function& constructor = dart::Function::ZoneHandle( | 
| 6063           Z, klass.LookupConstructorAllowPrivate( | 6067           Z, klass.LookupConstructorAllowPrivate( | 
| 6064                  H.DartSymbol("FallThroughError._create"))); | 6068                  H.DartSymbol("FallThroughError._create"))); | 
| 6065       ASSERT(!constructor.IsNull()); | 6069       ASSERT(!constructor.IsNull()); | 
| 6066       const dart::String& url = H.DartString( | 6070       const dart::String& url = H.DartString( | 
| 6067           parsed_function()->function().ToLibNamePrefixedQualifiedCString(), | 6071           parsed_function()->function().ToLibNamePrefixedQualifiedCString(), | 
| 6068           Heap::kOld); | 6072           Heap::kOld); | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 6095     // | 6099     // | 
| 6096     //    switch(expr) { | 6100     //    switch(expr) { | 
| 6097     //      case a: | 6101     //      case a: | 
| 6098     //      case b: | 6102     //      case b: | 
| 6099     //        <stmt-body> | 6103     //        <stmt-body> | 
| 6100     //    } | 6104     //    } | 
| 6101     // | 6105     // | 
| 6102     // This means that the <stmt-body> will have more than 1 incoming edge (one | 6106     // This means that the <stmt-body> will have more than 1 incoming edge (one | 
| 6103     // from `a == expr` and one from `a != expr && b == expr`). The | 6107     // from `a == expr` and one from `a != expr && b == expr`). The | 
| 6104     // `block.Destination()` records the additional jump. | 6108     // `block.Destination()` records the additional jump. | 
| 6105     if (num_expressions > 1) { | 6109     if (expression_count > 1) { | 
| 6106       block.DestinationDirect(i); | 6110       block.DestinationDirect(i); | 
| 6107     } | 6111     } | 
| 6108   } | 6112   } | 
| 6109 | 6113 | 
| 6110   intptr_t end_offset = ReaderOffset(); | 6114   intptr_t end_offset = ReaderOffset(); | 
| 6111 | 6115 | 
| 6112   // Phase 2: Generate everything except the real bodies: | 6116   // Phase 2: Generate everything except the real bodies: | 
| 6113   //   * jump directly to a body (if there is no jumper) | 6117   //   * jump directly to a body (if there is no jumper) | 
| 6114   //   * jump to a wrapper block which jumps to the body (if there is a jumper) | 6118   //   * jump to a wrapper block which jumps to the body (if there is a jumper) | 
| 6115   Fragment current_instructions = head_instructions; | 6119   Fragment current_instructions = head_instructions; | 
| 6116   for (intptr_t i = 0; i < num_cases; ++i) { | 6120   for (intptr_t i = 0; i < case_count; ++i) { | 
| 6117     SetOffset(case_expression_offsets[i]); | 6121     SetOffset(case_expression_offsets[i]); | 
| 6118     int num_expressions = ReadListLength();  // read length of expressions. | 6122     int expression_count = ReadListLength();  // read length of expressions. | 
| 6119 | 6123 | 
| 6120     if (i == default_case) { | 6124     if (i == default_case) { | 
| 6121       ASSERT(i == (num_cases - 1)); | 6125       ASSERT(i == (case_count - 1)); | 
| 6122 | 6126 | 
| 6123       // Evaluate the conditions for the default [SwitchCase] just for the | 6127       // Evaluate the conditions for the default [SwitchCase] just for the | 
| 6124       // purpose of potentially triggering a compile-time error. | 6128       // purpose of potentially triggering a compile-time error. | 
| 6125 | 6129 | 
| 6126       for (intptr_t j = 0; j < num_expressions; ++j) { | 6130       for (intptr_t j = 0; j < expression_count; ++j) { | 
| 6127         ReadPosition();  // read jth position. | 6131         ReadPosition();  // read jth position. | 
| 6128         // this reads the expression, but doesn't skip past it. | 6132         // this reads the expression, but doesn't skip past it. | 
| 6129         constant_evaluator_.EvaluateExpression(ReaderOffset()); | 6133         constant_evaluator_.EvaluateExpression(ReaderOffset()); | 
| 6130         SkipExpression();  // read jth expression. | 6134         SkipExpression();  // read jth expression. | 
| 6131       } | 6135       } | 
| 6132 | 6136 | 
| 6133       if (block.HadJumper(i)) { | 6137       if (block.HadJumper(i)) { | 
| 6134         // There are several branches to the body, so we will make a goto to | 6138         // There are several branches to the body, so we will make a goto to | 
| 6135         // the join block (and prepend a join instruction to the real body). | 6139         // the join block (and prepend a join instruction to the real body). | 
| 6136         JoinEntryInstr* join = block.DestinationDirect(i); | 6140         JoinEntryInstr* join = block.DestinationDirect(i); | 
| 6137         current_instructions += Goto(join); | 6141         current_instructions += Goto(join); | 
| 6138 | 6142 | 
| 6139         current_instructions = Fragment(current_instructions.entry, join); | 6143         current_instructions = Fragment(current_instructions.entry, join); | 
| 6140         current_instructions += body_fragments[i]; | 6144         current_instructions += body_fragments[i]; | 
| 6141       } else { | 6145       } else { | 
| 6142         current_instructions += body_fragments[i]; | 6146         current_instructions += body_fragments[i]; | 
| 6143       } | 6147       } | 
| 6144     } else { | 6148     } else { | 
| 6145       JoinEntryInstr* body_join = NULL; | 6149       JoinEntryInstr* body_join = NULL; | 
| 6146       if (block.HadJumper(i)) { | 6150       if (block.HadJumper(i)) { | 
| 6147         body_join = block.DestinationDirect(i); | 6151         body_join = block.DestinationDirect(i); | 
| 6148         body_fragments[i] = Fragment(body_join) + body_fragments[i]; | 6152         body_fragments[i] = Fragment(body_join) + body_fragments[i]; | 
| 6149       } | 6153       } | 
| 6150 | 6154 | 
| 6151       for (intptr_t j = 0; j < num_expressions; ++j) { | 6155       for (intptr_t j = 0; j < expression_count; ++j) { | 
| 6152         TargetEntryInstr* then; | 6156         TargetEntryInstr* then; | 
| 6153         TargetEntryInstr* otherwise; | 6157         TargetEntryInstr* otherwise; | 
| 6154 | 6158 | 
| 6155         TokenPosition position = ReadPosition();  // read jth position. | 6159         TokenPosition position = ReadPosition();  // read jth position. | 
| 6156         current_instructions += | 6160         current_instructions += | 
| 6157             Constant(constant_evaluator_.EvaluateExpression(ReaderOffset())); | 6161             Constant(constant_evaluator_.EvaluateExpression(ReaderOffset())); | 
| 6158         SkipExpression();  // read jth expression. | 6162         SkipExpression();  // read jth expression. | 
| 6159         current_instructions += PushArgument(); | 6163         current_instructions += PushArgument(); | 
| 6160         current_instructions += LoadLocal(scopes()->switch_variable); | 6164         current_instructions += LoadLocal(scopes()->switch_variable); | 
| 6161         current_instructions += PushArgument(); | 6165         current_instructions += PushArgument(); | 
| 6162         current_instructions += | 6166         current_instructions += | 
| 6163             InstanceCall(position, Symbols::EqualOperator(), Token::kEQ, | 6167             InstanceCall(position, Symbols::EqualOperator(), Token::kEQ, | 
| 6164                          /*argument_count=*/2, | 6168                          /*argument_count=*/2, | 
| 6165                          /*num_args_checked=*/2); | 6169                          /*checked_argument_count=*/2); | 
| 6166         current_instructions += BranchIfTrue(&then, &otherwise, false); | 6170         current_instructions += BranchIfTrue(&then, &otherwise, false); | 
| 6167 | 6171 | 
| 6168         Fragment then_fragment(then); | 6172         Fragment then_fragment(then); | 
| 6169 | 6173 | 
| 6170         if (body_join != NULL) { | 6174         if (body_join != NULL) { | 
| 6171           // There are several branches to the body, so we will make a goto to | 6175           // There are several branches to the body, so we will make a goto to | 
| 6172           // the join block (the real body has already been prepended with a | 6176           // the join block (the real body has already been prepended with a | 
| 6173           // join instruction). | 6177           // join instruction). | 
| 6174           then_fragment += Goto(body_join); | 6178           then_fragment += Goto(body_join); | 
| 6175         } else { | 6179         } else { | 
| 6176           // There is only a signle branch to the body, so we will just append | 6180           // There is only a signle branch to the body, so we will just append | 
| 6177           // the body fragment. | 6181           // the body fragment. | 
| 6178           then_fragment += body_fragments[i]; | 6182           then_fragment += body_fragments[i]; | 
| 6179         } | 6183         } | 
| 6180 | 6184 | 
| 6181         current_instructions = Fragment(otherwise); | 6185         current_instructions = Fragment(otherwise); | 
| 6182       } | 6186       } | 
| 6183     } | 6187     } | 
| 6184   } | 6188   } | 
| 6185 | 6189 | 
| 6186   if (num_cases > 0 && default_case < 0) { | 6190   if (case_count > 0 && default_case < 0) { | 
| 6187     // There is no default, which means we have an open [current_instructions] | 6191     // There is no default, which means we have an open [current_instructions] | 
| 6188     // (which is a [TargetEntryInstruction] for the last "otherwise" branch). | 6192     // (which is a [TargetEntryInstruction] for the last "otherwise" branch). | 
| 6189     // | 6193     // | 
| 6190     // Furthermore the last [SwitchCase] can be open as well.  If so, we need | 6194     // Furthermore the last [SwitchCase] can be open as well.  If so, we need | 
| 6191     // to join these two. | 6195     // to join these two. | 
| 6192     Fragment& last_body = body_fragments[num_cases - 1]; | 6196     Fragment& last_body = body_fragments[case_count - 1]; | 
| 6193     if (last_body.is_open()) { | 6197     if (last_body.is_open()) { | 
| 6194       ASSERT(current_instructions.is_open()); | 6198       ASSERT(current_instructions.is_open()); | 
| 6195       ASSERT(current_instructions.current->IsTargetEntry()); | 6199       ASSERT(current_instructions.current->IsTargetEntry()); | 
| 6196 | 6200 | 
| 6197       // Join the last "otherwise" branch and the last [SwitchCase] fragment. | 6201       // Join the last "otherwise" branch and the last [SwitchCase] fragment. | 
| 6198       JoinEntryInstr* join = BuildJoinEntry(); | 6202       JoinEntryInstr* join = BuildJoinEntry(); | 
| 6199       current_instructions += Goto(join); | 6203       current_instructions += Goto(join); | 
| 6200       last_body += Goto(join); | 6204       last_body += Goto(join); | 
| 6201 | 6205 | 
| 6202       current_instructions = Fragment(join); | 6206       current_instructions = Fragment(join); | 
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6306   { | 6310   { | 
| 6307     TryCatchBlock block(flow_graph_builder_, try_handler_index); | 6311     TryCatchBlock block(flow_graph_builder_, try_handler_index); | 
| 6308     try_body += BuildStatement();  // read body. | 6312     try_body += BuildStatement();  // read body. | 
| 6309     try_body += Goto(after_try); | 6313     try_body += Goto(after_try); | 
| 6310   } | 6314   } | 
| 6311   try_depth_dec(); | 6315   try_depth_dec(); | 
| 6312 | 6316 | 
| 6313   bool needs_stacktrace = ReadBool();  // read any_catch_needs_stack_trace | 6317   bool needs_stacktrace = ReadBool();  // read any_catch_needs_stack_trace | 
| 6314 | 6318 | 
| 6315   catch_depth_inc(); | 6319   catch_depth_inc(); | 
| 6316   intptr_t num_catches = ReadListLength();  // read number of catches. | 6320   intptr_t catch_count = ReadListLength();  // read number of catches. | 
| 6317   const Array& handler_types = | 6321   const Array& handler_types = | 
| 6318       Array::ZoneHandle(Z, Array::New(num_catches, Heap::kOld)); | 6322       Array::ZoneHandle(Z, Array::New(catch_count, Heap::kOld)); | 
| 6319   Fragment catch_body = | 6323   Fragment catch_body = | 
| 6320       CatchBlockEntry(handler_types, try_handler_index, needs_stacktrace); | 6324       CatchBlockEntry(handler_types, try_handler_index, needs_stacktrace); | 
| 6321   // Fill in the body of the catch. | 6325   // Fill in the body of the catch. | 
| 6322   for (intptr_t i = 0; i < num_catches; ++i) { | 6326   for (intptr_t i = 0; i < catch_count; ++i) { | 
| 6323     intptr_t catch_offset = ReaderOffset();  // Catch has no tag. | 6327     intptr_t catch_offset = ReaderOffset();  // Catch has no tag. | 
| 6324     Tag tag = PeekTag();                     // peek guard type. | 6328     Tag tag = PeekTag();                     // peek guard type. | 
| 6325     AbstractType* type_guard = NULL; | 6329     AbstractType* type_guard = NULL; | 
| 6326     if (tag != kDynamicType) { | 6330     if (tag != kDynamicType) { | 
| 6327       type_guard = &T.BuildType();  // read guard. | 6331       type_guard = &T.BuildType();  // read guard. | 
| 6328       handler_types.SetAt(i, *type_guard); | 6332       handler_types.SetAt(i, *type_guard); | 
| 6329     } else { | 6333     } else { | 
| 6330       SkipDartType();  // read guard. | 6334       SkipDartType();  // read guard. | 
| 6331       handler_types.SetAt(i, Object::dynamic_type()); | 6335       handler_types.SetAt(i, Object::dynamic_type()); | 
| 6332     } | 6336     } | 
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6785       total_parameter_count - positional_parameters_count; | 6789       total_parameter_count - positional_parameters_count; | 
| 6786 | 6790 | 
| 6787   function.set_num_fixed_parameters(extra_parameters + | 6791   function.set_num_fixed_parameters(extra_parameters + | 
| 6788                                     required_parameter_count); | 6792                                     required_parameter_count); | 
| 6789   if (named_parameters_count > 0) { | 6793   if (named_parameters_count > 0) { | 
| 6790     function.SetNumOptionalParameters(named_parameters_count, false); | 6794     function.SetNumOptionalParameters(named_parameters_count, false); | 
| 6791   } else { | 6795   } else { | 
| 6792     function.SetNumOptionalParameters( | 6796     function.SetNumOptionalParameters( | 
| 6793         positional_parameters_count - required_parameter_count, true); | 6797         positional_parameters_count - required_parameter_count, true); | 
| 6794   } | 6798   } | 
| 6795   intptr_t num_parameters = extra_parameters + total_parameter_count; | 6799   intptr_t parameter_count = extra_parameters + total_parameter_count; | 
| 6796   function.set_parameter_types( | 6800   function.set_parameter_types( | 
| 6797       Array::Handle(Z, Array::New(num_parameters, Heap::kOld))); | 6801       Array::Handle(Z, Array::New(parameter_count, Heap::kOld))); | 
| 6798   function.set_parameter_names( | 6802   function.set_parameter_names( | 
| 6799       Array::Handle(Z, Array::New(num_parameters, Heap::kOld))); | 6803       Array::Handle(Z, Array::New(parameter_count, Heap::kOld))); | 
| 6800   intptr_t pos = 0; | 6804   intptr_t pos = 0; | 
| 6801   if (is_method) { | 6805   if (is_method) { | 
| 6802     ASSERT(!klass.IsNull()); | 6806     ASSERT(!klass.IsNull()); | 
| 6803     function.SetParameterTypeAt(pos, H.GetCanonicalType(klass)); | 6807     function.SetParameterTypeAt(pos, H.GetCanonicalType(klass)); | 
| 6804     function.SetParameterNameAt(pos, Symbols::This()); | 6808     function.SetParameterNameAt(pos, Symbols::This()); | 
| 6805     pos++; | 6809     pos++; | 
| 6806   } else if (is_closure) { | 6810   } else if (is_closure) { | 
| 6807     function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); | 6811     function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); | 
| 6808     function.SetParameterNameAt(pos, Symbols::ClosureParameter()); | 6812     function.SetParameterNameAt(pos, Symbols::ClosureParameter()); | 
| 6809     pos++; | 6813     pos++; | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6931   for (intptr_t i = 0; i < list_length; ++i) { | 6935   for (intptr_t i = 0; i < list_length; ++i) { | 
| 6932     // this will (potentially) read the expression, but reset the position. | 6936     // this will (potentially) read the expression, but reset the position. | 
| 6933     Instance& value = constant_evaluator_.EvaluateExpression(ReaderOffset()); | 6937     Instance& value = constant_evaluator_.EvaluateExpression(ReaderOffset()); | 
| 6934     SkipExpression();  // read (actual) initializer. | 6938     SkipExpression();  // read (actual) initializer. | 
| 6935     metadata_values.SetAt(i, value); | 6939     metadata_values.SetAt(i, value); | 
| 6936   } | 6940   } | 
| 6937 | 6941 | 
| 6938   return metadata_values.raw(); | 6942   return metadata_values.raw(); | 
| 6939 } | 6943 } | 
| 6940 | 6944 | 
|  | 6945 void StreamingFlowGraphBuilder::CollectTokenPositionsFor( | 
|  | 6946     intptr_t script_index, | 
|  | 6947     GrowableArray<intptr_t>* record_token_positions_in, | 
|  | 6948     GrowableArray<intptr_t>* record_yield_positions_in) { | 
|  | 6949   record_token_positions_into_ = record_token_positions_in; | 
|  | 6950   record_yield_positions_into_ = record_yield_positions_in; | 
|  | 6951   record_for_script_id_ = script_index; | 
|  | 6952 | 
|  | 6953   // Get offset for 1st library. | 
|  | 6954   SetOffset(reader_->size() - 4); | 
|  | 6955   intptr_t library_count = reader_->ReadUInt32(); | 
|  | 6956 | 
|  | 6957   SetOffset(reader_->size() - 4 - 4 * library_count); | 
|  | 6958   intptr_t offset = reader_->ReadUInt32(); | 
|  | 6959 | 
|  | 6960   SetOffset(offset); | 
|  | 6961   for (intptr_t i = 0; i < library_count; ++i) { | 
|  | 6962     LibraryHelper library_helper(this); | 
|  | 6963     library_helper.ReadUntilExcluding(LibraryHelper::kEnd); | 
|  | 6964   } | 
|  | 6965 | 
|  | 6966   record_token_positions_into_ = NULL; | 
|  | 6967   record_yield_positions_into_ = NULL; | 
|  | 6968   record_for_script_id_ = -1; | 
|  | 6969 } | 
|  | 6970 | 
|  | 6971 intptr_t StreamingFlowGraphBuilder::SourceTableSize() { | 
|  | 6972   AlternativeReadingScope alt(reader_); | 
|  | 6973   SetOffset(reader_->size() - 4); | 
|  | 6974   intptr_t library_count = reader_->ReadUInt32(); | 
|  | 6975   SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); | 
|  | 6976   SetOffset(reader_->ReadUInt32());  // read source table offset. | 
|  | 6977   return ReadUInt();                 // read source table size. | 
|  | 6978 } | 
|  | 6979 | 
|  | 6980 String& StreamingFlowGraphBuilder::SourceTableUriFor(intptr_t index) { | 
|  | 6981   AlternativeReadingScope alt(reader_); | 
|  | 6982   SetOffset(reader_->size() - 4); | 
|  | 6983   intptr_t library_count = reader_->ReadUInt32(); | 
|  | 6984   SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); | 
|  | 6985   SetOffset(reader_->ReadUInt32());  // read source table offset. | 
|  | 6986   intptr_t size = ReadUInt();        // read source table size. | 
|  | 6987   intptr_t start = 0; | 
|  | 6988   intptr_t end = -1; | 
|  | 6989   for (intptr_t i = 0; i < size; ++i) { | 
|  | 6990     intptr_t offset = ReadUInt(); | 
|  | 6991     if (i == index - 1) { | 
|  | 6992       start = offset; | 
|  | 6993     } else if (i == index) { | 
|  | 6994       end = offset; | 
|  | 6995     } | 
|  | 6996   } | 
|  | 6997   intptr_t end_offset = ReaderOffset(); | 
|  | 6998   return H.DartString(reader_->buffer() + end_offset + start, end - start, | 
|  | 6999                       Heap::kOld); | 
|  | 7000 } | 
|  | 7001 | 
|  | 7002 String& StreamingFlowGraphBuilder::GetSourceFor(intptr_t index) { | 
|  | 7003   AlternativeReadingScope alt(reader_); | 
|  | 7004   SetOffset(reader_->size() - 4); | 
|  | 7005   intptr_t library_count = reader_->ReadUInt32(); | 
|  | 7006   SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); | 
|  | 7007   SetOffset(reader_->ReadUInt32());  // read source table offset. | 
|  | 7008   intptr_t size = ReadUInt();        // read source table size. | 
|  | 7009   intptr_t uris_size = 0; | 
|  | 7010   for (intptr_t i = 0; i < size; ++i) { | 
|  | 7011     uris_size = ReadUInt(); | 
|  | 7012   } | 
|  | 7013   SkipBytes(uris_size); | 
|  | 7014 | 
|  | 7015   // Read the source code strings and line starts. | 
|  | 7016   for (intptr_t i = 0; i < size; ++i) { | 
|  | 7017     intptr_t length = ReadUInt(); | 
|  | 7018     if (index == i) { | 
|  | 7019       return H.DartString(reader_->buffer() + ReaderOffset(), length, | 
|  | 7020                           Heap::kOld); | 
|  | 7021     } | 
|  | 7022     SkipBytes(length); | 
|  | 7023     intptr_t line_count = ReadUInt(); | 
|  | 7024     for (intptr_t j = 0; j < line_count; ++j) { | 
|  | 7025       ReadUInt(); | 
|  | 7026     } | 
|  | 7027   } | 
|  | 7028 | 
|  | 7029   return String::Handle(String::null()); | 
|  | 7030 } | 
|  | 7031 | 
|  | 7032 Array& StreamingFlowGraphBuilder::GetLineStartsFor(intptr_t index) { | 
|  | 7033   AlternativeReadingScope alt(reader_); | 
|  | 7034   SetOffset(reader_->size() - 4); | 
|  | 7035   intptr_t library_count = reader_->ReadUInt32(); | 
|  | 7036   SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); | 
|  | 7037   SetOffset(reader_->ReadUInt32());  // read source table offset. | 
|  | 7038   intptr_t size = ReadUInt();        // read source table size. | 
|  | 7039   intptr_t uris_size = 0; | 
|  | 7040   for (intptr_t i = 0; i < size; ++i) { | 
|  | 7041     uris_size = ReadUInt(); | 
|  | 7042   } | 
|  | 7043   SkipBytes(uris_size); | 
|  | 7044 | 
|  | 7045   // Read the source code strings and line starts. | 
|  | 7046   for (intptr_t i = 0; i < size; ++i) { | 
|  | 7047     intptr_t length = ReadUInt(); | 
|  | 7048     SkipBytes(length); | 
|  | 7049     intptr_t line_count = ReadUInt(); | 
|  | 7050     if (i == index) { | 
|  | 7051       Array& array_object = | 
|  | 7052           Array::Handle(Z, Array::New(line_count, Heap::kOld)); | 
|  | 7053       Smi& value = Smi::Handle(Z); | 
|  | 7054       intptr_t previous_line_start = 0; | 
|  | 7055       for (intptr_t j = 0; j < line_count; ++j) { | 
|  | 7056         intptr_t line_start = ReadUInt() + previous_line_start; | 
|  | 7057         value = Smi::New(line_start); | 
|  | 7058         array_object.SetAt(j, value); | 
|  | 7059         previous_line_start = line_start; | 
|  | 7060       } | 
|  | 7061       return array_object; | 
|  | 7062     } else { | 
|  | 7063       for (intptr_t j = 0; j < line_count; ++j) { | 
|  | 7064         ReadUInt(); | 
|  | 7065       } | 
|  | 7066     } | 
|  | 7067   } | 
|  | 7068 | 
|  | 7069   return Array::Handle(Array::null()); | 
|  | 7070 } | 
|  | 7071 | 
| 6941 }  // namespace kernel | 7072 }  // namespace kernel | 
| 6942 }  // namespace dart | 7073 }  // namespace dart | 
| 6943 | 7074 | 
| 6944 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 7075 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
| OLD | NEW | 
|---|