| 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 |