| 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;
|
|
|