Chromium Code Reviews| Index: runtime/vm/kernel_to_il.cc |
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
| index 40c1cd1fd326c2e9b143e2d75375a447d40675bf..1653061c07ab9624fefbdc97806cd57e696198ac 100644 |
| --- a/runtime/vm/kernel_to_il.cc |
| +++ b/runtime/vm/kernel_to_il.cc |
| @@ -31,6 +31,32 @@ namespace kernel { |
| #define I Isolate::Current() |
| +class NeedExprTempVisitor : public RecursiveVisitor { |
| + public: |
| + NeedExprTempVisitor() : need_expr_temp_(false) {} |
| + |
| + virtual void VisitConditionalExpression(ConditionalExpression* node) { |
| + need_expr_temp_ = true; |
| + } |
| + |
| + virtual void VisitLogicalExpression(LogicalExpression* node) { |
| + need_expr_temp_ = true; |
| + } |
| + |
| + bool NeedTemp() const { return need_expr_temp_; } |
|
Vyacheslav Egorov (Google)
2017/03/27 14:31:46
nit: style guide suggests naming simple getters li
|
| + |
| + private: |
| + bool need_expr_temp_; |
|
Vyacheslav Egorov (Google)
2017/03/27 14:31:46
better name is needs_expr_temp_.
|
| +}; |
| + |
| + |
| +bool NeedExprTemp(TreeNode* node) { |
|
Vyacheslav Egorov (Google)
2017/03/27 14:31:46
static bool NeedsExprTemp(...)
|
| + NeedExprTempVisitor visitor; |
| + node->AcceptVisitor(&visitor); |
| + return visitor.NeedTemp(); |
| +} |
| + |
| + |
| static void DiscoverEnclosingElements(Zone* zone, |
| const Function& function, |
| Function* outermost_function, |
| @@ -300,7 +326,11 @@ ScopeBuildingResult* ScopeBuilder::BuildScopes() { |
| LocalVariable* context_var = parsed_function->current_context_var(); |
| context_var->set_is_forced_stack(); |
| scope_->AddVariable(context_var); |
| - scope_->AddVariable(parsed_function->EnsureExpressionTemp()); |
| + bool has_expr_temp = false; |
| + if (node_ != NULL && NeedExprTemp(node_)) { |
| + scope_->AddVariable(parsed_function->EnsureExpressionTemp()); |
| + has_expr_temp = true; |
| + } |
| parsed_function->SetNodeSequence( |
| new SequenceNode(TokenPosition::kNoSource, scope_)); |
| @@ -348,6 +378,10 @@ ScopeBuildingResult* ScopeBuilder::BuildScopes() { |
| Field* field = klass->fields()[i]; |
| if (!field->IsStatic() && (field->initializer() != NULL)) { |
| EnterScope(field, field->position()); |
| + if (!has_expr_temp && NeedExprTemp(field->initializer())) { |
| + scope_->AddVariable(parsed_function->EnsureExpressionTemp()); |
| + has_expr_temp = true; |
| + } |
| field->initializer()->AcceptExpressionVisitor(this); |
| ExitScope(field->end_position()); |
| } |