OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/kernel_binary_flowgraph.h" | 5 #include "vm/kernel_binary_flowgraph.h" |
6 | 6 |
7 #include "vm/compiler.h" | 7 #include "vm/compiler.h" |
8 #include "vm/longjump.h" | 8 #include "vm/longjump.h" |
9 #include "vm/object_store.h" | 9 #include "vm/object_store.h" |
10 | 10 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 scope_->AddVariable(context_var); | 114 scope_->AddVariable(context_var); |
115 | 115 |
116 parsed_function->SetNodeSequence( | 116 parsed_function->SetNodeSequence( |
117 new SequenceNode(TokenPosition::kNoSource, scope_)); | 117 new SequenceNode(TokenPosition::kNoSource, scope_)); |
118 | 118 |
119 intptr_t parent_offset = -1; | 119 intptr_t parent_offset = -1; |
120 builder_->SetOffset(kernel_offset_); | 120 builder_->SetOffset(kernel_offset_); |
121 | 121 |
122 switch (function.kind()) { | 122 switch (function.kind()) { |
123 case RawFunction::kClosureFunction: | 123 case RawFunction::kClosureFunction: |
| 124 case RawFunction::kConvertedClosureFunction: |
124 case RawFunction::kRegularFunction: | 125 case RawFunction::kRegularFunction: |
125 case RawFunction::kGetterFunction: | 126 case RawFunction::kGetterFunction: |
126 case RawFunction::kSetterFunction: | 127 case RawFunction::kSetterFunction: |
127 case RawFunction::kConstructor: { | 128 case RawFunction::kConstructor: { |
128 const Tag tag = builder_->PeekTag(); | 129 const Tag tag = builder_->PeekTag(); |
129 parent_offset = builder_->ReadUntilFunctionNode(); | 130 parent_offset = builder_->ReadUntilFunctionNode(); |
130 word async_marker_word; | 131 word async_marker_word; |
131 builder_->ReadFunctionNodeUntilTypeParameters( | 132 builder_->ReadFunctionNodeUntilTypeParameters( |
132 &unused_tokenposition, &unused_tokenposition, &async_marker_word, | 133 &unused_tokenposition, &unused_tokenposition, &async_marker_word, |
133 &unused_word); // read first part of function node. | 134 &unused_word); // read first part of function node. |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 Tag function_node = builder_->ReadProcedureUntilFunctionNode( | 353 Tag function_node = builder_->ReadProcedureUntilFunctionNode( |
353 &unused_word, &unused_intptr); // read first part of procedure. | 354 &unused_word, &unused_intptr); // read first part of procedure. |
354 if (function_node == kSomething) { | 355 if (function_node == kSomething) { |
355 VisitFunctionNode(); | 356 VisitFunctionNode(); |
356 } | 357 } |
357 } | 358 } |
358 | 359 |
359 void StreamingScopeBuilder::VisitField() { | 360 void StreamingScopeBuilder::VisitField() { |
360 builder_->ReadFieldUntilAnnotation( | 361 builder_->ReadFieldUntilAnnotation( |
361 &unused_nameindex, &unused_tokenposition, &unused_tokenposition, | 362 &unused_nameindex, &unused_tokenposition, &unused_tokenposition, |
362 &unused_intptr, &unused_word); // read first part of field. | 363 &unused_intptr, &unused_word); // read first part of field. |
363 builder_->SkipListOfExpressions(); // read annotations. | 364 builder_->SkipListOfExpressions(); // read annotations. |
364 VisitDartType(); // read type. | 365 VisitDartType(); // read type. |
365 Tag tag = builder_->ReadTag(); // read initializer (part 1). | 366 Tag tag = builder_->ReadTag(); // read initializer (part 1). |
366 if (tag == kSomething) { | 367 if (tag == kSomething) { |
367 VisitExpression(); // read initializer (part 2). | 368 VisitExpression(); // read initializer (part 2). |
368 } | 369 } |
369 } | 370 } |
370 | 371 |
371 void StreamingScopeBuilder::VisitFunctionNode() { | 372 void StreamingScopeBuilder::VisitFunctionNode() { |
372 word async_marker_word; | 373 word async_marker_word; |
373 word dart_async_marker_word; | 374 word dart_async_marker_word; |
374 builder_->ReadFunctionNodeUntilTypeParameters( | 375 builder_->ReadFunctionNodeUntilTypeParameters( |
375 &unused_tokenposition, &unused_tokenposition, &async_marker_word, | 376 &unused_tokenposition, &unused_tokenposition, &async_marker_word, |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 return; | 687 return; |
687 case kDoubleLiteral: | 688 case kDoubleLiteral: |
688 builder_->SkipStringReference(); // read index into string table. | 689 builder_->SkipStringReference(); // read index into string table. |
689 return; | 690 return; |
690 case kTrueLiteral: | 691 case kTrueLiteral: |
691 return; | 692 return; |
692 case kFalseLiteral: | 693 case kFalseLiteral: |
693 return; | 694 return; |
694 case kNullLiteral: | 695 case kNullLiteral: |
695 return; | 696 return; |
| 697 case kVectorCreation: |
| 698 builder_->ReadUInt(); // read size. |
| 699 return; |
| 700 case kVectorGet: |
| 701 VisitExpression(); // read expression. |
| 702 builder_->ReadUInt(); // read index. |
| 703 return; |
| 704 case kVectorSet: |
| 705 VisitExpression(); // read vector expression. |
| 706 builder_->ReadUInt(); // read index. |
| 707 VisitExpression(); // read value. |
| 708 return; |
| 709 case kVectorCopy: |
| 710 VisitExpression(); // read vector expression. |
| 711 return; |
| 712 case kClosureCreation: |
| 713 builder_->SkipCanonicalNameReference(); // read function reference. |
| 714 VisitExpression(); // read context vector. |
| 715 VisitDartType(); // read function type of the closure. |
| 716 return; |
696 default: | 717 default: |
697 UNREACHABLE(); | 718 UNREACHABLE(); |
698 } | 719 } |
699 } | 720 } |
700 | 721 |
701 void StreamingScopeBuilder::VisitStatement() { | 722 void StreamingScopeBuilder::VisitStatement() { |
702 Tag tag = builder_->ReadTag(); // read tag. | 723 Tag tag = builder_->ReadTag(); // read tag. |
703 switch (tag) { | 724 switch (tag) { |
704 case kInvalidStatement: | 725 case kInvalidStatement: |
705 return; | 726 return; |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 result_->locals.Insert(kernel_offset_no_tag, variable); | 1046 result_->locals.Insert(kernel_offset_no_tag, variable); |
1026 } | 1047 } |
1027 | 1048 |
1028 void StreamingScopeBuilder::VisitDartType() { | 1049 void StreamingScopeBuilder::VisitDartType() { |
1029 Tag tag = builder_->ReadTag(); | 1050 Tag tag = builder_->ReadTag(); |
1030 switch (tag) { | 1051 switch (tag) { |
1031 case kInvalidType: | 1052 case kInvalidType: |
1032 case kDynamicType: | 1053 case kDynamicType: |
1033 case kVoidType: | 1054 case kVoidType: |
1034 case kBottomType: | 1055 case kBottomType: |
| 1056 case kVectorType: |
1035 // those contain nothing. | 1057 // those contain nothing. |
1036 return; | 1058 return; |
1037 case kInterfaceType: | 1059 case kInterfaceType: |
1038 VisitInterfaceType(false); | 1060 VisitInterfaceType(false); |
1039 return; | 1061 return; |
1040 case kSimpleInterfaceType: | 1062 case kSimpleInterfaceType: |
1041 VisitInterfaceType(true); | 1063 VisitInterfaceType(true); |
1042 return; | 1064 return; |
1043 case kFunctionType: | 1065 case kFunctionType: |
1044 VisitFunctionType(false); | 1066 VisitFunctionType(false); |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1436 Error::Handle(Z), // No previous error. | 1458 Error::Handle(Z), // No previous error. |
1437 dart::Script::Handle(Z, dart::Script::null()), | 1459 dart::Script::Handle(Z, dart::Script::null()), |
1438 TokenPosition::kNoSource, "[InvalidType] in Kernel IR."); | 1460 TokenPosition::kNoSource, "[InvalidType] in Kernel IR."); |
1439 break; | 1461 break; |
1440 case kDynamicType: | 1462 case kDynamicType: |
1441 result_ = Object::dynamic_type().raw(); | 1463 result_ = Object::dynamic_type().raw(); |
1442 break; | 1464 break; |
1443 case kVoidType: | 1465 case kVoidType: |
1444 result_ = Object::void_type().raw(); | 1466 result_ = Object::void_type().raw(); |
1445 break; | 1467 break; |
| 1468 case kVectorType: |
| 1469 result_ = Object::vector_type().raw(); |
| 1470 break; |
1446 case kBottomType: | 1471 case kBottomType: |
1447 result_ = dart::Class::Handle(Z, I->object_store()->null_class()) | 1472 result_ = dart::Class::Handle(Z, I->object_store()->null_class()) |
1448 .CanonicalType(); | 1473 .CanonicalType(); |
1449 break; | 1474 break; |
1450 case kInterfaceType: | 1475 case kInterfaceType: |
1451 BuildInterfaceType(false); | 1476 BuildInterfaceType(false); |
1452 break; | 1477 break; |
1453 case kSimpleInterfaceType: | 1478 case kSimpleInterfaceType: |
1454 BuildInterfaceType(true); | 1479 BuildInterfaceType(true); |
1455 break; | 1480 break; |
(...skipping 1678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3134 argument_names); | 3159 argument_names); |
3135 | 3160 |
3136 // Return the result. | 3161 // Return the result. |
3137 body += Return(end_position); | 3162 body += Return(end_position); |
3138 | 3163 |
3139 return new (Z) | 3164 return new (Z) |
3140 FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, | 3165 FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, |
3141 flow_graph_builder_->next_block_id_ - 1); | 3166 flow_graph_builder_->next_block_id_ - 1); |
3142 } | 3167 } |
3143 | 3168 |
| 3169 |
| 3170 // This method follows the logic similar to that of |
| 3171 // StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction. For |
| 3172 // additional details on converted closure functions, please, see the comment on |
| 3173 // the method Function::ConvertedClosureFunction. |
| 3174 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfConvertedClosureFunction( |
| 3175 const Function& function) { |
| 3176 const Function& target = Function::ZoneHandle(Z, function.parent_function()); |
| 3177 |
| 3178 TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry(); |
| 3179 flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr( |
| 3180 *parsed_function(), normal_entry, Compiler::kNoOSRDeoptId); |
| 3181 SetupDefaultParameterValues(); |
| 3182 |
| 3183 Fragment body(normal_entry); |
| 3184 body += flow_graph_builder_->CheckStackOverflowInPrologue(); |
| 3185 |
| 3186 // Load all the arguments. |
| 3187 ASSERT(target.is_static()); |
| 3188 |
| 3189 TokenPosition end_position; |
| 3190 ReadFunctionNodeUntilTypeParameters( |
| 3191 &unused_tokenposition, &end_position, &unused_word, |
| 3192 &unused_word); // read first part of function node. |
| 3193 SkipTypeParametersList(); // read type parameter list. |
| 3194 ReadUInt(); // read total parameter count. |
| 3195 ReadUInt(); // read required_parameter_count. |
| 3196 |
| 3197 // Positional. |
| 3198 intptr_t positional_argument_count = ReadListLength(); |
| 3199 |
| 3200 // The first argument is the instance of the closure class. For converted |
| 3201 // closures its context field contains the context vector that is used by the |
| 3202 // converted top-level function (target) explicitly and that should be passed |
| 3203 // to that function as the first parameter. |
| 3204 body += LoadLocal(LookupVariable(ReaderOffset())); // 0th variable offset. |
| 3205 body += flow_graph_builder_->LoadField(Closure::context_offset()); |
| 3206 body += PushArgument(); |
| 3207 SkipVariableDeclaration(); // read 0th variable. |
| 3208 |
| 3209 // The rest of the parameters are the same for the method of the Closure class |
| 3210 // being invoked and the top-level function (target). |
| 3211 for (intptr_t i = 1; i < positional_argument_count; i++) { |
| 3212 body += LoadLocal(LookupVariable(ReaderOffset())); // ith variable offset. |
| 3213 body += PushArgument(); |
| 3214 SkipVariableDeclaration(); // read ith variable. |
| 3215 } |
| 3216 |
| 3217 // Named. |
| 3218 intptr_t named_argument_count = ReadListLength(); |
| 3219 Array& argument_names = Array::ZoneHandle(Z); |
| 3220 if (named_argument_count > 0) { |
| 3221 argument_names = Array::New(named_argument_count); |
| 3222 for (intptr_t i = 0; i < named_argument_count; i++) { |
| 3223 body += |
| 3224 LoadLocal(LookupVariable(ReaderOffset())); // ith variable offset. |
| 3225 body += PushArgument(); |
| 3226 argument_names.SetAt( |
| 3227 i, H.DartSymbol(GetNameFromVariableDeclaration(ReaderOffset()))); |
| 3228 SkipVariableDeclaration(); // read ith variable. |
| 3229 } |
| 3230 } |
| 3231 |
| 3232 // Forward them to the target. |
| 3233 intptr_t argument_count = positional_argument_count + named_argument_count; |
| 3234 body += StaticCall(TokenPosition::kNoSource, target, argument_count, |
| 3235 argument_names); |
| 3236 |
| 3237 // Return the result. |
| 3238 body += Return(end_position); |
| 3239 |
| 3240 return new (Z) |
| 3241 FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, |
| 3242 flow_graph_builder_->next_block_id_ - 1); |
| 3243 } |
| 3244 |
| 3245 |
3144 static bool IsGetMainClosure(const String& name) { | 3246 static bool IsGetMainClosure(const String& name) { |
3145 if (name.Length() < 16) return false; | 3247 if (name.Length() < 16) return false; |
3146 const char* cstr = "_getMainClosure@"; | 3248 const char* cstr = "_getMainClosure@"; |
3147 for (intptr_t i = 0; i < 16; ++i) { | 3249 for (intptr_t i = 0; i < 16; ++i) { |
3148 if (name.CharAt(i) != cstr[i]) return false; | 3250 if (name.CharAt(i) != cstr[i]) return false; |
3149 } | 3251 } |
3150 return true; | 3252 return true; |
3151 } | 3253 } |
3152 | 3254 |
3153 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( | 3255 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3557 // will not need an AST. The code generator will assume that there is a | 3659 // will not need an AST. The code generator will assume that there is a |
3558 // local variable stack slot allocated for the current context and (I | 3660 // local variable stack slot allocated for the current context and (I |
3559 // think) that the runtime will expect it to be at a fixed offset which | 3661 // think) that the runtime will expect it to be at a fixed offset which |
3560 // requires allocating an unused expression temporary variable. | 3662 // requires allocating an unused expression temporary variable. |
3561 set_scopes(parsed_function()->EnsureKernelScopes()); | 3663 set_scopes(parsed_function()->EnsureKernelScopes()); |
3562 | 3664 |
3563 SetOffset(kernel_offset); | 3665 SetOffset(kernel_offset); |
3564 | 3666 |
3565 switch (function.kind()) { | 3667 switch (function.kind()) { |
3566 case RawFunction::kClosureFunction: | 3668 case RawFunction::kClosureFunction: |
| 3669 case RawFunction::kConvertedClosureFunction: |
3567 case RawFunction::kRegularFunction: | 3670 case RawFunction::kRegularFunction: |
3568 case RawFunction::kGetterFunction: | 3671 case RawFunction::kGetterFunction: |
3569 case RawFunction::kSetterFunction: { | 3672 case RawFunction::kSetterFunction: { |
3570 ReadUntilFunctionNode(); // read until function node. | 3673 ReadUntilFunctionNode(); // read until function node. |
3571 return function.IsImplicitClosureFunction() | 3674 if (function.IsImplicitClosureFunction()) { |
3572 ? BuildGraphOfImplicitClosureFunction(function) | 3675 return BuildGraphOfImplicitClosureFunction(function); |
3573 : BuildGraphOfFunction(is_in_builtin_library_toplevel); | 3676 } else if (function.IsConvertedClosureFunction()) { |
| 3677 return BuildGraphOfConvertedClosureFunction(function); |
| 3678 } |
| 3679 return BuildGraphOfFunction(is_in_builtin_library_toplevel); |
3574 } | 3680 } |
3575 case RawFunction::kConstructor: { | 3681 case RawFunction::kConstructor: { |
3576 bool is_factory = function.IsFactory(); | 3682 bool is_factory = function.IsFactory(); |
3577 if (is_factory) { | 3683 if (is_factory) { |
3578 ReadUntilFunctionNode(); // read until function node. | 3684 ReadUntilFunctionNode(); // read until function node. |
3579 return BuildGraphOfFunction(is_in_builtin_library_toplevel); | 3685 return BuildGraphOfFunction(is_in_builtin_library_toplevel); |
3580 } else { | 3686 } else { |
3581 // Constructor: Pass offset to parent class. | 3687 // Constructor: Pass offset to parent class. |
3582 return BuildGraphOfFunction( | 3688 return BuildGraphOfFunction( |
3583 is_in_builtin_library_toplevel, | 3689 is_in_builtin_library_toplevel, |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3694 case kPositiveIntLiteral: | 3800 case kPositiveIntLiteral: |
3695 return BuildIntLiteral(false, position); | 3801 return BuildIntLiteral(false, position); |
3696 case kDoubleLiteral: | 3802 case kDoubleLiteral: |
3697 return BuildDoubleLiteral(position); | 3803 return BuildDoubleLiteral(position); |
3698 case kTrueLiteral: | 3804 case kTrueLiteral: |
3699 return BuildBoolLiteral(true, position); | 3805 return BuildBoolLiteral(true, position); |
3700 case kFalseLiteral: | 3806 case kFalseLiteral: |
3701 return BuildBoolLiteral(false, position); | 3807 return BuildBoolLiteral(false, position); |
3702 case kNullLiteral: | 3808 case kNullLiteral: |
3703 return BuildNullLiteral(position); | 3809 return BuildNullLiteral(position); |
| 3810 case kVectorCreation: |
| 3811 return BuildVectorCreation(position); |
| 3812 case kVectorGet: |
| 3813 return BuildVectorGet(position); |
| 3814 case kVectorSet: |
| 3815 return BuildVectorSet(position); |
| 3816 case kVectorCopy: |
| 3817 return BuildVectorCopy(position); |
| 3818 case kClosureCreation: |
| 3819 return BuildClosureCreation(position); |
3704 default: | 3820 default: |
3705 UNREACHABLE(); | 3821 UNREACHABLE(); |
3706 } | 3822 } |
3707 | 3823 |
3708 return Fragment(); | 3824 return Fragment(); |
3709 } | 3825 } |
3710 | 3826 |
3711 Fragment StreamingFlowGraphBuilder::BuildStatement() { | 3827 Fragment StreamingFlowGraphBuilder::BuildStatement() { |
3712 Tag tag = ReadTag(); // read tag. | 3828 Tag tag = ReadTag(); // read tag. |
3713 switch (tag) { | 3829 switch (tag) { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3849 ReadUInt(); | 3965 ReadUInt(); |
3850 } | 3966 } |
3851 | 3967 |
3852 void StreamingFlowGraphBuilder::SkipDartType() { | 3968 void StreamingFlowGraphBuilder::SkipDartType() { |
3853 Tag tag = ReadTag(); | 3969 Tag tag = ReadTag(); |
3854 switch (tag) { | 3970 switch (tag) { |
3855 case kInvalidType: | 3971 case kInvalidType: |
3856 case kDynamicType: | 3972 case kDynamicType: |
3857 case kVoidType: | 3973 case kVoidType: |
3858 case kBottomType: | 3974 case kBottomType: |
| 3975 case kVectorType: |
3859 // those contain nothing. | 3976 // those contain nothing. |
3860 return; | 3977 return; |
3861 case kInterfaceType: | 3978 case kInterfaceType: |
3862 SkipInterfaceType(false); | 3979 SkipInterfaceType(false); |
3863 return; | 3980 return; |
3864 case kSimpleInterfaceType: | 3981 case kSimpleInterfaceType: |
3865 SkipInterfaceType(true); | 3982 SkipInterfaceType(true); |
3866 return; | 3983 return; |
3867 case kFunctionType: | 3984 case kFunctionType: |
3868 SkipFunctionType(false); | 3985 SkipFunctionType(false); |
(...skipping 24 matching lines...) Expand all Loading... |
3893 void StreamingFlowGraphBuilder::SkipInterfaceType(bool simple) { | 4010 void StreamingFlowGraphBuilder::SkipInterfaceType(bool simple) { |
3894 ReadUInt(); // read klass_name. | 4011 ReadUInt(); // read klass_name. |
3895 if (!simple) { | 4012 if (!simple) { |
3896 SkipListOfDartTypes(); // read list of types. | 4013 SkipListOfDartTypes(); // read list of types. |
3897 } | 4014 } |
3898 } | 4015 } |
3899 | 4016 |
3900 void StreamingFlowGraphBuilder::SkipFunctionType(bool simple) { | 4017 void StreamingFlowGraphBuilder::SkipFunctionType(bool simple) { |
3901 if (!simple) { | 4018 if (!simple) { |
3902 SkipTypeParametersList(); // read type_parameters. | 4019 SkipTypeParametersList(); // read type_parameters. |
3903 ReadUInt(); // read required parameter count. | 4020 ReadUInt(); // read required parameter count. |
3904 ReadUInt(); // read total parameter count. | 4021 ReadUInt(); // read total parameter count. |
3905 } | 4022 } |
3906 | 4023 |
3907 SkipListOfDartTypes(); // read positional_parameters types. | 4024 SkipListOfDartTypes(); // read positional_parameters types. |
3908 | 4025 |
3909 if (!simple) { | 4026 if (!simple) { |
3910 const intptr_t named_count = | 4027 const intptr_t named_count = |
3911 ReadListLength(); // read named_parameters list length. | 4028 ReadListLength(); // read named_parameters list length. |
3912 for (intptr_t i = 0; i < named_count; ++i) { | 4029 for (intptr_t i = 0; i < named_count; ++i) { |
3913 // read string reference (i.e. named_parameters[i].name). | 4030 // read string reference (i.e. named_parameters[i].name). |
3914 SkipStringReference(); | 4031 SkipStringReference(); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4043 SkipBytes(1); // read operator. | 4160 SkipBytes(1); // read operator. |
4044 SkipExpression(); // read right. | 4161 SkipExpression(); // read right. |
4045 return; | 4162 return; |
4046 case kConditionalExpression: | 4163 case kConditionalExpression: |
4047 SkipExpression(); // read condition. | 4164 SkipExpression(); // read condition. |
4048 SkipExpression(); // read then. | 4165 SkipExpression(); // read then. |
4049 SkipExpression(); // read otherwise. | 4166 SkipExpression(); // read otherwise. |
4050 SkipOptionalDartType(); // read unused static type. | 4167 SkipOptionalDartType(); // read unused static type. |
4051 return; | 4168 return; |
4052 case kStringConcatenation: | 4169 case kStringConcatenation: |
4053 ReadPosition(); // read position. | 4170 ReadPosition(); // read position. |
4054 SkipListOfExpressions(); // read list of expressions. | 4171 SkipListOfExpressions(); // read list of expressions. |
4055 return; | 4172 return; |
4056 case kIsExpression: | 4173 case kIsExpression: |
4057 ReadPosition(); // read position. | 4174 ReadPosition(); // read position. |
4058 SkipExpression(); // read operand. | 4175 SkipExpression(); // read operand. |
4059 SkipDartType(); // read type. | 4176 SkipDartType(); // read type. |
4060 return; | 4177 return; |
4061 case kAsExpression: | 4178 case kAsExpression: |
4062 ReadPosition(); // read position. | 4179 ReadPosition(); // read position. |
4063 SkipExpression(); // read operand. | 4180 SkipExpression(); // read operand. |
4064 SkipDartType(); // read type. | 4181 SkipDartType(); // read type. |
4065 return; | 4182 return; |
4066 case kSymbolLiteral: | 4183 case kSymbolLiteral: |
4067 SkipStringReference(); // read index into string table. | 4184 SkipStringReference(); // read index into string table. |
4068 return; | 4185 return; |
4069 case kTypeLiteral: | 4186 case kTypeLiteral: |
4070 SkipDartType(); // read type. | 4187 SkipDartType(); // read type. |
4071 return; | 4188 return; |
4072 case kThisExpression: | 4189 case kThisExpression: |
4073 return; | 4190 return; |
4074 case kRethrow: | 4191 case kRethrow: |
4075 ReadPosition(); // read position. | 4192 ReadPosition(); // read position. |
4076 return; | 4193 return; |
4077 case kThrow: | 4194 case kThrow: |
4078 ReadPosition(); // read position. | 4195 ReadPosition(); // read position. |
4079 SkipExpression(); // read expression. | 4196 SkipExpression(); // read expression. |
4080 return; | 4197 return; |
4081 case kListLiteral: | 4198 case kListLiteral: |
4082 case kConstListLiteral: | 4199 case kConstListLiteral: |
4083 ReadPosition(); // read position. | 4200 ReadPosition(); // read position. |
4084 SkipDartType(); // read type. | 4201 SkipDartType(); // read type. |
4085 SkipListOfExpressions(); // read list of expressions. | 4202 SkipListOfExpressions(); // read list of expressions. |
4086 return; | 4203 return; |
4087 case kMapLiteral: | 4204 case kMapLiteral: |
4088 case kConstMapLiteral: { | 4205 case kConstMapLiteral: { |
4089 ReadPosition(); // read position. | 4206 ReadPosition(); // read position. |
4090 SkipDartType(); // read key type. | 4207 SkipDartType(); // read key type. |
4091 SkipDartType(); // read value type. | 4208 SkipDartType(); // read value type. |
4092 intptr_t list_length = ReadListLength(); // read list length. | 4209 intptr_t list_length = ReadListLength(); // read list length. |
4093 for (intptr_t i = 0; i < list_length; ++i) { | 4210 for (intptr_t i = 0; i < list_length; ++i) { |
4094 SkipExpression(); // read ith key. | 4211 SkipExpression(); // read ith key. |
4095 SkipExpression(); // read ith value. | 4212 SkipExpression(); // read ith value. |
4096 } | 4213 } |
4097 return; | 4214 return; |
4098 } | 4215 } |
4099 case kFunctionExpression: | 4216 case kFunctionExpression: |
4100 SkipFunctionNode(); // read function node. | 4217 SkipFunctionNode(); // read function node. |
4101 return; | 4218 return; |
4102 case kLet: | 4219 case kLet: |
4103 SkipVariableDeclaration(); // read variable declaration. | 4220 SkipVariableDeclaration(); // read variable declaration. |
4104 SkipExpression(); // read expression. | 4221 SkipExpression(); // read expression. |
4105 return; | 4222 return; |
| 4223 case kVectorCreation: |
| 4224 ReadUInt(); // read value. |
| 4225 return; |
| 4226 case kVectorGet: |
| 4227 SkipExpression(); // read vector expression. |
| 4228 ReadUInt(); // read index. |
| 4229 return; |
| 4230 case kVectorSet: |
| 4231 SkipExpression(); // read vector expression. |
| 4232 ReadUInt(); // read index. |
| 4233 SkipExpression(); // read value. |
| 4234 return; |
| 4235 case kVectorCopy: |
| 4236 SkipExpression(); // read vector expression. |
| 4237 return; |
| 4238 case kClosureCreation: |
| 4239 SkipCanonicalNameReference(); // read top-level function reference. |
| 4240 SkipExpression(); // read context vector. |
| 4241 SkipDartType(); // read function type. |
| 4242 return; |
4106 case kBigIntLiteral: | 4243 case kBigIntLiteral: |
4107 SkipStringReference(); // read string reference. | 4244 SkipStringReference(); // read string reference. |
4108 return; | 4245 return; |
4109 case kStringLiteral: | 4246 case kStringLiteral: |
4110 SkipStringReference(); // read string reference. | 4247 SkipStringReference(); // read string reference. |
4111 return; | 4248 return; |
4112 case kSpecialIntLiteral: | 4249 case kSpecialIntLiteral: |
4113 return; | 4250 return; |
4114 case kNegativeIntLiteral: | 4251 case kNegativeIntLiteral: |
4115 ReadUInt(); // read value. | 4252 ReadUInt(); // read value. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4168 case kWhileStatement: | 4305 case kWhileStatement: |
4169 SkipExpression(); // read condition. | 4306 SkipExpression(); // read condition. |
4170 SkipStatement(); // read body. | 4307 SkipStatement(); // read body. |
4171 return; | 4308 return; |
4172 case kDoStatement: | 4309 case kDoStatement: |
4173 SkipStatement(); // read body. | 4310 SkipStatement(); // read body. |
4174 SkipExpression(); // read condition. | 4311 SkipExpression(); // read condition. |
4175 return; | 4312 return; |
4176 case kForStatement: { | 4313 case kForStatement: { |
4177 SkipListOfVariableDeclarations(); // read variables. | 4314 SkipListOfVariableDeclarations(); // read variables. |
4178 Tag tag = ReadTag(); // Read first part of condition. | 4315 Tag tag = ReadTag(); // Read first part of condition. |
4179 if (tag == kSomething) { | 4316 if (tag == kSomething) { |
4180 SkipExpression(); // read rest of condition. | 4317 SkipExpression(); // read rest of condition. |
4181 } | 4318 } |
4182 SkipListOfExpressions(); // read updates. | 4319 SkipListOfExpressions(); // read updates. |
4183 SkipStatement(); // read body. | 4320 SkipStatement(); // read body. |
4184 return; | 4321 return; |
4185 } | 4322 } |
4186 case kForInStatement: | 4323 case kForInStatement: |
4187 case kAsyncForInStatement: | 4324 case kAsyncForInStatement: |
4188 ReadPosition(); // read position. | 4325 ReadPosition(); // read position. |
4189 SkipVariableDeclaration(); // read variable. | 4326 SkipVariableDeclaration(); // read variable. |
4190 SkipExpression(); // read iterable. | 4327 SkipExpression(); // read iterable. |
4191 SkipStatement(); // read body. | 4328 SkipStatement(); // read body. |
4192 return; | 4329 return; |
4193 case kSwitchStatement: { | 4330 case kSwitchStatement: { |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4416 | 4553 |
4417 GrowableArray<YieldContinuation>& | 4554 GrowableArray<YieldContinuation>& |
4418 StreamingFlowGraphBuilder::yield_continuations() { | 4555 StreamingFlowGraphBuilder::yield_continuations() { |
4419 return flow_graph_builder_->yield_continuations_; | 4556 return flow_graph_builder_->yield_continuations_; |
4420 } | 4557 } |
4421 | 4558 |
4422 Value* StreamingFlowGraphBuilder::stack() { | 4559 Value* StreamingFlowGraphBuilder::stack() { |
4423 return flow_graph_builder_->stack_; | 4560 return flow_graph_builder_->stack_; |
4424 } | 4561 } |
4425 | 4562 |
| 4563 void StreamingFlowGraphBuilder::Push(Definition* definition) { |
| 4564 flow_graph_builder_->Push(definition); |
| 4565 } |
| 4566 |
4426 Value* StreamingFlowGraphBuilder::Pop() { | 4567 Value* StreamingFlowGraphBuilder::Pop() { |
4427 return flow_graph_builder_->Pop(); | 4568 return flow_graph_builder_->Pop(); |
4428 } | 4569 } |
4429 | 4570 |
4430 Tag StreamingFlowGraphBuilder::PeekArgumentsFirstPositionalTag() { | 4571 Tag StreamingFlowGraphBuilder::PeekArgumentsFirstPositionalTag() { |
4431 // read parts of arguments, then go back to before doing so. | 4572 // read parts of arguments, then go back to before doing so. |
4432 AlternativeReadingScope alt(reader_); | 4573 AlternativeReadingScope alt(reader_); |
4433 ReadUInt(); // read number of arguments. | 4574 ReadUInt(); // read number of arguments. |
4434 | 4575 |
4435 SkipListOfDartTypes(); // Read list of types. | 4576 SkipListOfDartTypes(); // Read list of types. |
(...skipping 16 matching lines...) Expand all Loading... |
4452 intptr_t list_length = ReadListLength(); // read types list length. | 4593 intptr_t list_length = ReadListLength(); // read types list length. |
4453 return T.BuildInstantiatedTypeArguments(klass, list_length); // read types. | 4594 return T.BuildInstantiatedTypeArguments(klass, list_length); // read types. |
4454 } | 4595 } |
4455 | 4596 |
4456 intptr_t StreamingFlowGraphBuilder::PeekArgumentsCount() { | 4597 intptr_t StreamingFlowGraphBuilder::PeekArgumentsCount() { |
4457 return PeekUInt(); | 4598 return PeekUInt(); |
4458 } | 4599 } |
4459 | 4600 |
4460 intptr_t StreamingFlowGraphBuilder::PeekArgumentsTypeCount() { | 4601 intptr_t StreamingFlowGraphBuilder::PeekArgumentsTypeCount() { |
4461 AlternativeReadingScope alt(reader_); | 4602 AlternativeReadingScope alt(reader_); |
4462 ReadUInt(); // read arguments count. | 4603 ReadUInt(); // read arguments count. |
4463 return ReadListLength(); // read length of types list. | 4604 return ReadListLength(); // read length of types list. |
4464 } | 4605 } |
4465 | 4606 |
4466 void StreamingFlowGraphBuilder::SkipArgumentsBeforeActualArguments() { | 4607 void StreamingFlowGraphBuilder::SkipArgumentsBeforeActualArguments() { |
4467 ReadUInt(); // read arguments count. | 4608 ReadUInt(); // read arguments count. |
4468 SkipListOfDartTypes(); // read list of types. | 4609 SkipListOfDartTypes(); // read list of types. |
4469 } | 4610 } |
4470 | 4611 |
4471 LocalVariable* StreamingFlowGraphBuilder::LookupVariable( | 4612 LocalVariable* StreamingFlowGraphBuilder::LookupVariable( |
4472 intptr_t kernel_offset) { | 4613 intptr_t kernel_offset) { |
4473 return flow_graph_builder_->LookupVariable(kernel_offset); | 4614 return flow_graph_builder_->LookupVariable(kernel_offset); |
4474 } | 4615 } |
4475 | 4616 |
4476 LocalVariable* StreamingFlowGraphBuilder::MakeTemporary() { | 4617 LocalVariable* StreamingFlowGraphBuilder::MakeTemporary() { |
4477 return flow_graph_builder_->MakeTemporary(); | 4618 return flow_graph_builder_->MakeTemporary(); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4582 Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind, | 4723 Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind, |
4583 bool number_check) { | 4724 bool number_check) { |
4584 return flow_graph_builder_->StrictCompare(kind, number_check); | 4725 return flow_graph_builder_->StrictCompare(kind, number_check); |
4585 } | 4726 } |
4586 | 4727 |
4587 Fragment StreamingFlowGraphBuilder::AllocateObject(const dart::Class& klass, | 4728 Fragment StreamingFlowGraphBuilder::AllocateObject(const dart::Class& klass, |
4588 intptr_t argument_count) { | 4729 intptr_t argument_count) { |
4589 return flow_graph_builder_->AllocateObject(klass, argument_count); | 4730 return flow_graph_builder_->AllocateObject(klass, argument_count); |
4590 } | 4731 } |
4591 | 4732 |
| 4733 Fragment StreamingFlowGraphBuilder::AllocateObject( |
| 4734 const dart::Class& klass, |
| 4735 const Function& closure_function) { |
| 4736 return flow_graph_builder_->AllocateObject(klass, closure_function); |
| 4737 } |
| 4738 |
| 4739 Fragment StreamingFlowGraphBuilder::AllocateContext(int size) { |
| 4740 return flow_graph_builder_->AllocateContext(size); |
| 4741 } |
| 4742 |
| 4743 Fragment StreamingFlowGraphBuilder::LoadField(intptr_t offset) { |
| 4744 return flow_graph_builder_->LoadField(offset); |
| 4745 } |
| 4746 |
4592 Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, | 4747 Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, |
4593 const dart::String& name, | 4748 const dart::String& name, |
4594 Token::Kind kind, | 4749 Token::Kind kind, |
4595 intptr_t argument_count, | 4750 intptr_t argument_count, |
4596 const Array& argument_names, | 4751 const Array& argument_names, |
4597 intptr_t num_args_checked) { | 4752 intptr_t num_args_checked) { |
4598 return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, | 4753 return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, |
4599 argument_names, num_args_checked); | 4754 argument_names, num_args_checked); |
4600 } | 4755 } |
4601 | 4756 |
4602 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, | 4757 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, |
4603 LocalVariable* variable) { | 4758 LocalVariable* variable) { |
4604 return flow_graph_builder_->StoreLocal(position, variable); | 4759 return flow_graph_builder_->StoreLocal(position, variable); |
4605 } | 4760 } |
4606 | 4761 |
4607 Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position, | 4762 Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position, |
4608 const dart::Field& field) { | 4763 const dart::Field& field) { |
4609 return flow_graph_builder_->StoreStaticField(position, field); | 4764 return flow_graph_builder_->StoreStaticField(position, field); |
4610 } | 4765 } |
4611 | 4766 |
| 4767 Fragment StreamingFlowGraphBuilder::StoreInstanceField(TokenPosition position, |
| 4768 intptr_t offset) { |
| 4769 return flow_graph_builder_->StoreInstanceField(position, offset); |
| 4770 } |
| 4771 |
4612 Fragment StreamingFlowGraphBuilder::StringInterpolate(TokenPosition position) { | 4772 Fragment StreamingFlowGraphBuilder::StringInterpolate(TokenPosition position) { |
4613 return flow_graph_builder_->StringInterpolate(position); | 4773 return flow_graph_builder_->StringInterpolate(position); |
4614 } | 4774 } |
4615 | 4775 |
4616 Fragment StreamingFlowGraphBuilder::StringInterpolateSingle( | 4776 Fragment StreamingFlowGraphBuilder::StringInterpolateSingle( |
4617 TokenPosition position) { | 4777 TokenPosition position) { |
4618 return flow_graph_builder_->StringInterpolateSingle(position); | 4778 return flow_graph_builder_->StringInterpolateSingle(position); |
4619 } | 4779 } |
4620 | 4780 |
4621 Fragment StreamingFlowGraphBuilder::ThrowTypeError() { | 4781 Fragment StreamingFlowGraphBuilder::ThrowTypeError() { |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5512 | 5672 |
5513 // Let condition be always true. | 5673 // Let condition be always true. |
5514 instructions += Constant(Bool::True()); | 5674 instructions += Constant(Bool::True()); |
5515 } else { | 5675 } else { |
5516 instructions += PushArgument(); | 5676 instructions += PushArgument(); |
5517 | 5677 |
5518 // See if simple instanceOf is applicable. | 5678 // See if simple instanceOf is applicable. |
5519 if (dart::FlowGraphBuilder::SimpleInstanceOfType(type)) { | 5679 if (dart::FlowGraphBuilder::SimpleInstanceOfType(type)) { |
5520 instructions += Constant(type); | 5680 instructions += Constant(type); |
5521 instructions += PushArgument(); // Type. | 5681 instructions += PushArgument(); // Type. |
5522 instructions += InstanceCall(position, dart::Library::PrivateCoreLibName( | 5682 instructions += InstanceCall( |
5523 Symbols::_simpleInstanceOf()), | 5683 position, |
5524 Token::kIS, 2, 2); // 2 checked arguments. | 5684 dart::Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()), |
| 5685 Token::kIS, 2, 2); // 2 checked arguments. |
5525 return instructions; | 5686 return instructions; |
5526 } | 5687 } |
5527 | 5688 |
5528 if (!type.IsInstantiated(kCurrentClass)) { | 5689 if (!type.IsInstantiated(kCurrentClass)) { |
5529 instructions += LoadInstantiatorTypeArguments(); | 5690 instructions += LoadInstantiatorTypeArguments(); |
5530 } else { | 5691 } else { |
5531 instructions += NullConstant(); | 5692 instructions += NullConstant(); |
5532 } | 5693 } |
5533 instructions += PushArgument(); // Instantiator type arguments. | 5694 instructions += PushArgument(); // Instantiator type arguments. |
5534 | 5695 |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5782 } | 5943 } |
5783 | 5944 |
5784 Fragment StreamingFlowGraphBuilder::BuildFunctionExpression() { | 5945 Fragment StreamingFlowGraphBuilder::BuildFunctionExpression() { |
5785 intptr_t offset = ReaderOffset() - 1; // -1 to include tag byte. | 5946 intptr_t offset = ReaderOffset() - 1; // -1 to include tag byte. |
5786 return BuildFunctionNode(offset, TokenPosition::kNoSource, false, -1); | 5947 return BuildFunctionNode(offset, TokenPosition::kNoSource, false, -1); |
5787 } | 5948 } |
5788 | 5949 |
5789 Fragment StreamingFlowGraphBuilder::BuildLet(TokenPosition* position) { | 5950 Fragment StreamingFlowGraphBuilder::BuildLet(TokenPosition* position) { |
5790 if (position != NULL) *position = TokenPosition::kNoSource; | 5951 if (position != NULL) *position = TokenPosition::kNoSource; |
5791 | 5952 |
5792 Fragment instructions = BuildVariableDeclaration(); // read variable. | 5953 Fragment instructions = BuildVariableDeclaration(); // read variable. |
5793 instructions += BuildExpression(); // read body. | 5954 instructions += BuildExpression(); // read body. |
5794 return instructions; | 5955 return instructions; |
5795 } | 5956 } |
5796 | 5957 |
5797 | 5958 |
5798 Fragment StreamingFlowGraphBuilder::BuildBigIntLiteral( | 5959 Fragment StreamingFlowGraphBuilder::BuildBigIntLiteral( |
5799 TokenPosition* position) { | 5960 TokenPosition* position) { |
5800 if (position != NULL) *position = TokenPosition::kNoSource; | 5961 if (position != NULL) *position = TokenPosition::kNoSource; |
5801 | 5962 |
5802 const dart::String& value = | 5963 const dart::String& value = |
5803 H.DartString(ReadStringReference()); // read index into string table. | 5964 H.DartString(ReadStringReference()); // read index into string table. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5844 | 6005 |
5845 return Constant(Bool::Get(value)); | 6006 return Constant(Bool::Get(value)); |
5846 } | 6007 } |
5847 | 6008 |
5848 Fragment StreamingFlowGraphBuilder::BuildNullLiteral(TokenPosition* position) { | 6009 Fragment StreamingFlowGraphBuilder::BuildNullLiteral(TokenPosition* position) { |
5849 if (position != NULL) *position = TokenPosition::kNoSource; | 6010 if (position != NULL) *position = TokenPosition::kNoSource; |
5850 | 6011 |
5851 return Constant(Instance::ZoneHandle(Z, Instance::null())); | 6012 return Constant(Instance::ZoneHandle(Z, Instance::null())); |
5852 } | 6013 } |
5853 | 6014 |
| 6015 Fragment StreamingFlowGraphBuilder::BuildVectorCreation( |
| 6016 TokenPosition* position) { |
| 6017 if (position != NULL) *position = TokenPosition::kNoSource; |
| 6018 |
| 6019 intptr_t size = ReadUInt(); // read size. |
| 6020 return AllocateContext(size); |
| 6021 } |
| 6022 |
| 6023 Fragment StreamingFlowGraphBuilder::BuildVectorGet(TokenPosition* position) { |
| 6024 if (position != NULL) *position = TokenPosition::kNoSource; |
| 6025 |
| 6026 Fragment instructions = BuildExpression(); // read expression. |
| 6027 intptr_t index = ReadUInt(); // read index. |
| 6028 instructions += LoadField(Context::variable_offset(index)); |
| 6029 return instructions; |
| 6030 } |
| 6031 |
| 6032 Fragment StreamingFlowGraphBuilder::BuildVectorSet(TokenPosition* position) { |
| 6033 if (position != NULL) *position = TokenPosition::kNoSource; |
| 6034 |
| 6035 Fragment instructions = BuildExpression(); // read vector expression. |
| 6036 intptr_t index = ReadUInt(); // read index. |
| 6037 instructions += BuildExpression(); // read value expression. |
| 6038 |
| 6039 // The assigned value is the result of the expression. |
| 6040 LocalVariable* result = MakeTemporary(); |
| 6041 |
| 6042 Value* value = Pop(); |
| 6043 StoreInstanceFieldInstr* store = new (Z) |
| 6044 StoreInstanceFieldInstr(Context::variable_offset(index), Pop(), value, |
| 6045 kNoStoreBarrier, TokenPosition::kNoSource); |
| 6046 instructions <<= store; |
| 6047 |
| 6048 // Load the result that is stored in the temporary variable. |
| 6049 instructions += LoadLocal(result); |
| 6050 |
| 6051 return instructions; |
| 6052 } |
| 6053 |
| 6054 Fragment StreamingFlowGraphBuilder::BuildVectorCopy(TokenPosition* position) { |
| 6055 if (position != NULL) *position = TokenPosition::kNoSource; |
| 6056 |
| 6057 Fragment instructions = BuildExpression(); // read vector expression. |
| 6058 CloneContextInstr* clone_instruction = new (Z) CloneContextInstr( |
| 6059 TokenPosition::kNoSource, Pop(), Thread::Current()->GetNextDeoptId()); |
| 6060 instructions <<= clone_instruction; |
| 6061 Push(clone_instruction); |
| 6062 |
| 6063 return instructions; |
| 6064 } |
| 6065 |
| 6066 Fragment StreamingFlowGraphBuilder::BuildClosureCreation( |
| 6067 TokenPosition* position) { |
| 6068 if (position != NULL) *position = TokenPosition::kNoSource; |
| 6069 |
| 6070 NameIndex function_reference = |
| 6071 ReadCanonicalNameReference(); // read function reference. |
| 6072 Function& function = Function::ZoneHandle( |
| 6073 Z, H.LookupStaticMethodByKernelProcedure(function_reference)); |
| 6074 function = function.ConvertedClosureFunction(); |
| 6075 ASSERT(!function.IsNull()); |
| 6076 |
| 6077 const dart::Class& closure_class = |
| 6078 dart::Class::ZoneHandle(Z, I->object_store()->closure_class()); |
| 6079 Fragment instructions = AllocateObject(closure_class, function); |
| 6080 LocalVariable* closure = MakeTemporary(); |
| 6081 |
| 6082 instructions += BuildExpression(); // read context vector. |
| 6083 LocalVariable* context = MakeTemporary(); |
| 6084 |
| 6085 instructions += LoadLocal(closure); |
| 6086 instructions += Constant(function); |
| 6087 instructions += |
| 6088 StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset()); |
| 6089 |
| 6090 instructions += LoadLocal(closure); |
| 6091 instructions += LoadLocal(context); |
| 6092 instructions += |
| 6093 StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset()); |
| 6094 |
| 6095 instructions += Drop(); |
| 6096 |
| 6097 SkipDartType(); // skip function type of the closure. |
| 6098 |
| 6099 return instructions; |
| 6100 } |
| 6101 |
5854 Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() { | 6102 Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() { |
5855 H.ReportError("Invalid statements not implemented yet!"); | 6103 H.ReportError("Invalid statements not implemented yet!"); |
5856 return Fragment(); | 6104 return Fragment(); |
5857 } | 6105 } |
5858 | 6106 |
5859 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() { | 6107 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() { |
5860 Fragment instructions = BuildExpression(); // read expression. | 6108 Fragment instructions = BuildExpression(); // read expression. |
5861 instructions += Drop(); | 6109 instructions += Drop(); |
5862 return instructions; | 6110 return instructions; |
5863 } | 6111 } |
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7136 metadata_values.SetAt(i, value); | 7384 metadata_values.SetAt(i, value); |
7137 } | 7385 } |
7138 | 7386 |
7139 return metadata_values.raw(); | 7387 return metadata_values.raw(); |
7140 } | 7388 } |
7141 | 7389 |
7142 } // namespace kernel | 7390 } // namespace kernel |
7143 } // namespace dart | 7391 } // namespace dart |
7144 | 7392 |
7145 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 7393 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |