| 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 <set> | 5 #include <set> |
| 6 | 6 |
| 7 #include "vm/kernel_to_il.h" | 7 #include "vm/kernel_to_il.h" |
| 8 | 8 |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/intermediate_language.h" | 10 #include "vm/intermediate_language.h" |
| (...skipping 1779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1790 ArgumentArray arguments = GetArguments(argument_count); | 1790 ArgumentArray arguments = GetArguments(argument_count); |
| 1791 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported. | 1791 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported. |
| 1792 InstanceCallInstr* call = new (Z) InstanceCallInstr( | 1792 InstanceCallInstr* call = new (Z) InstanceCallInstr( |
| 1793 position, name, kind, arguments, kTypeArgsLen, argument_names, | 1793 position, name, kind, arguments, kTypeArgsLen, argument_names, |
| 1794 num_args_checked, ic_data_array_, GetNextDeoptId()); | 1794 num_args_checked, ic_data_array_, GetNextDeoptId()); |
| 1795 Push(call); | 1795 Push(call); |
| 1796 return Fragment(call); | 1796 return Fragment(call); |
| 1797 } | 1797 } |
| 1798 | 1798 |
| 1799 | 1799 |
| 1800 Fragment FlowGraphBuilder::ClosureCall(int argument_count, | 1800 Fragment FlowGraphBuilder::ClosureCall(intptr_t type_args_len, |
| 1801 intptr_t argument_count, |
| 1801 const Array& argument_names) { | 1802 const Array& argument_names) { |
| 1802 Value* function = Pop(); | 1803 Value* function = Pop(); |
| 1803 ArgumentArray arguments = GetArguments(argument_count); | 1804 const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0); |
| 1804 const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported. | 1805 ArgumentArray arguments = GetArguments(total_count); |
| 1805 ClosureCallInstr* call = new (Z) | 1806 ClosureCallInstr* call = new (Z) |
| 1806 ClosureCallInstr(function, arguments, kTypeArgsLen, argument_names, | 1807 ClosureCallInstr(function, arguments, type_args_len, argument_names, |
| 1807 TokenPosition::kNoSource, GetNextDeoptId()); | 1808 TokenPosition::kNoSource, GetNextDeoptId()); |
| 1808 Push(call); | 1809 Push(call); |
| 1809 return Fragment(call); | 1810 return Fragment(call); |
| 1810 } | 1811 } |
| 1811 | 1812 |
| 1812 | 1813 |
| 1813 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { | 1814 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { |
| 1814 Fragment instructions; | 1815 Fragment instructions; |
| 1815 instructions += Drop(); | 1816 instructions += Drop(); |
| 1816 instructions += | 1817 instructions += |
| (...skipping 1636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3453 | 3454 |
| 3454 TargetEntryInstr* normal_entry = BuildTargetEntry(); | 3455 TargetEntryInstr* normal_entry = BuildTargetEntry(); |
| 3455 graph_entry_ = new (Z) | 3456 graph_entry_ = new (Z) |
| 3456 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); | 3457 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); |
| 3457 | 3458 |
| 3458 Fragment body(normal_entry); | 3459 Fragment body(normal_entry); |
| 3459 body += CheckStackOverflowInPrologue(); | 3460 body += CheckStackOverflowInPrologue(); |
| 3460 | 3461 |
| 3461 LocalScope* scope = parsed_function_->node_sequence()->scope(); | 3462 LocalScope* scope = parsed_function_->node_sequence()->scope(); |
| 3462 | 3463 |
| 3464 if (descriptor.TypeArgsLen() > 0) { |
| 3465 LocalVariable* type_args = parsed_function_->function_type_arguments(); |
| 3466 ASSERT(type_args != NULL); |
| 3467 body += LoadLocal(type_args); |
| 3468 body += PushArgument(); |
| 3469 } |
| 3470 |
| 3463 LocalVariable* closure = NULL; | 3471 LocalVariable* closure = NULL; |
| 3464 if (is_closure_call) { | 3472 if (is_closure_call) { |
| 3465 closure = scope->VariableAt(0); | 3473 closure = scope->VariableAt(0); |
| 3466 | 3474 |
| 3467 // The closure itself is the first argument. | 3475 // The closure itself is the first argument. |
| 3468 body += LoadLocal(closure); | 3476 body += LoadLocal(closure); |
| 3469 } else { | 3477 } else { |
| 3470 // Invoke the getter to get the field value. | 3478 // Invoke the getter to get the field value. |
| 3471 body += LoadLocal(scope->VariableAt(0)); | 3479 body += LoadLocal(scope->VariableAt(0)); |
| 3472 body += PushArgument(); | 3480 body += PushArgument(); |
| 3473 body += | 3481 body += |
| 3474 InstanceCall(TokenPosition::kMinSource, getter_name, Token::kGET, 1); | 3482 InstanceCall(TokenPosition::kMinSource, getter_name, Token::kGET, 1); |
| 3475 } | 3483 } |
| 3476 | 3484 |
| 3477 body += PushArgument(); | 3485 body += PushArgument(); |
| 3478 | 3486 |
| 3479 // Push all arguments onto the stack. | 3487 // Push all arguments onto the stack. |
| 3480 intptr_t pos = 1; | 3488 intptr_t pos = 1; |
| 3481 for (; pos < descriptor.Count(); pos++) { | 3489 for (; pos < descriptor.Count(); pos++) { |
| 3482 body += LoadLocal(scope->VariableAt(pos)); | 3490 body += LoadLocal(scope->VariableAt(pos)); |
| 3483 body += PushArgument(); | 3491 body += PushArgument(); |
| 3484 } | 3492 } |
| 3485 | 3493 |
| 3486 if (is_closure_call) { | 3494 if (is_closure_call) { |
| 3487 // Lookup the function in the closure. | 3495 // Lookup the function in the closure. |
| 3488 body += LoadLocal(closure); | 3496 body += LoadLocal(closure); |
| 3489 body += LoadField(Closure::function_offset()); | 3497 body += LoadField(Closure::function_offset()); |
| 3490 | 3498 |
| 3491 body += ClosureCall(descriptor.Count(), argument_names); | 3499 body += ClosureCall(descriptor.TypeArgsLen(), descriptor.Count(), |
| 3500 argument_names); |
| 3492 } else { | 3501 } else { |
| 3502 if (descriptor.TypeArgsLen() > 0) { |
| 3503 UNIMPLEMENTED(); |
| 3504 } |
| 3493 body += InstanceCall(TokenPosition::kMinSource, Symbols::Call(), | 3505 body += InstanceCall(TokenPosition::kMinSource, Symbols::Call(), |
| 3494 Token::kILLEGAL, descriptor.Count(), argument_names); | 3506 Token::kILLEGAL, descriptor.Count(), argument_names); |
| 3495 } | 3507 } |
| 3496 | 3508 |
| 3497 body += Return(TokenPosition::kNoSource); | 3509 body += Return(TokenPosition::kNoSource); |
| 3498 | 3510 |
| 3499 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); | 3511 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); |
| 3500 } | 3512 } |
| 3501 | 3513 |
| 3502 | 3514 |
| (...skipping 2610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6113 thread->clear_sticky_error(); | 6125 thread->clear_sticky_error(); |
| 6114 return error.raw(); | 6126 return error.raw(); |
| 6115 } | 6127 } |
| 6116 } | 6128 } |
| 6117 | 6129 |
| 6118 | 6130 |
| 6119 } // namespace kernel | 6131 } // namespace kernel |
| 6120 } // namespace dart | 6132 } // namespace dart |
| 6121 | 6133 |
| 6122 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6134 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |