OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/resolver.h" | 5 #include "vm/resolver.h" |
6 | 6 |
| 7 #include "vm/dart_entry.h" |
7 #include "vm/flags.h" | 8 #include "vm/flags.h" |
8 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
9 #include "vm/object.h" | 10 #include "vm/object.h" |
10 #include "vm/object_store.h" | 11 #include "vm/object_store.h" |
11 #include "vm/symbols.h" | 12 #include "vm/symbols.h" |
12 | 13 |
13 namespace dart { | 14 namespace dart { |
14 | 15 |
15 DEFINE_FLAG(bool, trace_resolving, false, "Trace resolving."); | 16 DEFINE_FLAG(bool, trace_resolving, false, "Trace resolving."); |
16 | 17 |
17 | 18 |
18 // The actual names of named arguments are not checked by the dynamic resolver, | 19 // The actual names of named arguments are not checked by the dynamic resolver, |
19 // but by the method entry code. It is important that the dynamic resolver | 20 // but by the method entry code. It is important that the dynamic resolver |
20 // checks that no named arguments are passed to a method that does not accept | 21 // checks that no named arguments are passed to a method that does not accept |
21 // them, since the entry code of such a method does not check for named | 22 // them, since the entry code of such a method does not check for named |
22 // arguments. The dynamic resolver actually checks that a valid number of named | 23 // arguments. The dynamic resolver actually checks that a valid number of named |
23 // arguments is passed in. | 24 // arguments is passed in. |
24 RawFunction* Resolver::ResolveDynamic(const Instance& receiver, | 25 RawFunction* Resolver::ResolveDynamic(const Instance& receiver, |
25 const String& function_name, | 26 const String& function_name, |
26 int num_arguments, | 27 const ArgumentsDescriptor& args_desc) { |
27 int num_named_arguments) { | |
28 // Figure out type of receiver first. | 28 // Figure out type of receiver first. |
29 Class& cls = Class::Handle(); | 29 Class& cls = Class::Handle(); |
30 cls = receiver.clazz(); | 30 cls = receiver.clazz(); |
31 // For lookups treat null as an instance of class Object. | 31 // For lookups treat null as an instance of class Object. |
32 if (cls.IsNullClass()) { | 32 if (cls.IsNullClass()) { |
33 cls = Isolate::Current()->object_store()->object_class(); | 33 cls = Isolate::Current()->object_store()->object_class(); |
34 } | 34 } |
35 ASSERT(!cls.IsNull()); | 35 ASSERT(!cls.IsNull()); |
36 | 36 |
37 return ResolveDynamicForReceiverClass( | 37 return ResolveDynamicForReceiverClass(cls, function_name, args_desc); |
38 cls, function_name, num_arguments, num_named_arguments); | |
39 } | 38 } |
40 | 39 |
41 | 40 |
42 RawFunction* Resolver::ResolveDynamicForReceiverClass( | 41 RawFunction* Resolver::ResolveDynamicForReceiverClass( |
43 const Class& receiver_class, | 42 const Class& receiver_class, |
44 const String& function_name, | 43 const String& function_name, |
45 int num_arguments, | 44 const ArgumentsDescriptor& args_desc) { |
46 int num_named_arguments) { | |
47 | 45 |
48 Function& function = | 46 Function& function = |
49 Function::Handle(ResolveDynamicAnyArgs(receiver_class, function_name)); | 47 Function::Handle(ResolveDynamicAnyArgs(receiver_class, function_name)); |
50 | 48 |
51 if (function.IsNull() || | 49 if (function.IsNull() || |
52 !function.AreValidArgumentCounts(num_arguments, | 50 !function.AreValidArguments(args_desc, NULL)) { |
53 num_named_arguments, | |
54 NULL)) { | |
55 // Return a null function to signal to the upper levels to dispatch to | 51 // Return a null function to signal to the upper levels to dispatch to |
56 // "noSuchMethod" function. | 52 // "noSuchMethod" function. |
57 if (FLAG_trace_resolving) { | 53 if (FLAG_trace_resolving) { |
58 String& error_message = String::Handle(String::New("function not found")); | 54 String& error_message = String::Handle(String::New("function not found")); |
59 if (!function.IsNull()) { | 55 if (!function.IsNull()) { |
60 // Obtain more detailed error message. | 56 // Obtain more detailed error message. |
61 function.AreValidArgumentCounts(num_arguments, | 57 function.AreValidArguments(args_desc, &error_message); |
62 num_named_arguments, | |
63 &error_message); | |
64 } | 58 } |
65 OS::Print("ResolveDynamic error '%s': %s.\n", | 59 OS::Print("ResolveDynamic error '%s': %s.\n", |
66 function_name.ToCString(), | 60 function_name.ToCString(), |
67 error_message.ToCString()); | 61 error_message.ToCString()); |
68 } | 62 } |
69 return Function::null(); | 63 return Function::null(); |
70 } | 64 } |
71 return function.raw(); | 65 return function.raw(); |
72 } | 66 } |
73 | 67 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 | 141 |
148 cls = cls.SuperClass(); | 142 cls = cls.SuperClass(); |
149 } | 143 } |
150 return function.raw(); | 144 return function.raw(); |
151 } | 145 } |
152 | 146 |
153 | 147 |
154 RawFunction* Resolver::ResolveStatic(const Library& library, | 148 RawFunction* Resolver::ResolveStatic(const Library& library, |
155 const String& class_name, | 149 const String& class_name, |
156 const String& function_name, | 150 const String& function_name, |
157 int num_arguments, | 151 intptr_t num_arguments, |
158 const Array& argument_names, | 152 const Array& argument_names, |
159 StaticResolveType resolve_type) { | 153 StaticResolveType resolve_type) { |
160 ASSERT(!library.IsNull()); | 154 ASSERT(!library.IsNull()); |
161 Function& function = Function::Handle(); | 155 Function& function = Function::Handle(); |
162 if (class_name.IsNull() || (class_name.Length() == 0)) { | 156 if (class_name.IsNull() || (class_name.Length() == 0)) { |
163 // Check if we are referring to a top level function. | 157 // Check if we are referring to a top level function. |
164 const Object& object = Object::Handle(library.LookupObject(function_name)); | 158 const Object& object = Object::Handle(library.LookupObject(function_name)); |
165 if (!object.IsNull() && object.IsFunction()) { | 159 if (!object.IsNull() && object.IsFunction()) { |
166 function ^= object.raw(); | 160 function ^= object.raw(); |
167 if (!function.AreValidArguments(num_arguments, argument_names, NULL)) { | 161 if (!function.AreValidArguments(num_arguments, argument_names, NULL)) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 if (super_class.IsNull()) break; | 217 if (super_class.IsNull()) break; |
224 } | 218 } |
225 } | 219 } |
226 return function.raw(); | 220 return function.raw(); |
227 } | 221 } |
228 | 222 |
229 | 223 |
230 | 224 |
231 RawFunction* Resolver::ResolveStatic(const Class& cls, | 225 RawFunction* Resolver::ResolveStatic(const Class& cls, |
232 const String& function_name, | 226 const String& function_name, |
233 int num_arguments, | 227 intptr_t num_arguments, |
234 const Array& argument_names, | 228 const Array& argument_names, |
235 StaticResolveType resolve_type) { | 229 StaticResolveType resolve_type) { |
236 const Function& function = Function::Handle( | 230 const Function& function = Function::Handle( |
237 ResolveStaticByName(cls, function_name, resolve_type)); | 231 ResolveStaticByName(cls, function_name, resolve_type)); |
238 if (function.IsNull() || | 232 if (function.IsNull() || |
239 !function.AreValidArguments(num_arguments, argument_names, NULL)) { | 233 !function.AreValidArguments(num_arguments, argument_names, NULL)) { |
240 // Return a null function to signal to the upper levels to throw a | 234 // Return a null function to signal to the upper levels to throw a |
241 // resolution error or maybe throw the error right here. | 235 // resolution error or maybe throw the error right here. |
242 if (FLAG_trace_resolving) { | 236 if (FLAG_trace_resolving) { |
243 String& error_message = String::Handle(String::New("function not found")); | 237 String& error_message = String::Handle(String::New("function not found")); |
244 if (!function.IsNull()) { | 238 if (!function.IsNull()) { |
245 // Obtain more detailed error message. | 239 // Obtain more detailed error message. |
246 function.AreValidArguments(num_arguments, | 240 function.AreValidArguments(num_arguments, |
247 argument_names, | 241 argument_names, |
248 &error_message); | 242 &error_message); |
249 } | 243 } |
250 OS::Print("ResolveStatic error '%s': %s.\n", | 244 OS::Print("ResolveStatic error '%s': %s.\n", |
251 function_name.ToCString(), | 245 function_name.ToCString(), |
252 error_message.ToCString()); | 246 error_message.ToCString()); |
253 } | 247 } |
254 return Function::null(); | 248 return Function::null(); |
255 } | 249 } |
256 return function.raw(); | 250 return function.raw(); |
257 } | 251 } |
258 | 252 |
259 } // namespace dart | 253 } // namespace dart |
OLD | NEW |