| 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/dart_entry.h" |
| 8 #include "vm/flags.h" | 8 #include "vm/flags.h" |
| 9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
| 10 #include "vm/object.h" | 10 #include "vm/object.h" |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 } | 143 } |
| 144 return function.raw(); | 144 return function.raw(); |
| 145 } | 145 } |
| 146 | 146 |
| 147 | 147 |
| 148 RawFunction* Resolver::ResolveStatic(const Library& library, | 148 RawFunction* Resolver::ResolveStatic(const Library& library, |
| 149 const String& class_name, | 149 const String& class_name, |
| 150 const String& function_name, | 150 const String& function_name, |
| 151 intptr_t num_arguments, | 151 intptr_t num_arguments, |
| 152 const Array& argument_names, | 152 const Array& argument_names, |
| 153 StaticResolveType resolve_type) { | 153 StaticResolveType resolve_type, |
| 154 String* ambiguity_error_msg) { |
| 154 ASSERT(!library.IsNull()); | 155 ASSERT(!library.IsNull()); |
| 155 Function& function = Function::Handle(); | 156 Function& function = Function::Handle(); |
| 156 if (class_name.IsNull() || (class_name.Length() == 0)) { | 157 if (class_name.IsNull() || (class_name.Length() == 0)) { |
| 157 // Check if we are referring to a top level function. | 158 // Check if we are referring to a top level function. |
| 158 const Object& object = Object::Handle(library.LookupObject(function_name)); | 159 const Object& object = Object::Handle( |
| 160 library.LookupObject(function_name, ambiguity_error_msg)); |
| 159 if (!object.IsNull() && object.IsFunction()) { | 161 if (!object.IsNull() && object.IsFunction()) { |
| 160 function ^= object.raw(); | 162 function ^= object.raw(); |
| 161 if (!function.AreValidArguments(num_arguments, argument_names, NULL)) { | 163 if (!function.AreValidArguments(num_arguments, argument_names, NULL)) { |
| 162 if (FLAG_trace_resolving) { | 164 if (FLAG_trace_resolving) { |
| 163 String& error_message = String::Handle(); | 165 String& error_message = String::Handle(); |
| 164 // Obtain more detailed error message. | 166 // Obtain more detailed error message. |
| 165 function.AreValidArguments(num_arguments, | 167 function.AreValidArguments(num_arguments, |
| 166 argument_names, | 168 argument_names, |
| 167 &error_message); | 169 &error_message); |
| 168 OS::Print("ResolveStatic error '%s': %s.\n", | 170 OS::Print("ResolveStatic error '%s': %s.\n", |
| 169 function_name.ToCString(), | 171 function_name.ToCString(), |
| 170 error_message.ToCString()); | 172 error_message.ToCString()); |
| 171 } | 173 } |
| 172 function = Function::null(); | 174 function = Function::null(); |
| 173 } | 175 } |
| 174 } else { | 176 } else { |
| 175 if (FLAG_trace_resolving) { | 177 if (FLAG_trace_resolving) { |
| 176 OS::Print("ResolveStatic error '%s': %s.\n", | 178 OS::Print("ResolveStatic error '%s': %s.\n", |
| 177 function_name.ToCString(), "top level function not found"); | 179 function_name.ToCString(), |
| 180 ambiguity_error_msg->IsNull() ? "top level function not found" |
| 181 : ambiguity_error_msg->ToCString()); |
| 178 } | 182 } |
| 179 } | 183 } |
| 180 } else { | 184 } else { |
| 181 // Lookup class_name in the library's class dictionary to get at | 185 // Lookup class_name in the library's class dictionary to get at |
| 182 // the dart class object. If class_name is not found in the dictionary | 186 // the dart class object. If class_name is not found in the dictionary |
| 183 // ResolveStatic will return a NULL function object. | 187 // ResolveStatic will return a NULL function object. |
| 184 const Class& cls = Class::Handle(library.LookupClass(class_name)); | 188 const Class& cls = Class::Handle( |
| 185 function = ResolveStatic(cls, | 189 library.LookupClass(class_name, ambiguity_error_msg)); |
| 186 function_name, | 190 if (!cls.IsNull()) { |
| 187 num_arguments, | 191 function = ResolveStatic(cls, |
| 188 argument_names, | 192 function_name, |
| 189 resolve_type); | 193 num_arguments, |
| 194 argument_names, |
| 195 resolve_type); |
| 196 } |
| 197 if (FLAG_trace_resolving && function.IsNull()) { |
| 198 OS::Print("ResolveStatic error '%s.%s': %s.\n", |
| 199 class_name.ToCString(), |
| 200 function_name.ToCString(), |
| 201 ambiguity_error_msg->IsNull() ? "static function not found" |
| 202 : ambiguity_error_msg->ToCString()); |
| 203 } |
| 190 } | 204 } |
| 191 return function.raw(); | 205 return function.raw(); |
| 192 } | 206 } |
| 193 | 207 |
| 194 | 208 |
| 195 RawFunction* Resolver::ResolveStaticByName(const Class& cls, | 209 RawFunction* Resolver::ResolveStaticByName(const Class& cls, |
| 196 const String& function_name, | 210 const String& function_name, |
| 197 StaticResolveType resolve_type) { | 211 StaticResolveType resolve_type) { |
| 198 if (cls.IsNull()) { | 212 ASSERT(!cls.IsNull()); |
| 199 // Can't resolve function if cls is null. | |
| 200 return Function::null(); | |
| 201 } | |
| 202 | 213 |
| 203 if (FLAG_trace_resolving) { | 214 if (FLAG_trace_resolving) { |
| 204 OS::Print("ResolveStatic '%s'\n", function_name.ToCString()); | 215 OS::Print("ResolveStatic '%s'\n", function_name.ToCString()); |
| 205 } | 216 } |
| 206 | 217 |
| 207 // Now look for a static function whose name matches function_name | 218 // Now look for a static function whose name matches function_name |
| 208 // in the class. | 219 // in the class. |
| 209 Function& function = | 220 Function& function = |
| 210 Function::Handle(cls.LookupStaticFunction(function_name)); | 221 Function::Handle(cls.LookupStaticFunction(function_name)); |
| 211 if (resolve_type == kNotQualified) { | 222 if (resolve_type == kNotQualified) { |
| 212 // Walk the hierarchy. | 223 // Walk the hierarchy. |
| 213 Class& super_class = Class::Handle(cls.SuperClass()); | 224 Class& super_class = Class::Handle(cls.SuperClass()); |
| 214 while (function.IsNull()) { | 225 while (function.IsNull()) { |
| 215 function = super_class.LookupStaticFunction(function_name); | 226 function = super_class.LookupStaticFunction(function_name); |
| 216 super_class = super_class.SuperClass(); | 227 super_class = super_class.SuperClass(); |
| 217 if (super_class.IsNull()) break; | 228 if (super_class.IsNull()) break; |
| 218 } | 229 } |
| 219 } | 230 } |
| 220 return function.raw(); | 231 return function.raw(); |
| 221 } | 232 } |
| 222 | 233 |
| 223 | 234 |
| 224 | 235 |
| 225 RawFunction* Resolver::ResolveStatic(const Class& cls, | 236 RawFunction* Resolver::ResolveStatic(const Class& cls, |
| 226 const String& function_name, | 237 const String& function_name, |
| 227 intptr_t num_arguments, | 238 intptr_t num_arguments, |
| 228 const Array& argument_names, | 239 const Array& argument_names, |
| 229 StaticResolveType resolve_type) { | 240 StaticResolveType resolve_type) { |
| 241 ASSERT(!cls.IsNull()); |
| 230 const Function& function = Function::Handle( | 242 const Function& function = Function::Handle( |
| 231 ResolveStaticByName(cls, function_name, resolve_type)); | 243 ResolveStaticByName(cls, function_name, resolve_type)); |
| 232 if (function.IsNull() || | 244 if (function.IsNull() || |
| 233 !function.AreValidArguments(num_arguments, argument_names, NULL)) { | 245 !function.AreValidArguments(num_arguments, argument_names, NULL)) { |
| 234 // Return a null function to signal to the upper levels to throw a | 246 // Return a null function to signal to the upper levels to throw a |
| 235 // resolution error or maybe throw the error right here. | 247 // resolution error or maybe throw the error right here. |
| 236 if (FLAG_trace_resolving) { | 248 if (FLAG_trace_resolving) { |
| 237 String& error_message = String::Handle(String::New("function not found")); | 249 String& error_message = String::Handle(String::New("function not found")); |
| 238 if (!function.IsNull()) { | 250 if (!function.IsNull()) { |
| 239 // Obtain more detailed error message. | 251 // Obtain more detailed error message. |
| 240 function.AreValidArguments(num_arguments, | 252 function.AreValidArguments(num_arguments, |
| 241 argument_names, | 253 argument_names, |
| 242 &error_message); | 254 &error_message); |
| 243 } | 255 } |
| 244 OS::Print("ResolveStatic error '%s': %s.\n", | 256 OS::Print("ResolveStatic error '%s': %s.\n", |
| 245 function_name.ToCString(), | 257 function_name.ToCString(), |
| 246 error_message.ToCString()); | 258 error_message.ToCString()); |
| 247 } | 259 } |
| 248 return Function::null(); | 260 return Function::null(); |
| 249 } | 261 } |
| 250 return function.raw(); | 262 return function.raw(); |
| 251 } | 263 } |
| 252 | 264 |
| 253 } // namespace dart | 265 } // namespace dart |
| OLD | NEW |