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

Unified Diff: runtime/vm/ast_transformer.cc

Issue 1308163006: Reduce the number of captured variables in async code, by only capturing local (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comments Created 5 years, 3 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/ast_transformer.h ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/ast_transformer.cc
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index 11cb61cabb661db8f66a1726ff8b1e2bf130c74a..76faa8905532a38563ba935da207889b2b34a370 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -46,12 +46,12 @@ FOR_EACH_UNREACHABLE_NODE(DEFINE_UNREACHABLE)
#undef DEFINE_UNREACHABLE
AwaitTransformer::AwaitTransformer(SequenceNode* preamble,
- LocalScope* function_top)
+ LocalScope* async_temp_scope)
: preamble_(preamble),
temp_cnt_(0),
- function_top_(function_top),
+ async_temp_scope_(async_temp_scope),
thread_(Thread::Current()) {
- ASSERT(function_top_ != NULL);
+ ASSERT(async_temp_scope_ != NULL);
}
@@ -62,18 +62,16 @@ AstNode* AwaitTransformer::Transform(AstNode* expr) {
LocalVariable* AwaitTransformer::EnsureCurrentTempVar() {
- const char* await_temp_prefix = ":await_temp_var_";
- const String& cnt_str = String::ZoneHandle(
- Z, String::NewFormatted("%s%d", await_temp_prefix, temp_cnt_));
- const String& symbol = String::ZoneHandle(Z, Symbols::New(cnt_str));
+ String& symbol = String::ZoneHandle(Z, String::NewFormatted("%d", temp_cnt_));
+ symbol = Symbols::FromConcat(Symbols::AwaitTempVarPrefix(), symbol);
ASSERT(!symbol.IsNull());
// Look up the variable in the scope used for async temp variables.
- LocalVariable* await_tmp = function_top_->LocalLookupVariable(symbol);
+ LocalVariable* await_tmp = async_temp_scope_->LocalLookupVariable(symbol);
if (await_tmp == NULL) {
// We need a new temp variable; add it to the function's top scope.
await_tmp = new (Z) LocalVariable(
Scanner::kNoSourcePos, symbol, Type::ZoneHandle(Type::DynamicType()));
- function_top_->AddVariable(await_tmp);
+ async_temp_scope_->AddVariable(await_tmp);
// After adding it to the top scope, we can look it up from the preamble.
// The following call includes an ASSERT check.
await_tmp = GetVariableInScope(preamble_->scope(), symbol);
@@ -136,8 +134,8 @@ void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
AstNode* transformed_expr = Transform(node->expr());
LocalVariable* await_temp = AddToPreambleNewTempVar(transformed_expr);
- AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode();
- await_marker->set_scope(preamble_->scope());
+ AwaitMarkerNode* await_marker =
+ new (Z) AwaitMarkerNode(async_temp_scope_, node->scope());
preamble_->Add(await_marker);
// :result_param = _awaitHelper(
@@ -562,7 +560,7 @@ void AwaitTransformer::VisitLetNode(LetNode* node) {
// added to a scope, and the subsequent nodes that are added to the
// preample can access them.
for (intptr_t i = 0; i < node->num_temps(); i++) {
- function_top_->AddVariable(node->TempAt(i));
+ async_temp_scope_->AddVariable(node->TempAt(i));
AstNode* new_init_val = Transform(node->InitializerAt(i));
preamble_->Add(new(Z) StoreLocalNode(node->token_pos(),
node->TempAt(i),
« no previous file with comments | « runtime/vm/ast_transformer.h ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698