| 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_; }
|
| +
|
| + private:
|
| + bool need_expr_temp_;
|
| +};
|
| +
|
| +
|
| +bool NeedExprTemp(TreeNode* node) {
|
| + 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());
|
| }
|
|
|