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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 return Api::NewError("%s expects argument '%s' to be non-null.", \ | 66 return Api::NewError("%s expects argument '%s' to be non-null.", \ |
67 CURRENT_FUNC, #parameter); | 67 CURRENT_FUNC, #parameter); |
68 | 68 |
69 | 69 |
70 #define CHECK_LENGTH(length, max_elements) \ | 70 #define CHECK_LENGTH(length, max_elements) \ |
71 do { \ | 71 do { \ |
72 intptr_t len = (length); \ | 72 intptr_t len = (length); \ |
73 intptr_t max = (max_elements); \ | 73 intptr_t max = (max_elements); \ |
74 if (len < 0 || len > max) { \ | 74 if (len < 0 || len > max) { \ |
75 return Api::NewError( \ | 75 return Api::NewError( \ |
76 "%s expects argument '%s' to be in the range [0..%ld].", \ | 76 "%s expects argument '%s' to be in the range [0..%"Pd"].", \ |
77 CURRENT_FUNC, #length, max); \ | 77 CURRENT_FUNC, #length, max); \ |
78 } \ | 78 } \ |
79 } while (0) | 79 } while (0) |
80 | 80 |
81 | 81 |
82 // Return error if isolate is in an inconsistent state. | 82 // Return error if isolate is in an inconsistent state. |
83 // Return NULL when no error condition exists. | 83 // Return NULL when no error condition exists. |
84 // | 84 // |
85 // TODO(turnidge): Make this function return an error handle directly | 85 // TODO(turnidge): Make this function return an error handle directly |
86 // rather than returning an error string. The current behavior can | 86 // rather than returning an error string. The current behavior can |
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
834 DARTSCOPE(isolate); | 834 DARTSCOPE(isolate); |
835 TIMERSCOPE(time_creating_snapshot); | 835 TIMERSCOPE(time_creating_snapshot); |
836 if (buffer == NULL) { | 836 if (buffer == NULL) { |
837 RETURN_NULL_ERROR(buffer); | 837 RETURN_NULL_ERROR(buffer); |
838 } | 838 } |
839 if (size == NULL) { | 839 if (size == NULL) { |
840 RETURN_NULL_ERROR(size); | 840 RETURN_NULL_ERROR(size); |
841 } | 841 } |
842 const char* msg = CheckIsolateState(isolate); | 842 const char* msg = CheckIsolateState(isolate); |
843 if (msg != NULL) { | 843 if (msg != NULL) { |
844 return Api::NewError(msg); | 844 return Api::NewError("%s", msg); |
845 } | 845 } |
846 // Since this is only a snapshot the root library should not be set. | 846 // Since this is only a snapshot the root library should not be set. |
847 isolate->object_store()->set_root_library(Library::Handle(isolate)); | 847 isolate->object_store()->set_root_library(Library::Handle(isolate)); |
848 FullSnapshotWriter writer(buffer, ApiReallocate); | 848 FullSnapshotWriter writer(buffer, ApiReallocate); |
849 writer.WriteFullSnapshot(); | 849 writer.WriteFullSnapshot(); |
850 *size = writer.BytesWritten(); | 850 *size = writer.BytesWritten(); |
851 return Api::Success(isolate); | 851 return Api::Success(isolate); |
852 } | 852 } |
853 | 853 |
854 | 854 |
855 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, | 855 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, |
856 intptr_t* size) { | 856 intptr_t* size) { |
857 Isolate* isolate = Isolate::Current(); | 857 Isolate* isolate = Isolate::Current(); |
858 DARTSCOPE(isolate); | 858 DARTSCOPE(isolate); |
859 TIMERSCOPE(time_creating_snapshot); | 859 TIMERSCOPE(time_creating_snapshot); |
860 if (buffer == NULL) { | 860 if (buffer == NULL) { |
861 RETURN_NULL_ERROR(buffer); | 861 RETURN_NULL_ERROR(buffer); |
862 } | 862 } |
863 if (size == NULL) { | 863 if (size == NULL) { |
864 RETURN_NULL_ERROR(size); | 864 RETURN_NULL_ERROR(size); |
865 } | 865 } |
866 const char* msg = CheckIsolateState(isolate); | 866 const char* msg = CheckIsolateState(isolate); |
867 if (msg != NULL) { | 867 if (msg != NULL) { |
868 return Api::NewError(msg); | 868 return Api::NewError("%s", msg); |
869 } | 869 } |
870 Library& library = | 870 Library& library = |
871 Library::Handle(isolate, isolate->object_store()->root_library()); | 871 Library::Handle(isolate, isolate->object_store()->root_library()); |
872 if (library.IsNull()) { | 872 if (library.IsNull()) { |
873 return | 873 return |
874 Api::NewError("%s expects the isolate to have a script loaded in it.", | 874 Api::NewError("%s expects the isolate to have a script loaded in it.", |
875 CURRENT_FUNC); | 875 CURRENT_FUNC); |
876 } | 876 } |
877 ScriptSnapshotWriter writer(buffer, ApiReallocate); | 877 ScriptSnapshotWriter writer(buffer, ApiReallocate); |
878 writer.WriteScriptSnapshot(library); | 878 writer.WriteScriptSnapshot(library); |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1180 if (obj.IsError()) { | 1180 if (obj.IsError()) { |
1181 return object; | 1181 return object; |
1182 } else if (!obj.IsNull() && !obj.IsInstance()) { | 1182 } else if (!obj.IsNull() && !obj.IsInstance()) { |
1183 return Api::NewError( | 1183 return Api::NewError( |
1184 "%s expects argument 'object' to be an instance of Object.", | 1184 "%s expects argument 'object' to be an instance of Object.", |
1185 CURRENT_FUNC); | 1185 CURRENT_FUNC); |
1186 } | 1186 } |
1187 // Finalize all classes. | 1187 // Finalize all classes. |
1188 const char* msg = CheckIsolateState(isolate); | 1188 const char* msg = CheckIsolateState(isolate); |
1189 if (msg != NULL) { | 1189 if (msg != NULL) { |
1190 return Api::NewError(msg); | 1190 return Api::NewError("%s", msg); |
1191 } | 1191 } |
1192 if (obj.IsInstance()) { | 1192 if (obj.IsInstance()) { |
1193 const Type& type = Type::Handle(isolate, | 1193 const Type& type = Type::Handle(isolate, |
1194 Type::NewNonParameterizedType(cls)); | 1194 Type::NewNonParameterizedType(cls)); |
1195 Error& malformed_type_error = Error::Handle(isolate); | 1195 Error& malformed_type_error = Error::Handle(isolate); |
1196 *value = Instance::Cast(obj).IsInstanceOf(type, | 1196 *value = Instance::Cast(obj).IsInstanceOf(type, |
1197 TypeArguments::Handle(isolate), | 1197 TypeArguments::Handle(isolate), |
1198 &malformed_type_error); | 1198 &malformed_type_error); |
1199 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. | 1199 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. |
1200 } else { | 1200 } else { |
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2473 Isolate* isolate = Isolate::Current(); | 2473 Isolate* isolate = Isolate::Current(); |
2474 DARTSCOPE(isolate); | 2474 DARTSCOPE(isolate); |
2475 const Class& cls = Api::UnwrapClassHandle(isolate, clazz); | 2475 const Class& cls = Api::UnwrapClassHandle(isolate, clazz); |
2476 if (cls.IsNull()) { | 2476 if (cls.IsNull()) { |
2477 RETURN_TYPE_ERROR(isolate, clazz, Class); | 2477 RETURN_TYPE_ERROR(isolate, clazz, Class); |
2478 } | 2478 } |
2479 | 2479 |
2480 // Finalize all classes. | 2480 // Finalize all classes. |
2481 const char* msg = CheckIsolateState(isolate); | 2481 const char* msg = CheckIsolateState(isolate); |
2482 if (msg != NULL) { | 2482 if (msg != NULL) { |
2483 return Api::NewError(msg); | 2483 return Api::NewError("%s", msg); |
2484 } | 2484 } |
2485 | 2485 |
2486 if (cls.HasFactoryClass() && cls.HasResolvedFactoryClass()) { | 2486 if (cls.HasFactoryClass() && cls.HasResolvedFactoryClass()) { |
2487 return Api::NewHandle(isolate, cls.FactoryClass()); | 2487 return Api::NewHandle(isolate, cls.FactoryClass()); |
2488 } | 2488 } |
2489 return Api::Null(isolate); | 2489 return Api::Null(isolate); |
2490 } | 2490 } |
2491 | 2491 |
2492 | 2492 |
2493 DART_EXPORT Dart_Handle Dart_ClassGetInterfaceCount(Dart_Handle clazz, | 2493 DART_EXPORT Dart_Handle Dart_ClassGetInterfaceCount(Dart_Handle clazz, |
(...skipping 20 matching lines...) Expand all Loading... |
2514 Isolate* isolate = Isolate::Current(); | 2514 Isolate* isolate = Isolate::Current(); |
2515 DARTSCOPE(isolate); | 2515 DARTSCOPE(isolate); |
2516 const Class& cls = Api::UnwrapClassHandle(isolate, clazz); | 2516 const Class& cls = Api::UnwrapClassHandle(isolate, clazz); |
2517 if (cls.IsNull()) { | 2517 if (cls.IsNull()) { |
2518 RETURN_TYPE_ERROR(isolate, clazz, Class); | 2518 RETURN_TYPE_ERROR(isolate, clazz, Class); |
2519 } | 2519 } |
2520 | 2520 |
2521 // Finalize all classes. | 2521 // Finalize all classes. |
2522 const char* msg = CheckIsolateState(isolate); | 2522 const char* msg = CheckIsolateState(isolate); |
2523 if (msg != NULL) { | 2523 if (msg != NULL) { |
2524 return Api::NewError(msg); | 2524 return Api::NewError("%s", msg); |
2525 } | 2525 } |
2526 | 2526 |
2527 const Array& interface_types = Array::Handle(isolate, cls.interfaces()); | 2527 const Array& interface_types = Array::Handle(isolate, cls.interfaces()); |
2528 if (index < 0 || index >= interface_types.Length()) { | 2528 if (index < 0 || index >= interface_types.Length()) { |
2529 return Api::NewError("%s: argument 'index' out of bounds.", CURRENT_FUNC); | 2529 return Api::NewError("%s: argument 'index' out of bounds.", CURRENT_FUNC); |
2530 } | 2530 } |
2531 Type& interface_type = Type::Handle(isolate); | 2531 Type& interface_type = Type::Handle(isolate); |
2532 interface_type ^= interface_types.At(index); | 2532 interface_type ^= interface_types.At(index); |
2533 if (interface_type.HasResolvedTypeClass()) { | 2533 if (interface_type.HasResolvedTypeClass()) { |
2534 return Api::NewHandle(isolate, interface_type.type_class()); | 2534 return Api::NewHandle(isolate, interface_type.type_class()); |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3053 if (name_obj.IsNull()) { | 3053 if (name_obj.IsNull()) { |
3054 dot_name = Symbols::Dot(); | 3054 dot_name = Symbols::Dot(); |
3055 } else if (name_obj.IsString()) { | 3055 } else if (name_obj.IsString()) { |
3056 const String& dot = String::Handle(isolate, Symbols::Dot()); | 3056 const String& dot = String::Handle(isolate, Symbols::Dot()); |
3057 dot_name = String::Concat(dot, String::Cast(name_obj)); | 3057 dot_name = String::Concat(dot, String::Cast(name_obj)); |
3058 } else { | 3058 } else { |
3059 RETURN_TYPE_ERROR(isolate, constructor_name, String); | 3059 RETURN_TYPE_ERROR(isolate, constructor_name, String); |
3060 } | 3060 } |
3061 const char* msg = CheckIsolateState(isolate); | 3061 const char* msg = CheckIsolateState(isolate); |
3062 if (msg != NULL) { | 3062 if (msg != NULL) { |
3063 return Api::NewError(msg); | 3063 return Api::NewError("%s", msg); |
3064 } | 3064 } |
3065 | 3065 |
3066 // Check for interfaces with default implementations. | 3066 // Check for interfaces with default implementations. |
3067 if (cls.is_interface()) { | 3067 if (cls.is_interface()) { |
3068 // Make sure that the constructor is found in the interface. | 3068 // Make sure that the constructor is found in the interface. |
3069 result = ResolveConstructor( | 3069 result = ResolveConstructor( |
3070 "Dart_New", cls, base_constructor_name, dot_name, number_of_arguments); | 3070 "Dart_New", cls, base_constructor_name, dot_name, number_of_arguments); |
3071 if (result.IsError()) { | 3071 if (result.IsError()) { |
3072 return Api::NewHandle(isolate, result.raw()); | 3072 return Api::NewHandle(isolate, result.raw()); |
3073 } | 3073 } |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3208 function_name.ToCString()); | 3208 function_name.ToCString()); |
3209 } | 3209 } |
3210 return Api::NewHandle( | 3210 return Api::NewHandle( |
3211 isolate, | 3211 isolate, |
3212 DartEntry::InvokeDynamic(instance, function, args, kNoArgNames)); | 3212 DartEntry::InvokeDynamic(instance, function, args, kNoArgNames)); |
3213 | 3213 |
3214 } else if (obj.IsClass()) { | 3214 } else if (obj.IsClass()) { |
3215 // Finalize all classes. | 3215 // Finalize all classes. |
3216 const char* msg = CheckIsolateState(isolate); | 3216 const char* msg = CheckIsolateState(isolate); |
3217 if (msg != NULL) { | 3217 if (msg != NULL) { |
3218 return Api::NewError(msg); | 3218 return Api::NewError("%s", msg); |
3219 } | 3219 } |
3220 | 3220 |
3221 const Class& cls = Class::Cast(obj); | 3221 const Class& cls = Class::Cast(obj); |
3222 const Function& function = Function::Handle( | 3222 const Function& function = Function::Handle( |
3223 isolate, | 3223 isolate, |
3224 Resolver::ResolveStatic(cls, | 3224 Resolver::ResolveStatic(cls, |
3225 function_name, | 3225 function_name, |
3226 number_of_arguments, | 3226 number_of_arguments, |
3227 Array::Handle(isolate), | 3227 Array::Handle(isolate), |
3228 Resolver::kIsQualified)); | 3228 Resolver::kIsQualified)); |
(...skipping 18 matching lines...) Expand all Loading... |
3247 Library& builtin = | 3247 Library& builtin = |
3248 Library::Handle(isolate, isolate->object_store()->builtin_library()); | 3248 Library::Handle(isolate, isolate->object_store()->builtin_library()); |
3249 if (builtin.raw() == lib.raw()) { | 3249 if (builtin.raw() == lib.raw()) { |
3250 finalize_classes = false; | 3250 finalize_classes = false; |
3251 } | 3251 } |
3252 | 3252 |
3253 // Finalize all classes if needed. | 3253 // Finalize all classes if needed. |
3254 if (finalize_classes) { | 3254 if (finalize_classes) { |
3255 const char* msg = CheckIsolateState(isolate); | 3255 const char* msg = CheckIsolateState(isolate); |
3256 if (msg != NULL) { | 3256 if (msg != NULL) { |
3257 return Api::NewError(msg); | 3257 return Api::NewError("%s", msg); |
3258 } | 3258 } |
3259 } | 3259 } |
3260 | 3260 |
3261 Function& function = Function::Handle(isolate); | 3261 Function& function = Function::Handle(isolate); |
3262 function = lib.LookupFunctionAllowPrivate(function_name); | 3262 function = lib.LookupFunctionAllowPrivate(function_name); |
3263 if (function.IsNull()) { | 3263 if (function.IsNull()) { |
3264 return Api::NewError("%s: did not find top-level function '%s'.", | 3264 return Api::NewError("%s: did not find top-level function '%s'.", |
3265 CURRENT_FUNC, | 3265 CURRENT_FUNC, |
3266 function_name.ToCString()); | 3266 function_name.ToCString()); |
3267 } | 3267 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3340 GrowableArray<const Object*> args; | 3340 GrowableArray<const Object*> args; |
3341 const Array& kNoArgNames = Array::Handle(isolate); | 3341 const Array& kNoArgNames = Array::Handle(isolate); |
3342 return Api::NewHandle( | 3342 return Api::NewHandle( |
3343 isolate, | 3343 isolate, |
3344 DartEntry::InvokeDynamic(instance, getter, args, kNoArgNames)); | 3344 DartEntry::InvokeDynamic(instance, getter, args, kNoArgNames)); |
3345 | 3345 |
3346 } else if (obj.IsClass()) { | 3346 } else if (obj.IsClass()) { |
3347 // Finalize all classes. | 3347 // Finalize all classes. |
3348 const char* msg = CheckIsolateState(isolate); | 3348 const char* msg = CheckIsolateState(isolate); |
3349 if (msg != NULL) { | 3349 if (msg != NULL) { |
3350 return Api::NewError(msg); | 3350 return Api::NewError("%s", msg); |
3351 } | 3351 } |
3352 // To access a static field we may need to use the Field or the | 3352 // To access a static field we may need to use the Field or the |
3353 // getter Function. | 3353 // getter Function. |
3354 const Class& cls = Class::Cast(obj); | 3354 const Class& cls = Class::Cast(obj); |
3355 field = cls.LookupStaticField(field_name); | 3355 field = cls.LookupStaticField(field_name); |
3356 if (field.IsNull() || FieldIsUninitialized(isolate, field)) { | 3356 if (field.IsNull() || FieldIsUninitialized(isolate, field)) { |
3357 const String& getter_name = | 3357 const String& getter_name = |
3358 String::Handle(isolate, Field::GetterName(field_name)); | 3358 String::Handle(isolate, Field::GetterName(field_name)); |
3359 getter = cls.LookupStaticFunction(getter_name); | 3359 getter = cls.LookupStaticFunction(getter_name); |
3360 } | 3360 } |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3897 } | 3897 } |
3898 } | 3898 } |
3899 | 3899 |
3900 | 3900 |
3901 DART_EXPORT Dart_Handle Dart_CompileAll() { | 3901 DART_EXPORT Dart_Handle Dart_CompileAll() { |
3902 Isolate* isolate = Isolate::Current(); | 3902 Isolate* isolate = Isolate::Current(); |
3903 DARTSCOPE(isolate); | 3903 DARTSCOPE(isolate); |
3904 Dart_Handle result; | 3904 Dart_Handle result; |
3905 const char* msg = CheckIsolateState(isolate); | 3905 const char* msg = CheckIsolateState(isolate); |
3906 if (msg != NULL) { | 3906 if (msg != NULL) { |
3907 return Api::NewError(msg); | 3907 return Api::NewError("%s", msg); |
3908 } | 3908 } |
3909 CompileAll(isolate, &result); | 3909 CompileAll(isolate, &result); |
3910 return result; | 3910 return result; |
3911 } | 3911 } |
3912 | 3912 |
3913 | 3913 |
3914 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { | 3914 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { |
3915 return Api::ClassId(object) == kLibraryCid; | 3915 return Api::ClassId(object) == kLibraryCid; |
3916 } | 3916 } |
3917 | 3917 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4048 // Propagate the error out right now. | 4048 // Propagate the error out right now. |
4049 if (::Dart_IsError(result)) { | 4049 if (::Dart_IsError(result)) { |
4050 return result; | 4050 return result; |
4051 } | 4051 } |
4052 | 4052 |
4053 // If this is the dart:builtin library, register it with the VM. | 4053 // If this is the dart:builtin library, register it with the VM. |
4054 if (url_str.Equals("dart:builtin")) { | 4054 if (url_str.Equals("dart:builtin")) { |
4055 isolate->object_store()->set_builtin_library(library); | 4055 isolate->object_store()->set_builtin_library(library); |
4056 const char* msg = CheckIsolateState(isolate); | 4056 const char* msg = CheckIsolateState(isolate); |
4057 if (msg != NULL) { | 4057 if (msg != NULL) { |
4058 return Api::NewError(msg); | 4058 return Api::NewError("%s", msg); |
4059 } | 4059 } |
4060 } | 4060 } |
4061 return result; | 4061 return result; |
4062 } | 4062 } |
4063 | 4063 |
4064 | 4064 |
4065 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library, | 4065 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library, |
4066 Dart_Handle import, | 4066 Dart_Handle import, |
4067 Dart_Handle prefix) { | 4067 Dart_Handle prefix) { |
4068 Isolate* isolate = Isolate::Current(); | 4068 Isolate* isolate = Isolate::Current(); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4179 DART_EXPORT void Dart_InitPerfEventsSupport(Dart_FileWriterFunction function) { | 4179 DART_EXPORT void Dart_InitPerfEventsSupport(Dart_FileWriterFunction function) { |
4180 Dart::set_perf_events_writer(function); | 4180 Dart::set_perf_events_writer(function); |
4181 } | 4181 } |
4182 | 4182 |
4183 | 4183 |
4184 DART_EXPORT void Dart_InitFlowGraphPrinting(Dart_FileWriterFunction function) { | 4184 DART_EXPORT void Dart_InitFlowGraphPrinting(Dart_FileWriterFunction function) { |
4185 Dart::set_flow_graph_writer(function); | 4185 Dart::set_flow_graph_writer(function); |
4186 } | 4186 } |
4187 | 4187 |
4188 } // namespace dart | 4188 } // namespace dart |
OLD | NEW |