OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/flow_graph_compiler.h" | 8 #include "vm/flow_graph_compiler.h" |
9 | 9 |
10 #include "lib/error.h" | 10 #include "lib/error.h" |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 if (StackSize() != 0) { | 808 if (StackSize() != 0) { |
809 // We need to unwind the space we reserved for locals and copied parameters. | 809 // We need to unwind the space we reserved for locals and copied parameters. |
810 // The NoSuchMethodFunction stub does not expect to see that area on the | 810 // The NoSuchMethodFunction stub does not expect to see that area on the |
811 // stack. | 811 // stack. |
812 __ addq(RSP, Immediate(StackSize() * kWordSize)); | 812 __ addq(RSP, Immediate(StackSize() * kWordSize)); |
813 } | 813 } |
814 // The calls immediately below have empty stackmaps because we have just | 814 // The calls immediately below have empty stackmaps because we have just |
815 // dropped the spill slots. | 815 // dropped the spill slots. |
816 BitmapBuilder* empty_stack_bitmap = new BitmapBuilder(); | 816 BitmapBuilder* empty_stack_bitmap = new BitmapBuilder(); |
817 if (function.IsClosureFunction()) { | 817 if (function.IsClosureFunction()) { |
| 818 // TODO(regis): Call NoSuchMethod with "call" as name of original function. |
818 // We do not use GenerateCallRuntime because of the non-standard (empty) | 819 // We do not use GenerateCallRuntime because of the non-standard (empty) |
819 // stackmap used here. | 820 // stackmap used here. |
820 __ CallRuntime(kClosureArgumentMismatchRuntimeEntry); | 821 __ CallRuntime(kClosureArgumentMismatchRuntimeEntry); |
821 AddCurrentDescriptor(PcDescriptors::kOther, | 822 AddCurrentDescriptor(PcDescriptors::kOther, |
822 Isolate::kNoDeoptId, | 823 Isolate::kNoDeoptId, |
823 0); // No token position. | 824 0); // No token position. |
824 } else { | 825 } else { |
825 // Invoke noSuchMethod function. | 826 // Invoke noSuchMethod function. |
826 const int kNumArgsChecked = 1; | 827 const int kNumArgsChecked = 1; |
827 ICData& ic_data = ICData::ZoneHandle(); | 828 ICData& ic_data = ICData::ZoneHandle(); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 #endif | 957 #endif |
957 if (check_arguments) { | 958 if (check_arguments) { |
958 __ Comment("Check argument count"); | 959 __ Comment("Check argument count"); |
959 // Check that num_fixed <= argc <= num_params. | 960 // Check that num_fixed <= argc <= num_params. |
960 Label argc_in_range; | 961 Label argc_in_range; |
961 // Total number of args is the first Smi in args descriptor array (R10). | 962 // Total number of args is the first Smi in args descriptor array (R10). |
962 __ movq(RAX, FieldAddress(R10, Array::data_offset())); | 963 __ movq(RAX, FieldAddress(R10, Array::data_offset())); |
963 __ cmpq(RAX, Immediate(Smi::RawValue(num_fixed_params))); | 964 __ cmpq(RAX, Immediate(Smi::RawValue(num_fixed_params))); |
964 __ j(EQUAL, &argc_in_range, Assembler::kNearJump); | 965 __ j(EQUAL, &argc_in_range, Assembler::kNearJump); |
965 if (function.IsClosureFunction()) { | 966 if (function.IsClosureFunction()) { |
| 967 // TODO(regis): Call NoSuchMethod with "call" as name of original |
| 968 // function. |
966 GenerateCallRuntime(function.token_pos(), | 969 GenerateCallRuntime(function.token_pos(), |
967 kClosureArgumentMismatchRuntimeEntry, | 970 kClosureArgumentMismatchRuntimeEntry, |
968 prologue_locs); | 971 prologue_locs); |
969 } else { | 972 } else { |
970 __ Stop("Wrong number of arguments"); | 973 __ Stop("Wrong number of arguments"); |
971 } | 974 } |
972 __ Bind(&argc_in_range); | 975 __ Bind(&argc_in_range); |
973 } | 976 } |
974 // The arguments descriptor is never saved in the absence of optional | 977 // The arguments descriptor is never saved in the absence of optional |
975 // parameters, since any argument definition test would always yield true. | 978 // parameters, since any argument definition test would always yield true. |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1363 void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) { | 1366 void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) { |
1364 __ Exchange(mem1, mem2); | 1367 __ Exchange(mem1, mem2); |
1365 } | 1368 } |
1366 | 1369 |
1367 | 1370 |
1368 #undef __ | 1371 #undef __ |
1369 | 1372 |
1370 } // namespace dart | 1373 } // namespace dart |
1371 | 1374 |
1372 #endif // defined TARGET_ARCH_X64 | 1375 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |