Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Unified Diff: runtime/vm/kernel_to_il.h

Issue 2886873008: [kernel] Streaming ScopeBuilder (Closed)
Patch Set: Addressed (some) comments; rebased. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/kernel_reader.cc ('k') | runtime/vm/kernel_to_il.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « runtime/vm/kernel_reader.cc ('k') | runtime/vm/kernel_to_il.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698