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 "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 | 6 |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
(...skipping 3001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3012 lookup_class_name.ToCString())); | 3012 lookup_class_name.ToCString())); |
3013 return ApiError::New(message); | 3013 return ApiError::New(message); |
3014 } else { | 3014 } else { |
3015 const String& message = String::Handle( | 3015 const String& message = String::Handle( |
3016 String::NewFormatted("%s: could not find constructor '%s'.", | 3016 String::NewFormatted("%s: could not find constructor '%s'.", |
3017 current_func, constr_name.ToCString())); | 3017 current_func, constr_name.ToCString())); |
3018 return ApiError::New(message); | 3018 return ApiError::New(message); |
3019 } | 3019 } |
3020 } | 3020 } |
3021 int extra_args = (constructor.IsConstructor() ? 2 : 1); | 3021 int extra_args = (constructor.IsConstructor() ? 2 : 1); |
3022 if (!constructor.AreValidArgumentCounts(num_args + extra_args, 0)) { | 3022 String& error_message = String::Handle(); |
| 3023 if (!constructor.AreValidArgumentCounts(num_args + extra_args, |
| 3024 0, |
| 3025 &error_message)) { |
3023 const String& message = String::Handle( | 3026 const String& message = String::Handle( |
3024 String::NewFormatted("%s: wrong argument count for constructor '%s': " | 3027 String::NewFormatted("%s: wrong argument count for " |
3025 "expected %d but saw %d.", | 3028 "constructor '%s': %s.", |
3026 current_func, | 3029 current_func, |
3027 constr_name.ToCString(), | 3030 constr_name.ToCString(), |
3028 constructor.num_fixed_parameters() - extra_args, | 3031 error_message.ToCString())); |
3029 num_args)); | |
3030 return ApiError::New(message); | 3032 return ApiError::New(message); |
3031 } | 3033 } |
3032 return constructor.raw(); | 3034 return constructor.raw(); |
3033 } | 3035 } |
3034 | 3036 |
3035 | 3037 |
3036 DART_EXPORT Dart_Handle Dart_New(Dart_Handle clazz, | 3038 DART_EXPORT Dart_Handle Dart_New(Dart_Handle clazz, |
3037 Dart_Handle constructor_name, | 3039 Dart_Handle constructor_name, |
3038 int number_of_arguments, | 3040 int number_of_arguments, |
3039 Dart_Handle* arguments) { | 3041 Dart_Handle* arguments) { |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3266 // Finalize all classes if needed. | 3268 // Finalize all classes if needed. |
3267 if (finalize_classes) { | 3269 if (finalize_classes) { |
3268 const char* msg = CheckIsolateState(isolate); | 3270 const char* msg = CheckIsolateState(isolate); |
3269 if (msg != NULL) { | 3271 if (msg != NULL) { |
3270 return Api::NewError(msg); | 3272 return Api::NewError(msg); |
3271 } | 3273 } |
3272 } | 3274 } |
3273 | 3275 |
3274 Function& function = Function::Handle(isolate); | 3276 Function& function = Function::Handle(isolate); |
3275 function = lib.LookupFunctionAllowPrivate(function_name); | 3277 function = lib.LookupFunctionAllowPrivate(function_name); |
3276 // LookupFunctionAllowPrivate does not check argument arity, so we | |
3277 // do it here. | |
3278 if (!function.IsNull() && | |
3279 !function.AreValidArgumentCounts(number_of_arguments, 0)) { | |
3280 function = Function::null(); | |
3281 } | |
3282 if (function.IsNull()) { | 3278 if (function.IsNull()) { |
3283 return Api::NewError("%s: did not find top-level function '%s'.", | 3279 return Api::NewError("%s: did not find top-level function '%s'.", |
3284 CURRENT_FUNC, | 3280 CURRENT_FUNC, |
3285 function_name.ToCString()); | 3281 function_name.ToCString()); |
3286 } | 3282 } |
| 3283 // LookupFunctionAllowPrivate does not check argument arity, so we |
| 3284 // do it here. |
| 3285 String& error_message = String::Handle(); |
| 3286 if (!function.AreValidArgumentCounts(number_of_arguments, |
| 3287 0, |
| 3288 &error_message)) { |
| 3289 return Api::NewError("%s: wrong argument count for function '%s': %s.", |
| 3290 CURRENT_FUNC, |
| 3291 function_name.ToCString(), |
| 3292 error_message.ToCString()); |
| 3293 } |
3287 return Api::NewHandle( | 3294 return Api::NewHandle( |
3288 isolate, DartEntry::InvokeStatic(function, args, kNoArgNames)); | 3295 isolate, DartEntry::InvokeStatic(function, args, kNoArgNames)); |
3289 | 3296 |
3290 } else { | 3297 } else { |
3291 return Api::NewError( | 3298 return Api::NewError( |
3292 "%s expects argument 'target' to be an object, class, or library.", | 3299 "%s expects argument 'target' to be an object, class, or library.", |
3293 CURRENT_FUNC); | 3300 CURRENT_FUNC); |
3294 } | 3301 } |
3295 } | 3302 } |
3296 | 3303 |
(...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4113 *buffer_size = 0; | 4120 *buffer_size = 0; |
4114 } | 4121 } |
4115 } | 4122 } |
4116 | 4123 |
4117 | 4124 |
4118 DART_EXPORT void Dart_InitFlowGraphPrinting(FileWriterFunction function) { | 4125 DART_EXPORT void Dart_InitFlowGraphPrinting(FileWriterFunction function) { |
4119 Dart::set_flow_graph_writer(function); | 4126 Dart::set_flow_graph_writer(function); |
4120 } | 4127 } |
4121 | 4128 |
4122 } // namespace dart | 4129 } // namespace dart |
OLD | NEW |