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

Unified Diff: runtime/vm/kernel_to_il.cc

Issue 2778693002: [kernel] Don't use kernel ast nodes as keys (Closed)
Patch Set: Created 3 years, 9 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
« runtime/vm/kernel_to_il.h ('K') | « runtime/vm/kernel_to_il.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel_to_il.cc
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 081c7a128e1940b894a3fe0a08248fec49c51a60..7924465818f5ae9905422c9b8a64417af81c4bee 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -58,10 +58,12 @@ static void DiscoverEnclosingElements(Zone* zone,
}
-void ScopeBuilder::EnterScope(TreeNode* node, TokenPosition start_position) {
+template <typename NewScopeType>
+void ScopeBuilder::EnterScope(NewScopeType* node,
Kevin Millikin (Google) 2017/03/28 06:42:23 Instead of the template functions I'd rather add o
jensj 2017/03/28 08:56:28 Done.
+ TokenPosition start_position) {
scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_);
scope_->set_begin_token_pos(start_position);
- result_->scopes.Insert(node, scope_);
+ result_->scopes.Insert(node->kernel_file_offset(), scope_);
}
@@ -100,7 +102,7 @@ void ScopeBuilder::AddParameter(VariableDeclaration* declaration,
variable->set_is_final();
}
scope_->InsertParameterAt(pos, variable);
- result_->locals.Insert(declaration, variable);
+ result_->locals.Insert(declaration->kernel_file_offset(), variable);
// The default value may contain 'let' bindings for which the constant
// evaluator needs scope bindings.
@@ -185,7 +187,8 @@ void ScopeBuilder::AddIteratorVariable() {
void ScopeBuilder::LookupVariable(VariableDeclaration* declaration) {
- LocalVariable* variable = result_->locals.Lookup(declaration);
+ LocalVariable* variable =
+ result_->locals.Lookup(declaration->kernel_file_offset());
if (variable == NULL) {
// We have not seen a declaration of the variable, so it must be the
// case that we are compiling a nested function and the variable is
@@ -195,7 +198,7 @@ void ScopeBuilder::LookupVariable(VariableDeclaration* declaration) {
const dart::String& name = H.DartSymbol(declaration->name());
variable = current_function_scope_->parent()->LookupVariable(name, true);
ASSERT(variable != NULL);
- result_->locals.Insert(declaration, variable);
+ result_->locals.Insert(declaration->kernel_file_offset(), variable);
}
if (variable->owner()->function_level() < scope_->function_level()) {
// We call `LocalScope->CaptureVariable(variable)` in two scenarios for two
@@ -249,7 +252,7 @@ void ScopeBuilder::AddVariable(VariableDeclaration* declaration) {
variable->set_is_final();
}
scope_->AddVariable(variable);
- result_->locals.Insert(declaration, variable);
+ result_->locals.Insert(declaration->kernel_file_offset(), variable);
}
@@ -482,7 +485,8 @@ void ScopeBuilder::VisitVariableSet(VariableSet* node) {
}
-void ScopeBuilder::HandleLocalFunction(TreeNode* parent,
+template <typename FunctionType>
+void ScopeBuilder::HandleLocalFunction(FunctionType* parent,
FunctionNode* function) {
LocalScope* saved_function_scope = current_function_scope_;
FunctionNode* saved_function_node = current_function_node_;
@@ -492,7 +496,7 @@ void ScopeBuilder::HandleLocalFunction(TreeNode* parent,
current_function_scope_ = scope_;
current_function_node_ = function;
if (depth_.function_ == 1) {
- FunctionScope function_scope = {function, scope_};
+ FunctionScope function_scope = {function->kernel_file_offset(), scope_};
result_->function_scopes.Add(function_scope);
}
AddParameters(function);
@@ -2010,10 +2014,11 @@ Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
}
-Fragment FlowGraphBuilder::EnterScope(TreeNode* node, bool* new_context) {
+Fragment FlowGraphBuilder::EnterScope(int64_t kernel_offset,
Kevin Millikin (Google) 2017/03/28 06:42:22 It's a little confusing that this is sometimes 'ke
jensj 2017/03/28 08:56:28 Done.
+ bool* new_context) {
Fragment instructions;
const intptr_t context_size =
- scopes_->scopes.Lookup(node)->num_context_variables();
+ scopes_->scopes.Lookup(kernel_offset)->num_context_variables();
if (context_size > 0) {
instructions += PushContext(context_size);
instructions += Drop();
@@ -2025,10 +2030,10 @@ Fragment FlowGraphBuilder::EnterScope(TreeNode* node, bool* new_context) {
}
-Fragment FlowGraphBuilder::ExitScope(TreeNode* node) {
+Fragment FlowGraphBuilder::ExitScope(int64_t kernel_offset) {
Fragment instructions;
const intptr_t context_size =
- scopes_->scopes.Lookup(node)->num_context_variables();
+ scopes_->scopes.Lookup(kernel_offset)->num_context_variables();
if (context_size > 0) {
instructions += PopContext();
}
@@ -2881,7 +2886,7 @@ intptr_t FlowGraphBuilder::CurrentTryIndex() {
dart::LocalVariable* FlowGraphBuilder::LookupVariable(
VariableDeclaration* var) {
- LocalVariable* local = scopes_->locals.Lookup(var);
+ LocalVariable* local = scopes_->locals.Lookup(var->kernel_file_offset());
ASSERT(local != NULL);
return local;
}
@@ -4086,11 +4091,11 @@ Fragment FlowGraphBuilder::TranslateInitializers(
dart::Field& field =
dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field));
- EnterScope(kernel_field);
+ EnterScope(kernel_field->kernel_file_offset());
instructions += LoadLocal(scopes_->this_variable);
instructions += TranslateExpression(init);
instructions += StoreInstanceFieldGuarded(field, true);
- ExitScope(kernel_field);
+ ExitScope(kernel_field->kernel_file_offset());
}
}
@@ -5375,13 +5380,13 @@ void FlowGraphBuilder::VisitEmptyStatement(EmptyStatement* node) {
void FlowGraphBuilder::VisitBlock(Block* node) {
Fragment instructions;
- instructions += EnterScope(node);
+ instructions += EnterScope(node->kernel_file_offset());
List<Statement>& statements = node->statements();
for (intptr_t i = 0; (i < statements.length()) && instructions.is_open();
++i) {
instructions += TranslateStatement(statements[i]);
}
- instructions += ExitScope(node);
+ instructions += ExitScope(node->kernel_file_offset());
fragment_ = instructions;
}
@@ -5558,7 +5563,7 @@ void FlowGraphBuilder::VisitForStatement(ForStatement* node) {
Fragment declarations;
bool new_context = false;
- declarations += EnterScope(node, &new_context);
+ declarations += EnterScope(node->kernel_file_offset(), &new_context);
List<VariableDeclaration>& variables = node->variables();
for (intptr_t i = 0; i < variables.length(); ++i) {
@@ -5604,7 +5609,7 @@ void FlowGraphBuilder::VisitForStatement(ForStatement* node) {
Fragment loop(declarations.entry, loop_exit);
--loop_depth_;
- loop += ExitScope(node);
+ loop += ExitScope(node->kernel_file_offset());
fragment_ = loop;
}
@@ -5633,7 +5638,7 @@ void FlowGraphBuilder::VisitForInStatement(ForInStatement* node) {
condition += BranchIfTrue(&body_entry, &loop_exit);
Fragment body(body_entry);
- body += EnterScope(node);
+ body += EnterScope(node->kernel_file_offset());
body += LoadLocal(iterator);
body += PushArgument();
const dart::String& current_getter = dart::String::ZoneHandle(
@@ -5643,7 +5648,7 @@ void FlowGraphBuilder::VisitForInStatement(ForInStatement* node) {
StoreLocal(TokenPosition::kNoSource, LookupVariable(node->variable()));
body += Drop();
body += TranslateStatement(node->body());
- body += ExitScope(node);
+ body += ExitScope(node->kernel_file_offset());
if (body.is_open()) {
JoinEntryInstr* join = BuildJoinEntry();
@@ -6090,7 +6095,7 @@ void FlowGraphBuilder::VisitTryCatch(class TryCatch* node) {
Fragment catch_handler_body;
- catch_handler_body += EnterScope(catch_clause);
+ catch_handler_body += EnterScope(catch_clause->kernel_file_offset());
if (catch_clause->exception() != NULL) {
catch_handler_body += LoadLocal(CurrentException());
@@ -6122,7 +6127,7 @@ void FlowGraphBuilder::VisitTryCatch(class TryCatch* node) {
// Note: ExitScope adjusts context_depth_ so even if catch_handler_body
// is closed we still need to execute ExitScope for its side effect.
- catch_handler_body += ExitScope(catch_clause);
+ catch_handler_body += ExitScope(catch_clause->kernel_file_offset());
if (catch_handler_body.is_open()) {
catch_handler_body += Goto(after_try);
}
@@ -6256,7 +6261,10 @@ Fragment FlowGraphBuilder::TranslateFunctionNode(FunctionNode* node,
// function and token position.
Function& function = Function::ZoneHandle(Z);
for (intptr_t i = 0; i < scopes_->function_scopes.length(); ++i) {
- if (scopes_->function_scopes[i].function != node) continue;
+ if (scopes_->function_scopes[i].kernelFileOffset !=
+ node->kernel_file_offset()) {
+ continue;
+ }
TokenPosition position = node->position();
if (parent->IsFunctionDeclaration()) {
« runtime/vm/kernel_to_il.h ('K') | « runtime/vm/kernel_to_il.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698