Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 16973003: Split dart_api.h into multiple parts: (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 #include "include/dart_mirrors_api.h"
7 #include "include/dart_native_api.h"
6 8
7 #include "platform/assert.h" 9 #include "platform/assert.h"
8 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
9 #include "vm/class_finalizer.h" 11 #include "vm/class_finalizer.h"
10 #include "vm/compiler.h" 12 #include "vm/compiler.h"
11 #include "vm/dart.h" 13 #include "vm/dart.h"
12 #include "vm/dart_api_impl.h" 14 #include "vm/dart_api_impl.h"
13 #include "vm/dart_api_message.h" 15 #include "vm/dart_api_message.h"
14 #include "vm/dart_api_state.h" 16 #include "vm/dart_api_state.h"
15 #include "vm/dart_entry.h" 17 #include "vm/dart_entry.h"
16 #include "vm/debuginfo.h" 18 #include "vm/debuginfo.h"
17 #include "vm/exceptions.h" 19 #include "vm/exceptions.h"
18 #include "vm/flags.h" 20 #include "vm/flags.h"
19 #include "vm/growable_array.h" 21 #include "vm/growable_array.h"
20 #include "vm/message.h" 22 #include "vm/message.h"
23 #include "vm/message_handler.h"
21 #include "vm/native_entry.h" 24 #include "vm/native_entry.h"
22 #include "vm/native_message_handler.h"
23 #include "vm/object.h" 25 #include "vm/object.h"
24 #include "vm/object_store.h" 26 #include "vm/object_store.h"
25 #include "vm/port.h" 27 #include "vm/port.h"
26 #include "vm/resolver.h" 28 #include "vm/resolver.h"
27 #include "vm/stack_frame.h" 29 #include "vm/stack_frame.h"
28 #include "vm/symbols.h" 30 #include "vm/symbols.h"
29 #include "vm/timer.h" 31 #include "vm/timer.h"
30 #include "vm/unicode.h" 32 #include "vm/unicode.h"
31 #include "vm/verifier.h" 33 #include "vm/verifier.h"
32 #include "vm/version.h" 34 #include "vm/version.h"
(...skipping 11 matching lines...) Expand all
44 46
45 const char* CanonicalFunction(const char* func) { 47 const char* CanonicalFunction(const char* func) {
46 if (strncmp(func, "dart::", 6) == 0) { 48 if (strncmp(func, "dart::", 6) == 0) {
47 return func + 6; 49 return func + 6;
48 } else { 50 } else {
49 return func; 51 return func;
50 } 52 }
51 } 53 }
52 54
53 55
54 #define RETURN_TYPE_ERROR(isolate, dart_handle, type) \ 56 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) {
55 do { \ 57 if (obj.IsInstance()) {
56 const Object& tmp = \ 58 const Instance& instance = Instance::Cast(obj);
57 Object::Handle(isolate, Api::UnwrapHandle((dart_handle))); \ 59 const Class& obj_class = Class::Handle(isolate, obj.clazz());
58 if (tmp.IsNull()) { \ 60 const Class& list_class =
59 return Api::NewError("%s expects argument '%s' to be non-null.", \ 61 Class::Handle(isolate, isolate->object_store()->list_class());
60 CURRENT_FUNC, #dart_handle); \ 62 Error& malformed_type_error = Error::Handle(isolate);
61 } else if (tmp.IsError()) { \ 63 if (obj_class.IsSubtypeOf(TypeArguments::Handle(isolate),
62 return dart_handle; \ 64 list_class,
63 } else { \ 65 TypeArguments::Handle(isolate),
64 return Api::NewError("%s expects argument '%s' to be of type %s.", \ 66 &malformed_type_error)) {
65 CURRENT_FUNC, #dart_handle, #type); \ 67 ASSERT(malformed_type_error.IsNull()); // Type is a raw List.
66 } \ 68 return instance.raw();
67 } while (0) 69 }
68 70 }
69 71 return Instance::null();
70 #define RETURN_NULL_ERROR(parameter) \ 72 }
71 return Api::NewError("%s expects argument '%s' to be non-null.", \
72 CURRENT_FUNC, #parameter);
73
74
75 #define CHECK_LENGTH(length, max_elements) \
76 do { \
77 intptr_t len = (length); \
78 intptr_t max = (max_elements); \
79 if (len < 0 || len > max) { \
80 return Api::NewError( \
81 "%s expects argument '%s' to be in the range [0..%"Pd"].", \
82 CURRENT_FUNC, #length, max); \
83 } \
84 } while (0)
85 73
86 74
87 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) { 75 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) {
88 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles(); 76 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles();
89 ASSERT(local_handles != NULL); 77 ASSERT(local_handles != NULL);
90 LocalHandle* ref = local_handles->AllocateHandle(); 78 LocalHandle* ref = local_handles->AllocateHandle();
91 ref->set_raw(raw); 79 ref->set_raw(raw);
92 return reinterpret_cast<Dart_Handle>(ref); 80 return reinterpret_cast<Dart_Handle>(ref);
93 } 81 }
94 82
83
95 RawObject* Api::UnwrapHandle(Dart_Handle object) { 84 RawObject* Api::UnwrapHandle(Dart_Handle object) {
96 #if defined(DEBUG) 85 #if defined(DEBUG)
97 Isolate* isolate = Isolate::Current(); 86 Isolate* isolate = Isolate::Current();
98 ASSERT(isolate != NULL); 87 ASSERT(isolate != NULL);
99 ApiState* state = isolate->api_state(); 88 ApiState* state = isolate->api_state();
100 ASSERT(state != NULL); 89 ASSERT(state != NULL);
101 ASSERT(!FLAG_verify_handles || 90 ASSERT(!FLAG_verify_handles ||
102 state->IsValidLocalHandle(object) || 91 state->IsValidLocalHandle(object) ||
103 Dart::vm_isolate()->api_state()->IsValidLocalHandle(object)); 92 Dart::vm_isolate()->api_state()->IsValidLocalHandle(object));
104 ASSERT(FinalizablePersistentHandle::raw_offset() == 0 && 93 ASSERT(FinalizablePersistentHandle::raw_offset() == 0 &&
105 PersistentHandle::raw_offset() == 0 && 94 PersistentHandle::raw_offset() == 0 &&
106 LocalHandle::raw_offset() == 0); 95 LocalHandle::raw_offset() == 0);
107 #endif 96 #endif
108 return (reinterpret_cast<LocalHandle*>(object))->raw(); 97 return (reinterpret_cast<LocalHandle*>(object))->raw();
109 } 98 }
110 99
100
111 #define DEFINE_UNWRAP(type) \ 101 #define DEFINE_UNWRAP(type) \
112 const type& Api::Unwrap##type##Handle(Isolate* iso, \ 102 const type& Api::Unwrap##type##Handle(Isolate* iso, \
113 Dart_Handle dart_handle) { \ 103 Dart_Handle dart_handle) { \
114 const Object& obj = Object::Handle(iso, Api::UnwrapHandle(dart_handle)); \ 104 const Object& obj = Object::Handle(iso, Api::UnwrapHandle(dart_handle)); \
115 if (obj.Is##type()) { \ 105 if (obj.Is##type()) { \
116 return type::Cast(obj); \ 106 return type::Cast(obj); \
117 } \ 107 } \
118 return type::Handle(iso); \ 108 return type::Handle(iso); \
119 } 109 }
120 CLASS_LIST_FOR_HANDLES(DEFINE_UNWRAP) 110 CLASS_LIST_FOR_HANDLES(DEFINE_UNWRAP)
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); 250 reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr();
261 ExternalStringData<uint16_t>* data = raw_string->external_data_; 251 ExternalStringData<uint16_t>* data = raw_string->external_data_;
262 *peer = data->peer(); 252 *peer = data->peer();
263 return true; 253 return true;
264 } 254 }
265 } 255 }
266 return false; 256 return false;
267 } 257 }
268 258
269 259
270 // When we want to return a handle to a type to the user, we handle
271 // class-types differently than some other types.
272 static Dart_Handle TypeToHandle(Isolate* isolate,
273 const char* function_name,
274 const AbstractType& type) {
275 if (type.IsMalformed()) {
276 const Error& error = Error::Handle(type.malformed_error());
277 return Api::NewError("%s: malformed type encountered: %s.",
278 function_name, error.ToErrorCString());
279 } else if (type.HasResolvedTypeClass()) {
280 const Class& cls = Class::Handle(isolate, type.type_class());
281 #if defined(DEBUG)
282 const Library& lib = Library::Handle(cls.library());
283 if (lib.IsNull()) {
284 ASSERT(cls.IsDynamicClass() || cls.IsVoidClass());
285 }
286 #endif
287 return Api::NewHandle(isolate, cls.raw());
288 } else if (type.IsTypeParameter()) {
289 return Api::NewHandle(isolate, type.raw());
290 } else {
291 return Api::NewError("%s: unexpected type '%s' encountered.",
292 function_name, type.ToCString());
293 }
294 }
295
296
297 // --- Handles --- 260 // --- Handles ---
298 261
299
300 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { 262 DART_EXPORT bool Dart_IsError(Dart_Handle handle) {
301 return RawObject::IsErrorClassId(Api::ClassId(handle)); 263 return RawObject::IsErrorClassId(Api::ClassId(handle));
302 } 264 }
303 265
304 266
305 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) { 267 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) {
306 return Api::ClassId(object) == kApiErrorCid; 268 return Api::ClassId(object) == kApiErrorCid;
307 } 269 }
308 270
309 271
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 629
668 WeakReferenceSet* reference_set = new WeakReferenceSet(keys, num_keys, 630 WeakReferenceSet* reference_set = new WeakReferenceSet(keys, num_keys,
669 values, num_values); 631 values, num_values);
670 state->DelayWeakReferenceSet(reference_set); 632 state->DelayWeakReferenceSet(reference_set);
671 return Api::Success(); 633 return Api::Success();
672 } 634 }
673 635
674 636
675 // --- Garbage Collection Callbacks -- 637 // --- Garbage Collection Callbacks --
676 638
677
678 DART_EXPORT Dart_Handle Dart_AddGcPrologueCallback( 639 DART_EXPORT Dart_Handle Dart_AddGcPrologueCallback(
679 Dart_GcPrologueCallback callback) { 640 Dart_GcPrologueCallback callback) {
680 Isolate* isolate = Isolate::Current(); 641 Isolate* isolate = Isolate::Current();
681 CHECK_ISOLATE(isolate); 642 CHECK_ISOLATE(isolate);
682 GcPrologueCallbacks& callbacks = isolate->gc_prologue_callbacks(); 643 GcPrologueCallbacks& callbacks = isolate->gc_prologue_callbacks();
683 if (callbacks.Contains(callback)) { 644 if (callbacks.Contains(callback)) {
684 return Api::NewError( 645 return Api::NewError(
685 "%s permits only one instance of 'callback' to be present in the " 646 "%s permits only one instance of 'callback' to be present in the "
686 "prologue callback list.", 647 "prologue callback list.",
687 CURRENT_FUNC); 648 CURRENT_FUNC);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 if (!callbacks.Contains(callback)) { 691 if (!callbacks.Contains(callback)) {
731 return Api::NewError( 692 return Api::NewError(
732 "%s expects 'callback' to be present in the epilogue callback list.", 693 "%s expects 'callback' to be present in the epilogue callback list.",
733 CURRENT_FUNC); 694 CURRENT_FUNC);
734 } 695 }
735 callbacks.Remove(callback); 696 callbacks.Remove(callback);
736 return Api::Success(); 697 return Api::Success();
737 } 698 }
738 699
739 700
740 DART_EXPORT Dart_Handle Dart_HeapProfile(Dart_FileWriteCallback callback,
741 void* stream) {
742 Isolate* isolate = Isolate::Current();
743 CHECK_ISOLATE(isolate);
744 if (callback == NULL) {
745 RETURN_NULL_ERROR(callback);
746 }
747 isolate->heap()->Profile(callback, stream);
748 return Api::Success();
749 }
750
751 // --- Initialization and Globals --- 701 // --- Initialization and Globals ---
752 702
753 DART_EXPORT const char* Dart_VersionString() { 703 DART_EXPORT const char* Dart_VersionString() {
754 return Version::String(); 704 return Version::String();
755 } 705 }
756 706
757 DART_EXPORT bool Dart_Initialize( 707 DART_EXPORT bool Dart_Initialize(
758 Dart_IsolateCreateCallback create, 708 Dart_IsolateCreateCallback create,
759 Dart_IsolateInterruptCallback interrupt, 709 Dart_IsolateInterruptCallback interrupt,
760 Dart_IsolateUnhandledExceptionCallback unhandled, 710 Dart_IsolateUnhandledExceptionCallback unhandled,
(...skipping 19 matching lines...) Expand all
780 DART_EXPORT bool Dart_IsVMFlagSet(const char* flag_name) { 730 DART_EXPORT bool Dart_IsVMFlagSet(const char* flag_name) {
781 if (Flags::Lookup(flag_name) != NULL) { 731 if (Flags::Lookup(flag_name) != NULL) {
782 return true; 732 return true;
783 } 733 }
784 return false; 734 return false;
785 } 735 }
786 736
787 737
788 // --- Isolates --- 738 // --- Isolates ---
789 739
790
791 static char* BuildIsolateName(const char* script_uri, 740 static char* BuildIsolateName(const char* script_uri,
792 const char* main) { 741 const char* main) {
793 if (script_uri == NULL) { 742 if (script_uri == NULL) {
794 // Just use the main as the name. 743 // Just use the main as the name.
795 if (main == NULL) { 744 if (main == NULL) {
796 return strdup("isolate"); 745 return strdup("isolate");
797 } else { 746 } else {
798 return strdup(main); 747 return strdup(main);
799 } 748 }
800 } 749 }
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 return isolate->message_handler()->HasLivePorts(); 991 return isolate->message_handler()->HasLivePorts();
1043 } 992 }
1044 993
1045 994
1046 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 995 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
1047 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 996 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
1048 return reinterpret_cast<uint8_t*>(new_ptr); 997 return reinterpret_cast<uint8_t*>(new_ptr);
1049 } 998 }
1050 999
1051 1000
1052 DART_EXPORT bool Dart_PostIntArray(Dart_Port port_id,
1053 intptr_t len,
1054 intptr_t* data) {
1055 uint8_t* buffer = NULL;
1056 ApiMessageWriter writer(&buffer, &allocator);
1057 writer.WriteMessage(len, data);
1058
1059 // Post the message at the given port.
1060 return PortMap::PostMessage(new Message(
1061 port_id, Message::kIllegalPort, buffer, writer.BytesWritten(),
1062 Message::kNormalPriority));
1063 }
1064
1065
1066 DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message) {
1067 uint8_t* buffer = NULL;
1068 ApiMessageWriter writer(&buffer, allocator);
1069 bool success = writer.WriteCMessage(message);
1070
1071 if (!success) return success;
1072
1073 // Post the message at the given port.
1074 return PortMap::PostMessage(new Message(
1075 port_id, Message::kIllegalPort, buffer, writer.BytesWritten(),
1076 Message::kNormalPriority));
1077 }
1078
1079
1080 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { 1001 DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) {
1081 Isolate* isolate = Isolate::Current(); 1002 Isolate* isolate = Isolate::Current();
1082 DARTSCOPE(isolate); 1003 DARTSCOPE(isolate);
1083 const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle)); 1004 const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle));
1084 uint8_t* data = NULL; 1005 uint8_t* data = NULL;
1085 MessageWriter writer(&data, &allocator); 1006 MessageWriter writer(&data, &allocator);
1086 writer.WriteMessage(object); 1007 writer.WriteMessage(object);
1087 intptr_t len = writer.BytesWritten(); 1008 intptr_t len = writer.BytesWritten();
1088 return PortMap::PostMessage(new Message( 1009 return PortMap::PostMessage(new Message(
1089 port_id, Message::kIllegalPort, data, len, Message::kNormalPriority)); 1010 port_id, Message::kIllegalPort, data, len, Message::kNormalPriority));
1090 } 1011 }
1091 1012
1092 1013
1093 DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
1094 Dart_NativeMessageHandler handler,
1095 bool handle_concurrently) {
1096 if (name == NULL) {
1097 name = "<UnnamedNativePort>";
1098 }
1099 if (handler == NULL) {
1100 OS::PrintErr("%s expects argument 'handler' to be non-null.\n",
1101 CURRENT_FUNC);
1102 return ILLEGAL_PORT;
1103 }
1104 // Start the native port without a current isolate.
1105 IsolateSaver saver(Isolate::Current());
1106 Isolate::SetCurrent(NULL);
1107
1108 NativeMessageHandler* nmh = new NativeMessageHandler(name, handler);
1109 Dart_Port port_id = PortMap::CreatePort(nmh);
1110 nmh->Run(Dart::thread_pool(), NULL, NULL, 0);
1111 return port_id;
1112 }
1113
1114
1115 DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) {
1116 // Close the native port without a current isolate.
1117 IsolateSaver saver(Isolate::Current());
1118 Isolate::SetCurrent(NULL);
1119
1120 // TODO(turnidge): Check that the port is native before trying to close.
1121 return PortMap::ClosePort(native_port_id);
1122 }
1123
1124
1125 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) { 1014 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) {
1126 Isolate* isolate = Isolate::Current(); 1015 Isolate* isolate = Isolate::Current();
1127 DARTSCOPE(isolate); 1016 DARTSCOPE(isolate);
1128 CHECK_CALLBACK_STATE(isolate); 1017 CHECK_CALLBACK_STATE(isolate);
1129 return Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); 1018 return Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
1130 } 1019 }
1131 1020
1132 1021
1133 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { 1022 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) {
1134 Isolate* isolate = Isolate::Current(); 1023 Isolate* isolate = Isolate::Current();
(...skipping 22 matching lines...) Expand all
1157 return Api::NewHandle(isolate, DartEntry::InvokeFunction(function, args)); 1046 return Api::NewHandle(isolate, DartEntry::InvokeFunction(function, args));
1158 } 1047 }
1159 1048
1160 1049
1161 DART_EXPORT Dart_Port Dart_GetMainPortId() { 1050 DART_EXPORT Dart_Port Dart_GetMainPortId() {
1162 Isolate* isolate = Isolate::Current(); 1051 Isolate* isolate = Isolate::Current();
1163 CHECK_ISOLATE(isolate); 1052 CHECK_ISOLATE(isolate);
1164 return isolate->main_port(); 1053 return isolate->main_port();
1165 } 1054 }
1166 1055
1056
1167 // --- Scopes ---- 1057 // --- Scopes ----
1168 1058
1169
1170 DART_EXPORT void Dart_EnterScope() { 1059 DART_EXPORT void Dart_EnterScope() {
1171 Isolate* isolate = Isolate::Current(); 1060 Isolate* isolate = Isolate::Current();
1172 CHECK_ISOLATE(isolate); 1061 CHECK_ISOLATE(isolate);
1173 ApiState* state = isolate->api_state(); 1062 ApiState* state = isolate->api_state();
1174 ASSERT(state != NULL); 1063 ASSERT(state != NULL);
1175 ApiLocalScope* new_scope = new ApiLocalScope(state->top_scope(), 1064 ApiLocalScope* new_scope = new ApiLocalScope(state->top_scope(),
1176 isolate->top_exit_frame_info()); 1065 isolate->top_exit_frame_info());
1177 ASSERT(new_scope != NULL); 1066 ASSERT(new_scope != NULL);
1178 state->set_top_scope(new_scope); // New scope is now the top scope. 1067 state->set_top_scope(new_scope); // New scope is now the top scope.
1179 } 1068 }
(...skipping 22 matching lines...) Expand all
1202 ApiNativeScope* scope = ApiNativeScope::Current(); 1091 ApiNativeScope* scope = ApiNativeScope::Current();
1203 if (scope == NULL) return NULL; 1092 if (scope == NULL) return NULL;
1204 zone = scope->zone(); 1093 zone = scope->zone();
1205 } 1094 }
1206 return reinterpret_cast<uint8_t*>(zone->AllocUnsafe(size)); 1095 return reinterpret_cast<uint8_t*>(zone->AllocUnsafe(size));
1207 } 1096 }
1208 1097
1209 1098
1210 // --- Objects ---- 1099 // --- Objects ----
1211 1100
1212
1213 DART_EXPORT Dart_Handle Dart_Null() { 1101 DART_EXPORT Dart_Handle Dart_Null() {
1214 Isolate* isolate = Isolate::Current(); 1102 Isolate* isolate = Isolate::Current();
1215 CHECK_ISOLATE_SCOPE(isolate); 1103 CHECK_ISOLATE_SCOPE(isolate);
1216 return Api::Null(); 1104 return Api::Null();
1217 } 1105 }
1218 1106
1219 1107
1220 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { 1108 DART_EXPORT bool Dart_IsNull(Dart_Handle object) {
1221 return Api::ClassId(object) == kNullCid; 1109 return Api::ClassId(object) == kNullCid;
1222 } 1110 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 TypeArguments::Handle(isolate), 1167 TypeArguments::Handle(isolate),
1280 &malformed_type_error); 1168 &malformed_type_error);
1281 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. 1169 ASSERT(malformed_type_error.IsNull()); // Type was created from a class.
1282 } else { 1170 } else {
1283 *value = false; 1171 *value = false;
1284 } 1172 }
1285 return Api::Success(); 1173 return Api::Success();
1286 } 1174 }
1287 1175
1288 1176
1289 // --- Instances ----
1290
1291
1292 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) { 1177 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) {
1293 Isolate* isolate = Isolate::Current(); 1178 Isolate* isolate = Isolate::Current();
1294 DARTSCOPE(isolate); 1179 DARTSCOPE(isolate);
1295 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 1180 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
1296 return obj.IsInstance(); 1181 return obj.IsInstance();
1297 } 1182 }
1298 1183
1299 1184
1185 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) {
1186 return RawObject::IsNumberClassId(Api::ClassId(object));
1187 }
1188
1189
1190 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) {
1191 return RawObject::IsIntegerClassId(Api::ClassId(object));
1192 }
1193
1194
1195 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) {
1196 return Api::ClassId(object) == kDoubleCid;
1197 }
1198
1199
1200 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) {
1201 return Api::ClassId(object) == kBoolCid;
1202 }
1203
1204
1205 DART_EXPORT bool Dart_IsString(Dart_Handle object) {
1206 return RawObject::IsStringClassId(Api::ClassId(object));
1207 }
1208
1209
1210 DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object) {
1211 return RawObject::IsOneByteStringClassId(Api::ClassId(object));
1212 }
1213
1214
1215 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) {
1216 return RawObject::IsExternalStringClassId(Api::ClassId(object));
1217 }
1218
1219
1220 DART_EXPORT bool Dart_IsList(Dart_Handle object) {
1221 if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) {
1222 return true;
1223 }
1224
1225 Isolate* isolate = Isolate::Current();
1226 DARTSCOPE(isolate);
1227 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
1228 return GetListInstance(isolate, obj) != Instance::null();
1229 }
1230
1231
1232 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) {
1233 return Api::ClassId(object) == kLibraryCid;
1234 }
1235
1236
1237 DART_EXPORT bool Dart_IsClass(Dart_Handle handle) {
1238 Isolate* isolate = Isolate::Current();
1239 DARTSCOPE(isolate);
1240 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
1241 return obj.IsClass();
1242 }
1243
1244
1245 DART_EXPORT bool Dart_IsAbstractClass(Dart_Handle handle) {
1246 Isolate* isolate = Isolate::Current();
1247 DARTSCOPE(isolate);
1248 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
1249 if (obj.IsClass()) {
1250 return Class::Cast(obj).is_abstract();
1251 }
1252 return false;
1253 }
1254
1255
1256 DART_EXPORT bool Dart_IsFunction(Dart_Handle handle) {
1257 return Api::ClassId(handle) == kFunctionCid;
1258 }
1259
1260
1261 DART_EXPORT bool Dart_IsVariable(Dart_Handle handle) {
1262 return Api::ClassId(handle) == kFieldCid;
1263 }
1264
1265
1266 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) {
1267 return Api::ClassId(handle) == kTypeParameterCid;
1268 }
1269
1270
1271 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
1272 // We can't use a fast class index check here because there are many
1273 // different signature classes for closures.
1274 Isolate* isolate = Isolate::Current();
1275 DARTSCOPE(isolate);
1276 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, object);
1277 return (!closure_obj.IsNull() && closure_obj.IsClosure());
1278 }
1279
1280
1281 // --- Instances ----
1282
1300 // TODO(turnidge): Technically, null has a class. Should we allow it? 1283 // TODO(turnidge): Technically, null has a class. Should we allow it?
1301 DART_EXPORT Dart_Handle Dart_InstanceGetClass(Dart_Handle instance) { 1284 DART_EXPORT Dart_Handle Dart_InstanceGetClass(Dart_Handle instance) {
1302 Isolate* isolate = Isolate::Current(); 1285 Isolate* isolate = Isolate::Current();
1303 DARTSCOPE(isolate); 1286 DARTSCOPE(isolate);
1304 const Instance& obj = Api::UnwrapInstanceHandle(isolate, instance); 1287 const Instance& obj = Api::UnwrapInstanceHandle(isolate, instance);
1305 if (obj.IsNull()) { 1288 if (obj.IsNull()) {
1306 RETURN_TYPE_ERROR(isolate, instance, Instance); 1289 RETURN_TYPE_ERROR(isolate, instance, Instance);
1307 } 1290 }
1308 return Api::NewHandle(isolate, obj.clazz()); 1291 return Api::NewHandle(isolate, obj.clazz());
1309 } 1292 }
1310 1293
1311 1294
1312 // --- Numbers ---- 1295 // --- Numbers, Integers and Doubles ----
1313
1314
1315 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) {
1316 return RawObject::IsNumberClassId(Api::ClassId(object));
1317 }
1318
1319
1320 // --- Integers ----
1321
1322
1323 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) {
1324 return RawObject::IsIntegerClassId(Api::ClassId(object));
1325 }
1326
1327 1296
1328 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, 1297 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer,
1329 bool* fits) { 1298 bool* fits) {
1330 // Fast path for Smis and Mints. 1299 // Fast path for Smis and Mints.
1331 Isolate* isolate = Isolate::Current(); 1300 Isolate* isolate = Isolate::Current();
1332 CHECK_ISOLATE(isolate); 1301 CHECK_ISOLATE(isolate);
1333 intptr_t class_id = Api::ClassId(integer); 1302 intptr_t class_id = Api::ClassId(integer);
1334 if (class_id == kSmiCid || class_id == kMintCid) { 1303 if (class_id == kSmiCid || class_id == kMintCid) {
1335 *fits = true; 1304 *fits = true;
1336 return Api::Success(); 1305 return Api::Success();
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 BigintOperations::NewFromInt64(int_obj.AsInt64Value())); 1448 BigintOperations::NewFromInt64(int_obj.AsInt64Value()));
1480 *value = BigintOperations::ToHexCString(bigint, BigintAllocate); 1449 *value = BigintOperations::ToHexCString(bigint, BigintAllocate);
1481 } else { 1450 } else {
1482 *value = BigintOperations::ToHexCString(Bigint::Cast(int_obj), 1451 *value = BigintOperations::ToHexCString(Bigint::Cast(int_obj),
1483 BigintAllocate); 1452 BigintAllocate);
1484 } 1453 }
1485 return Api::Success(); 1454 return Api::Success();
1486 } 1455 }
1487 1456
1488 1457
1458 DART_EXPORT Dart_Handle Dart_NewDouble(double value) {
1459 Isolate* isolate = Isolate::Current();
1460 DARTSCOPE(isolate);
1461 CHECK_CALLBACK_STATE(isolate);
1462 return Api::NewHandle(isolate, Double::New(value));
1463 }
1464
1465
1466 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj,
1467 double* value) {
1468 Isolate* isolate = Isolate::Current();
1469 DARTSCOPE(isolate);
1470 const Double& obj = Api::UnwrapDoubleHandle(isolate, double_obj);
1471 if (obj.IsNull()) {
1472 RETURN_TYPE_ERROR(isolate, double_obj, Double);
1473 }
1474 *value = obj.value();
1475 return Api::Success();
1476 }
1477
1478
1489 // --- Booleans ---- 1479 // --- Booleans ----
1490 1480
1491
1492 DART_EXPORT Dart_Handle Dart_True() { 1481 DART_EXPORT Dart_Handle Dart_True() {
1493 Isolate* isolate = Isolate::Current(); 1482 Isolate* isolate = Isolate::Current();
1494 CHECK_ISOLATE_SCOPE(isolate); 1483 CHECK_ISOLATE_SCOPE(isolate);
1495 return Api::True(); 1484 return Api::True();
1496 } 1485 }
1497 1486
1498 1487
1499 DART_EXPORT Dart_Handle Dart_False() { 1488 DART_EXPORT Dart_Handle Dart_False() {
1500 Isolate* isolate = Isolate::Current(); 1489 Isolate* isolate = Isolate::Current();
1501 CHECK_ISOLATE_SCOPE(isolate); 1490 CHECK_ISOLATE_SCOPE(isolate);
1502 return Api::False(); 1491 return Api::False();
1503 } 1492 }
1504 1493
1505 1494
1506 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) {
1507 return Api::ClassId(object) == kBoolCid;
1508 }
1509
1510
1511 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) { 1495 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) {
1512 Isolate* isolate = Isolate::Current(); 1496 Isolate* isolate = Isolate::Current();
1513 CHECK_ISOLATE_SCOPE(isolate); 1497 CHECK_ISOLATE_SCOPE(isolate);
1514 return value ? Api::True() : Api::False(); 1498 return value ? Api::True() : Api::False();
1515 } 1499 }
1516 1500
1517 1501
1518 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, 1502 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj,
1519 bool* value) { 1503 bool* value) {
1520 Isolate* isolate = Isolate::Current(); 1504 Isolate* isolate = Isolate::Current();
1521 DARTSCOPE(isolate); 1505 DARTSCOPE(isolate);
1522 const Bool& obj = Api::UnwrapBoolHandle(isolate, boolean_obj); 1506 const Bool& obj = Api::UnwrapBoolHandle(isolate, boolean_obj);
1523 if (obj.IsNull()) { 1507 if (obj.IsNull()) {
1524 RETURN_TYPE_ERROR(isolate, boolean_obj, Bool); 1508 RETURN_TYPE_ERROR(isolate, boolean_obj, Bool);
1525 } 1509 }
1526 *value = obj.value(); 1510 *value = obj.value();
1527 return Api::Success(); 1511 return Api::Success();
1528 } 1512 }
1529 1513
1530 1514
1531 // --- Doubles ---
1532
1533
1534 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) {
1535 return Api::ClassId(object) == kDoubleCid;
1536 }
1537
1538
1539 DART_EXPORT Dart_Handle Dart_NewDouble(double value) {
1540 Isolate* isolate = Isolate::Current();
1541 DARTSCOPE(isolate);
1542 CHECK_CALLBACK_STATE(isolate);
1543 return Api::NewHandle(isolate, Double::New(value));
1544 }
1545
1546
1547 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj,
1548 double* value) {
1549 Isolate* isolate = Isolate::Current();
1550 DARTSCOPE(isolate);
1551 const Double& obj = Api::UnwrapDoubleHandle(isolate, double_obj);
1552 if (obj.IsNull()) {
1553 RETURN_TYPE_ERROR(isolate, double_obj, Double);
1554 }
1555 *value = obj.value();
1556 return Api::Success();
1557 }
1558
1559
1560 // --- Strings --- 1515 // --- Strings ---
1561 1516
1562 1517
1563 DART_EXPORT bool Dart_IsString(Dart_Handle object) {
1564 return RawObject::IsStringClassId(Api::ClassId(object));
1565 }
1566
1567
1568 DART_EXPORT bool Dart_IsStringLatin1(Dart_Handle object) {
1569 return RawObject::IsOneByteStringClassId(Api::ClassId(object));
1570 }
1571
1572
1573 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { 1518 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) {
1574 Isolate* isolate = Isolate::Current(); 1519 Isolate* isolate = Isolate::Current();
1575 DARTSCOPE(isolate); 1520 DARTSCOPE(isolate);
1576 const String& str_obj = Api::UnwrapStringHandle(isolate, str); 1521 const String& str_obj = Api::UnwrapStringHandle(isolate, str);
1577 if (str_obj.IsNull()) { 1522 if (str_obj.IsNull()) {
1578 RETURN_TYPE_ERROR(isolate, str, String); 1523 RETURN_TYPE_ERROR(isolate, str, String);
1579 } 1524 }
1580 *len = str_obj.Length(); 1525 *len = str_obj.Length();
1581 return Api::Success(); 1526 return Api::Success();
1582 } 1527 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 DARTSCOPE(isolate); 1574 DARTSCOPE(isolate);
1630 if (utf32_array == NULL && length != 0) { 1575 if (utf32_array == NULL && length != 0) {
1631 RETURN_NULL_ERROR(utf32_array); 1576 RETURN_NULL_ERROR(utf32_array);
1632 } 1577 }
1633 CHECK_LENGTH(length, String::kMaxElements); 1578 CHECK_LENGTH(length, String::kMaxElements);
1634 CHECK_CALLBACK_STATE(isolate); 1579 CHECK_CALLBACK_STATE(isolate);
1635 return Api::NewHandle(isolate, String::FromUTF32(utf32_array, length)); 1580 return Api::NewHandle(isolate, String::FromUTF32(utf32_array, length));
1636 } 1581 }
1637 1582
1638 1583
1639 DART_EXPORT bool Dart_IsExternalString(Dart_Handle object) {
1640 return RawObject::IsExternalStringClassId(Api::ClassId(object));
1641 }
1642
1643
1644 DART_EXPORT Dart_Handle Dart_ExternalStringGetPeer(Dart_Handle object, 1584 DART_EXPORT Dart_Handle Dart_ExternalStringGetPeer(Dart_Handle object,
1645 void** peer) { 1585 void** peer) {
1646 if (peer == NULL) { 1586 if (peer == NULL) {
1647 RETURN_NULL_ERROR(peer); 1587 RETURN_NULL_ERROR(peer);
1648 } 1588 }
1649 1589
1650 if (Api::ExternalStringGetPeerHelper(object, peer)) { 1590 if (Api::ExternalStringGetPeerHelper(object, peer)) {
1651 return Api::Success(); 1591 return Api::Success();
1652 } 1592 }
1653 1593
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1856 } 1796 }
1857 return Api::Null(); 1797 return Api::Null();
1858 } 1798 }
1859 return Api::NewHandle(isolate, 1799 return Api::NewHandle(isolate,
1860 str_obj.MakeExternal(array, length, peer, cback)); 1800 str_obj.MakeExternal(array, length, peer, cback));
1861 } 1801 }
1862 1802
1863 1803
1864 // --- Lists --- 1804 // --- Lists ---
1865 1805
1866
1867 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) {
1868 if (obj.IsInstance()) {
1869 const Instance& instance = Instance::Cast(obj);
1870 const Class& obj_class = Class::Handle(isolate, obj.clazz());
1871 const Class& list_class =
1872 Class::Handle(isolate, isolate->object_store()->list_class());
1873 Error& malformed_type_error = Error::Handle(isolate);
1874 if (obj_class.IsSubtypeOf(TypeArguments::Handle(isolate),
1875 list_class,
1876 TypeArguments::Handle(isolate),
1877 &malformed_type_error)) {
1878 ASSERT(malformed_type_error.IsNull()); // Type is a raw List.
1879 return instance.raw();
1880 }
1881 }
1882 return Instance::null();
1883 }
1884
1885
1886 DART_EXPORT bool Dart_IsList(Dart_Handle object) {
1887 if (RawObject::IsBuiltinListClassId(Api::ClassId(object))) {
1888 return true;
1889 }
1890
1891 Isolate* isolate = Isolate::Current();
1892 DARTSCOPE(isolate);
1893 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
1894 return GetListInstance(isolate, obj) != Instance::null();
1895 }
1896
1897
1898 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { 1806 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) {
1899 Isolate* isolate = Isolate::Current(); 1807 Isolate* isolate = Isolate::Current();
1900 DARTSCOPE(isolate); 1808 DARTSCOPE(isolate);
1901 CHECK_LENGTH(length, Array::kMaxElements); 1809 CHECK_LENGTH(length, Array::kMaxElements);
1902 CHECK_CALLBACK_STATE(isolate); 1810 CHECK_CALLBACK_STATE(isolate);
1903 return Api::NewHandle(isolate, Array::New(length)); 1811 return Api::NewHandle(isolate, Array::New(length));
1904 } 1812 }
1905 1813
1906 1814
1907 #define GET_LIST_LENGTH(isolate, type, obj, len) \ 1815 #define GET_LIST_LENGTH(isolate, type, obj, len) \
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
2351 } 2259 }
2352 return Api::Success(); 2260 return Api::Success();
2353 } 2261 }
2354 } 2262 }
2355 return Api::NewError("Object does not implement the 'List' interface"); 2263 return Api::NewError("Object does not implement the 'List' interface");
2356 } 2264 }
2357 2265
2358 2266
2359 // --- Typed Data --- 2267 // --- Typed Data ---
2360 2268
2361
2362 // Helper method to get the type of a TypedData object. 2269 // Helper method to get the type of a TypedData object.
2363 static Dart_TypedData_Type GetType(intptr_t class_id) { 2270 static Dart_TypedData_Type GetType(intptr_t class_id) {
2364 Dart_TypedData_Type type; 2271 Dart_TypedData_Type type;
2365 switch (class_id) { 2272 switch (class_id) {
2366 case kByteDataViewCid : 2273 case kByteDataViewCid :
2367 type = Dart_TypedData_kByteData; 2274 type = Dart_TypedData_kByteData;
2368 break; 2275 break;
2369 case kTypedDataInt8ArrayCid : 2276 case kTypedDataInt8ArrayCid :
2370 case kTypedDataInt8ArrayViewCid : 2277 case kTypedDataInt8ArrayViewCid :
2371 case kExternalTypedDataInt8ArrayCid : 2278 case kExternalTypedDataInt8ArrayCid :
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
2743 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); 2650 RETURN_TYPE_ERROR(isolate, object, 'TypedData');
2744 } 2651 }
2745 if (!RawObject::IsExternalTypedDataClassId(class_id)) { 2652 if (!RawObject::IsExternalTypedDataClassId(class_id)) {
2746 isolate->DecrementNoGCScopeDepth(); 2653 isolate->DecrementNoGCScopeDepth();
2747 END_NO_CALLBACK_SCOPE(isolate); 2654 END_NO_CALLBACK_SCOPE(isolate);
2748 } 2655 }
2749 return Api::Success(); 2656 return Api::Success();
2750 } 2657 }
2751 2658
2752 2659
2753 // --- Closures --- 2660 // --- Invoking Constructors, Methods, and Field accessors ---
2754
2755
2756 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
2757 // We can't use a fast class index check here because there are many
2758 // different signature classes for closures.
2759 Isolate* isolate = Isolate::Current();
2760 DARTSCOPE(isolate);
2761 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, object);
2762 return (!closure_obj.IsNull() && closure_obj.IsClosure());
2763 }
2764
2765
2766 DART_EXPORT Dart_Handle Dart_ClosureFunction(Dart_Handle closure) {
2767 Isolate* isolate = Isolate::Current();
2768 DARTSCOPE(isolate);
2769 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
2770 if (closure_obj.IsNull() || !closure_obj.IsClosure()) {
2771 RETURN_TYPE_ERROR(isolate, closure, Instance);
2772 }
2773
2774 ASSERT(ClassFinalizer::AllClassesFinalized());
2775
2776 RawFunction* rf = Closure::function(closure_obj);
2777 return Api::NewHandle(isolate, rf);
2778 }
2779
2780
2781 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
2782 int number_of_arguments,
2783 Dart_Handle* arguments) {
2784 Isolate* isolate = Isolate::Current();
2785 DARTSCOPE(isolate);
2786 CHECK_CALLBACK_STATE(isolate);
2787 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
2788 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) {
2789 RETURN_TYPE_ERROR(isolate, closure, Instance);
2790 }
2791 if (number_of_arguments < 0) {
2792 return Api::NewError(
2793 "%s expects argument 'number_of_arguments' to be non-negative.",
2794 CURRENT_FUNC);
2795 }
2796 ASSERT(ClassFinalizer::AllClassesFinalized());
2797
2798 // Set up arguments to include the closure as the first argument.
2799 const Array& args = Array::Handle(isolate,
2800 Array::New(number_of_arguments + 1));
2801 Object& obj = Object::Handle(isolate);
2802 args.SetAt(0, closure_obj);
2803 for (int i = 0; i < number_of_arguments; i++) {
2804 obj = Api::UnwrapHandle(arguments[i]);
2805 if (!obj.IsNull() && !obj.IsInstance()) {
2806 RETURN_TYPE_ERROR(isolate, arguments[i], Instance);
2807 }
2808 args.SetAt(i + 1, obj);
2809 }
2810 // Now try to invoke the closure.
2811 return Api::NewHandle(isolate, DartEntry::InvokeClosure(args));
2812 }
2813
2814
2815 // --- Classes ---
2816
2817
2818 DART_EXPORT bool Dart_IsClass(Dart_Handle handle) {
2819 Isolate* isolate = Isolate::Current();
2820 DARTSCOPE(isolate);
2821 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
2822 return obj.IsClass();
2823 }
2824
2825
2826 DART_EXPORT bool Dart_IsAbstractClass(Dart_Handle handle) {
2827 Isolate* isolate = Isolate::Current();
2828 DARTSCOPE(isolate);
2829 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
2830 if (obj.IsClass()) {
2831 return Class::Cast(obj).is_abstract();
2832 }
2833 return false;
2834 }
2835
2836
2837 DART_EXPORT Dart_Handle Dart_ClassName(Dart_Handle clazz) {
2838 Isolate* isolate = Isolate::Current();
2839 DARTSCOPE(isolate);
2840 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2841 if (cls.IsNull()) {
2842 RETURN_TYPE_ERROR(isolate, clazz, Class);
2843 }
2844 return Api::NewHandle(isolate, cls.UserVisibleName());
2845 }
2846
2847
2848 DART_EXPORT Dart_Handle Dart_ClassGetLibrary(Dart_Handle clazz) {
2849 Isolate* isolate = Isolate::Current();
2850 DARTSCOPE(isolate);
2851 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2852 if (cls.IsNull()) {
2853 RETURN_TYPE_ERROR(isolate, clazz, Class);
2854 }
2855
2856 #if defined(DEBUG)
2857 const Library& lib = Library::Handle(cls.library());
2858 if (lib.IsNull()) {
2859 // ASSERT(cls.IsDynamicClass() || cls.IsVoidClass());
2860 if (!cls.IsDynamicClass() && !cls.IsVoidClass()) {
2861 fprintf(stderr, "NO LIBRARY: %s\n", cls.ToCString());
2862 }
2863 }
2864 #endif
2865
2866 return Api::NewHandle(isolate, cls.library());
2867 }
2868
2869
2870 DART_EXPORT Dart_Handle Dart_ClassGetInterfaceCount(Dart_Handle clazz,
2871 intptr_t* count) {
2872 Isolate* isolate = Isolate::Current();
2873 DARTSCOPE(isolate);
2874 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2875 if (cls.IsNull()) {
2876 RETURN_TYPE_ERROR(isolate, clazz, Class);
2877 }
2878
2879 const Array& interface_types = Array::Handle(isolate, cls.interfaces());
2880 if (interface_types.IsNull()) {
2881 *count = 0;
2882 } else {
2883 *count = interface_types.Length();
2884 }
2885 return Api::Success();
2886 }
2887
2888
2889 DART_EXPORT Dart_Handle Dart_ClassGetInterfaceAt(Dart_Handle clazz,
2890 intptr_t index) {
2891 Isolate* isolate = Isolate::Current();
2892 DARTSCOPE(isolate);
2893 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2894 if (cls.IsNull()) {
2895 RETURN_TYPE_ERROR(isolate, clazz, Class);
2896 }
2897
2898 // Finalize all classes.
2899 Dart_Handle state = Api::CheckIsolateState(isolate);
2900 if (::Dart_IsError(state)) {
2901 return state;
2902 }
2903
2904 const Array& interface_types = Array::Handle(isolate, cls.interfaces());
2905 if (index < 0 || index >= interface_types.Length()) {
2906 return Api::NewError("%s: argument 'index' out of bounds.", CURRENT_FUNC);
2907 }
2908 Type& interface_type = Type::Handle(isolate);
2909 interface_type ^= interface_types.At(index);
2910 if (interface_type.HasResolvedTypeClass()) {
2911 return Api::NewHandle(isolate, interface_type.type_class());
2912 }
2913 const String& type_name =
2914 String::Handle(isolate, interface_type.TypeClassName());
2915 return Api::NewError("%s: internal error: found unresolved type class '%s'.",
2916 CURRENT_FUNC, type_name.ToCString());
2917 }
2918
2919
2920 DART_EXPORT bool Dart_ClassIsTypedef(Dart_Handle clazz) {
2921 Isolate* isolate = Isolate::Current();
2922 DARTSCOPE(isolate);
2923 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2924 if (cls.IsNull()) {
2925 RETURN_TYPE_ERROR(isolate, clazz, Class);
2926 }
2927 // For now we represent typedefs as non-canonical signature classes.
2928 // I anticipate this may change if we make typedefs more general.
2929 return cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass();
2930 }
2931
2932
2933 DART_EXPORT Dart_Handle Dart_ClassGetTypedefReferent(Dart_Handle clazz) {
2934 Isolate* isolate = Isolate::Current();
2935 DARTSCOPE(isolate);
2936 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2937 if (cls.IsNull()) {
2938 RETURN_TYPE_ERROR(isolate, clazz, Class);
2939 }
2940
2941 if (!cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()) {
2942 const String& cls_name = String::Handle(cls.UserVisibleName());
2943 return Api::NewError("%s: class '%s' is not a typedef class. "
2944 "See Dart_ClassIsTypedef.",
2945 CURRENT_FUNC, cls_name.ToCString());
2946 }
2947
2948 const Function& func = Function::Handle(isolate, cls.signature_function());
2949 return Api::NewHandle(isolate, func.signature_class());
2950 }
2951
2952
2953 DART_EXPORT bool Dart_ClassIsFunctionType(Dart_Handle clazz) {
2954 Isolate* isolate = Isolate::Current();
2955 DARTSCOPE(isolate);
2956 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2957 if (cls.IsNull()) {
2958 RETURN_TYPE_ERROR(isolate, clazz, Class);
2959 }
2960 // A class represents a function type when it is a canonical
2961 // signature class.
2962 return cls.IsCanonicalSignatureClass();
2963 }
2964
2965
2966 DART_EXPORT Dart_Handle Dart_ClassGetFunctionTypeSignature(Dart_Handle clazz) {
2967 Isolate* isolate = Isolate::Current();
2968 DARTSCOPE(isolate);
2969 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
2970 if (cls.IsNull()) {
2971 RETURN_TYPE_ERROR(isolate, clazz, Class);
2972 }
2973 if (!cls.IsCanonicalSignatureClass()) {
2974 const String& cls_name = String::Handle(cls.UserVisibleName());
2975 return Api::NewError("%s: class '%s' is not a function-type class. "
2976 "See Dart_ClassIsFunctionType.",
2977 CURRENT_FUNC, cls_name.ToCString());
2978 }
2979 return Api::NewHandle(isolate, cls.signature_function());
2980 }
2981
2982
2983 // --- Function and Variable Reflection ---
2984
2985
2986 // Outside of the vm, we expose setter names with a trailing '='.
2987 static bool HasExternalSetterSuffix(const String& name) {
2988 return name.CharAt(name.Length() - 1) == '=';
2989 }
2990
2991
2992 static RawString* RemoveExternalSetterSuffix(const String& name) {
2993 ASSERT(HasExternalSetterSuffix(name));
2994 return String::SubString(name, 0, name.Length() - 1);
2995 }
2996
2997
2998 DART_EXPORT Dart_Handle Dart_GetFunctionNames(Dart_Handle target) {
2999 Isolate* isolate = Isolate::Current();
3000 DARTSCOPE(isolate);
3001 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
3002 if (obj.IsError()) {
3003 return target;
3004 }
3005
3006 const GrowableObjectArray& names =
3007 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
3008 Function& func = Function::Handle();
3009 String& name = String::Handle();
3010
3011 if (obj.IsClass()) {
3012 const Class& cls = Class::Cast(obj);
3013 const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
3014 if (!error.IsNull()) {
3015 return Api::NewHandle(isolate, error.raw());
3016 }
3017 const Array& func_array = Array::Handle(cls.functions());
3018
3019 // Some special types like 'dynamic' have a null functions list.
3020 if (!func_array.IsNull()) {
3021 for (intptr_t i = 0; i < func_array.Length(); ++i) {
3022 func ^= func_array.At(i);
3023
3024 // Skip implicit getters and setters.
3025 if (func.kind() == RawFunction::kImplicitGetter ||
3026 func.kind() == RawFunction::kImplicitSetter ||
3027 func.kind() == RawFunction::kConstImplicitGetter ||
3028 func.kind() == RawFunction::kMethodExtractor) {
3029 continue;
3030 }
3031
3032 name = func.UserVisibleName();
3033 names.Add(name);
3034 }
3035 }
3036 } else if (obj.IsLibrary()) {
3037 const Library& lib = Library::Cast(obj);
3038 DictionaryIterator it(lib);
3039 Object& obj = Object::Handle();
3040 while (it.HasNext()) {
3041 obj = it.GetNext();
3042 if (obj.IsFunction()) {
3043 func ^= obj.raw();
3044 name = func.UserVisibleName();
3045 names.Add(name);
3046 }
3047 }
3048 } else {
3049 return Api::NewError(
3050 "%s expects argument 'target' to be a class or library.",
3051 CURRENT_FUNC);
3052 }
3053 return Api::NewHandle(isolate, Array::MakeArray(names));
3054 }
3055
3056
3057 DART_EXPORT Dart_Handle Dart_LookupFunction(Dart_Handle target,
3058 Dart_Handle function_name) {
3059 Isolate* isolate = Isolate::Current();
3060 DARTSCOPE(isolate);
3061 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
3062 if (obj.IsError()) {
3063 return target;
3064 }
3065 const String& func_name = Api::UnwrapStringHandle(isolate, function_name);
3066 if (func_name.IsNull()) {
3067 RETURN_TYPE_ERROR(isolate, function_name, String);
3068 }
3069
3070 Function& func = Function::Handle(isolate);
3071 String& tmp_name = String::Handle(isolate);
3072 if (obj.IsClass()) {
3073 const Class& cls = Class::Cast(obj);
3074
3075 // Case 1. Lookup the unmodified function name.
3076 func = cls.LookupFunctionAllowPrivate(func_name);
3077
3078 // Case 2. Lookup the function without the external setter suffix
3079 // '='. Make sure to do this check after the regular lookup, so
3080 // that we don't interfere with operator lookups (like ==).
3081 if (func.IsNull() && HasExternalSetterSuffix(func_name)) {
3082 tmp_name = RemoveExternalSetterSuffix(func_name);
3083 tmp_name = Field::SetterName(tmp_name);
3084 func = cls.LookupFunctionAllowPrivate(tmp_name);
3085 }
3086
3087 // Case 3. Lookup the funciton with the getter prefix prepended.
3088 if (func.IsNull()) {
3089 tmp_name = Field::GetterName(func_name);
3090 func = cls.LookupFunctionAllowPrivate(tmp_name);
3091 }
3092
3093 // Case 4. Lookup the function with a . appended to find the
3094 // unnamed constructor.
3095 if (func.IsNull()) {
3096 tmp_name = String::Concat(func_name, Symbols::Dot());
3097 func = cls.LookupFunctionAllowPrivate(tmp_name);
3098 }
3099 } else if (obj.IsLibrary()) {
3100 const Library& lib = Library::Cast(obj);
3101
3102 // Case 1. Lookup the unmodified function name.
3103 func = lib.LookupFunctionAllowPrivate(func_name);
3104
3105 // Case 2. Lookup the function without the external setter suffix
3106 // '='. Make sure to do this check after the regular lookup, so
3107 // that we don't interfere with operator lookups (like ==).
3108 if (func.IsNull() && HasExternalSetterSuffix(func_name)) {
3109 tmp_name = RemoveExternalSetterSuffix(func_name);
3110 tmp_name = Field::SetterName(tmp_name);
3111 func = lib.LookupFunctionAllowPrivate(tmp_name);
3112 }
3113
3114 // Case 3. Lookup the function with the getter prefix prepended.
3115 if (func.IsNull()) {
3116 tmp_name = Field::GetterName(func_name);
3117 func = lib.LookupFunctionAllowPrivate(tmp_name);
3118 }
3119 } else {
3120 return Api::NewError(
3121 "%s expects argument 'target' to be a class or library.",
3122 CURRENT_FUNC);
3123 }
3124
3125 #if defined(DEBUG)
3126 if (!func.IsNull()) {
3127 // We only provide access to a subset of function kinds.
3128 RawFunction::Kind func_kind = func.kind();
3129 ASSERT(func_kind == RawFunction::kRegularFunction ||
3130 func_kind == RawFunction::kGetterFunction ||
3131 func_kind == RawFunction::kSetterFunction ||
3132 func_kind == RawFunction::kConstructor);
3133 }
3134 #endif
3135 return Api::NewHandle(isolate, func.raw());
3136 }
3137
3138
3139 DART_EXPORT bool Dart_IsFunction(Dart_Handle handle) {
3140 return Api::ClassId(handle) == kFunctionCid;
3141 }
3142
3143
3144 DART_EXPORT Dart_Handle Dart_FunctionName(Dart_Handle function) {
3145 Isolate* isolate = Isolate::Current();
3146 DARTSCOPE(isolate);
3147 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3148 if (func.IsNull()) {
3149 RETURN_TYPE_ERROR(isolate, function, Function);
3150 }
3151 return Api::NewHandle(isolate, func.UserVisibleName());
3152 }
3153
3154
3155 DART_EXPORT Dart_Handle Dart_FunctionOwner(Dart_Handle function) {
3156 Isolate* isolate = Isolate::Current();
3157 DARTSCOPE(isolate);
3158 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3159 if (func.IsNull()) {
3160 RETURN_TYPE_ERROR(isolate, function, Function);
3161 }
3162 if (func.IsNonImplicitClosureFunction()) {
3163 RawFunction* parent_function = func.parent_function();
3164 return Api::NewHandle(isolate, parent_function);
3165 }
3166 const Class& owner = Class::Handle(func.Owner());
3167 ASSERT(!owner.IsNull());
3168 if (owner.IsTopLevel()) {
3169 // Top-level functions are implemented as members of a hidden class. We hide
3170 // that class here and instead answer the library.
3171 #if defined(DEBUG)
3172 const Library& lib = Library::Handle(owner.library());
3173 if (lib.IsNull()) {
3174 ASSERT(owner.IsDynamicClass() || owner.IsVoidClass());
3175 }
3176 #endif
3177 return Api::NewHandle(isolate, owner.library());
3178 } else {
3179 return Api::NewHandle(isolate, owner.raw());
3180 }
3181 }
3182
3183
3184 DART_EXPORT Dart_Handle Dart_FunctionIsAbstract(Dart_Handle function,
3185 bool* is_abstract) {
3186 Isolate* isolate = Isolate::Current();
3187 DARTSCOPE(isolate);
3188 if (is_abstract == NULL) {
3189 RETURN_NULL_ERROR(is_abstract);
3190 }
3191 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3192 if (func.IsNull()) {
3193 RETURN_TYPE_ERROR(isolate, function, Function);
3194 }
3195 *is_abstract = func.is_abstract();
3196 return Api::Success();
3197 }
3198
3199
3200 DART_EXPORT Dart_Handle Dart_FunctionIsStatic(Dart_Handle function,
3201 bool* is_static) {
3202 Isolate* isolate = Isolate::Current();
3203 DARTSCOPE(isolate);
3204 if (is_static == NULL) {
3205 RETURN_NULL_ERROR(is_static);
3206 }
3207 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3208 if (func.IsNull()) {
3209 RETURN_TYPE_ERROR(isolate, function, Function);
3210 }
3211 *is_static = func.is_static();
3212 return Api::Success();
3213 }
3214
3215
3216 DART_EXPORT Dart_Handle Dart_FunctionIsConstructor(Dart_Handle function,
3217 bool* is_constructor) {
3218 Isolate* isolate = Isolate::Current();
3219 DARTSCOPE(isolate);
3220 if (is_constructor == NULL) {
3221 RETURN_NULL_ERROR(is_constructor);
3222 }
3223 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3224 if (func.IsNull()) {
3225 RETURN_TYPE_ERROR(isolate, function, Function);
3226 }
3227 *is_constructor = func.kind() == RawFunction::kConstructor;
3228 return Api::Success();
3229 }
3230
3231
3232 DART_EXPORT Dart_Handle Dart_FunctionIsGetter(Dart_Handle function,
3233 bool* is_getter) {
3234 Isolate* isolate = Isolate::Current();
3235 DARTSCOPE(isolate);
3236 if (is_getter == NULL) {
3237 RETURN_NULL_ERROR(is_getter);
3238 }
3239 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3240 if (func.IsNull()) {
3241 RETURN_TYPE_ERROR(isolate, function, Function);
3242 }
3243 *is_getter = func.IsGetterFunction();
3244 return Api::Success();
3245 }
3246
3247
3248 DART_EXPORT Dart_Handle Dart_FunctionIsSetter(Dart_Handle function,
3249 bool* is_setter) {
3250 Isolate* isolate = Isolate::Current();
3251 DARTSCOPE(isolate);
3252 if (is_setter == NULL) {
3253 RETURN_NULL_ERROR(is_setter);
3254 }
3255 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3256 if (func.IsNull()) {
3257 RETURN_TYPE_ERROR(isolate, function, Function);
3258 }
3259 *is_setter = (func.kind() == RawFunction::kSetterFunction);
3260 return Api::Success();
3261 }
3262
3263
3264 DART_EXPORT Dart_Handle Dart_FunctionReturnType(Dart_Handle function) {
3265 Isolate* isolate = Isolate::Current();
3266 DARTSCOPE(isolate);
3267 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3268 if (func.IsNull()) {
3269 RETURN_TYPE_ERROR(isolate, function, Function);
3270 }
3271
3272 if (func.kind() == RawFunction::kConstructor) {
3273 // Special case the return type for constructors. Inside the vm
3274 // we mark them as returning dynamic, but for the purposes of
3275 // reflection, they return the type of the class being
3276 // constructed.
3277 return Api::NewHandle(isolate, func.Owner());
3278 } else {
3279 const AbstractType& return_type =
3280 AbstractType::Handle(isolate, func.result_type());
3281 return TypeToHandle(isolate, "Dart_FunctionReturnType", return_type);
3282 }
3283 }
3284
3285
3286 DART_EXPORT Dart_Handle Dart_FunctionParameterCounts(
3287 Dart_Handle function,
3288 int64_t* fixed_param_count,
3289 int64_t* opt_param_count) {
3290 Isolate* isolate = Isolate::Current();
3291 DARTSCOPE(isolate);
3292 if (fixed_param_count == NULL) {
3293 RETURN_NULL_ERROR(fixed_param_count);
3294 }
3295 if (opt_param_count == NULL) {
3296 RETURN_NULL_ERROR(opt_param_count);
3297 }
3298 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3299 if (func.IsNull()) {
3300 RETURN_TYPE_ERROR(isolate, function, Function);
3301 }
3302
3303 // We hide implicit parameters, such as a method's receiver. This is
3304 // consistent with Invoke or New, which don't expect their callers to
3305 // provide them in the argument lists they are handed.
3306 *fixed_param_count = func.num_fixed_parameters() -
3307 func.NumImplicitParameters();
3308 // TODO(regis): Separately report named and positional optional param counts.
3309 *opt_param_count = func.NumOptionalParameters();
3310
3311 ASSERT(*fixed_param_count >= 0);
3312 ASSERT(*opt_param_count >= 0);
3313
3314 return Api::Success();
3315 }
3316
3317
3318 DART_EXPORT Dart_Handle Dart_FunctionParameterType(Dart_Handle function,
3319 int parameter_index) {
3320 Isolate* isolate = Isolate::Current();
3321 DARTSCOPE(isolate);
3322 const Function& func = Api::UnwrapFunctionHandle(isolate, function);
3323 if (func.IsNull()) {
3324 RETURN_TYPE_ERROR(isolate, function, Function);
3325 }
3326
3327 const intptr_t num_implicit_params = func.NumImplicitParameters();
3328 const intptr_t num_params = func.NumParameters() - num_implicit_params;
3329 if (parameter_index < 0 || parameter_index >= num_params) {
3330 return Api::NewError(
3331 "%s: argument 'parameter_index' out of range. "
3332 "Expected 0..%"Pd" but saw %d.",
3333 CURRENT_FUNC, num_params, parameter_index);
3334 }
3335 const AbstractType& param_type =
3336 AbstractType::Handle(isolate, func.ParameterTypeAt(
3337 num_implicit_params + parameter_index));
3338 return TypeToHandle(isolate, "Dart_FunctionParameterType", param_type);
3339 }
3340
3341
3342 DART_EXPORT Dart_Handle Dart_GetVariableNames(Dart_Handle target) {
3343 Isolate* isolate = Isolate::Current();
3344 DARTSCOPE(isolate);
3345 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
3346 if (obj.IsError()) {
3347 return target;
3348 }
3349
3350 const GrowableObjectArray& names =
3351 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
3352 Field& field = Field::Handle(isolate);
3353 String& name = String::Handle(isolate);
3354
3355 if (obj.IsClass()) {
3356 const Class& cls = Class::Cast(obj);
3357 const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
3358 if (!error.IsNull()) {
3359 return Api::NewHandle(isolate, error.raw());
3360 }
3361 const Array& field_array = Array::Handle(cls.fields());
3362
3363 // Some special types like 'dynamic' have a null fields list.
3364 //
3365 // TODO(turnidge): Fix 'dynamic' so that it does not have a null
3366 // fields list. This will have to wait until the empty array is
3367 // allocated in the vm isolate.
3368 if (!field_array.IsNull()) {
3369 for (intptr_t i = 0; i < field_array.Length(); ++i) {
3370 field ^= field_array.At(i);
3371 name = field.UserVisibleName();
3372 names.Add(name);
3373 }
3374 }
3375 } else if (obj.IsLibrary()) {
3376 const Library& lib = Library::Cast(obj);
3377 DictionaryIterator it(lib);
3378 Object& obj = Object::Handle(isolate);
3379 while (it.HasNext()) {
3380 obj = it.GetNext();
3381 if (obj.IsField()) {
3382 field ^= obj.raw();
3383 name = field.UserVisibleName();
3384 names.Add(name);
3385 }
3386 }
3387 } else {
3388 return Api::NewError(
3389 "%s expects argument 'target' to be a class or library.",
3390 CURRENT_FUNC);
3391 }
3392 return Api::NewHandle(isolate, Array::MakeArray(names));
3393 }
3394
3395
3396 DART_EXPORT Dart_Handle Dart_LookupVariable(Dart_Handle target,
3397 Dart_Handle variable_name) {
3398 Isolate* isolate = Isolate::Current();
3399 DARTSCOPE(isolate);
3400 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
3401 if (obj.IsError()) {
3402 return target;
3403 }
3404 const String& var_name = Api::UnwrapStringHandle(isolate, variable_name);
3405 if (var_name.IsNull()) {
3406 RETURN_TYPE_ERROR(isolate, variable_name, String);
3407 }
3408 if (obj.IsClass()) {
3409 const Class& cls = Class::Cast(obj);
3410 return Api::NewHandle(isolate, cls.LookupField(var_name));
3411 }
3412 if (obj.IsLibrary()) {
3413 const Library& lib = Library::Cast(obj);
3414 return Api::NewHandle(isolate, lib.LookupFieldAllowPrivate(var_name));
3415 }
3416 return Api::NewError(
3417 "%s expects argument 'target' to be a class or library.",
3418 CURRENT_FUNC);
3419 }
3420
3421
3422 DART_EXPORT bool Dart_IsVariable(Dart_Handle handle) {
3423 return Api::ClassId(handle) == kFieldCid;
3424 }
3425
3426
3427 DART_EXPORT Dart_Handle Dart_VariableName(Dart_Handle variable) {
3428 Isolate* isolate = Isolate::Current();
3429 DARTSCOPE(isolate);
3430 const Field& var = Api::UnwrapFieldHandle(isolate, variable);
3431 if (var.IsNull()) {
3432 RETURN_TYPE_ERROR(isolate, variable, Field);
3433 }
3434 return Api::NewHandle(isolate, var.UserVisibleName());
3435 }
3436
3437
3438 DART_EXPORT Dart_Handle Dart_VariableIsStatic(Dart_Handle variable,
3439 bool* is_static) {
3440 Isolate* isolate = Isolate::Current();
3441 DARTSCOPE(isolate);
3442 if (is_static == NULL) {
3443 RETURN_NULL_ERROR(is_static);
3444 }
3445 const Field& var = Api::UnwrapFieldHandle(isolate, variable);
3446 if (var.IsNull()) {
3447 RETURN_TYPE_ERROR(isolate, variable, Field);
3448 }
3449 *is_static = var.is_static();
3450 return Api::Success();
3451 }
3452
3453
3454 DART_EXPORT Dart_Handle Dart_VariableIsFinal(Dart_Handle variable,
3455 bool* is_final) {
3456 Isolate* isolate = Isolate::Current();
3457 DARTSCOPE(isolate);
3458 if (is_final == NULL) {
3459 RETURN_NULL_ERROR(is_final);
3460 }
3461 const Field& var = Api::UnwrapFieldHandle(isolate, variable);
3462 if (var.IsNull()) {
3463 RETURN_TYPE_ERROR(isolate, variable, Field);
3464 }
3465 *is_final = var.is_final();
3466 return Api::Success();
3467 }
3468
3469
3470 DART_EXPORT Dart_Handle Dart_VariableType(Dart_Handle variable) {
3471 Isolate* isolate = Isolate::Current();
3472 DARTSCOPE(isolate);
3473 const Field& var = Api::UnwrapFieldHandle(isolate, variable);
3474 if (var.IsNull()) {
3475 RETURN_TYPE_ERROR(isolate, variable, Field);
3476 }
3477
3478 const AbstractType& type = AbstractType::Handle(isolate, var.type());
3479 return TypeToHandle(isolate, "Dart_VariableType", type);
3480 }
3481
3482
3483 DART_EXPORT Dart_Handle Dart_GetTypeVariableNames(Dart_Handle clazz) {
3484 Isolate* isolate = Isolate::Current();
3485 DARTSCOPE(isolate);
3486 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
3487 if (cls.IsNull()) {
3488 RETURN_TYPE_ERROR(isolate, clazz, Class);
3489 }
3490
3491 const intptr_t num_type_params = cls.NumTypeParameters();
3492 const TypeArguments& type_params =
3493 TypeArguments::Handle(cls.type_parameters());
3494
3495 const GrowableObjectArray& names =
3496 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
3497 TypeParameter& type_param = TypeParameter::Handle(isolate);
3498 String& name = String::Handle(isolate);
3499 for (intptr_t i = 0; i < num_type_params; i++) {
3500 type_param ^= type_params.TypeAt(i);
3501 name = type_param.name();
3502 names.Add(name);
3503 }
3504 return Api::NewHandle(isolate, Array::MakeArray(names));
3505 }
3506
3507
3508 DART_EXPORT Dart_Handle Dart_LookupTypeVariable(
3509 Dart_Handle clazz,
3510 Dart_Handle type_variable_name) {
3511 Isolate* isolate = Isolate::Current();
3512 DARTSCOPE(isolate);
3513 const Class& cls = Api::UnwrapClassHandle(isolate, clazz);
3514 if (cls.IsNull()) {
3515 RETURN_TYPE_ERROR(isolate, clazz, Class);
3516 }
3517 const String& var_name = Api::UnwrapStringHandle(isolate, type_variable_name);
3518 if (var_name.IsNull()) {
3519 RETURN_TYPE_ERROR(isolate, type_variable_name, String);
3520 }
3521
3522 const intptr_t num_type_params = cls.NumTypeParameters();
3523 const TypeArguments& type_params =
3524 TypeArguments::Handle(cls.type_parameters());
3525
3526 TypeParameter& type_param = TypeParameter::Handle(isolate);
3527 String& name = String::Handle(isolate);
3528 for (intptr_t i = 0; i < num_type_params; i++) {
3529 type_param ^= type_params.TypeAt(i);
3530 name = type_param.name();
3531 if (name.Equals(var_name)) {
3532 return Api::NewHandle(isolate, type_param.raw());
3533 }
3534 }
3535 const String& cls_name = String::Handle(cls.UserVisibleName());
3536 return Api::NewError(
3537 "%s: Could not find type variable named '%s' for class %s.\n",
3538 CURRENT_FUNC, var_name.ToCString(), cls_name.ToCString());
3539 }
3540
3541
3542 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) {
3543 return Api::ClassId(handle) == kTypeParameterCid;
3544 }
3545
3546 DART_EXPORT Dart_Handle Dart_TypeVariableName(Dart_Handle type_variable) {
3547 Isolate* isolate = Isolate::Current();
3548 DARTSCOPE(isolate);
3549 const TypeParameter& type_var =
3550 Api::UnwrapTypeParameterHandle(isolate, type_variable);
3551 if (type_var.IsNull()) {
3552 RETURN_TYPE_ERROR(isolate, type_variable, TypeParameter);
3553 }
3554 return Api::NewHandle(isolate, type_var.name());
3555 }
3556
3557
3558 DART_EXPORT Dart_Handle Dart_TypeVariableOwner(Dart_Handle type_variable) {
3559 Isolate* isolate = Isolate::Current();
3560 DARTSCOPE(isolate);
3561 const TypeParameter& type_var =
3562 Api::UnwrapTypeParameterHandle(isolate, type_variable);
3563 if (type_var.IsNull()) {
3564 RETURN_TYPE_ERROR(isolate, type_variable, TypeParameter);
3565 }
3566 const Class& owner = Class::Handle(type_var.parameterized_class());
3567 ASSERT(!owner.IsNull() && owner.IsClass());
3568 return Api::NewHandle(isolate, owner.raw());
3569 }
3570
3571
3572 DART_EXPORT Dart_Handle Dart_TypeVariableUpperBound(Dart_Handle type_variable) {
3573 Isolate* isolate = Isolate::Current();
3574 DARTSCOPE(isolate);
3575 const TypeParameter& type_var =
3576 Api::UnwrapTypeParameterHandle(isolate, type_variable);
3577 if (type_var.IsNull()) {
3578 RETURN_TYPE_ERROR(isolate, type_variable, TypeParameter);
3579 }
3580 const AbstractType& bound = AbstractType::Handle(type_var.bound());
3581 return TypeToHandle(isolate, "Dart_TypeVariableUpperBound", bound);
3582 }
3583
3584
3585 // --- Constructors, Methods, and Fields ---
3586
3587 2661
3588 static RawObject* ResolveConstructor(const char* current_func, 2662 static RawObject* ResolveConstructor(const char* current_func,
3589 const Class& cls, 2663 const Class& cls,
3590 const String& class_name, 2664 const String& class_name,
3591 const String& constr_name, 2665 const String& constr_name,
3592 int num_args) { 2666 int num_args) {
3593 // The constructor must be present in the interface. 2667 // The constructor must be present in the interface.
3594 const Function& constructor = 2668 const Function& constructor =
3595 Function::Handle(cls.LookupFunctionAllowPrivate(constr_name)); 2669 Function::Handle(cls.LookupFunctionAllowPrivate(constr_name));
3596 if (constructor.IsNull() || 2670 if (constructor.IsNull() ||
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
3872 return Api::NewHandle(isolate, DartEntry::InvokeFunction(function, args)); 2946 return Api::NewHandle(isolate, DartEntry::InvokeFunction(function, args));
3873 2947
3874 } else { 2948 } else {
3875 return Api::NewError( 2949 return Api::NewError(
3876 "%s expects argument 'target' to be an object, class, or library.", 2950 "%s expects argument 'target' to be an object, class, or library.",
3877 CURRENT_FUNC); 2951 CURRENT_FUNC);
3878 } 2952 }
3879 } 2953 }
3880 2954
3881 2955
2956 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
2957 int number_of_arguments,
2958 Dart_Handle* arguments) {
2959 Isolate* isolate = Isolate::Current();
2960 DARTSCOPE(isolate);
2961 CHECK_CALLBACK_STATE(isolate);
2962 const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
2963 if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) {
2964 RETURN_TYPE_ERROR(isolate, closure, Instance);
2965 }
2966 if (number_of_arguments < 0) {
2967 return Api::NewError(
2968 "%s expects argument 'number_of_arguments' to be non-negative.",
2969 CURRENT_FUNC);
2970 }
2971 ASSERT(ClassFinalizer::AllClassesFinalized());
2972
2973 // Set up arguments to include the closure as the first argument.
2974 const Array& args = Array::Handle(isolate,
2975 Array::New(number_of_arguments + 1));
2976 Object& obj = Object::Handle(isolate);
2977 args.SetAt(0, closure_obj);
2978 for (int i = 0; i < number_of_arguments; i++) {
2979 obj = Api::UnwrapHandle(arguments[i]);
2980 if (!obj.IsNull() && !obj.IsInstance()) {
2981 RETURN_TYPE_ERROR(isolate, arguments[i], Instance);
2982 }
2983 args.SetAt(i + 1, obj);
2984 }
2985 // Now try to invoke the closure.
2986 return Api::NewHandle(isolate, DartEntry::InvokeClosure(args));
2987 }
2988
2989
3882 static bool FieldIsUninitialized(Isolate* isolate, const Field& fld) { 2990 static bool FieldIsUninitialized(Isolate* isolate, const Field& fld) {
3883 ASSERT(!fld.IsNull()); 2991 ASSERT(!fld.IsNull());
3884 2992
3885 // Return getter method for uninitialized fields, rather than the 2993 // Return getter method for uninitialized fields, rather than the
3886 // field object, since the value in the field object will not be 2994 // field object, since the value in the field object will not be
3887 // initialized until the first time the getter is invoked. 2995 // initialized until the first time the getter is invoked.
3888 const Instance& value = Instance::Handle(isolate, fld.value()); 2996 const Instance& value = Instance::Handle(isolate, fld.value());
3889 ASSERT(value.raw() != Object::transition_sentinel().raw()); 2997 ASSERT(value.raw() != Object::transition_sentinel().raw());
3890 return value.raw() == Object::sentinel().raw(); 2998 return value.raw() == Object::sentinel().raw();
3891 } 2999 }
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
4149 } else if (obj.IsError()) { 3257 } else if (obj.IsError()) {
4150 return container; 3258 return container;
4151 } else { 3259 } else {
4152 return Api::NewError( 3260 return Api::NewError(
4153 "%s expects argument 'container' to be an object, class, or library.", 3261 "%s expects argument 'container' to be an object, class, or library.",
4154 CURRENT_FUNC); 3262 CURRENT_FUNC);
4155 } 3263 }
4156 } 3264 }
4157 3265
4158 3266
3267 // --- Exceptions ----
3268
3269 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
3270 Isolate* isolate = Isolate::Current();
3271 CHECK_ISOLATE(isolate);
3272 CHECK_CALLBACK_STATE(isolate);
3273 {
3274 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
3275 if (excp.IsNull()) {
3276 RETURN_TYPE_ERROR(isolate, exception, Instance);
3277 }
3278 }
3279 if (isolate->top_exit_frame_info() == 0) {
3280 // There are no dart frames on the stack so it would be illegal to
3281 // throw an exception here.
3282 return Api::NewError("No Dart frames on stack, cannot throw exception");
3283 }
3284
3285 // Unwind all the API scopes till the exit frame before throwing an
3286 // exception.
3287 ApiState* state = isolate->api_state();
3288 ASSERT(state != NULL);
3289 const Instance* saved_exception;
3290 {
3291 NoGCScope no_gc;
3292 RawInstance* raw_exception =
3293 Api::UnwrapInstanceHandle(isolate, exception).raw();
3294 state->UnwindScopes(isolate->top_exit_frame_info());
3295 saved_exception = &Instance::Handle(raw_exception);
3296 }
3297 Exceptions::Throw(*saved_exception);
3298 return Api::NewError("Exception was not thrown, internal error");
3299 }
3300
3301
3302 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception,
3303 Dart_Handle stacktrace) {
3304 Isolate* isolate = Isolate::Current();
3305 CHECK_ISOLATE(isolate);
3306 CHECK_CALLBACK_STATE(isolate);
3307 {
3308 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
3309 if (excp.IsNull()) {
3310 RETURN_TYPE_ERROR(isolate, exception, Instance);
3311 }
3312 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace);
3313 if (stk.IsNull()) {
3314 RETURN_TYPE_ERROR(isolate, stacktrace, Instance);
3315 }
3316 }
3317 if (isolate->top_exit_frame_info() == 0) {
3318 // There are no dart frames on the stack so it would be illegal to
3319 // throw an exception here.
3320 return Api::NewError("No Dart frames on stack, cannot throw exception");
3321 }
3322
3323 // Unwind all the API scopes till the exit frame before throwing an
3324 // exception.
3325 ApiState* state = isolate->api_state();
3326 ASSERT(state != NULL);
3327 const Instance* saved_exception;
3328 const Instance* saved_stacktrace;
3329 {
3330 NoGCScope no_gc;
3331 RawInstance* raw_exception =
3332 Api::UnwrapInstanceHandle(isolate, exception).raw();
3333 RawInstance* raw_stacktrace =
3334 Api::UnwrapInstanceHandle(isolate, stacktrace).raw();
3335 state->UnwindScopes(isolate->top_exit_frame_info());
3336 saved_exception = &Instance::Handle(raw_exception);
3337 saved_stacktrace = &Instance::Handle(raw_stacktrace);
3338 }
3339 Exceptions::ReThrow(*saved_exception, *saved_stacktrace);
3340 return Api::NewError("Exception was not re thrown, internal error");
3341 }
3342
3343
3344 // --- Native fields and functions ---
3345
4159 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, 3346 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library,
4160 Dart_Handle name, 3347 Dart_Handle name,
4161 int field_count) { 3348 int field_count) {
4162 Isolate* isolate = Isolate::Current(); 3349 Isolate* isolate = Isolate::Current();
4163 DARTSCOPE(isolate); 3350 DARTSCOPE(isolate);
4164 const String& cls_name = Api::UnwrapStringHandle(isolate, name); 3351 const String& cls_name = Api::UnwrapStringHandle(isolate, name);
4165 if (cls_name.IsNull()) { 3352 if (cls_name.IsNull()) {
4166 RETURN_TYPE_ERROR(isolate, name, String); 3353 RETURN_TYPE_ERROR(isolate, name, String);
4167 } 3354 }
4168 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 3355 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4231 if (!instance.IsValidNativeIndex(index)) { 3418 if (!instance.IsValidNativeIndex(index)) {
4232 return Api::NewError( 3419 return Api::NewError(
4233 "%s: invalid index %d passed in to set native instance field", 3420 "%s: invalid index %d passed in to set native instance field",
4234 CURRENT_FUNC, index); 3421 CURRENT_FUNC, index);
4235 } 3422 }
4236 instance.SetNativeField(index, value); 3423 instance.SetNativeField(index, value);
4237 return Api::Success(); 3424 return Api::Success();
4238 } 3425 }
4239 3426
4240 3427
4241 // --- Exceptions ----
4242
4243
4244 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) {
4245 Isolate* isolate = Isolate::Current();
4246 CHECK_ISOLATE(isolate);
4247 CHECK_CALLBACK_STATE(isolate);
4248 {
4249 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
4250 if (excp.IsNull()) {
4251 RETURN_TYPE_ERROR(isolate, exception, Instance);
4252 }
4253 }
4254 if (isolate->top_exit_frame_info() == 0) {
4255 // There are no dart frames on the stack so it would be illegal to
4256 // throw an exception here.
4257 return Api::NewError("No Dart frames on stack, cannot throw exception");
4258 }
4259
4260 // Unwind all the API scopes till the exit frame before throwing an
4261 // exception.
4262 ApiState* state = isolate->api_state();
4263 ASSERT(state != NULL);
4264 const Instance* saved_exception;
4265 {
4266 NoGCScope no_gc;
4267 RawInstance* raw_exception =
4268 Api::UnwrapInstanceHandle(isolate, exception).raw();
4269 state->UnwindScopes(isolate->top_exit_frame_info());
4270 saved_exception = &Instance::Handle(raw_exception);
4271 }
4272 Exceptions::Throw(*saved_exception);
4273 return Api::NewError("Exception was not thrown, internal error");
4274 }
4275
4276
4277 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception,
4278 Dart_Handle stacktrace) {
4279 Isolate* isolate = Isolate::Current();
4280 CHECK_ISOLATE(isolate);
4281 CHECK_CALLBACK_STATE(isolate);
4282 {
4283 const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception);
4284 if (excp.IsNull()) {
4285 RETURN_TYPE_ERROR(isolate, exception, Instance);
4286 }
4287 const Instance& stk = Api::UnwrapInstanceHandle(isolate, stacktrace);
4288 if (stk.IsNull()) {
4289 RETURN_TYPE_ERROR(isolate, stacktrace, Instance);
4290 }
4291 }
4292 if (isolate->top_exit_frame_info() == 0) {
4293 // There are no dart frames on the stack so it would be illegal to
4294 // throw an exception here.
4295 return Api::NewError("No Dart frames on stack, cannot throw exception");
4296 }
4297
4298 // Unwind all the API scopes till the exit frame before throwing an
4299 // exception.
4300 ApiState* state = isolate->api_state();
4301 ASSERT(state != NULL);
4302 const Instance* saved_exception;
4303 const Instance* saved_stacktrace;
4304 {
4305 NoGCScope no_gc;
4306 RawInstance* raw_exception =
4307 Api::UnwrapInstanceHandle(isolate, exception).raw();
4308 RawInstance* raw_stacktrace =
4309 Api::UnwrapInstanceHandle(isolate, stacktrace).raw();
4310 state->UnwindScopes(isolate->top_exit_frame_info());
4311 saved_exception = &Instance::Handle(raw_exception);
4312 saved_stacktrace = &Instance::Handle(raw_stacktrace);
4313 }
4314 Exceptions::ReThrow(*saved_exception, *saved_stacktrace);
4315 return Api::NewError("Exception was not re thrown, internal error");
4316 }
4317
4318
4319 // --- Native functions ---
4320
4321
4322 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, 3428 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args,
4323 int index) { 3429 int index) {
4324 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); 3430 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
4325 if ((index < 0) || (index >= arguments->NativeArgCount())) { 3431 if ((index < 0) || (index >= arguments->NativeArgCount())) {
4326 return Api::NewError( 3432 return Api::NewError(
4327 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", 3433 "%s: argument 'index' out of range. Expected 0..%d but saw %d.",
4328 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); 3434 CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
4329 } 3435 }
4330 return Api::NewHandle(arguments->isolate(), arguments->NativeArgAt(index)); 3436 return Api::NewHandle(arguments->isolate(), arguments->NativeArgAt(index));
4331 } 3437 }
(...skipping 11 matching lines...) Expand all
4343 if (!ret_obj.IsNull() && !ret_obj.IsInstance()) { 3449 if (!ret_obj.IsNull() && !ret_obj.IsInstance()) {
4344 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", 3450 FATAL1("Return value check failed: saw '%s' expected a dart Instance.",
4345 ret_obj.ToCString()); 3451 ret_obj.ToCString());
4346 } 3452 }
4347 NoGCScope no_gc_scope; 3453 NoGCScope no_gc_scope;
4348 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); 3454 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
4349 arguments->SetReturn(ret_obj); 3455 arguments->SetReturn(ret_obj);
4350 } 3456 }
4351 3457
4352 3458
4353 // --- Metadata ----
4354
4355 DART_EXPORT Dart_Handle Dart_GetMetadata(Dart_Handle object) {
4356 Isolate* isolate = Isolate::Current();
4357 CHECK_ISOLATE(isolate);
4358 DARTSCOPE(isolate);
4359 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
4360 Class& cls = Class::Handle(isolate);
4361 if (obj.IsClass()) {
4362 cls ^= obj.raw();
4363 } else if (obj.IsFunction()) {
4364 cls = Function::Cast(obj).origin();
4365 } else if (obj.IsField()) {
4366 cls = Field::Cast(obj).origin();
4367 } else {
4368 return Api::NewHandle(isolate, Object::empty_array().raw());
4369 }
4370 const Library& lib = Library::Handle(cls.library());
4371 return Api::NewHandle(isolate, lib.GetMetadata(obj));
4372 }
4373
4374
4375 // --- Scripts and Libraries --- 3459 // --- Scripts and Libraries ---
4376 3460
4377
4378 DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler( 3461 DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler(
4379 Dart_LibraryTagHandler handler) { 3462 Dart_LibraryTagHandler handler) {
4380 Isolate* isolate = Isolate::Current(); 3463 Isolate* isolate = Isolate::Current();
4381 CHECK_ISOLATE(isolate); 3464 CHECK_ISOLATE(isolate);
4382 isolate->set_library_tag_handler(handler); 3465 isolate->set_library_tag_handler(handler);
4383 return Api::Success(); 3466 return Api::Success();
4384 } 3467 }
4385 3468
4386 3469
4387 // NOTE: Need to pass 'result' as a parameter here in order to avoid 3470 // NOTE: Need to pass 'result' as a parameter here in order to avoid
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4505 3588
4506 DART_EXPORT Dart_Handle Dart_RootLibrary() { 3589 DART_EXPORT Dart_Handle Dart_RootLibrary() {
4507 Isolate* isolate = Isolate::Current(); 3590 Isolate* isolate = Isolate::Current();
4508 DARTSCOPE(isolate); 3591 DARTSCOPE(isolate);
4509 Library& library = 3592 Library& library =
4510 Library::Handle(isolate, isolate->object_store()->root_library()); 3593 Library::Handle(isolate, isolate->object_store()->root_library());
4511 return Api::NewHandle(isolate, library.raw()); 3594 return Api::NewHandle(isolate, library.raw());
4512 } 3595 }
4513 3596
4514 3597
4515 static void CompileAll(Isolate* isolate, Dart_Handle* result) {
4516 ASSERT(isolate != NULL);
4517 const Error& error = Error::Handle(isolate, Library::CompileAll());
4518 if (error.IsNull()) {
4519 *result = Api::Success();
4520 } else {
4521 *result = Api::NewHandle(isolate, error.raw());
4522 }
4523 }
4524
4525
4526 DART_EXPORT Dart_Handle Dart_CompileAll() {
4527 Isolate* isolate = Isolate::Current();
4528 DARTSCOPE(isolate);
4529 Dart_Handle result = Api::CheckIsolateState(isolate);
4530 if (::Dart_IsError(result)) {
4531 return result;
4532 }
4533 CHECK_CALLBACK_STATE(isolate);
4534 CompileAll(isolate, &result);
4535 return result;
4536 }
4537
4538
4539 DART_EXPORT Dart_Handle Dart_CheckFunctionFingerprints() {
4540 Isolate* isolate = Isolate::Current();
4541 DARTSCOPE(isolate);
4542 Dart_Handle result = Api::CheckIsolateState(isolate);
4543 if (::Dart_IsError(result)) {
4544 return result;
4545 }
4546 CHECK_CALLBACK_STATE(isolate);
4547 Library::CheckFunctionFingerprints();
4548 return result;
4549 }
4550
4551
4552 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) {
4553 return Api::ClassId(object) == kLibraryCid;
4554 }
4555
4556
4557 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, 3598 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library,
4558 Dart_Handle class_name) { 3599 Dart_Handle class_name) {
4559 Isolate* isolate = Isolate::Current(); 3600 Isolate* isolate = Isolate::Current();
4560 DARTSCOPE(isolate); 3601 DARTSCOPE(isolate);
4561 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 3602 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4562 if (lib.IsNull()) { 3603 if (lib.IsNull()) {
4563 RETURN_TYPE_ERROR(isolate, library, Library); 3604 RETURN_TYPE_ERROR(isolate, library, Library);
4564 } 3605 }
4565 const String& cls_name = Api::UnwrapStringHandle(isolate, class_name); 3606 const String& cls_name = Api::UnwrapStringHandle(isolate, class_name);
4566 if (cls_name.IsNull()) { 3607 if (cls_name.IsNull()) {
4567 RETURN_TYPE_ERROR(isolate, class_name, String); 3608 RETURN_TYPE_ERROR(isolate, class_name, String);
4568 } 3609 }
4569 const Class& cls = 3610 const Class& cls =
4570 Class::Handle(isolate, lib.LookupClassAllowPrivate(cls_name)); 3611 Class::Handle(isolate, lib.LookupClassAllowPrivate(cls_name));
4571 if (cls.IsNull()) { 3612 if (cls.IsNull()) {
4572 // TODO(turnidge): Return null or error in this case? 3613 // TODO(turnidge): Return null or error in this case?
4573 const String& lib_name = String::Handle(isolate, lib.name()); 3614 const String& lib_name = String::Handle(isolate, lib.name());
4574 return Api::NewError("Class '%s' not found in library '%s'.", 3615 return Api::NewError("Class '%s' not found in library '%s'.",
4575 cls_name.ToCString(), lib_name.ToCString()); 3616 cls_name.ToCString(), lib_name.ToCString());
4576 } 3617 }
4577 return Api::NewHandle(isolate, cls.raw()); 3618 return Api::NewHandle(isolate, cls.raw());
4578 } 3619 }
4579 3620
4580 3621
4581 DART_EXPORT Dart_Handle Dart_LibraryName(Dart_Handle library) {
4582 Isolate* isolate = Isolate::Current();
4583 DARTSCOPE(isolate);
4584 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4585 if (lib.IsNull()) {
4586 RETURN_TYPE_ERROR(isolate, library, Library);
4587 }
4588 const String& name = String::Handle(isolate, lib.name());
4589 ASSERT(!name.IsNull());
4590 return Api::NewHandle(isolate, name.raw());
4591 }
4592
4593
4594 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) { 3622 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) {
4595 Isolate* isolate = Isolate::Current(); 3623 Isolate* isolate = Isolate::Current();
4596 DARTSCOPE(isolate); 3624 DARTSCOPE(isolate);
4597 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 3625 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4598 if (lib.IsNull()) { 3626 if (lib.IsNull()) {
4599 RETURN_TYPE_ERROR(isolate, library, Library); 3627 RETURN_TYPE_ERROR(isolate, library, Library);
4600 } 3628 }
4601 const String& url = String::Handle(isolate, lib.url()); 3629 const String& url = String::Handle(isolate, lib.url());
4602 ASSERT(!url.IsNull()); 3630 ASSERT(!url.IsNull());
4603 return Api::NewHandle(isolate, url.raw()); 3631 return Api::NewHandle(isolate, url.raw());
4604 } 3632 }
4605 3633
4606 3634
4607 DART_EXPORT Dart_Handle Dart_LibraryGetClassNames(Dart_Handle library) {
4608 Isolate* isolate = Isolate::Current();
4609 DARTSCOPE(isolate);
4610 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4611 if (lib.IsNull()) {
4612 RETURN_TYPE_ERROR(isolate, library, Library);
4613 }
4614
4615 const GrowableObjectArray& names =
4616 GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
4617 ClassDictionaryIterator it(lib);
4618 Class& cls = Class::Handle();
4619 String& name = String::Handle();
4620 while (it.HasNext()) {
4621 cls = it.GetNextClass();
4622 if (cls.IsSignatureClass()) {
4623 if (!cls.IsCanonicalSignatureClass()) {
4624 // This is a typedef. Add it to the list of class names.
4625 name = cls.UserVisibleName();
4626 names.Add(name);
4627 } else {
4628 // Skip canonical signature classes. These are not named.
4629 }
4630 } else {
4631 name = cls.UserVisibleName();
4632 names.Add(name);
4633 }
4634 }
4635 return Api::NewHandle(isolate, Array::MakeArray(names));
4636 }
4637
4638
4639 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) { 3635 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) {
4640 Isolate* isolate = Isolate::Current(); 3636 Isolate* isolate = Isolate::Current();
4641 DARTSCOPE(isolate); 3637 DARTSCOPE(isolate);
4642 const String& url_str = Api::UnwrapStringHandle(isolate, url); 3638 const String& url_str = Api::UnwrapStringHandle(isolate, url);
4643 if (url_str.IsNull()) { 3639 if (url_str.IsNull()) {
4644 RETURN_TYPE_ERROR(isolate, url, String); 3640 RETURN_TYPE_ERROR(isolate, url, String);
4645 } 3641 }
4646 const Library& library = 3642 const Library& library =
4647 Library::Handle(isolate, Library::LookupLibrary(url_str)); 3643 Library::Handle(isolate, Library::LookupLibrary(url_str));
4648 if (library.IsNull()) { 3644 if (library.IsNull()) {
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
4806 DARTSCOPE(isolate); 3802 DARTSCOPE(isolate);
4807 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); 3803 const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
4808 if (lib.IsNull()) { 3804 if (lib.IsNull()) {
4809 RETURN_TYPE_ERROR(isolate, library, Library); 3805 RETURN_TYPE_ERROR(isolate, library, Library);
4810 } 3806 }
4811 lib.set_native_entry_resolver(resolver); 3807 lib.set_native_entry_resolver(resolver);
4812 return Api::Success(); 3808 return Api::Success();
4813 } 3809 }
4814 3810
4815 3811
4816 // --- Profiling support ---
4817
4818 // TODO(7565): Dartium should use the new VM flag "generate_pprof_symbols" for
4819 // pprof profiling. Then these symbols should be removed.
4820
4821 DART_EXPORT void Dart_InitPprofSupport() { }
4822
4823 DART_EXPORT void Dart_GetPprofSymbolInfo(void** buffer, int* buffer_size) {
4824 *buffer = NULL;
4825 *buffer_size = 0;
4826 }
4827
4828
4829 // --- Peer support --- 3812 // --- Peer support ---
4830 3813
4831
4832 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) { 3814 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) {
4833 if (peer == NULL) { 3815 if (peer == NULL) {
4834 RETURN_NULL_ERROR(peer); 3816 RETURN_NULL_ERROR(peer);
4835 } 3817 }
4836 Isolate* isolate = Isolate::Current(); 3818 Isolate* isolate = Isolate::Current();
4837 DARTSCOPE(isolate); 3819 DARTSCOPE(isolate);
4838 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object)); 3820 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
4839 if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) { 3821 if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) {
4840 const char* msg = 3822 const char* msg =
4841 "%s: argument 'object' cannot be a subtype of Null, num, or bool"; 3823 "%s: argument 'object' cannot be a subtype of Null, num, or bool";
(...skipping 19 matching lines...) Expand all
4861 } 3843 }
4862 { 3844 {
4863 NoGCScope no_gc; 3845 NoGCScope no_gc;
4864 RawObject* raw_obj = obj.raw(); 3846 RawObject* raw_obj = obj.raw();
4865 isolate->heap()->SetPeer(raw_obj, peer); 3847 isolate->heap()->SetPeer(raw_obj, peer);
4866 } 3848 }
4867 return Api::Success(); 3849 return Api::Success();
4868 } 3850 }
4869 3851
4870 } // namespace dart 3852 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698