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 #include "vm/compiler.h" | 6 #include "vm/compiler.h" |
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 6389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6400 instructions += LoadLocal(closure); | 6400 instructions += LoadLocal(closure); |
6401 instructions += Constant(function); | 6401 instructions += Constant(function); |
6402 instructions += | 6402 instructions += |
6403 StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset()); | 6403 StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset()); |
6404 | 6404 |
6405 instructions += LoadLocal(closure); | 6405 instructions += LoadLocal(closure); |
6406 instructions += LoadLocal(context); | 6406 instructions += LoadLocal(context); |
6407 instructions += | 6407 instructions += |
6408 StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset()); | 6408 StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset()); |
6409 | 6409 |
6410 instructions += Drop(); | |
6411 | |
6412 SkipDartType(); // skip function type of the closure. | 6410 SkipDartType(); // skip function type of the closure. |
6413 | 6411 |
6414 // TODO(30455): Kernel generic methods undone. When generic methods are | 6412 // TODO(30455): Kernel generic methods undone. When generic methods are |
6415 // fully supported in kernel, we'll need to store a NULL in the type arguments | 6413 // fully supported in kernel, we'll need to store a NULL in the type arguments |
6416 // slot when type arguments are absent, so the wrapper for the target function | 6414 // slot when type arguments are absent, so the wrapper for the target function |
6417 // can tell how many type args are captured vs. provided by the caller of the | 6415 // can tell how many type args are captured vs. provided by the caller of the |
6418 // closure. | 6416 // closure. |
6419 | 6417 |
6420 intptr_t types_count = ReadListLength(); // read type count. | 6418 intptr_t types_count = ReadListLength(); // read type count. |
6421 if (types_count > 0) { | 6419 if (types_count > 0) { |
6422 instructions += LoadLocal(context); | |
6423 | |
6424 const TypeArguments& type_args = | 6420 const TypeArguments& type_args = |
6425 T.BuildTypeArguments(types_count); // read list of type arguments. | 6421 T.BuildTypeArguments(types_count); // read list of type arguments. |
6426 instructions += TranslateInstantiatedTypeArguments(type_args); | 6422 instructions += TranslateInstantiatedTypeArguments(type_args); |
| 6423 LocalVariable* type_args_slot = MakeTemporary(); |
6427 | 6424 |
| 6425 instructions += LoadLocal(context); |
| 6426 instructions += LoadLocal(type_args_slot); |
6428 instructions += StoreInstanceField(TokenPosition::kNoSource, | 6427 instructions += StoreInstanceField(TokenPosition::kNoSource, |
6429 Context::variable_offset(0)); | 6428 Context::variable_offset(0)); |
| 6429 |
| 6430 instructions += LoadLocal(closure); |
| 6431 instructions += LoadLocal(type_args_slot); |
| 6432 instructions += StoreInstanceField( |
| 6433 TokenPosition::kNoSource, Closure::function_type_arguments_offset()); |
| 6434 |
| 6435 instructions += Drop(); // type args |
6430 } | 6436 } |
6431 | 6437 |
| 6438 instructions += Drop(); // context |
6432 return instructions; | 6439 return instructions; |
6433 } | 6440 } |
6434 | 6441 |
6435 Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() { | 6442 Fragment StreamingFlowGraphBuilder::BuildInvalidStatement() { |
6436 H.ReportError("Invalid statements not implemented yet!"); | 6443 H.ReportError("Invalid statements not implemented yet!"); |
6437 return Fragment(); | 6444 return Fragment(); |
6438 } | 6445 } |
6439 | 6446 |
6440 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() { | 6447 Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() { |
6441 Fragment instructions = BuildExpression(); // read expression. | 6448 Fragment instructions = BuildExpression(); // read expression. |
(...skipping 1373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7815 } | 7822 } |
7816 } | 7823 } |
7817 | 7824 |
7818 return Array::Handle(Array::null()); | 7825 return Array::Handle(Array::null()); |
7819 } | 7826 } |
7820 | 7827 |
7821 } // namespace kernel | 7828 } // namespace kernel |
7822 } // namespace dart | 7829 } // namespace dart |
7823 | 7830 |
7824 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 7831 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |