| Index: runtime/vm/kernel_binary_flowgraph.h
 | 
| diff --git a/runtime/vm/kernel_binary_flowgraph.h b/runtime/vm/kernel_binary_flowgraph.h
 | 
| index 300787d6373e50ed0af6e496b5cab38c8124bd42..4667e5152d1be8c4b134e8e9b40f62340486f9a3 100644
 | 
| --- a/runtime/vm/kernel_binary_flowgraph.h
 | 
| +++ b/runtime/vm/kernel_binary_flowgraph.h
 | 
| @@ -24,6 +24,8 @@ class StreamingDartTypeTranslator {
 | 
|  
 | 
|    // Can return a malformed type.
 | 
|    AbstractType& BuildType();
 | 
| +  // Can return a malformed type.
 | 
| +  AbstractType& BuildTypeWithoutFinalization();
 | 
|    // Is guaranteed to be not malformed.
 | 
|    AbstractType& BuildVariableType();
 | 
|  
 | 
| @@ -101,46 +103,12 @@ class StreamingScopeBuilder {
 | 
|  
 | 
|   private:
 | 
|    void VisitField();
 | 
| -  void ReadFieldUntilAnnotation(TokenPosition* position,
 | 
| -                                TokenPosition* end_position,
 | 
| -                                word* flags,
 | 
| -                                intptr_t* parent_offset);
 | 
|  
 | 
| -  /**
 | 
| -   * Will read until the function node; as this is optional, will return the tag
 | 
| -   * (i.e. either kSomething or kNothing).
 | 
| -   */
 | 
| -  Tag ReadProcedureUntilFunctionNode(word* kind, intptr_t* parent_offset);
 | 
| -  void GetTypeParameterInfoForPossibleProcedure(
 | 
| -      intptr_t outermost_kernel_offset,
 | 
| -      bool* member_is_procedure,
 | 
| -      bool* is_factory_procedure,
 | 
| -      intptr_t* member_type_parameters,
 | 
| -      intptr_t* member_type_parameters_offset_start);
 | 
|    void VisitProcedure();
 | 
|  
 | 
| -  /**
 | 
| -   * Will return binary offset of parent class.
 | 
| -   */
 | 
| -  intptr_t ReadConstructorUntilFunctionNode();
 | 
|    void VisitConstructor();
 | 
|  
 | 
| -  void ReadClassUntilTypeParameters();
 | 
| -  void ReadClassUntilFields();
 | 
| -
 | 
| -  void ReadFunctionNodeUntilTypeParameters(word* async_marker,
 | 
| -                                           word* dart_async_marker);
 | 
|    void VisitFunctionNode();
 | 
| -
 | 
| -  void DiscoverEnclosingElements(Zone* zone,
 | 
| -                                 const Function& function,
 | 
| -                                 Function* outermost_function,
 | 
| -                                 intptr_t* outermost_kernel_offset,
 | 
| -                                 intptr_t* parent_class_offset);
 | 
| -  intptr_t GetParentOffset(intptr_t offset);
 | 
| -  void GetTypeParameterInfoForClass(intptr_t class_offset,
 | 
| -                                    intptr_t* type_paremeter_counts,
 | 
| -                                    intptr_t* type_paremeter_offset);
 | 
|    void VisitNode();
 | 
|    void VisitInitializer();
 | 
|    void VisitExpression();
 | 
| @@ -181,8 +149,6 @@ class StreamingScopeBuilder {
 | 
|    void AddIteratorVariable();
 | 
|    void AddSwitchVariable();
 | 
|  
 | 
| -  StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset);
 | 
| -
 | 
|    // Record an assignment or reference to a variable.  If the occurrence is
 | 
|    // in a nested function, ensure that the variable is handled properly as a
 | 
|    // captured variable.
 | 
| @@ -236,9 +202,29 @@ class StreamingScopeBuilder {
 | 
|    word unused_word;
 | 
|    intptr_t unused_intptr;
 | 
|    TokenPosition unused_tokenposition;
 | 
| +  NameIndex unused_nameindex;
 | 
|  };
 | 
|  
 | 
|  
 | 
| +// There are several cases when we are compiling constant expressions:
 | 
| +//
 | 
| +//   * constant field initializers:
 | 
| +//      const FieldName = <expr>;
 | 
| +//
 | 
| +//   * constant expressions:
 | 
| +//      const [<expr>, ...]
 | 
| +//      const {<expr> : <expr>, ...}
 | 
| +//      const Constructor(<expr>, ...)
 | 
| +//
 | 
| +//   * constant default parameters:
 | 
| +//      f(a, [b = <expr>])
 | 
| +//      f(a, {b: <expr>})
 | 
| +//
 | 
| +//   * constant values to compare in a [SwitchCase]
 | 
| +//      case <expr>:
 | 
| +//
 | 
| +// In all cases `<expr>` must be recursively evaluated and canonicalized at
 | 
| +// compile-time.
 | 
|  class StreamingConstantEvaluator {
 | 
|   public:
 | 
|    explicit StreamingConstantEvaluator(StreamingFlowGraphBuilder* builder);
 | 
| @@ -328,12 +314,6 @@ class StreamingFlowGraphBuilder {
 | 
|          constant_evaluator_(this),
 | 
|          type_translator_(this, /* finalize= */ true) {}
 | 
|  
 | 
| -  ~StreamingFlowGraphBuilder() { delete reader_; }
 | 
| -
 | 
| -  Fragment BuildExpressionAt(intptr_t kernel_offset);
 | 
| -  Fragment BuildStatementAt(intptr_t kernel_offset);
 | 
| -
 | 
| - private:
 | 
|    StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
 | 
|                              Zone* zone,
 | 
|                              const uint8_t* buffer,
 | 
| @@ -345,6 +325,69 @@ class StreamingFlowGraphBuilder {
 | 
|          constant_evaluator_(this),
 | 
|          type_translator_(this, /* finalize= */ true) {}
 | 
|  
 | 
| +  ~StreamingFlowGraphBuilder() { delete reader_; }
 | 
| +
 | 
| +  FlowGraph* BuildGraph(intptr_t kernel_offset);
 | 
| +
 | 
| +  Fragment BuildStatementAt(intptr_t kernel_offset);
 | 
| +  RawObject* BuildParameterDescriptor(intptr_t kernel_offset);
 | 
| +  RawObject* EvaluateMetadata(intptr_t kernel_offset);
 | 
| +
 | 
| + private:
 | 
| +  void DiscoverEnclosingElements(Zone* zone,
 | 
| +                                 const Function& function,
 | 
| +                                 Function* outermost_function,
 | 
| +                                 intptr_t* outermost_kernel_offset,
 | 
| +                                 intptr_t* parent_class_offset);
 | 
| +  intptr_t GetParentOffset(intptr_t offset);
 | 
| +  void GetTypeParameterInfoForClass(intptr_t class_offset,
 | 
| +                                    intptr_t* type_paremeter_counts,
 | 
| +                                    intptr_t* type_paremeter_offset);
 | 
| +  void ReadClassUntilFields();
 | 
| +  void ReadClassUntilTypeParameters();
 | 
| +  /**
 | 
| +   * Will return binary offset of parent class.
 | 
| +   */
 | 
| +  intptr_t ReadConstructorUntilFunctionNode();
 | 
| +  /**
 | 
| +   * Will read until the function node; as this is optional, will return the tag
 | 
| +   * (i.e. either kSomething or kNothing).
 | 
| +   */
 | 
| +  Tag ReadProcedureUntilFunctionNode(word* kind, intptr_t* parent_offset);
 | 
| +
 | 
| +  void ReadFieldUntilAnnotation(NameIndex* canonical_name,
 | 
| +                                TokenPosition* position,
 | 
| +                                TokenPosition* end_position,
 | 
| +                                word* flags,
 | 
| +                                intptr_t* parent_offset);
 | 
| +  void GetTypeParameterInfoForPossibleProcedure(
 | 
| +      intptr_t outermost_kernel_offset,
 | 
| +      bool* member_is_procedure,
 | 
| +      bool* is_factory_procedure,
 | 
| +      intptr_t* member_type_parameters,
 | 
| +      intptr_t* member_type_parameters_offset_start);
 | 
| +  void ReadFunctionNodeUntilTypeParameters(TokenPosition* position,
 | 
| +                                           TokenPosition* end_position,
 | 
| +                                           word* async_marker,
 | 
| +                                           word* dart_async_marker);
 | 
| +  /**
 | 
| +   * Will return kernel offset for parent class if reading a constructor.
 | 
| +   * Will otherwise return -1.
 | 
| +   */
 | 
| +  intptr_t ReadUntilFunctionNode();
 | 
| +  StringIndex GetNameFromVariableDeclaration(intptr_t kernel_offset);
 | 
| +
 | 
| +  FlowGraph* BuildGraphOfStaticFieldInitializer();
 | 
| +  FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value);
 | 
| +  void SetupDefaultParameterValues();
 | 
| +  Fragment BuildFieldInitializer(NameIndex canonical_name);
 | 
| +  Fragment BuildInitializers(intptr_t constructor_class_parent_offset);
 | 
| +  FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
 | 
| +  FlowGraph* BuildGraphOfFunction(
 | 
| +      bool is_in_builtin_library_toplevel,
 | 
| +      intptr_t constructor_class_parent_offset = -1);
 | 
| +  Fragment BuildGetMainClosure();
 | 
| +
 | 
|    Fragment BuildExpression(TokenPosition* position = NULL);
 | 
|    Fragment BuildStatement();
 | 
|  
 | 
| @@ -399,6 +442,7 @@ class StreamingFlowGraphBuilder {
 | 
|    CatchBlock* catch_block();
 | 
|    ActiveClass* active_class();
 | 
|    ScopeBuildingResult* scopes();
 | 
| +  void set_scopes(ScopeBuildingResult* scope);
 | 
|    ParsedFunction* parsed_function();
 | 
|    TryFinallyBlock* try_finally_block();
 | 
|    SwitchBlock* switch_block();
 | 
| @@ -537,6 +581,7 @@ class StreamingFlowGraphBuilder {
 | 
|    Fragment BuildThrow(TokenPosition* position);
 | 
|    Fragment BuildListLiteral(bool is_const, TokenPosition* position);
 | 
|    Fragment BuildMapLiteral(bool is_const, TokenPosition* position);
 | 
| +  Fragment BuildFunctionExpression();
 | 
|    Fragment BuildLet(TokenPosition* position);
 | 
|    Fragment BuildBigIntLiteral(TokenPosition* position);
 | 
|    Fragment BuildStringLiteral(TokenPosition* position);
 | 
| @@ -565,6 +610,15 @@ class StreamingFlowGraphBuilder {
 | 
|    Fragment BuildTryFinally();
 | 
|    Fragment BuildYieldStatement();
 | 
|    Fragment BuildVariableDeclaration();
 | 
| +  Fragment BuildFunctionDeclaration();
 | 
| +  Fragment BuildFunctionNode(intptr_t parent_kernel_offset,
 | 
| +                             TokenPosition parent_position,
 | 
| +                             bool declaration,
 | 
| +                             intptr_t variable_offeset);
 | 
| +  void SetupFunctionParameters(const dart::Class& klass,
 | 
| +                               const dart::Function& function,
 | 
| +                               bool is_method,
 | 
| +                               bool is_closure);
 | 
|  
 | 
|    FlowGraphBuilder* flow_graph_builder_;
 | 
|    TranslationHelper& translation_helper_;
 | 
| @@ -573,6 +627,11 @@ class StreamingFlowGraphBuilder {
 | 
|    StreamingConstantEvaluator constant_evaluator_;
 | 
|    StreamingDartTypeTranslator type_translator_;
 | 
|  
 | 
| +  word unused_word;
 | 
| +  intptr_t unused_intptr;
 | 
| +  TokenPosition unused_tokenposition;
 | 
| +  NameIndex unused_nameindex;
 | 
| +
 | 
|    friend class StreamingConstantEvaluator;
 | 
|    friend class StreamingDartTypeTranslator;
 | 
|    friend class StreamingScopeBuilder;
 | 
| 
 |