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/flags.h" | 7 #include "vm/flags.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/object.h" | 9 #include "vm/object.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // in the class. | 55 // in the class. |
56 Function& function = | 56 Function& function = |
57 Function::Handle(cls.LookupDynamicFunction(function_name)); | 57 Function::Handle(cls.LookupDynamicFunction(function_name)); |
58 while (function.IsNull()) { | 58 while (function.IsNull()) { |
59 cls = cls.SuperClass(); | 59 cls = cls.SuperClass(); |
60 if (cls.IsNull()) break; | 60 if (cls.IsNull()) break; |
61 function = cls.LookupDynamicFunction(function_name); | 61 function = cls.LookupDynamicFunction(function_name); |
62 } | 62 } |
63 if (function.IsNull() || | 63 if (function.IsNull() || |
64 !function.AreValidArgumentCounts(num_arguments, | 64 !function.AreValidArgumentCounts(num_arguments, |
65 num_named_arguments)) { | 65 num_named_arguments, |
| 66 NULL)) { |
66 // Return a null function to signal to the upper levels to dispatch to | 67 // Return a null function to signal to the upper levels to dispatch to |
67 // "noSuchMethod" function. | 68 // "noSuchMethod" function. |
68 if (FLAG_trace_resolving) { | 69 if (FLAG_trace_resolving) { |
| 70 String& error_message = String::Handle(String::New("function not found")); |
| 71 if (!function.IsNull()) { |
| 72 // Obtain more detailed error message. |
| 73 function.AreValidArgumentCounts(num_arguments, |
| 74 num_named_arguments, |
| 75 &error_message); |
| 76 } |
69 OS::Print("ResolveDynamic error '%s': %s.\n", | 77 OS::Print("ResolveDynamic error '%s': %s.\n", |
70 function_name.ToCString(), | 78 function_name.ToCString(), |
71 function.IsNull() ? | 79 error_message.ToCString()); |
72 "function not found" : "argument count mismatch"); | |
73 } | 80 } |
74 return Function::null(); | 81 return Function::null(); |
75 } | 82 } |
76 return function.raw(); | 83 return function.raw(); |
77 } | 84 } |
78 | 85 |
79 | 86 |
80 RawFunction* Resolver::ResolveStatic(const Library& library, | 87 RawFunction* Resolver::ResolveStatic(const Library& library, |
81 const String& class_name, | 88 const String& class_name, |
82 const String& function_name, | 89 const String& function_name, |
83 int num_arguments, | 90 int num_arguments, |
84 const Array& argument_names, | 91 const Array& argument_names, |
85 StaticResolveType resolve_type) { | 92 StaticResolveType resolve_type) { |
86 ASSERT(!library.IsNull()); | 93 ASSERT(!library.IsNull()); |
87 Function& function = Function::Handle(); | 94 Function& function = Function::Handle(); |
88 if (class_name.IsNull() || (class_name.Length() == 0)) { | 95 if (class_name.IsNull() || (class_name.Length() == 0)) { |
89 // Check if we are referring to a top level function. | 96 // Check if we are referring to a top level function. |
90 const Object& object = Object::Handle(library.LookupObject(function_name)); | 97 const Object& object = Object::Handle(library.LookupObject(function_name)); |
91 if (!object.IsNull() && object.IsFunction()) { | 98 if (!object.IsNull() && object.IsFunction()) { |
92 function ^= object.raw(); | 99 function ^= object.raw(); |
93 if (!function.AreValidArguments(num_arguments, argument_names)) { | 100 if (!function.AreValidArguments(num_arguments, argument_names, NULL)) { |
94 if (FLAG_trace_resolving) { | 101 if (FLAG_trace_resolving) { |
| 102 String& error_message = String::Handle(); |
| 103 // Obtain more detailed error message. |
| 104 function.AreValidArguments(num_arguments, |
| 105 argument_names, |
| 106 &error_message); |
95 OS::Print("ResolveStatic error '%s': %s.\n", | 107 OS::Print("ResolveStatic error '%s': %s.\n", |
96 function_name.ToCString(), "arguments mismatch"); | 108 function_name.ToCString(), |
| 109 error_message.ToCString()); |
97 } | 110 } |
98 function = Function::null(); | 111 function = Function::null(); |
99 } | 112 } |
100 } else { | 113 } else { |
101 if (FLAG_trace_resolving) { | 114 if (FLAG_trace_resolving) { |
102 OS::Print("ResolveStatic error '%s': %s.\n", | 115 OS::Print("ResolveStatic error '%s': %s.\n", |
103 function_name.ToCString(), "top level function not found"); | 116 function_name.ToCString(), "top level function not found"); |
104 } | 117 } |
105 } | 118 } |
106 } else { | 119 } else { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 | 162 |
150 | 163 |
151 RawFunction* Resolver::ResolveStatic(const Class& cls, | 164 RawFunction* Resolver::ResolveStatic(const Class& cls, |
152 const String& function_name, | 165 const String& function_name, |
153 int num_arguments, | 166 int num_arguments, |
154 const Array& argument_names, | 167 const Array& argument_names, |
155 StaticResolveType resolve_type) { | 168 StaticResolveType resolve_type) { |
156 const Function& function = Function::Handle( | 169 const Function& function = Function::Handle( |
157 ResolveStaticByName(cls, function_name, resolve_type)); | 170 ResolveStaticByName(cls, function_name, resolve_type)); |
158 if (function.IsNull() || | 171 if (function.IsNull() || |
159 !function.AreValidArguments(num_arguments, argument_names)) { | 172 !function.AreValidArguments(num_arguments, argument_names, NULL)) { |
160 // Return a null function to signal to the upper levels to throw a | 173 // Return a null function to signal to the upper levels to throw a |
161 // resolution error or maybe throw the error right here. | 174 // resolution error or maybe throw the error right here. |
162 if (FLAG_trace_resolving) { | 175 if (FLAG_trace_resolving) { |
| 176 String& error_message = String::Handle(String::New("function not found")); |
| 177 if (!function.IsNull()) { |
| 178 // Obtain more detailed error message. |
| 179 function.AreValidArguments(num_arguments, |
| 180 argument_names, |
| 181 &error_message); |
| 182 } |
163 OS::Print("ResolveStatic error '%s': %s.\n", | 183 OS::Print("ResolveStatic error '%s': %s.\n", |
164 function_name.ToCString(), | 184 function_name.ToCString(), |
165 function.IsNull() ? | 185 error_message.ToCString()); |
166 "function not found" : "arguments mismatch"); | |
167 } | 186 } |
168 return Function::null(); | 187 return Function::null(); |
169 } | 188 } |
170 return function.raw(); | 189 return function.raw(); |
171 } | 190 } |
172 | 191 |
173 } // namespace dart | 192 } // namespace dart |
OLD | NEW |