Chromium Code Reviews| 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/longjump.h" | 7 #include "vm/longjump.h" |
| 8 #include "vm/object_store.h" | 8 #include "vm/object_store.h" |
| 9 | 9 |
| 10 #if !defined(DART_PRECOMPILED_RUNTIME) | 10 #if !defined(DART_PRECOMPILED_RUNTIME) |
| (...skipping 1209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1220 case kPositiveIntLiteral: | 1220 case kPositiveIntLiteral: |
| 1221 return BuildIntLiteral(false, position); | 1221 return BuildIntLiteral(false, position); |
| 1222 case kDoubleLiteral: | 1222 case kDoubleLiteral: |
| 1223 return BuildDoubleLiteral(position); | 1223 return BuildDoubleLiteral(position); |
| 1224 case kTrueLiteral: | 1224 case kTrueLiteral: |
| 1225 return BuildBoolLiteral(true, position); | 1225 return BuildBoolLiteral(true, position); |
| 1226 case kFalseLiteral: | 1226 case kFalseLiteral: |
| 1227 return BuildBoolLiteral(false, position); | 1227 return BuildBoolLiteral(false, position); |
| 1228 case kNullLiteral: | 1228 case kNullLiteral: |
| 1229 return BuildNullLiteral(position); | 1229 return BuildNullLiteral(position); |
| 1230 case kVectorCreation: | |
| 1231 return BuildVectorCreation(position); | |
| 1232 case kVectorGet: | |
| 1233 return BuildVectorGet(position); | |
| 1234 case kVectorSet: | |
| 1235 return BuildVectorSet(position); | |
| 1236 case kVectorCopy: | |
| 1237 return BuildVectorCopy(position); | |
| 1238 case kClosureCreation: | |
| 1239 return BuildClosureCreation(position); | |
| 1230 default: | 1240 default: |
| 1231 UNREACHABLE(); | 1241 UNREACHABLE(); |
| 1232 } | 1242 } |
| 1233 | 1243 |
| 1234 return Fragment(); | 1244 return Fragment(); |
| 1235 } | 1245 } |
| 1236 | 1246 |
| 1237 Fragment StreamingFlowGraphBuilder::BuildStatement() { | 1247 Fragment StreamingFlowGraphBuilder::BuildStatement() { |
| 1238 Tag tag = ReadTag(); // read tag. | 1248 Tag tag = ReadTag(); // read tag. |
| 1239 switch (tag) { | 1249 switch (tag) { |
| (...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1925 | 1935 |
| 1926 GrowableArray<YieldContinuation>& | 1936 GrowableArray<YieldContinuation>& |
| 1927 StreamingFlowGraphBuilder::yield_continuations() { | 1937 StreamingFlowGraphBuilder::yield_continuations() { |
| 1928 return flow_graph_builder_->yield_continuations_; | 1938 return flow_graph_builder_->yield_continuations_; |
| 1929 } | 1939 } |
| 1930 | 1940 |
| 1931 Value* StreamingFlowGraphBuilder::stack() { | 1941 Value* StreamingFlowGraphBuilder::stack() { |
| 1932 return flow_graph_builder_->stack_; | 1942 return flow_graph_builder_->stack_; |
| 1933 } | 1943 } |
| 1934 | 1944 |
| 1945 void StreamingFlowGraphBuilder::Push(Definition* definition) { | |
| 1946 flow_graph_builder_->Push(definition); | |
| 1947 } | |
| 1948 | |
| 1935 Value* StreamingFlowGraphBuilder::Pop() { | 1949 Value* StreamingFlowGraphBuilder::Pop() { |
| 1936 return flow_graph_builder_->Pop(); | 1950 return flow_graph_builder_->Pop(); |
| 1937 } | 1951 } |
| 1938 | 1952 |
| 1939 Tag StreamingFlowGraphBuilder::PeekArgumentsFirstPositionalTag() { | 1953 Tag StreamingFlowGraphBuilder::PeekArgumentsFirstPositionalTag() { |
| 1940 // read parts of arguments, then go back to before doing so. | 1954 // read parts of arguments, then go back to before doing so. |
| 1941 intptr_t offset = ReaderOffset(); | 1955 intptr_t offset = ReaderOffset(); |
| 1942 ReadUInt(); // read number of arguments. | 1956 ReadUInt(); // read number of arguments. |
| 1943 | 1957 |
| 1944 // List of types. | 1958 // List of types. |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2105 Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind, | 2119 Fragment StreamingFlowGraphBuilder::StrictCompare(Token::Kind kind, |
| 2106 bool number_check) { | 2120 bool number_check) { |
| 2107 return flow_graph_builder_->StrictCompare(kind, number_check); | 2121 return flow_graph_builder_->StrictCompare(kind, number_check); |
| 2108 } | 2122 } |
| 2109 | 2123 |
| 2110 Fragment StreamingFlowGraphBuilder::AllocateObject(const dart::Class& klass, | 2124 Fragment StreamingFlowGraphBuilder::AllocateObject(const dart::Class& klass, |
| 2111 intptr_t argument_count) { | 2125 intptr_t argument_count) { |
| 2112 return flow_graph_builder_->AllocateObject(klass, argument_count); | 2126 return flow_graph_builder_->AllocateObject(klass, argument_count); |
| 2113 } | 2127 } |
| 2114 | 2128 |
| 2129 Fragment StreamingFlowGraphBuilder::AllocateObject( | |
| 2130 const dart::Class& klass, | |
| 2131 const Function& closure_function) { | |
| 2132 return flow_graph_builder_->AllocateObject(klass, closure_function); | |
| 2133 } | |
| 2134 | |
| 2135 Fragment StreamingFlowGraphBuilder::AllocateContext(int size) { | |
| 2136 return flow_graph_builder_->AllocateContext(size); | |
| 2137 } | |
| 2138 | |
| 2139 Fragment StreamingFlowGraphBuilder::LoadField(intptr_t offset) { | |
| 2140 return flow_graph_builder_->LoadField(offset); | |
| 2141 } | |
| 2142 | |
| 2115 Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, | 2143 Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, |
| 2116 const dart::String& name, | 2144 const dart::String& name, |
| 2117 Token::Kind kind, | 2145 Token::Kind kind, |
| 2118 intptr_t argument_count, | 2146 intptr_t argument_count, |
| 2119 const Array& argument_names, | 2147 const Array& argument_names, |
| 2120 intptr_t num_args_checked) { | 2148 intptr_t num_args_checked) { |
| 2121 return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, | 2149 return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, |
| 2122 argument_names, num_args_checked); | 2150 argument_names, num_args_checked); |
| 2123 } | 2151 } |
| 2124 | 2152 |
| 2125 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, | 2153 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, |
| 2126 LocalVariable* variable) { | 2154 LocalVariable* variable) { |
| 2127 return flow_graph_builder_->StoreLocal(position, variable); | 2155 return flow_graph_builder_->StoreLocal(position, variable); |
| 2128 } | 2156 } |
| 2129 | 2157 |
| 2130 Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position, | 2158 Fragment StreamingFlowGraphBuilder::StoreStaticField(TokenPosition position, |
| 2131 const dart::Field& field) { | 2159 const dart::Field& field) { |
| 2132 return flow_graph_builder_->StoreStaticField(position, field); | 2160 return flow_graph_builder_->StoreStaticField(position, field); |
| 2133 } | 2161 } |
| 2134 | 2162 |
| 2163 Fragment StreamingFlowGraphBuilder::StoreInstanceField(TokenPosition position, | |
| 2164 intptr_t offset) { | |
| 2165 return flow_graph_builder_->StoreInstanceField(position, offset); | |
| 2166 } | |
| 2167 | |
| 2135 Fragment StreamingFlowGraphBuilder::StringInterpolate(TokenPosition position) { | 2168 Fragment StreamingFlowGraphBuilder::StringInterpolate(TokenPosition position) { |
| 2136 return flow_graph_builder_->StringInterpolate(position); | 2169 return flow_graph_builder_->StringInterpolate(position); |
| 2137 } | 2170 } |
| 2138 | 2171 |
| 2139 Fragment StreamingFlowGraphBuilder::StringInterpolateSingle( | 2172 Fragment StreamingFlowGraphBuilder::StringInterpolateSingle( |
| 2140 TokenPosition position) { | 2173 TokenPosition position) { |
| 2141 return flow_graph_builder_->StringInterpolateSingle(position); | 2174 return flow_graph_builder_->StringInterpolateSingle(position); |
| 2142 } | 2175 } |
| 2143 | 2176 |
| 2144 Fragment StreamingFlowGraphBuilder::ThrowTypeError() { | 2177 Fragment StreamingFlowGraphBuilder::ThrowTypeError() { |
| (...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3038 | 3071 |
| 3039 // Let condition be always true. | 3072 // Let condition be always true. |
| 3040 instructions += Constant(Bool::True()); | 3073 instructions += Constant(Bool::True()); |
| 3041 } else { | 3074 } else { |
| 3042 instructions += PushArgument(); | 3075 instructions += PushArgument(); |
| 3043 | 3076 |
| 3044 // See if simple instanceOf is applicable. | 3077 // See if simple instanceOf is applicable. |
| 3045 if (dart::FlowGraphBuilder::SimpleInstanceOfType(type)) { | 3078 if (dart::FlowGraphBuilder::SimpleInstanceOfType(type)) { |
| 3046 instructions += Constant(type); | 3079 instructions += Constant(type); |
| 3047 instructions += PushArgument(); // Type. | 3080 instructions += PushArgument(); // Type. |
| 3048 instructions += InstanceCall(position, dart::Library::PrivateCoreLibName( | 3081 instructions += InstanceCall( |
| 3049 Symbols::_simpleInstanceOf()), | 3082 position, |
| 3050 Token::kIS, 2, 2); // 2 checked arguments. | 3083 dart::Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()), |
| 3084 Token::kIS, 2, 2); // 2 checked arguments. | |
| 3051 return instructions; | 3085 return instructions; |
| 3052 } | 3086 } |
| 3053 | 3087 |
| 3054 if (!type.IsInstantiated(kCurrentClass)) { | 3088 if (!type.IsInstantiated(kCurrentClass)) { |
| 3055 instructions += LoadInstantiatorTypeArguments(); | 3089 instructions += LoadInstantiatorTypeArguments(); |
| 3056 } else { | 3090 } else { |
| 3057 instructions += NullConstant(); | 3091 instructions += NullConstant(); |
| 3058 } | 3092 } |
| 3059 instructions += PushArgument(); // Instantiator type arguments. | 3093 instructions += PushArgument(); // Instantiator type arguments. |
| 3060 | 3094 |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3365 | 3399 |
| 3366 return Constant(Bool::Get(value)); | 3400 return Constant(Bool::Get(value)); |
| 3367 } | 3401 } |
| 3368 | 3402 |
| 3369 Fragment StreamingFlowGraphBuilder::BuildNullLiteral(TokenPosition* position) { | 3403 Fragment StreamingFlowGraphBuilder::BuildNullLiteral(TokenPosition* position) { |
| 3370 if (position != NULL) *position = TokenPosition::kNoSource; | 3404 if (position != NULL) *position = TokenPosition::kNoSource; |
| 3371 | 3405 |
| 3372 return Constant(Instance::ZoneHandle(Z, Instance::null())); | 3406 return Constant(Instance::ZoneHandle(Z, Instance::null())); |
| 3373 } | 3407 } |
| 3374 | 3408 |
| 3409 Fragment StreamingFlowGraphBuilder::BuildVectorCreation( | |
| 3410 TokenPosition* position) { | |
| 3411 if (position != NULL) *position = TokenPosition::kNoSource; | |
| 3412 | |
| 3413 intptr_t size = ReadUInt(); // read size. | |
| 3414 return AllocateContext(size); | |
| 3415 } | |
| 3416 | |
| 3417 Fragment StreamingFlowGraphBuilder::BuildVectorGet(TokenPosition* position) { | |
| 3418 if (position != NULL) *position = TokenPosition::kNoSource; | |
| 3419 | |
| 3420 Fragment instructions = BuildExpression(); // read expression. | |
| 3421 intptr_t index = ReadUInt(); // read index. | |
| 3422 instructions += LoadField(Context::variable_offset(index)); | |
| 3423 return instructions; | |
| 3424 } | |
| 3425 | |
| 3426 Fragment StreamingFlowGraphBuilder::BuildVectorSet(TokenPosition* position) { | |
| 3427 if (position != NULL) *position = TokenPosition::kNoSource; | |
| 3428 | |
| 3429 Fragment instructions = BuildExpression(); // read vector expression. | |
| 3430 intptr_t index = ReadUInt(); // read index. | |
| 3431 instructions += BuildExpressionStatement(); // read value expression. | |
|
jensj
2017/05/18 11:19:05
Shouldn't this just be BuildExpression();?
Dmitry Stefantsov
2017/05/18 12:18:53
Yes, of course. Thanks! Fixed.
| |
| 3432 | |
| 3433 // The assigned value is the result of the expression. | |
| 3434 LocalVariable* result = MakeTemporary(); | |
| 3435 | |
| 3436 Value* value = Pop(); | |
| 3437 StoreInstanceFieldInstr* store = new (Z) | |
| 3438 StoreInstanceFieldInstr(Context::variable_offset(index), Pop(), value, | |
| 3439 kNoStoreBarrier, TokenPosition::kNoSource); | |
| 3440 instructions <<= store; | |
| 3441 | |
| 3442 // Load the result that is stored in the temporary variable. | |
| 3443 instructions += LoadLocal(result); | |
| 3444 | |
| 3445 return instructions; | |
| 3446 } | |
| 3447 | |
| 3448 Fragment StreamingFlowGraphBuilder::BuildVectorCopy(TokenPosition* position) { | |
| 3449 if (position != NULL) *position = TokenPosition::kNoSource; | |
| 3450 | |
| 3451 Fragment instructions = BuildExpression(); // read vector expression. | |
| 3452 CloneContextInstr* clone_instruction = | |
| 3453 new (Z) CloneContextInstr(TokenPosition::kNoSource, Pop()); | |
| 3454 instructions <<= clone_instruction; | |
| 3455 Push(clone_instruction); | |
| 3456 | |
| 3457 return instructions; | |
| 3458 } | |
| 3459 | |
| 3460 Fragment StreamingFlowGraphBuilder::BuildClosureCreation( | |
| 3461 TokenPosition* position) { | |
| 3462 if (position != NULL) *position = TokenPosition::kNoSource; | |
| 3463 | |
| 3464 NameIndex function_reference = | |
| 3465 ReadCanonicalNameReference(); // read function reference. | |
| 3466 Function& function = Function::ZoneHandle( | |
| 3467 Z, H.LookupStaticMethodByKernelProcedure(function_reference)); | |
| 3468 function = function.ConvertedClosureFunction(); | |
| 3469 ASSERT(!function.IsNull()); | |
| 3470 | |
| 3471 const dart::Class& closure_class = | |
| 3472 dart::Class::ZoneHandle(Z, I->object_store()->closure_class()); | |
| 3473 Fragment instructions = AllocateObject(closure_class, function); | |
| 3474 LocalVariable* closure = MakeTemporary(); | |
| 3475 | |
| 3476 instructions += BuildExpression(); // read vector expression. | |
|
jensj
2017/05/18 11:19:06
from the kernel_binary.cc file I would guess the c
Dmitry Stefantsov
2017/05/18 12:18:52
Yep. Thanks!
| |
| 3477 LocalVariable* context = MakeTemporary(); | |
| 3478 | |
| 3479 instructions += LoadLocal(closure); | |
| 3480 instructions += Constant(function); | |
| 3481 instructions += | |
| 3482 StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset()); | |
| 3483 | |
| 3484 instructions += LoadLocal(closure); | |
| 3485 instructions += LoadLocal(context); | |
| 3486 instructions += | |
| 3487 StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset()); | |
| 3488 | |
| 3489 instructions += Drop(); | |
| 3490 | |
| 3491 return instructions; | |
|
jensj
2017/05/18 11:19:06
Isn't there a SkipDartType or something missing?
Dmitry Stefantsov
2017/05/18 12:18:52
Yes. I should have put an invocation of SkipDartTy
| |
| 3492 } | |
| 3493 | |
| 3375 Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() { | 3494 Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() { |
| 3376 H.ReportError("Invalid statements not implemented yet!"); | 3495 H.ReportError("Invalid statements not implemented yet!"); |
| 3377 return Fragment(); | 3496 return Fragment(); |
| 3378 } | 3497 } |
| 3379 | 3498 |
| 3380 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() { | 3499 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() { |
| 3381 Fragment instructions = BuildExpression(); // read expression. | 3500 Fragment instructions = BuildExpression(); // read expression. |
| 3382 instructions += Drop(); | 3501 instructions += Drop(); |
| 3383 return instructions; | 3502 return instructions; |
| 3384 } | 3503 } |
| (...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4311 } | 4430 } |
| 4312 instructions += StoreLocal(position, variable); | 4431 instructions += StoreLocal(position, variable); |
| 4313 instructions += Drop(); | 4432 instructions += Drop(); |
| 4314 return instructions; | 4433 return instructions; |
| 4315 } | 4434 } |
| 4316 | 4435 |
| 4317 } // namespace kernel | 4436 } // namespace kernel |
| 4318 } // namespace dart | 4437 } // namespace dart |
| 4319 | 4438 |
| 4320 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 4439 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |