Index: runtime/vm/kernel_to_il.h |
diff --git a/runtime/vm/kernel_to_il.h b/runtime/vm/kernel_to_il.h |
index 038e0e1b0e706f8ce550e003543d814217912dea..959197744ac81bf629441c604af5ff272aac5596 100644 |
--- a/runtime/vm/kernel_to_il.h |
+++ b/runtime/vm/kernel_to_il.h |
@@ -13,7 +13,6 @@ |
#include "vm/flow_graph.h" |
#include "vm/flow_graph_builder.h" |
#include "vm/intermediate_language.h" |
-#include "vm/kernel.h" |
namespace dart { |
namespace kernel { |
@@ -551,115 +550,6 @@ class DartTypeTranslator : public DartTypeVisitor { |
}; |
-// 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 ConstantEvaluator : public ExpressionVisitor { |
- public: |
- ConstantEvaluator(FlowGraphBuilder* builder, |
- Zone* zone, |
- TranslationHelper* h, |
- DartTypeTranslator* type_translator); |
- virtual ~ConstantEvaluator() {} |
- |
- Instance& EvaluateExpression(Expression* node); |
- Object& EvaluateExpressionSafe(Expression* node); |
- Instance& EvaluateConstructorInvocation(ConstructorInvocation* node); |
- Instance& EvaluateListLiteral(ListLiteral* node); |
- Instance& EvaluateMapLiteral(MapLiteral* node); |
- |
- virtual void VisitDefaultExpression(Expression* node) { UNREACHABLE(); } |
- |
- virtual void VisitBigintLiteral(BigintLiteral* node); |
- virtual void VisitBoolLiteral(BoolLiteral* node); |
- virtual void VisitDoubleLiteral(DoubleLiteral* node); |
- virtual void VisitIntLiteral(IntLiteral* node); |
- virtual void VisitNullLiteral(NullLiteral* node); |
- virtual void VisitStringLiteral(StringLiteral* node); |
- virtual void VisitSymbolLiteral(SymbolLiteral* node); |
- virtual void VisitTypeLiteral(TypeLiteral* node); |
- |
- virtual void VisitListLiteral(ListLiteral* node); |
- virtual void VisitMapLiteral(MapLiteral* node); |
- |
- virtual void VisitConstructorInvocation(ConstructorInvocation* node); |
- virtual void VisitMethodInvocation(MethodInvocation* node); |
- virtual void VisitStaticGet(StaticGet* node); |
- virtual void VisitVariableGet(VariableGet* node); |
- virtual void VisitLet(Let* node); |
- virtual void VisitStaticInvocation(StaticInvocation* node); |
- virtual void VisitStringConcatenation(StringConcatenation* node); |
- virtual void VisitConditionalExpression(ConditionalExpression* node); |
- virtual void VisitLogicalExpression(LogicalExpression* node); |
- virtual void VisitNot(Not* node); |
- virtual void VisitPropertyGet(PropertyGet* node); |
- |
- private: |
- // This will translate type arguments form [kernel_arguments]. If no type |
- // arguments are passed and the [target] is a factory then the null type |
- // argument array will be returned. |
- // |
- // If none of these cases apply, NULL will be returned. |
- const TypeArguments* TranslateTypeArguments(const Function& target, |
- dart::Class* target_klass, |
- Arguments* kernel_arguments); |
- |
- const Object& RunFunction(const Function& function, |
- Arguments* arguments, |
- const Instance* receiver = NULL, |
- const TypeArguments* type_args = NULL); |
- |
- const Object& RunFunction(const Function& function, |
- const Array& arguments, |
- const Array& names); |
- |
- RawObject* EvaluateConstConstructorCall(const dart::Class& type_class, |
- const TypeArguments& type_arguments, |
- const Function& constructor, |
- const Object& argument); |
- |
- void AssertBoolInCheckedMode() { |
- if (isolate_->type_checks() && !result_.IsBool()) { |
- translation_helper_.ReportError("Expected boolean expression."); |
- } |
- } |
- |
- bool EvaluateBooleanExpression(Expression* expression) { |
- EvaluateExpression(expression); |
- AssertBoolInCheckedMode(); |
- return result_.raw() == Bool::True().raw(); |
- } |
- |
- bool GetCachedConstant(TreeNode* node, Instance* value); |
- void CacheConstantValue(TreeNode* node, const Instance& value); |
- |
- FlowGraphBuilder* builder_; |
- Isolate* isolate_; |
- Zone* zone_; |
- TranslationHelper& translation_helper_; |
- DartTypeTranslator& type_translator_; |
- |
- Script& script_; |
- Instance& result_; |
-}; |
- |
- |
struct FunctionScope { |
intptr_t kernel_offset; |
LocalScope* scope; |
@@ -728,9 +618,9 @@ struct YieldContinuation { |
: entry(NULL), try_index(CatchClauseNode::kInvalidTryIndex) {} |
}; |
-class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
+class FlowGraphBuilder { |
public: |
- FlowGraphBuilder(TreeNode* node, |
+ FlowGraphBuilder(intptr_t kernel_offset, |
ParsedFunction* parsed_function, |
const ZoneGrowableArray<const ICData*>& ic_data_array, |
ZoneGrowableArray<intptr_t>* context_level_array, |
@@ -741,106 +631,24 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
FlowGraph* BuildGraph(); |
- virtual void VisitDefaultExpression(Expression* node) { UNREACHABLE(); } |
- virtual void VisitDefaultStatement(Statement* node) { UNREACHABLE(); } |
- |
- virtual void VisitInvalidExpression(InvalidExpression* node); |
- virtual void VisitNullLiteral(NullLiteral* node); |
- virtual void VisitBoolLiteral(BoolLiteral* node); |
- virtual void VisitIntLiteral(IntLiteral* node); |
- virtual void VisitBigintLiteral(BigintLiteral* node); |
- virtual void VisitDoubleLiteral(DoubleLiteral* node); |
- virtual void VisitStringLiteral(StringLiteral* node); |
- virtual void VisitSymbolLiteral(SymbolLiteral* node); |
- virtual void VisitTypeLiteral(TypeLiteral* node); |
- virtual void VisitVariableGet(VariableGet* node); |
- virtual void VisitVariableSet(VariableSet* node); |
- virtual void VisitStaticGet(StaticGet* node); |
- virtual void VisitStaticSet(StaticSet* node); |
- virtual void VisitPropertyGet(PropertyGet* node); |
- virtual void VisitPropertySet(PropertySet* node); |
- virtual void VisitDirectPropertyGet(DirectPropertyGet* node); |
- virtual void VisitDirectPropertySet(DirectPropertySet* node); |
- virtual void VisitStaticInvocation(StaticInvocation* node); |
- virtual void VisitMethodInvocation(MethodInvocation* node); |
- virtual void VisitDirectMethodInvocation(DirectMethodInvocation* node); |
- virtual void VisitConstructorInvocation(ConstructorInvocation* node); |
- virtual void VisitIsExpression(IsExpression* node); |
- virtual void VisitAsExpression(AsExpression* node); |
- virtual void VisitConditionalExpression(ConditionalExpression* node); |
- virtual void VisitLogicalExpression(LogicalExpression* node); |
- virtual void VisitNot(Not* node); |
- virtual void VisitThisExpression(ThisExpression* node); |
- virtual void VisitStringConcatenation(StringConcatenation* node); |
- virtual void VisitListLiteral(ListLiteral* node); |
- virtual void VisitMapLiteral(MapLiteral* node); |
- virtual void VisitFunctionExpression(FunctionExpression* node); |
- virtual void VisitLet(Let* node); |
- virtual void VisitThrow(Throw* node); |
- virtual void VisitRethrow(Rethrow* node); |
- |
- virtual void VisitInvalidStatement(InvalidStatement* node); |
- virtual void VisitEmptyStatement(EmptyStatement* node); |
- virtual void VisitBlock(Block* node); |
- virtual void VisitReturnStatement(ReturnStatement* node); |
- virtual void VisitExpressionStatement(ExpressionStatement* node); |
- virtual void VisitVariableDeclaration(VariableDeclaration* node); |
- virtual void VisitFunctionDeclaration(FunctionDeclaration* node); |
- virtual void VisitIfStatement(IfStatement* node); |
- virtual void VisitWhileStatement(WhileStatement* node); |
- virtual void VisitDoStatement(DoStatement* node); |
- virtual void VisitForStatement(ForStatement* node); |
- virtual void VisitForInStatement(ForInStatement* node); |
- virtual void VisitLabeledStatement(LabeledStatement* node); |
- virtual void VisitBreakStatement(BreakStatement* node); |
- virtual void VisitSwitchStatement(SwitchStatement* node); |
- virtual void VisitContinueSwitchStatement(ContinueSwitchStatement* node); |
- virtual void VisitAssertStatement(AssertStatement* node); |
- virtual void VisitTryFinally(TryFinally* node); |
- virtual void VisitTryCatch(TryCatch* node); |
- virtual void VisitYieldStatement(YieldStatement* node); |
- |
private: |
- FlowGraph* BuildGraphOfFunction(FunctionNode* node, |
- Constructor* constructor = NULL); |
- FlowGraph* BuildGraphOfFieldAccessor(Field* node, |
- LocalVariable* setter_value); |
- FlowGraph* BuildGraphOfStaticFieldInitializer(Field* node); |
FlowGraph* BuildGraphOfMethodExtractor(const Function& method); |
- FlowGraph* BuildGraphOfImplicitClosureFunction(FunctionNode* kernel_function, |
- const Function& function); |
FlowGraph* BuildGraphOfNoSuchMethodDispatcher(const Function& function); |
FlowGraph* BuildGraphOfInvokeFieldDispatcher(const Function& function); |
- Fragment NativeFunctionBody(FunctionNode* kernel_function, |
+ Fragment NativeFunctionBody(intptr_t first_positional_offset, |
const Function& function); |
- void SetupDefaultParameterValues(FunctionNode* function); |
- |
TargetEntryInstr* BuildTargetEntry(); |
JoinEntryInstr* BuildJoinEntry(); |
JoinEntryInstr* BuildJoinEntry(intptr_t try_index); |
- Fragment TranslateArguments(Arguments* node, Array* argument_names); |
ArgumentArray GetArguments(int count); |
- Fragment TranslateInitializers(Class* kernel_class, |
- List<Initializer>* initialiers); |
- Fragment TranslateFieldInitializer(NameIndex canonical_name, |
- Expression* init); |
- |
- Fragment TranslateStatement(Statement* statement); |
- Fragment TranslateCondition(Expression* expression, bool* negate); |
- Fragment TranslateExpression(Expression* expression); |
- |
Fragment TranslateFinallyFinalizers(TryFinallyBlock* outer_finally, |
intptr_t target_context_depth); |
- Fragment TranslateFunctionNode(FunctionNode* node, TreeNode* parent); |
- |
- Fragment EnterScope(TreeNode* node, bool* new_context = NULL); |
Fragment EnterScope(intptr_t kernel_offset, bool* new_context = NULL); |
- Fragment ExitScope(TreeNode* node); |
Fragment ExitScope(intptr_t kernel_offset); |
Fragment LoadContextAt(int depth); |
@@ -943,7 +751,6 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
Fragment EvaluateAssertion(); |
Fragment CheckReturnTypeInCheckedMode(); |
- Fragment CheckVariableTypeInCheckedMode(VariableDeclaration* variable); |
Fragment CheckVariableTypeInCheckedMode(const AbstractType& dst_type, |
const dart::String& name_symbol); |
Fragment CheckBooleanInCheckedMode(); |
@@ -954,9 +761,6 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
Fragment AssertAssignable(const dart::AbstractType& dst_type, |
const dart::String& dst_name); |
- template <class Invocation> |
- bool RecognizeComparisonWithNull(Token::Kind token_kind, Invocation* node); |
- |
bool NeedsDebugStepCheck(const Function& function, TokenPosition position); |
bool NeedsDebugStepCheck(Value* value, TokenPosition position); |
Fragment DebugStepCheck(TokenPosition position); |
@@ -970,10 +774,6 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
intptr_t CurrentTryIndex(); |
intptr_t AllocateTryIndex() { return next_used_try_index_++; } |
- void AddVariable(VariableDeclaration* declaration, LocalVariable* variable); |
- void AddParameter(VariableDeclaration* declaration, |
- LocalVariable* variable, |
- intptr_t pos); |
dart::LocalVariable* LookupVariable(VariableDeclaration* var); |
dart::LocalVariable* LookupVariable(intptr_t kernel_offset); |
@@ -993,9 +793,7 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
Thread* thread_; |
Zone* zone_; |
- // The node we are currently compiling (e.g. FunctionNode, Constructor, |
- // Field) |
- TreeNode* node_; |
+ intptr_t kernel_offset_; |
ParsedFunction* parsed_function_; |
intptr_t osr_id_; |
@@ -1025,7 +823,6 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
intptr_t try_depth_; |
intptr_t catch_depth_; |
intptr_t for_in_depth_; |
- Fragment fragment_; |
Value* stack_; |
intptr_t pending_argument_count_; |
@@ -1069,7 +866,6 @@ class FlowGraphBuilder : public ExpressionVisitor, public StatementVisitor { |
ActiveClass active_class_; |
DartTypeTranslator type_translator_; |
- ConstantEvaluator constant_evaluator_; |
StreamingFlowGraphBuilder* streaming_flow_graph_builder_; |