Index: runtime/vm/kernel_binary_flowgraph.cc |
diff --git a/runtime/vm/kernel_binary_flowgraph.cc b/runtime/vm/kernel_binary_flowgraph.cc |
index eb976d501057907c862ded382cf5c70f9c8cdba2..5f07ae774fa80ba237fb8a765b1fd8d2d0a9f63d 100644 |
--- a/runtime/vm/kernel_binary_flowgraph.cc |
+++ b/runtime/vm/kernel_binary_flowgraph.cc |
@@ -1197,15 +1197,15 @@ void StreamingScopeBuilder::VisitStatement() { |
case kWhileStatement: |
++depth_.loop_; |
builder_->ReadPosition(); // read position. |
- VisitExpression(); // read condition. |
- VisitStatement(); // read body. |
+ VisitExpression(); // read condition. |
+ VisitStatement(); // read body. |
--depth_.loop_; |
return; |
case kDoStatement: |
++depth_.loop_; |
builder_->ReadPosition(); // read position. |
- VisitStatement(); // read body. |
- VisitExpression(); // read condition. |
+ VisitStatement(); // read body. |
+ VisitExpression(); // read condition. |
--depth_.loop_; |
return; |
case kForStatement: { |
@@ -3424,6 +3424,17 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction( |
flow_graph_builder_->next_block_id_ - 1); |
} |
+LocalVariable* StreamingFlowGraphBuilder::LookupParameterDirect( |
+ intptr_t kernel_offset, |
+ intptr_t parameter_index) { |
+ LocalVariable* var = LookupVariable(kernel_offset); |
+ LocalVariable* parameter = |
+ new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource, |
+ Symbols::TempParam(), var->type()); |
+ parameter->set_index(parameter_index); |
+ if (var->is_captured()) parameter->set_is_captured_parameter(true); |
+ return parameter; |
+} |
// This method follows the logic of |
// StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction. For |
// additional details on converted closure functions, please, see the comment on |
@@ -3464,8 +3475,10 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfConvertedClosureFunction( |
// closures its context field contains the context vector that is used by the |
// converted top-level function (target) explicitly and that should be passed |
// to that function as the first parameter. |
- body += LoadLocal(LookupVariable( |
- ReaderOffset() + relative_kernel_offset_)); // 0th variable offset. |
+ intptr_t parameter_index = parsed_function()->first_parameter_index(); |
+ LocalVariable* parameter = LookupParameterDirect( |
+ ReaderOffset() + relative_kernel_offset_, parameter_index--); |
+ body += LoadLocal(parameter); // 0th variable offset. |
body += flow_graph_builder_->LoadField(Closure::context_offset()); |
LocalVariable* context = MakeTemporary(); |
@@ -3482,8 +3495,9 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfConvertedClosureFunction( |
// The rest of the parameters are the same for the method of the Closure class |
// being invoked and the top-level function (target). |
for (intptr_t i = 1; i < positional_argument_count; i++) { |
- body += LoadLocal(LookupVariable( |
- ReaderOffset() + relative_kernel_offset_)); // ith variable offset. |
+ LocalVariable* parameter = LookupParameterDirect( |
+ ReaderOffset() + relative_kernel_offset_, parameter_index--); |
+ body += LoadLocal(parameter); // ith variable offset. |
body += PushArgument(); |
SkipVariableDeclaration(); // read ith variable. |
} |
@@ -3545,6 +3559,7 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) { |
LocalScope* scope = parsed_function()->node_sequence()->scope(); |
intptr_t parameter_count = dart_function.NumParameters(); |
intptr_t parameter_index = parsed_function()->first_parameter_index(); |
+ |
for (intptr_t i = 0; i < parameter_count; ++i, --parameter_index) { |
LocalVariable* variable = scope->VariableAt(i); |
if (variable->is_captured()) { |
@@ -4310,16 +4325,16 @@ void StreamingFlowGraphBuilder::SkipExpression() { |
SkipExpression(); // read expression. |
return; |
case kPropertyGet: |
- ReadPosition(); // read position. |
- SkipExpression(); // read receiver. |
- SkipName(); // read name. |
+ ReadPosition(); // read position. |
+ SkipExpression(); // read receiver. |
+ SkipName(); // read name. |
SkipCanonicalNameReference(); // read interface_target_reference. |
return; |
case kPropertySet: |
- ReadPosition(); // read position. |
- SkipExpression(); // read receiver. |
- SkipName(); // read name. |
- SkipExpression(); // read value. |
+ ReadPosition(); // read position. |
+ SkipExpression(); // read receiver. |
+ SkipName(); // read name. |
+ SkipExpression(); // read value. |
SkipCanonicalNameReference(); // read interface_target_reference. |
return; |
case kDirectPropertyGet: |
@@ -4343,10 +4358,10 @@ void StreamingFlowGraphBuilder::SkipExpression() { |
SkipExpression(); // read expression. |
return; |
case kMethodInvocation: |
- ReadPosition(); // read position. |
- SkipExpression(); // read receiver. |
- SkipName(); // read name. |
- SkipArguments(); // read arguments. |
+ ReadPosition(); // read position. |
+ SkipExpression(); // read receiver. |
+ SkipName(); // read name. |
+ SkipArguments(); // read arguments. |
SkipCanonicalNameReference(); // read interface_target_reference. |
return; |
case kDirectMethodInvocation: |
@@ -5180,9 +5195,9 @@ Fragment StreamingFlowGraphBuilder::TranslateCondition(bool* negate) { |
} |
const TypeArguments& StreamingFlowGraphBuilder::BuildTypeArguments() { |
- ReadUInt(); // read arguments count. |
- intptr_t type_count = ReadListLength(); // read type count. |
- return T.BuildTypeArguments(type_count); // read types. |
+ ReadUInt(); // read arguments count. |
+ intptr_t type_count = ReadListLength(); // read type count. |
+ return T.BuildTypeArguments(type_count); // read types. |
} |
Fragment StreamingFlowGraphBuilder::BuildArguments(Array* argument_names, |
@@ -5221,7 +5236,7 @@ Fragment StreamingFlowGraphBuilder::BuildArgumentsFromActualArguments( |
} |
for (intptr_t i = 0; i < list_length; ++i) { |
String& name = H.DartSymbol(ReadStringReference()); // read ith name index. |
- instructions += BuildExpression(); // read ith expression. |
+ instructions += BuildExpression(); // read ith expression. |
if (!skip_push_arguments) instructions += PushArgument(); |
if (do_drop) instructions += Drop(); |
if (argument_names != NULL) { |