Index: runtime/vm/kernel_to_il.h |
diff --git a/runtime/vm/kernel_to_il.h b/runtime/vm/kernel_to_il.h |
index 7663fd393cc7e234236583bc296549a305d5a19f..038e0e1b0e706f8ce550e003543d814217912dea 100644 |
--- a/runtime/vm/kernel_to_il.h |
+++ b/runtime/vm/kernel_to_il.h |
@@ -196,10 +196,20 @@ typedef ZoneGrowableArray<PushArgumentInstr*>* ArgumentArray; |
class ActiveClass { |
public: |
ActiveClass() |
- : kernel_class(NULL), klass(NULL), member(NULL), kernel_function(NULL) {} |
+ : kernel_class(NULL), |
+ class_type_parameters(0), |
+ class_type_parameters_offset_start(-1), |
+ klass(NULL), |
+ member(NULL), |
+ member_is_procedure(false), |
+ member_is_factory_procedure(false), |
+ member_type_parameters(0), |
+ member_type_parameters_offset_start(-1) {} |
// The current enclosing kernel class (if available, otherwise NULL). |
Class* kernel_class; |
+ intptr_t class_type_parameters; |
+ intptr_t class_type_parameters_offset_start; |
// The current enclosing class (or the library top-level class). When this is |
// a library's top-level class, the kernel_class will be NULL. |
@@ -208,14 +218,29 @@ class ActiveClass { |
// The enclosing member (e.g., Constructor, Procedure, or Field) if there |
// is one. |
Member* member; |
- |
- // The current function. |
- FunctionNode* kernel_function; |
+ bool member_is_procedure; |
+ bool member_is_factory_procedure; |
+ intptr_t member_type_parameters; |
+ intptr_t member_type_parameters_offset_start; |
}; |
class ActiveClassScope { |
public: |
+ ActiveClassScope(ActiveClass* active_class, |
+ intptr_t class_type_parameters, |
+ intptr_t class_type_parameters_offset_start, |
+ const dart::Class* klass) |
+ : active_class_(active_class), saved_(*active_class) { |
+ active_class_->kernel_class = NULL; |
+ active_class_->class_type_parameters = class_type_parameters; |
+ active_class_->class_type_parameters_offset_start = |
+ class_type_parameters_offset_start; |
+ active_class_->klass = klass; |
+ active_class_->member = NULL; |
+ } |
+ |
+ |
ActiveClassScope(ActiveClass* active_class, |
Class* kernel_class, |
const dart::Class* klass) |
@@ -223,7 +248,15 @@ class ActiveClassScope { |
active_class_->kernel_class = kernel_class; |
active_class_->klass = klass; |
active_class_->member = NULL; |
- active_class_->kernel_function = NULL; |
+ |
+ if (kernel_class != NULL) { |
+ List<TypeParameter>& type_parameters = kernel_class->type_parameters(); |
+ active_class_->class_type_parameters = type_parameters.length(); |
+ active_class_->class_type_parameters_offset_start = |
+ active_class_->class_type_parameters > 0 |
+ ? type_parameters[0]->kernel_offset() |
+ : -1; |
+ } |
} |
~ActiveClassScope() { *active_class_ = saved_; } |
@@ -236,30 +269,51 @@ class ActiveClassScope { |
class ActiveMemberScope { |
public: |
+ ActiveMemberScope(ActiveClass* active_class, |
+ bool member_is_procedure, |
+ bool member_is_factory_procedure, |
+ intptr_t member_type_parameters, |
+ intptr_t member_type_parameters_offset_start) |
+ : active_class_(active_class), saved_(*active_class) { |
+ // The class and kernel_class is inherited. |
+ active_class_->member = NULL; |
+ active_class_->member_is_procedure = member_is_procedure; |
+ active_class_->member_is_factory_procedure = member_is_factory_procedure; |
+ active_class_->member_type_parameters = member_type_parameters; |
+ active_class_->member_type_parameters_offset_start = |
+ member_type_parameters_offset_start; |
+ } |
+ |
ActiveMemberScope(ActiveClass* active_class, Member* member) |
: active_class_(active_class), saved_(*active_class) { |
// The class and kernel_class is inherited. |
active_class_->member = member; |
- active_class_->kernel_function = NULL; |
- } |
- ~ActiveMemberScope() { *active_class_ = saved_; } |
- |
- private: |
- ActiveClass* active_class_; |
- ActiveClass saved_; |
-}; |
+ active_class_->member_is_procedure = false; |
+ active_class_->member_is_factory_procedure = false; |
+ active_class_->member_type_parameters = 0; |
+ active_class_->member_type_parameters_offset_start = -1; |
+ if (member == NULL || !member->IsProcedure()) { |
+ return; |
+ } |
-class ActiveFunctionScope { |
- public: |
- ActiveFunctionScope(ActiveClass* active_class, FunctionNode* kernel_function) |
- : active_class_(active_class), saved_(*active_class) { |
- // The class, kernel_class, and member are inherited. |
- active_class_->kernel_function = kernel_function; |
+ Procedure* procedure = Procedure::Cast(member); |
+ active_class_->member_is_procedure = true; |
+ active_class->member_is_factory_procedure = |
+ procedure->kind() == Procedure::kFactory; |
+ if (procedure->function() != NULL) { |
+ TypeParameterList& type_parameters = |
+ procedure->function()->type_parameters(); |
+ if (type_parameters.length() > 0) { |
+ active_class_->member_type_parameters = type_parameters.length(); |
+ active_class_->member_type_parameters_offset_start = |
+ type_parameters.first_offset; |
+ } |
+ } |
} |
- ~ActiveFunctionScope() { *active_class_ = saved_; } |
+ ~ActiveMemberScope() { *active_class_ = saved_; } |
private: |
ActiveClass* active_class_; |
@@ -663,113 +717,6 @@ class ScopeBuildingResult : public ZoneAllocated { |
}; |
-class ScopeBuilder : public RecursiveVisitor { |
- public: |
- ScopeBuilder(ParsedFunction* parsed_function, TreeNode* node); |
- |
- virtual ~ScopeBuilder() {} |
- |
- ScopeBuildingResult* BuildScopes(); |
- |
- virtual void VisitName(Name* node) { /* NOP */ |
- } |
- |
- virtual void VisitThisExpression(ThisExpression* node); |
- virtual void VisitTypeParameterType(TypeParameterType* node); |
- virtual void VisitVariableGet(VariableGet* node); |
- virtual void VisitVariableSet(VariableSet* node); |
- virtual void VisitConditionalExpression(ConditionalExpression* node); |
- virtual void VisitLogicalExpression(LogicalExpression* node); |
- virtual void VisitFunctionExpression(FunctionExpression* node); |
- virtual void VisitLet(Let* node); |
- virtual void VisitBlock(Block* node); |
- virtual void VisitVariableDeclaration(VariableDeclaration* node); |
- virtual void VisitFunctionDeclaration(FunctionDeclaration* node); |
- virtual void VisitWhileStatement(WhileStatement* node); |
- virtual void VisitDoStatement(DoStatement* node); |
- virtual void VisitForStatement(ForStatement* node); |
- virtual void VisitForInStatement(ForInStatement* node); |
- virtual void VisitSwitchStatement(SwitchStatement* node); |
- virtual void VisitReturnStatement(ReturnStatement* node); |
- virtual void VisitTryCatch(TryCatch* node); |
- virtual void VisitTryFinally(TryFinally* node); |
- virtual void VisitYieldStatement(YieldStatement* node); |
- virtual void VisitAssertStatement(AssertStatement* node); |
- |
- virtual void VisitFunctionNode(FunctionNode* node); |
- |
- virtual void VisitConstructor(Constructor* node); |
- |
- private: |
- void EnterScope(TreeNode* node, TokenPosition start_position); |
- void ExitScope(TokenPosition end_position); |
- |
- const Type& TranslateVariableType(VariableDeclaration* variable); |
- LocalVariable* MakeVariable(TokenPosition declaration_pos, |
- TokenPosition token_pos, |
- const dart::String& name, |
- const AbstractType& type); |
- |
- void AddParameters(FunctionNode* function, intptr_t pos = 0); |
- void AddParameter(VariableDeclaration* declaration, intptr_t pos); |
- void AddVariable(VariableDeclaration* declaration); |
- void AddExceptionVariable(GrowableArray<LocalVariable*>* variables, |
- const char* prefix, |
- intptr_t nesting_depth); |
- void AddTryVariables(); |
- void AddCatchVariables(); |
- void AddIteratorVariable(); |
- void AddSwitchVariable(); |
- |
- // 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. |
- void LookupVariable(VariableDeclaration* declaration); |
- |
- const dart::String& GenerateName(const char* prefix, intptr_t suffix); |
- |
- void HandleLocalFunction(TreeNode* parent, FunctionNode* function); |
- void HandleSpecialLoad(LocalVariable** variable, const dart::String& symbol); |
- void LookupCapturedVariableByName(LocalVariable** variable, |
- const dart::String& name); |
- |
- struct DepthState { |
- explicit DepthState(intptr_t function) |
- : loop_(0), |
- function_(function), |
- try_(0), |
- catch_(0), |
- finally_(0), |
- for_in_(0) {} |
- |
- intptr_t loop_; |
- intptr_t function_; |
- intptr_t try_; |
- intptr_t catch_; |
- intptr_t finally_; |
- intptr_t for_in_; |
- }; |
- |
- ScopeBuildingResult* result_; |
- ParsedFunction* parsed_function_; |
- TreeNode* node_; |
- |
- ActiveClass active_class_; |
- |
- TranslationHelper translation_helper_; |
- Zone* zone_; |
- DartTypeTranslator type_translator_; |
- |
- FunctionNode* current_function_node_; |
- LocalScope* current_function_scope_; |
- LocalScope* scope_; |
- DepthState depth_; |
- |
- intptr_t name_index_; |
- |
- bool needs_expr_temp_; |
-}; |
- |
struct YieldContinuation { |
Instruction* entry; |
intptr_t try_index; |