OLD | NEW |
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" | 6 #include "include/dart_mirrors_api.h" |
7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 | 165 |
166 static bool GetNativeStringArgument(NativeArguments* arguments, | 166 static bool GetNativeStringArgument(NativeArguments* arguments, |
167 int arg_index, | 167 int arg_index, |
168 Dart_Handle* str, | 168 Dart_Handle* str, |
169 void** peer) { | 169 void** peer) { |
170 ASSERT(peer != NULL); | 170 ASSERT(peer != NULL); |
171 if (Api::StringGetPeerHelper(arguments, arg_index, peer)) { | 171 if (Api::StringGetPeerHelper(arguments, arg_index, peer)) { |
172 *str = NULL; | 172 *str = NULL; |
173 return true; | 173 return true; |
174 } | 174 } |
175 Isolate* isolate = arguments->thread()->isolate(); | 175 Thread* thread = arguments->thread(); |
| 176 Isolate* isolate = thread->isolate(); |
176 ASSERT(isolate == Isolate::Current()); | 177 ASSERT(isolate == Isolate::Current()); |
177 *peer = NULL; | 178 *peer = NULL; |
178 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 179 REUSABLE_OBJECT_HANDLESCOPE(thread); |
179 Object& obj = isolate->ObjectHandle(); | 180 Object& obj = thread->ObjectHandle(); |
180 obj = arguments->NativeArgAt(arg_index); | 181 obj = arguments->NativeArgAt(arg_index); |
181 if (RawObject::IsStringClassId(obj.GetClassId())) { | 182 if (RawObject::IsStringClassId(obj.GetClassId())) { |
182 ASSERT(isolate->api_state() && | 183 ASSERT(isolate->api_state() && |
183 isolate->api_state()->top_scope() != NULL); | 184 isolate->api_state()->top_scope() != NULL); |
184 *str = Api::NewHandle(isolate, obj.raw()); | 185 *str = Api::NewHandle(isolate, obj.raw()); |
185 return true; | 186 return true; |
186 } | 187 } |
187 if (obj.IsNull()) { | 188 if (obj.IsNull()) { |
188 *str = Api::Null(); | 189 *str = Api::Null(); |
189 return true; | 190 return true; |
190 } | 191 } |
191 return false; | 192 return false; |
192 } | 193 } |
193 | 194 |
194 | 195 |
195 static bool GetNativeIntegerArgument(NativeArguments* arguments, | 196 static bool GetNativeIntegerArgument(NativeArguments* arguments, |
196 int arg_index, | 197 int arg_index, |
197 int64_t* value) { | 198 int64_t* value) { |
198 ASSERT(value != NULL); | 199 ASSERT(value != NULL); |
199 if (Api::GetNativeIntegerArgument(arguments, arg_index, value)) { | 200 if (Api::GetNativeIntegerArgument(arguments, arg_index, value)) { |
200 return true; | 201 return true; |
201 } | 202 } |
202 Isolate* isolate = arguments->thread()->isolate(); | 203 Thread* thread = arguments->thread(); |
203 ASSERT(isolate == Isolate::Current()); | 204 ASSERT(thread == Thread::Current()); |
204 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 205 REUSABLE_OBJECT_HANDLESCOPE(thread); |
205 Object& obj = isolate->ObjectHandle(); | 206 Object& obj = thread->ObjectHandle(); |
206 obj = arguments->NativeArgAt(arg_index); | 207 obj = arguments->NativeArgAt(arg_index); |
207 intptr_t cid = obj.GetClassId(); | 208 intptr_t cid = obj.GetClassId(); |
208 if (cid == kBigintCid) { | 209 if (cid == kBigintCid) { |
209 const Bigint& bigint = Bigint::Cast(obj); | 210 const Bigint& bigint = Bigint::Cast(obj); |
210 if (bigint.FitsIntoInt64()) { | 211 if (bigint.FitsIntoInt64()) { |
211 *value = bigint.AsInt64Value(); | 212 *value = bigint.AsInt64Value(); |
212 return true; | 213 return true; |
213 } | 214 } |
214 } | 215 } |
215 return false; | 216 return false; |
216 } | 217 } |
217 | 218 |
218 | 219 |
219 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments, | 220 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments, |
220 int arg_index, | 221 int arg_index, |
221 uint64_t* value) { | 222 uint64_t* value) { |
222 ASSERT(value != NULL); | 223 ASSERT(value != NULL); |
223 int64_t arg_value = 0; | 224 int64_t arg_value = 0; |
224 if (Api::GetNativeIntegerArgument(arguments, arg_index, &arg_value)) { | 225 if (Api::GetNativeIntegerArgument(arguments, arg_index, &arg_value)) { |
225 *value = static_cast<uint64_t>(arg_value); | 226 *value = static_cast<uint64_t>(arg_value); |
226 return true; | 227 return true; |
227 } | 228 } |
228 Isolate* isolate = arguments->thread()->isolate(); | 229 Thread* thread = arguments->thread(); |
229 ASSERT(isolate == Isolate::Current()); | 230 ASSERT(thread == Thread::Current()); |
230 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 231 REUSABLE_OBJECT_HANDLESCOPE(thread); |
231 Object& obj = isolate->ObjectHandle(); | 232 Object& obj = thread->ObjectHandle(); |
232 obj = arguments->NativeArgAt(arg_index); | 233 obj = arguments->NativeArgAt(arg_index); |
233 intptr_t cid = obj.GetClassId(); | 234 intptr_t cid = obj.GetClassId(); |
234 if (cid == kBigintCid) { | 235 if (cid == kBigintCid) { |
235 const Bigint& bigint = Bigint::Cast(obj); | 236 const Bigint& bigint = Bigint::Cast(obj); |
236 if (bigint.FitsIntoUint64()) { | 237 if (bigint.FitsIntoUint64()) { |
237 *value = bigint.AsUint64Value(); | 238 *value = bigint.AsUint64Value(); |
238 return true; | 239 return true; |
239 } | 240 } |
240 } | 241 } |
241 return false; | 242 return false; |
242 } | 243 } |
243 | 244 |
244 | 245 |
245 static bool GetNativeDoubleArgument(NativeArguments* arguments, | 246 static bool GetNativeDoubleArgument(NativeArguments* arguments, |
246 int arg_index, | 247 int arg_index, |
247 double* value) { | 248 double* value) { |
248 ASSERT(value != NULL); | 249 ASSERT(value != NULL); |
249 if (Api::GetNativeDoubleArgument(arguments, arg_index, value)) { | 250 if (Api::GetNativeDoubleArgument(arguments, arg_index, value)) { |
250 return true; | 251 return true; |
251 } | 252 } |
252 Isolate* isolate = arguments->thread()->isolate(); | 253 Thread* thread = arguments->thread(); |
253 ASSERT(isolate == Isolate::Current()); | 254 ASSERT(thread == Thread::Current()); |
254 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 255 REUSABLE_OBJECT_HANDLESCOPE(thread); |
255 Object& obj = isolate->ObjectHandle(); | 256 Object& obj = thread->ObjectHandle(); |
256 obj = arguments->NativeArgAt(arg_index); | 257 obj = arguments->NativeArgAt(arg_index); |
257 intptr_t cid = obj.GetClassId(); | 258 intptr_t cid = obj.GetClassId(); |
258 if (cid == kBigintCid) { | 259 if (cid == kBigintCid) { |
259 *value = Bigint::Cast(obj).AsDoubleValue(); | 260 *value = Bigint::Cast(obj).AsDoubleValue(); |
260 return true; | 261 return true; |
261 } | 262 } |
262 return false; | 263 return false; |
263 } | 264 } |
264 | 265 |
265 | 266 |
266 static Dart_Handle GetNativeFieldsOfArgument(NativeArguments* arguments, | 267 static Dart_Handle GetNativeFieldsOfArgument(NativeArguments* arguments, |
267 int arg_index, | 268 int arg_index, |
268 int num_fields, | 269 int num_fields, |
269 intptr_t* field_values, | 270 intptr_t* field_values, |
270 const char* current_func) { | 271 const char* current_func) { |
271 ASSERT(field_values != NULL); | 272 ASSERT(field_values != NULL); |
272 if (Api::GetNativeFieldsOfArgument(arguments, | 273 if (Api::GetNativeFieldsOfArgument(arguments, |
273 arg_index, | 274 arg_index, |
274 num_fields, | 275 num_fields, |
275 field_values)) { | 276 field_values)) { |
276 return Api::Success(); | 277 return Api::Success(); |
277 } | 278 } |
278 Isolate* isolate = arguments->thread()->isolate(); | 279 Thread* thread = arguments->thread(); |
279 ASSERT(isolate == Isolate::Current()); | 280 ASSERT(thread == Thread::Current()); |
280 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 281 REUSABLE_OBJECT_HANDLESCOPE(thread); |
281 Object& obj = isolate->ObjectHandle(); | 282 Object& obj = thread->ObjectHandle(); |
282 obj = arguments->NativeArgAt(arg_index); | 283 obj = arguments->NativeArgAt(arg_index); |
283 if (obj.IsNull()) { | 284 if (obj.IsNull()) { |
284 memset(field_values, 0, (num_fields * sizeof(field_values[0]))); | 285 memset(field_values, 0, (num_fields * sizeof(field_values[0]))); |
285 return Api::Success(); | 286 return Api::Success(); |
286 } | 287 } |
287 // We did not succeed in extracting the native fields report the | 288 // We did not succeed in extracting the native fields report the |
288 // appropriate error. | 289 // appropriate error. |
289 if (!obj.IsInstance()) { | 290 if (!obj.IsInstance()) { |
290 return Api::NewError("%s expects argument at index '%d' to be of" | 291 return Api::NewError("%s expects argument at index '%d' to be of" |
291 " type Instance.", current_func, arg_index); | 292 " type Instance.", current_func, arg_index); |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1002 ApiState* state = I->api_state(); | 1003 ApiState* state = I->api_state(); |
1003 ASSERT(state != NULL); | 1004 ASSERT(state != NULL); |
1004 ASSERT(state->IsValidPersistentHandle(obj1)); | 1005 ASSERT(state->IsValidPersistentHandle(obj1)); |
1005 const Object& obj2_ref = Object::Handle(Z, Api::UnwrapHandle(obj2)); | 1006 const Object& obj2_ref = Object::Handle(Z, Api::UnwrapHandle(obj2)); |
1006 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1); | 1007 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1); |
1007 obj1_ref->set_raw(obj2_ref); | 1008 obj1_ref->set_raw(obj2_ref); |
1008 } | 1009 } |
1009 | 1010 |
1010 | 1011 |
1011 static Dart_WeakPersistentHandle AllocateFinalizableHandle( | 1012 static Dart_WeakPersistentHandle AllocateFinalizableHandle( |
1012 Isolate* isolate, | 1013 Thread* thread, |
1013 Dart_Handle object, | 1014 Dart_Handle object, |
1014 bool is_prologue, | 1015 bool is_prologue, |
1015 void* peer, | 1016 void* peer, |
1016 intptr_t external_allocation_size, | 1017 intptr_t external_allocation_size, |
1017 Dart_WeakPersistentHandleFinalizer callback) { | 1018 Dart_WeakPersistentHandleFinalizer callback) { |
1018 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 1019 REUSABLE_OBJECT_HANDLESCOPE(thread); |
1019 Object& ref = isolate->ObjectHandle(); | 1020 Object& ref = thread->ObjectHandle(); |
1020 ref = Api::UnwrapHandle(object); | 1021 ref = Api::UnwrapHandle(object); |
1021 FinalizablePersistentHandle* finalizable_ref = | 1022 FinalizablePersistentHandle* finalizable_ref = |
1022 FinalizablePersistentHandle::New(isolate, | 1023 FinalizablePersistentHandle::New(thread->isolate(), |
1023 is_prologue, | 1024 is_prologue, |
1024 ref, | 1025 ref, |
1025 peer, | 1026 peer, |
1026 callback, | 1027 callback, |
1027 external_allocation_size); | 1028 external_allocation_size); |
1028 return finalizable_ref->apiHandle(); | 1029 return finalizable_ref->apiHandle(); |
1029 } | 1030 } |
1030 | 1031 |
1031 | 1032 |
1032 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( | 1033 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( |
1033 Dart_Handle object, | 1034 Dart_Handle object, |
1034 void* peer, | 1035 void* peer, |
1035 intptr_t external_allocation_size, | 1036 intptr_t external_allocation_size, |
1036 Dart_WeakPersistentHandleFinalizer callback) { | 1037 Dart_WeakPersistentHandleFinalizer callback) { |
1037 Isolate* isolate = Isolate::Current(); | 1038 Thread* thread = Thread::Current(); |
1038 CHECK_ISOLATE(isolate); | 1039 CHECK_ISOLATE(thread->isolate()); |
1039 if (callback == NULL) { | 1040 if (callback == NULL) { |
1040 return NULL; | 1041 return NULL; |
1041 } | 1042 } |
1042 return AllocateFinalizableHandle(isolate, | 1043 return AllocateFinalizableHandle(thread, |
1043 object, | 1044 object, |
1044 false, | 1045 false, |
1045 peer, | 1046 peer, |
1046 external_allocation_size, | 1047 external_allocation_size, |
1047 callback); | 1048 callback); |
1048 } | 1049 } |
1049 | 1050 |
1050 | 1051 |
1051 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle( | 1052 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle( |
1052 Dart_Handle object, | 1053 Dart_Handle object, |
1053 void* peer, | 1054 void* peer, |
1054 intptr_t external_allocation_size, | 1055 intptr_t external_allocation_size, |
1055 Dart_WeakPersistentHandleFinalizer callback) { | 1056 Dart_WeakPersistentHandleFinalizer callback) { |
1056 Isolate* isolate = Isolate::Current(); | 1057 Thread* thread = Thread::Current(); |
1057 CHECK_ISOLATE(isolate); | 1058 CHECK_ISOLATE(thread->isolate()); |
1058 if (callback == NULL) { | 1059 if (callback == NULL) { |
1059 return NULL; | 1060 return NULL; |
1060 } | 1061 } |
1061 return AllocateFinalizableHandle(isolate, | 1062 return AllocateFinalizableHandle(thread, |
1062 object, | 1063 object, |
1063 true, | 1064 true, |
1064 peer, | 1065 peer, |
1065 external_allocation_size, | 1066 external_allocation_size, |
1066 callback); | 1067 callback); |
1067 } | 1068 } |
1068 | 1069 |
1069 | 1070 |
1070 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { | 1071 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { |
1071 Isolate* isolate = Isolate::Current(); | 1072 Isolate* isolate = Isolate::Current(); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 } | 1206 } |
1206 } | 1207 } |
1207 isolate->set_gc_prologue_callback(prologue_callback); | 1208 isolate->set_gc_prologue_callback(prologue_callback); |
1208 isolate->set_gc_epilogue_callback(epilogue_callback); | 1209 isolate->set_gc_epilogue_callback(epilogue_callback); |
1209 return Api::Success(); | 1210 return Api::Success(); |
1210 } | 1211 } |
1211 | 1212 |
1212 | 1213 |
1213 class PrologueWeakVisitor : public HandleVisitor { | 1214 class PrologueWeakVisitor : public HandleVisitor { |
1214 public: | 1215 public: |
1215 PrologueWeakVisitor(Isolate* isolate, | 1216 PrologueWeakVisitor(Thread* thread, |
1216 Dart_GcPrologueWeakHandleCallback callback) | 1217 Dart_GcPrologueWeakHandleCallback callback) |
1217 : HandleVisitor(isolate), | 1218 : HandleVisitor(thread), |
1218 callback_(callback) { | 1219 callback_(callback) { |
1219 } | 1220 } |
1220 | 1221 |
| 1222 |
1221 void VisitHandle(uword addr) { | 1223 void VisitHandle(uword addr) { |
1222 NoSafepointScope no_safepoint; | 1224 NoSafepointScope no_safepoint; |
1223 FinalizablePersistentHandle* handle = | 1225 FinalizablePersistentHandle* handle = |
1224 reinterpret_cast<FinalizablePersistentHandle*>(addr); | 1226 reinterpret_cast<FinalizablePersistentHandle*>(addr); |
1225 RawObject* raw_obj = handle->raw(); | 1227 RawObject* raw_obj = handle->raw(); |
1226 if (raw_obj->IsHeapObject()) { | 1228 if (raw_obj->IsHeapObject()) { |
1227 ASSERT(handle->IsPrologueWeakPersistent()); | 1229 ASSERT(handle->IsPrologueWeakPersistent()); |
1228 ReusableInstanceHandleScope reused_instance_handle(isolate()); | 1230 ReusableInstanceHandleScope reused_instance_handle(thread()); |
1229 Instance& instance = reused_instance_handle.Handle(); | 1231 Instance& instance = reused_instance_handle.Handle(); |
1230 instance ^= reinterpret_cast<RawInstance*>(handle->raw()); | 1232 instance ^= reinterpret_cast<RawInstance*>(handle->raw()); |
1231 intptr_t num_native_fields = instance.NumNativeFields(); | 1233 intptr_t num_native_fields = instance.NumNativeFields(); |
1232 intptr_t* native_fields = instance.NativeFieldsDataAddr(); | 1234 intptr_t* native_fields = instance.NativeFieldsDataAddr(); |
1233 if (native_fields != NULL) { | 1235 if (native_fields != NULL) { |
1234 callback_(isolate()->init_callback_data(), | 1236 callback_(thread()->isolate()->init_callback_data(), |
1235 reinterpret_cast<Dart_WeakPersistentHandle>(addr), | 1237 reinterpret_cast<Dart_WeakPersistentHandle>(addr), |
1236 num_native_fields, | 1238 num_native_fields, |
1237 native_fields); | 1239 native_fields); |
1238 } | 1240 } |
1239 } | 1241 } |
1240 } | 1242 } |
1241 | 1243 |
1242 private: | 1244 private: |
1243 Dart_GcPrologueWeakHandleCallback callback_; | 1245 Dart_GcPrologueWeakHandleCallback callback_; |
1244 | 1246 |
1245 DISALLOW_COPY_AND_ASSIGN(PrologueWeakVisitor); | 1247 DISALLOW_COPY_AND_ASSIGN(PrologueWeakVisitor); |
1246 }; | 1248 }; |
1247 | 1249 |
1248 | 1250 |
1249 DART_EXPORT Dart_Handle Dart_VisitPrologueWeakHandles( | 1251 DART_EXPORT Dart_Handle Dart_VisitPrologueWeakHandles( |
1250 Dart_GcPrologueWeakHandleCallback callback) { | 1252 Dart_GcPrologueWeakHandleCallback callback) { |
1251 Isolate* isolate = Isolate::Current(); | 1253 Thread* thread = Thread::Current(); |
1252 CHECK_ISOLATE(isolate); | 1254 CHECK_ISOLATE(thread->isolate()); |
1253 PrologueWeakVisitor visitor(isolate, callback); | 1255 PrologueWeakVisitor visitor(thread, callback); |
1254 isolate->VisitPrologueWeakPersistentHandles(&visitor); | 1256 thread->isolate()->VisitPrologueWeakPersistentHandles(&visitor); |
1255 return Api::Success(); | 1257 return Api::Success(); |
1256 } | 1258 } |
1257 | 1259 |
1258 | 1260 |
1259 // --- Initialization and Globals --- | 1261 // --- Initialization and Globals --- |
1260 | 1262 |
1261 DART_EXPORT const char* Dart_VersionString() { | 1263 DART_EXPORT const char* Dart_VersionString() { |
1262 return Version::String(); | 1264 return Version::String(); |
1263 } | 1265 } |
1264 | 1266 |
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1903 Error& malformed_type_error = Error::Handle(Z); | 1905 Error& malformed_type_error = Error::Handle(Z); |
1904 *value = instance.IsInstanceOf(type_obj, | 1906 *value = instance.IsInstanceOf(type_obj, |
1905 Object::null_type_arguments(), | 1907 Object::null_type_arguments(), |
1906 &malformed_type_error); | 1908 &malformed_type_error); |
1907 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. | 1909 ASSERT(malformed_type_error.IsNull()); // Type was created from a class. |
1908 return Api::Success(); | 1910 return Api::Success(); |
1909 } | 1911 } |
1910 | 1912 |
1911 | 1913 |
1912 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) { | 1914 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) { |
1913 Isolate* isolate = Isolate::Current(); | 1915 Thread* thread = Thread::Current(); |
1914 CHECK_ISOLATE(isolate); | 1916 CHECK_ISOLATE(thread->isolate()); |
1915 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 1917 REUSABLE_OBJECT_HANDLESCOPE(thread); |
1916 Object& ref = isolate->ObjectHandle(); | 1918 Object& ref = thread->ObjectHandle(); |
1917 ref = Api::UnwrapHandle(object); | 1919 ref = Api::UnwrapHandle(object); |
1918 return ref.IsInstance(); | 1920 return ref.IsInstance(); |
1919 } | 1921 } |
1920 | 1922 |
1921 | 1923 |
1922 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) { | 1924 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) { |
1923 TRACE_API_CALL(CURRENT_FUNC); | 1925 TRACE_API_CALL(CURRENT_FUNC); |
1924 return RawObject::IsNumberClassId(Api::ClassId(object)); | 1926 return RawObject::IsNumberClassId(Api::ClassId(object)); |
1925 } | 1927 } |
1926 | 1928 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2006 | 2008 |
2007 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) { | 2009 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) { |
2008 TRACE_API_CALL(CURRENT_FUNC); | 2010 TRACE_API_CALL(CURRENT_FUNC); |
2009 return Api::ClassId(handle) == kTypeParameterCid; | 2011 return Api::ClassId(handle) == kTypeParameterCid; |
2010 } | 2012 } |
2011 | 2013 |
2012 | 2014 |
2013 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { | 2015 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { |
2014 // We can't use a fast class index check here because there are many | 2016 // We can't use a fast class index check here because there are many |
2015 // different signature classes for closures. | 2017 // different signature classes for closures. |
2016 Isolate* isolate = Isolate::Current(); | 2018 Thread* thread = Thread::Current(); |
2017 CHECK_ISOLATE(isolate); | 2019 CHECK_ISOLATE(thread->isolate()); |
2018 ReusableObjectHandleScope reused_obj_handle(isolate); | 2020 ReusableObjectHandleScope reused_obj_handle(thread); |
2019 const Instance& closure_obj = | 2021 const Instance& closure_obj = |
2020 Api::UnwrapInstanceHandle(reused_obj_handle, object); | 2022 Api::UnwrapInstanceHandle(reused_obj_handle, object); |
2021 return (!closure_obj.IsNull() && closure_obj.IsClosure()); | 2023 return (!closure_obj.IsNull() && closure_obj.IsClosure()); |
2022 } | 2024 } |
2023 | 2025 |
2024 | 2026 |
2025 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { | 2027 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { |
2026 TRACE_API_CALL(CURRENT_FUNC); | 2028 TRACE_API_CALL(CURRENT_FUNC); |
2027 intptr_t cid = Api::ClassId(handle); | 2029 intptr_t cid = Api::ClassId(handle); |
2028 return RawObject::IsTypedDataClassId(cid) || | 2030 return RawObject::IsTypedDataClassId(cid) || |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2296 } | 2298 } |
2297 *value = obj.value(); | 2299 *value = obj.value(); |
2298 return Api::Success(); | 2300 return Api::Success(); |
2299 } | 2301 } |
2300 | 2302 |
2301 | 2303 |
2302 // --- Strings --- | 2304 // --- Strings --- |
2303 | 2305 |
2304 | 2306 |
2305 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { | 2307 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { |
2306 Isolate* isolate = Isolate::Current(); | 2308 Thread* thread = Thread::Current(); |
2307 CHECK_ISOLATE(isolate); | 2309 CHECK_ISOLATE(thread->isolate()); |
2308 ReusableObjectHandleScope reused_obj_handle(isolate); | 2310 ReusableObjectHandleScope reused_obj_handle(thread); |
2309 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); | 2311 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); |
2310 if (str_obj.IsNull()) { | 2312 if (str_obj.IsNull()) { |
2311 RETURN_TYPE_ERROR(isolate, str, String); | 2313 RETURN_TYPE_ERROR(thread->isolate(), str, String); |
2312 } | 2314 } |
2313 *len = str_obj.Length(); | 2315 *len = str_obj.Length(); |
2314 return Api::Success(); | 2316 return Api::Success(); |
2315 } | 2317 } |
2316 | 2318 |
2317 | 2319 |
2318 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { | 2320 DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char* str) { |
2319 DARTSCOPE(Thread::Current()); | 2321 DARTSCOPE(Thread::Current()); |
2320 if (str == NULL) { | 2322 if (str == NULL) { |
2321 RETURN_NULL_ERROR(str); | 2323 RETURN_NULL_ERROR(str); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2493 for (intptr_t i = 0; i < copy_len; i++) { | 2495 for (intptr_t i = 0; i < copy_len; i++) { |
2494 utf16_array[i] = str_obj.CharAt(i); | 2496 utf16_array[i] = str_obj.CharAt(i); |
2495 } | 2497 } |
2496 *length = copy_len; | 2498 *length = copy_len; |
2497 return Api::Success(); | 2499 return Api::Success(); |
2498 } | 2500 } |
2499 | 2501 |
2500 | 2502 |
2501 DART_EXPORT Dart_Handle Dart_StringStorageSize(Dart_Handle str, | 2503 DART_EXPORT Dart_Handle Dart_StringStorageSize(Dart_Handle str, |
2502 intptr_t* size) { | 2504 intptr_t* size) { |
2503 Isolate* isolate = Isolate::Current(); | 2505 Thread* thread = Thread::Current(); |
2504 CHECK_ISOLATE(isolate); | 2506 CHECK_ISOLATE(thread->isolate()); |
2505 ReusableObjectHandleScope reused_obj_handle(isolate); | 2507 ReusableObjectHandleScope reused_obj_handle(thread); |
2506 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); | 2508 const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str); |
2507 if (str_obj.IsNull()) { | 2509 if (str_obj.IsNull()) { |
2508 RETURN_TYPE_ERROR(isolate, str, String); | 2510 RETURN_TYPE_ERROR(thread->isolate(), str, String); |
2509 } | 2511 } |
2510 if (size == NULL) { | 2512 if (size == NULL) { |
2511 RETURN_NULL_ERROR(size); | 2513 RETURN_NULL_ERROR(size); |
2512 } | 2514 } |
2513 *size = (str_obj.Length() * str_obj.CharSize()); | 2515 *size = (str_obj.Length() * str_obj.CharSize()); |
2514 return Api::Success(); | 2516 return Api::Success(); |
2515 } | 2517 } |
2516 | 2518 |
2517 | 2519 |
2518 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str, | 2520 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2564 return str; | 2566 return str; |
2565 } | 2567 } |
2566 return Api::NewHandle(I, str_obj.MakeExternal(array, length, peer, cback)); | 2568 return Api::NewHandle(I, str_obj.MakeExternal(array, length, peer, cback)); |
2567 } | 2569 } |
2568 | 2570 |
2569 | 2571 |
2570 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, | 2572 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, |
2571 intptr_t* char_size, | 2573 intptr_t* char_size, |
2572 intptr_t* str_len, | 2574 intptr_t* str_len, |
2573 void** peer) { | 2575 void** peer) { |
2574 Isolate* isolate = Isolate::Current(); | 2576 Thread* thread = Thread::Current(); |
2575 CHECK_ISOLATE(isolate); | 2577 CHECK_ISOLATE(thread->isolate()); |
2576 ReusableObjectHandleScope reused_obj_handle(isolate); | 2578 ReusableObjectHandleScope reused_obj_handle(thread); |
2577 const String& str = Api::UnwrapStringHandle(reused_obj_handle, object); | 2579 const String& str = Api::UnwrapStringHandle(reused_obj_handle, object); |
2578 if (str.IsNull()) { | 2580 if (str.IsNull()) { |
2579 RETURN_TYPE_ERROR(isolate, object, String); | 2581 RETURN_TYPE_ERROR(thread->isolate(), object, String); |
2580 } | 2582 } |
2581 if (str.IsExternal()) { | 2583 if (str.IsExternal()) { |
2582 *peer = str.GetPeer(); | 2584 *peer = str.GetPeer(); |
2583 ASSERT(*peer != NULL); | 2585 ASSERT(*peer != NULL); |
2584 } else { | 2586 } else { |
2585 NoSafepointScope no_safepoint_scope; | 2587 NoSafepointScope no_safepoint_scope; |
2586 *peer = isolate->heap()->GetPeer(str.raw()); | 2588 *peer = thread->isolate()->heap()->GetPeer(str.raw()); |
2587 } | 2589 } |
2588 *char_size = str.CharSize(); | 2590 *char_size = str.CharSize(); |
2589 *str_len = str.Length(); | 2591 *str_len = str.Length(); |
2590 return Api::Success(); | 2592 return Api::Success(); |
2591 } | 2593 } |
2592 | 2594 |
2593 | 2595 |
2594 // --- Lists --- | 2596 // --- Lists --- |
2595 | 2597 |
2596 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { | 2598 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { |
(...skipping 1994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4591 if (cls.IsNull()) { | 4593 if (cls.IsNull()) { |
4592 return Api::NewError( | 4594 return Api::NewError( |
4593 "Unable to create native wrapper class : already exists"); | 4595 "Unable to create native wrapper class : already exists"); |
4594 } | 4596 } |
4595 return Api::NewHandle(I, cls.RareType()); | 4597 return Api::NewHandle(I, cls.RareType()); |
4596 } | 4598 } |
4597 | 4599 |
4598 | 4600 |
4599 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj, | 4601 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj, |
4600 int* count) { | 4602 int* count) { |
4601 Isolate* isolate = Isolate::Current(); | 4603 Thread* thread = Thread::Current(); |
4602 CHECK_ISOLATE(isolate); | 4604 CHECK_ISOLATE(thread->isolate()); |
4603 ReusableObjectHandleScope reused_obj_handle(isolate); | 4605 ReusableObjectHandleScope reused_obj_handle(thread); |
4604 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); | 4606 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); |
4605 if (instance.IsNull()) { | 4607 if (instance.IsNull()) { |
4606 RETURN_TYPE_ERROR(isolate, obj, Instance); | 4608 RETURN_TYPE_ERROR(thread->isolate(), obj, Instance); |
4607 } | 4609 } |
4608 *count = instance.NumNativeFields(); | 4610 *count = instance.NumNativeFields(); |
4609 return Api::Success(); | 4611 return Api::Success(); |
4610 } | 4612 } |
4611 | 4613 |
4612 | 4614 |
4613 DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, | 4615 DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, |
4614 int index, | 4616 int index, |
4615 intptr_t* value) { | 4617 intptr_t* value) { |
4616 Isolate* isolate = Isolate::Current(); | 4618 Thread* thread = Thread::Current(); |
4617 CHECK_ISOLATE(isolate); | 4619 CHECK_ISOLATE(thread->isolate()); |
4618 ReusableObjectHandleScope reused_obj_handle(isolate); | 4620 ReusableObjectHandleScope reused_obj_handle(thread); |
4619 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); | 4621 const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj); |
4620 if (instance.IsNull()) { | 4622 if (instance.IsNull()) { |
4621 RETURN_TYPE_ERROR(isolate, obj, Instance); | 4623 RETURN_TYPE_ERROR(thread->isolate(), obj, Instance); |
4622 } | 4624 } |
4623 if (!instance.IsValidNativeIndex(index)) { | 4625 if (!instance.IsValidNativeIndex(index)) { |
4624 return Api::NewError( | 4626 return Api::NewError( |
4625 "%s: invalid index %d passed in to access native instance field", | 4627 "%s: invalid index %d passed in to access native instance field", |
4626 CURRENT_FUNC, index); | 4628 CURRENT_FUNC, index); |
4627 } | 4629 } |
4628 *value = instance.GetNativeField(index); | 4630 *value = instance.GetNativeField(index); |
4629 return Api::Success(); | 4631 return Api::Success(); |
4630 } | 4632 } |
4631 | 4633 |
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5536 return Api::Success(); | 5538 return Api::Success(); |
5537 } | 5539 } |
5538 | 5540 |
5539 | 5541 |
5540 // --- Peer support --- | 5542 // --- Peer support --- |
5541 | 5543 |
5542 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) { | 5544 DART_EXPORT Dart_Handle Dart_GetPeer(Dart_Handle object, void** peer) { |
5543 if (peer == NULL) { | 5545 if (peer == NULL) { |
5544 RETURN_NULL_ERROR(peer); | 5546 RETURN_NULL_ERROR(peer); |
5545 } | 5547 } |
5546 Isolate* isolate = Isolate::Current(); | 5548 Thread* thread = Thread::Current(); |
5547 CHECK_ISOLATE(isolate); | 5549 CHECK_ISOLATE(thread->isolate()); |
5548 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 5550 REUSABLE_OBJECT_HANDLESCOPE(thread); |
5549 Object& obj = isolate->ObjectHandle(); | 5551 Object& obj = thread->ObjectHandle(); |
5550 obj = Api::UnwrapHandle(object); | 5552 obj = Api::UnwrapHandle(object); |
5551 if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) { | 5553 if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) { |
5552 const char* msg = | 5554 const char* msg = |
5553 "%s: argument 'object' cannot be a subtype of Null, num, or bool"; | 5555 "%s: argument 'object' cannot be a subtype of Null, num, or bool"; |
5554 return Api::NewError(msg, CURRENT_FUNC); | 5556 return Api::NewError(msg, CURRENT_FUNC); |
5555 } | 5557 } |
5556 { | 5558 { |
5557 NoSafepointScope no_safepoint; | 5559 NoSafepointScope no_safepoint; |
5558 RawObject* raw_obj = obj.raw(); | 5560 RawObject* raw_obj = obj.raw(); |
5559 *peer = isolate->heap()->GetPeer(raw_obj); | 5561 *peer = thread->isolate()->heap()->GetPeer(raw_obj); |
5560 } | 5562 } |
5561 return Api::Success(); | 5563 return Api::Success(); |
5562 } | 5564 } |
5563 | 5565 |
5564 | 5566 |
5565 DART_EXPORT Dart_Handle Dart_SetPeer(Dart_Handle object, void* peer) { | 5567 DART_EXPORT Dart_Handle Dart_SetPeer(Dart_Handle object, void* peer) { |
5566 Isolate* isolate = Isolate::Current(); | 5568 Thread* thread = Thread::Current(); |
5567 CHECK_ISOLATE(isolate); | 5569 CHECK_ISOLATE(thread->isolate()); |
5568 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 5570 REUSABLE_OBJECT_HANDLESCOPE(thread); |
5569 Object& obj = isolate->ObjectHandle(); | 5571 Object& obj = thread->ObjectHandle(); |
5570 obj = Api::UnwrapHandle(object); | 5572 obj = Api::UnwrapHandle(object); |
5571 if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) { | 5573 if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) { |
5572 const char* msg = | 5574 const char* msg = |
5573 "%s: argument 'object' cannot be a subtype of Null, num, or bool"; | 5575 "%s: argument 'object' cannot be a subtype of Null, num, or bool"; |
5574 return Api::NewError(msg, CURRENT_FUNC); | 5576 return Api::NewError(msg, CURRENT_FUNC); |
5575 } | 5577 } |
5576 { | 5578 { |
5577 NoSafepointScope no_safepoint; | 5579 NoSafepointScope no_safepoint; |
5578 RawObject* raw_obj = obj.raw(); | 5580 RawObject* raw_obj = obj.raw(); |
5579 isolate->heap()->SetPeer(raw_obj, peer); | 5581 thread->isolate()->heap()->SetPeer(raw_obj, peer); |
5580 } | 5582 } |
5581 return Api::Success(); | 5583 return Api::Success(); |
5582 } | 5584 } |
5583 | 5585 |
5584 | 5586 |
5585 // --- Service support --- | 5587 // --- Service support --- |
5586 | 5588 |
5587 DART_EXPORT bool Dart_IsServiceIsolate(Dart_Isolate isolate) { | 5589 DART_EXPORT bool Dart_IsServiceIsolate(Dart_Isolate isolate) { |
5588 Isolate* iso = reinterpret_cast<Isolate*>(isolate); | 5590 Isolate* iso = reinterpret_cast<Isolate*>(isolate); |
5589 return ServiceIsolate::IsServiceIsolate(iso); | 5591 return ServiceIsolate::IsServiceIsolate(iso); |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6070 ApiReallocate); | 6072 ApiReallocate); |
6071 writer.WriteFullSnapshot(); | 6073 writer.WriteFullSnapshot(); |
6072 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 6074 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); |
6073 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 6075 *isolate_snapshot_size = writer.IsolateSnapshotSize(); |
6074 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); | 6076 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); |
6075 | 6077 |
6076 return Api::Success(); | 6078 return Api::Success(); |
6077 } | 6079 } |
6078 | 6080 |
6079 } // namespace dart | 6081 } // namespace dart |
OLD | NEW |