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 2008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2019 ZoneGrowableArray<const Instance*>* default_values = | 2019 ZoneGrowableArray<const Instance*>* default_values = |
2020 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount()); | 2020 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount()); |
2021 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { | 2021 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { |
2022 default_values->Add(&Object::null_instance()); | 2022 default_values->Add(&Object::null_instance()); |
2023 } | 2023 } |
2024 parsed_function_->set_default_parameter_values(default_values); | 2024 parsed_function_->set_default_parameter_values(default_values); |
2025 | 2025 |
2026 Fragment body(normal_entry); | 2026 Fragment body(normal_entry); |
2027 body += CheckStackOverflowInPrologue(); | 2027 body += CheckStackOverflowInPrologue(); |
2028 | 2028 |
2029 // TODO(regis): Check if a type argument vector is passed. | |
2030 | |
2031 // The receiver is the first argument to noSuchMethod, and it is the first | 2029 // The receiver is the first argument to noSuchMethod, and it is the first |
2032 // argument passed to the dispatcher function. | 2030 // argument passed to the dispatcher function. |
2033 LocalScope* scope = parsed_function_->node_sequence()->scope(); | 2031 LocalScope* scope = parsed_function_->node_sequence()->scope(); |
2034 body += LoadLocal(scope->VariableAt(0)); | 2032 body += LoadLocal(scope->VariableAt(0)); |
2035 body += PushArgument(); | 2033 body += PushArgument(); |
2036 | 2034 |
2037 // The second argument to noSuchMethod is an invocation mirror. Push the | 2035 // The second argument to noSuchMethod is an invocation mirror. Push the |
2038 // arguments for allocating the invocation mirror. First, the name. | 2036 // arguments for allocating the invocation mirror. First, the name. |
2039 body += Constant(String::ZoneHandle(Z, function.name())); | 2037 body += Constant(String::ZoneHandle(Z, function.name())); |
2040 body += PushArgument(); | 2038 body += PushArgument(); |
2041 | 2039 |
2042 // Second, the arguments descriptor. | 2040 // Second, the arguments descriptor. |
2043 body += Constant(descriptor_array); | 2041 body += Constant(descriptor_array); |
2044 body += PushArgument(); | 2042 body += PushArgument(); |
2045 | 2043 |
2046 // Third, an array containing the original arguments. Create it and fill | 2044 // Third, an array containing the original arguments. Create it and fill |
2047 // it in. | 2045 // it in. |
| 2046 const intptr_t receiver_index = descriptor.TypeArgsLen() > 0 ? 1 : 0; |
2048 body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null())); | 2047 body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null())); |
2049 body += IntConstant(descriptor.Count()); | 2048 body += IntConstant(receiver_index + descriptor.Count()); |
2050 body += CreateArray(); | 2049 body += CreateArray(); |
2051 LocalVariable* array = MakeTemporary(); | 2050 LocalVariable* array = MakeTemporary(); |
| 2051 if (receiver_index > 0) { |
| 2052 LocalVariable* type_args = parsed_function_->function_type_arguments(); |
| 2053 ASSERT(type_args != NULL); |
| 2054 body += LoadLocal(array); |
| 2055 body += IntConstant(0); |
| 2056 body += LoadLocal(type_args); |
| 2057 body += StoreIndexed(kArrayCid); |
| 2058 body += Drop(); |
| 2059 } |
2052 for (intptr_t i = 0; i < descriptor.PositionalCount(); ++i) { | 2060 for (intptr_t i = 0; i < descriptor.PositionalCount(); ++i) { |
2053 body += LoadLocal(array); | 2061 body += LoadLocal(array); |
2054 body += IntConstant(i); | 2062 body += IntConstant(receiver_index + i); |
2055 body += LoadLocal(scope->VariableAt(i)); | 2063 body += LoadLocal(scope->VariableAt(i)); |
2056 body += StoreIndexed(kArrayCid); | 2064 body += StoreIndexed(kArrayCid); |
2057 body += Drop(); | 2065 body += Drop(); |
2058 } | 2066 } |
2059 String& name = String::Handle(Z); | 2067 String& name = String::Handle(Z); |
2060 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { | 2068 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { |
2061 intptr_t parameter_index = descriptor.PositionalCount() + i; | 2069 intptr_t parameter_index = descriptor.PositionalCount() + i; |
2062 name = descriptor.NameAt(i); | 2070 name = descriptor.NameAt(i); |
2063 name = Symbols::New(H.thread(), name); | 2071 name = Symbols::New(H.thread(), name); |
2064 body += LoadLocal(array); | 2072 body += LoadLocal(array); |
2065 body += IntConstant(descriptor.PositionAt(i)); | 2073 body += IntConstant(receiver_index + descriptor.PositionAt(i)); |
2066 body += LoadLocal(scope->VariableAt(parameter_index)); | 2074 body += LoadLocal(scope->VariableAt(parameter_index)); |
2067 body += StoreIndexed(kArrayCid); | 2075 body += StoreIndexed(kArrayCid); |
2068 body += Drop(); | 2076 body += Drop(); |
2069 } | 2077 } |
2070 body += PushArgument(); | 2078 body += PushArgument(); |
2071 | 2079 |
2072 // Fourth, false indicating this is not a super NoSuchMethod. | 2080 // Fourth, false indicating this is not a super NoSuchMethod. |
2073 body += Constant(Bool::False()); | 2081 body += Constant(Bool::False()); |
2074 body += PushArgument(); | 2082 body += PushArgument(); |
2075 | 2083 |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2414 array_object = AsSortedDuplicateFreeArray(&token_positions); | 2422 array_object = AsSortedDuplicateFreeArray(&token_positions); |
2415 script.set_debug_positions(array_object); | 2423 script.set_debug_positions(array_object); |
2416 array_object = AsSortedDuplicateFreeArray(&yield_positions); | 2424 array_object = AsSortedDuplicateFreeArray(&yield_positions); |
2417 script.set_yield_positions(array_object); | 2425 script.set_yield_positions(array_object); |
2418 } | 2426 } |
2419 | 2427 |
2420 } // namespace kernel | 2428 } // namespace kernel |
2421 } // namespace dart | 2429 } // namespace dart |
2422 | 2430 |
2423 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 2431 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |