| 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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 if (function.IsNull()) { | 340 if (function.IsNull()) { |
| 341 return ApiError::New(String::Handle(String::New(""))); | 341 return ApiError::New(String::Handle(String::New(""))); |
| 342 } | 342 } |
| 343 const Array& args = Array::Handle(Array::New(kNumArgs)); | 343 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 344 args.SetAt(0, receiver); | 344 args.SetAt(0, receiver); |
| 345 args.SetAt(1, argument); | 345 args.SetAt(1, argument); |
| 346 return DartEntry::InvokeFunction(function, args); | 346 return DartEntry::InvokeFunction(function, args); |
| 347 } | 347 } |
| 348 | 348 |
| 349 | 349 |
| 350 WeakReferenceSetBuilder* ApiState::NewWeakReferenceSetBuilder() { | |
| 351 return new WeakReferenceSetBuilder(this); | |
| 352 } | |
| 353 | |
| 354 | |
| 355 void ApiState::DelayWeakReferenceSet(WeakReferenceSet* reference_set) { | |
| 356 WeakReferenceSet::Push(reference_set, &delayed_weak_reference_sets_); | |
| 357 } | |
| 358 | |
| 359 | |
| 360 Dart_Handle Api::InitNewHandle(Isolate* isolate, RawObject* raw) { | 350 Dart_Handle Api::InitNewHandle(Isolate* isolate, RawObject* raw) { |
| 361 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles(); | 351 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles(); |
| 362 ASSERT(local_handles != NULL); | 352 ASSERT(local_handles != NULL); |
| 363 LocalHandle* ref = local_handles->AllocateHandle(); | 353 LocalHandle* ref = local_handles->AllocateHandle(); |
| 364 ref->set_raw(raw); | 354 ref->set_raw(raw); |
| 365 return ref->apiHandle(); | 355 return ref->apiHandle(); |
| 366 } | 356 } |
| 367 | 357 |
| 368 | 358 |
| 369 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) { | 359 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) { |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 PersistentHandle* PersistentHandle::Cast(Dart_PersistentHandle handle) { | 674 PersistentHandle* PersistentHandle::Cast(Dart_PersistentHandle handle) { |
| 685 ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(handle)); | 675 ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(handle)); |
| 686 return reinterpret_cast<PersistentHandle*>(handle); | 676 return reinterpret_cast<PersistentHandle*>(handle); |
| 687 } | 677 } |
| 688 | 678 |
| 689 | 679 |
| 690 FinalizablePersistentHandle* FinalizablePersistentHandle::Cast( | 680 FinalizablePersistentHandle* FinalizablePersistentHandle::Cast( |
| 691 Dart_WeakPersistentHandle handle) { | 681 Dart_WeakPersistentHandle handle) { |
| 692 #if defined(DEBUG) | 682 #if defined(DEBUG) |
| 693 ApiState* state = Isolate::Current()->api_state(); | 683 ApiState* state = Isolate::Current()->api_state(); |
| 694 ASSERT(state->IsValidWeakPersistentHandle(handle) || | 684 ASSERT(state->IsValidWeakPersistentHandle(handle)); |
| 695 state->IsValidPrologueWeakPersistentHandle(handle)); | |
| 696 #endif | 685 #endif |
| 697 return reinterpret_cast<FinalizablePersistentHandle*>(handle); | 686 return reinterpret_cast<FinalizablePersistentHandle*>(handle); |
| 698 } | 687 } |
| 699 | 688 |
| 700 | 689 |
| 701 void FinalizablePersistentHandle::Finalize( | 690 void FinalizablePersistentHandle::Finalize( |
| 702 Isolate* isolate, FinalizablePersistentHandle* handle) { | 691 Isolate* isolate, FinalizablePersistentHandle* handle) { |
| 703 if (!handle->raw()->IsHeapObject()) { | 692 if (!handle->raw()->IsHeapObject()) { |
| 704 return; | 693 return; |
| 705 } | 694 } |
| 706 Dart_WeakPersistentHandleFinalizer callback = handle->callback(); | 695 Dart_WeakPersistentHandleFinalizer callback = handle->callback(); |
| 707 ASSERT(callback != NULL); | 696 ASSERT(callback != NULL); |
| 708 void* peer = handle->peer(); | 697 void* peer = handle->peer(); |
| 709 Dart_WeakPersistentHandle object = handle->apiHandle(); | 698 Dart_WeakPersistentHandle object = handle->apiHandle(); |
| 710 (*callback)(isolate->init_callback_data(), object, peer); | 699 (*callback)(isolate->init_callback_data(), object, peer); |
| 711 ApiState* state = isolate->api_state(); | 700 ApiState* state = isolate->api_state(); |
| 712 ASSERT(state != NULL); | 701 ASSERT(state != NULL); |
| 713 if (handle->IsPrologueWeakPersistent()) { | 702 state->weak_persistent_handles().FreeHandle(handle); |
| 714 state->prologue_weak_persistent_handles().FreeHandle(handle); | |
| 715 } else { | |
| 716 state->weak_persistent_handles().FreeHandle(handle); | |
| 717 } | |
| 718 } | 703 } |
| 719 | 704 |
| 720 | 705 |
| 721 // --- Handles --- | 706 // --- Handles --- |
| 722 | 707 |
| 723 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { | 708 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { |
| 724 TRACE_API_CALL(CURRENT_FUNC); | 709 TRACE_API_CALL(CURRENT_FUNC); |
| 725 return RawObject::IsErrorClassId(Api::ClassId(handle)); | 710 return RawObject::IsErrorClassId(Api::ClassId(handle)); |
| 726 } | 711 } |
| 727 | 712 |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 ASSERT(state->IsValidPersistentHandle(obj1)); | 996 ASSERT(state->IsValidPersistentHandle(obj1)); |
| 1012 const Object& obj2_ref = Object::Handle(Z, Api::UnwrapHandle(obj2)); | 997 const Object& obj2_ref = Object::Handle(Z, Api::UnwrapHandle(obj2)); |
| 1013 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1); | 998 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1); |
| 1014 obj1_ref->set_raw(obj2_ref); | 999 obj1_ref->set_raw(obj2_ref); |
| 1015 } | 1000 } |
| 1016 | 1001 |
| 1017 | 1002 |
| 1018 static Dart_WeakPersistentHandle AllocateFinalizableHandle( | 1003 static Dart_WeakPersistentHandle AllocateFinalizableHandle( |
| 1019 Thread* thread, | 1004 Thread* thread, |
| 1020 Dart_Handle object, | 1005 Dart_Handle object, |
| 1021 bool is_prologue, | |
| 1022 void* peer, | 1006 void* peer, |
| 1023 intptr_t external_allocation_size, | 1007 intptr_t external_allocation_size, |
| 1024 Dart_WeakPersistentHandleFinalizer callback) { | 1008 Dart_WeakPersistentHandleFinalizer callback) { |
| 1025 REUSABLE_OBJECT_HANDLESCOPE(thread); | 1009 REUSABLE_OBJECT_HANDLESCOPE(thread); |
| 1026 Object& ref = thread->ObjectHandle(); | 1010 Object& ref = thread->ObjectHandle(); |
| 1027 ref = Api::UnwrapHandle(object); | 1011 ref = Api::UnwrapHandle(object); |
| 1028 FinalizablePersistentHandle* finalizable_ref = | 1012 FinalizablePersistentHandle* finalizable_ref = |
| 1029 FinalizablePersistentHandle::New(thread->isolate(), | 1013 FinalizablePersistentHandle::New(thread->isolate(), |
| 1030 is_prologue, | |
| 1031 ref, | 1014 ref, |
| 1032 peer, | 1015 peer, |
| 1033 callback, | 1016 callback, |
| 1034 external_allocation_size); | 1017 external_allocation_size); |
| 1035 return finalizable_ref->apiHandle(); | 1018 return finalizable_ref->apiHandle(); |
| 1036 } | 1019 } |
| 1037 | 1020 |
| 1038 | 1021 |
| 1039 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( | 1022 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( |
| 1040 Dart_Handle object, | 1023 Dart_Handle object, |
| 1041 void* peer, | 1024 void* peer, |
| 1042 intptr_t external_allocation_size, | 1025 intptr_t external_allocation_size, |
| 1043 Dart_WeakPersistentHandleFinalizer callback) { | 1026 Dart_WeakPersistentHandleFinalizer callback) { |
| 1044 Thread* thread = Thread::Current(); | 1027 Thread* thread = Thread::Current(); |
| 1045 CHECK_ISOLATE(thread->isolate()); | 1028 CHECK_ISOLATE(thread->isolate()); |
| 1046 if (callback == NULL) { | 1029 if (callback == NULL) { |
| 1047 return NULL; | 1030 return NULL; |
| 1048 } | 1031 } |
| 1049 return AllocateFinalizableHandle(thread, | 1032 return AllocateFinalizableHandle(thread, |
| 1050 object, | 1033 object, |
| 1051 false, | |
| 1052 peer, | 1034 peer, |
| 1053 external_allocation_size, | 1035 external_allocation_size, |
| 1054 callback); | 1036 callback); |
| 1055 } | |
| 1056 | |
| 1057 | |
| 1058 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle( | |
| 1059 Dart_Handle object, | |
| 1060 void* peer, | |
| 1061 intptr_t external_allocation_size, | |
| 1062 Dart_WeakPersistentHandleFinalizer callback) { | |
| 1063 Thread* thread = Thread::Current(); | |
| 1064 CHECK_ISOLATE(thread->isolate()); | |
| 1065 if (callback == NULL) { | |
| 1066 return NULL; | |
| 1067 } | |
| 1068 return AllocateFinalizableHandle(thread, | |
| 1069 object, | |
| 1070 true, | |
| 1071 peer, | |
| 1072 external_allocation_size, | |
| 1073 callback); | |
| 1074 } | 1037 } |
| 1075 | 1038 |
| 1076 | 1039 |
| 1077 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { | 1040 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { |
| 1078 Isolate* isolate = Isolate::Current(); | 1041 Isolate* isolate = Isolate::Current(); |
| 1079 CHECK_ISOLATE(isolate); | 1042 CHECK_ISOLATE(isolate); |
| 1080 ApiState* state = isolate->api_state(); | 1043 ApiState* state = isolate->api_state(); |
| 1081 ASSERT(state != NULL); | 1044 ASSERT(state != NULL); |
| 1082 PersistentHandle* ref = PersistentHandle::Cast(object); | 1045 PersistentHandle* ref = PersistentHandle::Cast(object); |
| 1083 ASSERT(!state->IsProtectedHandle(ref)); | 1046 ASSERT(!state->IsProtectedHandle(ref)); |
| 1084 if (!state->IsProtectedHandle(ref)) { | 1047 if (!state->IsProtectedHandle(ref)) { |
| 1085 state->persistent_handles().FreeHandle(ref); | 1048 state->persistent_handles().FreeHandle(ref); |
| 1086 } | 1049 } |
| 1087 } | 1050 } |
| 1088 | 1051 |
| 1089 | 1052 |
| 1090 DART_EXPORT void Dart_DeleteWeakPersistentHandle( | 1053 DART_EXPORT void Dart_DeleteWeakPersistentHandle( |
| 1091 Dart_Isolate current_isolate, | 1054 Dart_Isolate current_isolate, |
| 1092 Dart_WeakPersistentHandle object) { | 1055 Dart_WeakPersistentHandle object) { |
| 1093 Isolate* isolate = reinterpret_cast<Isolate*>(current_isolate); | 1056 Isolate* isolate = reinterpret_cast<Isolate*>(current_isolate); |
| 1094 CHECK_ISOLATE(isolate); | 1057 CHECK_ISOLATE(isolate); |
| 1095 ASSERT(isolate == Isolate::Current()); | 1058 ASSERT(isolate == Isolate::Current()); |
| 1096 ApiState* state = isolate->api_state(); | 1059 ApiState* state = isolate->api_state(); |
| 1097 ASSERT(state != NULL); | 1060 ASSERT(state != NULL); |
| 1098 FinalizablePersistentHandle* weak_ref = | 1061 FinalizablePersistentHandle* weak_ref = |
| 1099 FinalizablePersistentHandle::Cast(object); | 1062 FinalizablePersistentHandle::Cast(object); |
| 1100 weak_ref->EnsureFreeExternal(isolate); | 1063 weak_ref->EnsureFreeExternal(isolate); |
| 1101 if (weak_ref->IsPrologueWeakPersistent()) { | 1064 state->weak_persistent_handles().FreeHandle(weak_ref); |
| 1102 ASSERT(state->IsValidPrologueWeakPersistentHandle(object)); | |
| 1103 state->prologue_weak_persistent_handles().FreeHandle(weak_ref); | |
| 1104 } else { | |
| 1105 ASSERT(!state->IsValidPrologueWeakPersistentHandle(object)); | |
| 1106 state->weak_persistent_handles().FreeHandle(weak_ref); | |
| 1107 } | |
| 1108 } | 1065 } |
| 1109 | 1066 |
| 1110 | 1067 |
| 1111 DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle( | |
| 1112 Dart_WeakPersistentHandle object) { | |
| 1113 FinalizablePersistentHandle* weak_ref = | |
| 1114 FinalizablePersistentHandle::Cast(object); | |
| 1115 return weak_ref->IsPrologueWeakPersistent(); | |
| 1116 } | |
| 1117 | |
| 1118 | |
| 1119 DART_EXPORT Dart_WeakReferenceSetBuilder Dart_NewWeakReferenceSetBuilder() { | |
| 1120 Isolate* isolate = Isolate::Current(); | |
| 1121 CHECK_ISOLATE(isolate); | |
| 1122 ApiState* state = isolate->api_state(); | |
| 1123 ASSERT(state != NULL); | |
| 1124 return reinterpret_cast<Dart_WeakReferenceSetBuilder>( | |
| 1125 state->NewWeakReferenceSetBuilder()); | |
| 1126 } | |
| 1127 | |
| 1128 | |
| 1129 DART_EXPORT Dart_WeakReferenceSet Dart_NewWeakReferenceSet( | |
| 1130 Dart_WeakReferenceSetBuilder set_builder, | |
| 1131 Dart_WeakPersistentHandle key, | |
| 1132 Dart_WeakPersistentHandle value) { | |
| 1133 ASSERT(set_builder != NULL && key != NULL); | |
| 1134 WeakReferenceSetBuilder* builder = | |
| 1135 reinterpret_cast<WeakReferenceSetBuilder*>(set_builder); | |
| 1136 ApiState* state = builder->api_state(); | |
| 1137 ASSERT(state == Isolate::Current()->api_state()); | |
| 1138 WeakReferenceSet* reference_set = builder->NewWeakReferenceSet(); | |
| 1139 reference_set->AppendKey(key); | |
| 1140 if (value != NULL) { | |
| 1141 reference_set->AppendValue(value); | |
| 1142 } | |
| 1143 state->DelayWeakReferenceSet(reference_set); | |
| 1144 return reinterpret_cast<Dart_WeakReferenceSet>(reference_set); | |
| 1145 } | |
| 1146 | |
| 1147 | |
| 1148 DART_EXPORT Dart_Handle Dart_AppendToWeakReferenceSet( | |
| 1149 Dart_WeakReferenceSet reference_set, | |
| 1150 Dart_WeakPersistentHandle key, | |
| 1151 Dart_WeakPersistentHandle value) { | |
| 1152 ASSERT(reference_set != NULL); | |
| 1153 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set); | |
| 1154 set->Append(key, value); | |
| 1155 return Api::Success(); | |
| 1156 } | |
| 1157 | |
| 1158 | |
| 1159 DART_EXPORT Dart_Handle Dart_AppendKeyToWeakReferenceSet( | |
| 1160 Dart_WeakReferenceSet reference_set, | |
| 1161 Dart_WeakPersistentHandle key) { | |
| 1162 ASSERT(reference_set != NULL); | |
| 1163 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set); | |
| 1164 set->AppendKey(key); | |
| 1165 return Api::Success(); | |
| 1166 } | |
| 1167 | |
| 1168 | |
| 1169 DART_EXPORT Dart_Handle Dart_AppendValueToWeakReferenceSet( | |
| 1170 Dart_WeakReferenceSet reference_set, | |
| 1171 Dart_WeakPersistentHandle value) { | |
| 1172 ASSERT(reference_set != NULL); | |
| 1173 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set); | |
| 1174 set->AppendValue(value); | |
| 1175 return Api::Success(); | |
| 1176 } | |
| 1177 | |
| 1178 | |
| 1179 // --- Garbage Collection Callbacks -- | 1068 // --- Garbage Collection Callbacks -- |
| 1180 | 1069 |
| 1181 DART_EXPORT Dart_Handle Dart_SetGcCallbacks( | 1070 DART_EXPORT Dart_Handle Dart_SetGcCallbacks( |
| 1182 Dart_GcPrologueCallback prologue_callback, | 1071 Dart_GcPrologueCallback prologue_callback, |
| 1183 Dart_GcEpilogueCallback epilogue_callback) { | 1072 Dart_GcEpilogueCallback epilogue_callback) { |
| 1184 Isolate* isolate = Isolate::Current(); | 1073 Isolate* isolate = Isolate::Current(); |
| 1185 CHECK_ISOLATE(isolate); | 1074 CHECK_ISOLATE(isolate); |
| 1186 if (prologue_callback != NULL) { | 1075 if (prologue_callback != NULL) { |
| 1187 if (isolate->gc_prologue_callback() != NULL) { | 1076 if (isolate->gc_prologue_callback() != NULL) { |
| 1188 return Api::NewError( | 1077 return Api::NewError( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1210 "%s expects 'epilogue_callback' to be present in the callback set.", | 1099 "%s expects 'epilogue_callback' to be present in the callback set.", |
| 1211 CURRENT_FUNC); | 1100 CURRENT_FUNC); |
| 1212 } | 1101 } |
| 1213 } | 1102 } |
| 1214 isolate->set_gc_prologue_callback(prologue_callback); | 1103 isolate->set_gc_prologue_callback(prologue_callback); |
| 1215 isolate->set_gc_epilogue_callback(epilogue_callback); | 1104 isolate->set_gc_epilogue_callback(epilogue_callback); |
| 1216 return Api::Success(); | 1105 return Api::Success(); |
| 1217 } | 1106 } |
| 1218 | 1107 |
| 1219 | 1108 |
| 1220 class PrologueWeakVisitor : public HandleVisitor { | |
| 1221 public: | |
| 1222 PrologueWeakVisitor(Thread* thread, | |
| 1223 Dart_GcPrologueWeakHandleCallback callback) | |
| 1224 : HandleVisitor(thread), | |
| 1225 callback_(callback) { | |
| 1226 } | |
| 1227 | |
| 1228 | |
| 1229 void VisitHandle(uword addr) { | |
| 1230 NoSafepointScope no_safepoint; | |
| 1231 FinalizablePersistentHandle* handle = | |
| 1232 reinterpret_cast<FinalizablePersistentHandle*>(addr); | |
| 1233 RawObject* raw_obj = handle->raw(); | |
| 1234 if (raw_obj->IsHeapObject()) { | |
| 1235 ASSERT(handle->IsPrologueWeakPersistent()); | |
| 1236 ReusableInstanceHandleScope reused_instance_handle(thread()); | |
| 1237 Instance& instance = reused_instance_handle.Handle(); | |
| 1238 instance ^= reinterpret_cast<RawInstance*>(handle->raw()); | |
| 1239 intptr_t num_native_fields = instance.NumNativeFields(); | |
| 1240 intptr_t* native_fields = instance.NativeFieldsDataAddr(); | |
| 1241 if (native_fields != NULL) { | |
| 1242 callback_(thread()->isolate()->init_callback_data(), | |
| 1243 reinterpret_cast<Dart_WeakPersistentHandle>(addr), | |
| 1244 num_native_fields, | |
| 1245 native_fields); | |
| 1246 } | |
| 1247 } | |
| 1248 } | |
| 1249 | |
| 1250 private: | |
| 1251 Dart_GcPrologueWeakHandleCallback callback_; | |
| 1252 | |
| 1253 DISALLOW_COPY_AND_ASSIGN(PrologueWeakVisitor); | |
| 1254 }; | |
| 1255 | |
| 1256 | |
| 1257 DART_EXPORT Dart_Handle Dart_VisitPrologueWeakHandles( | |
| 1258 Dart_GcPrologueWeakHandleCallback callback) { | |
| 1259 Thread* thread = Thread::Current(); | |
| 1260 CHECK_ISOLATE(thread->isolate()); | |
| 1261 PrologueWeakVisitor visitor(thread, callback); | |
| 1262 thread->isolate()->VisitPrologueWeakPersistentHandles(&visitor); | |
| 1263 return Api::Success(); | |
| 1264 } | |
| 1265 | |
| 1266 | |
| 1267 // --- Initialization and Globals --- | 1109 // --- Initialization and Globals --- |
| 1268 | 1110 |
| 1269 DART_EXPORT const char* Dart_VersionString() { | 1111 DART_EXPORT const char* Dart_VersionString() { |
| 1270 return Version::String(); | 1112 return Version::String(); |
| 1271 } | 1113 } |
| 1272 | 1114 |
| 1273 DART_EXPORT char* Dart_Initialize( | 1115 DART_EXPORT char* Dart_Initialize( |
| 1274 const uint8_t* vm_isolate_snapshot, | 1116 const uint8_t* vm_isolate_snapshot, |
| 1275 const uint8_t* instructions_snapshot, | 1117 const uint8_t* instructions_snapshot, |
| 1276 Dart_IsolateCreateCallback create, | 1118 Dart_IsolateCreateCallback create, |
| (...skipping 3692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4969 } | 4811 } |
| 4970 | 4812 |
| 4971 | 4813 |
| 4972 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, | 4814 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, |
| 4973 Dart_WeakPersistentHandle rval) { | 4815 Dart_WeakPersistentHandle rval) { |
| 4974 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4816 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4975 #if defined(DEBUG) | 4817 #if defined(DEBUG) |
| 4976 Isolate* isolate = arguments->thread()->isolate(); | 4818 Isolate* isolate = arguments->thread()->isolate(); |
| 4977 ASSERT(isolate == Isolate::Current()); | 4819 ASSERT(isolate == Isolate::Current()); |
| 4978 ASSERT(isolate->api_state() != NULL && | 4820 ASSERT(isolate->api_state() != NULL && |
| 4979 (isolate->api_state()->IsValidWeakPersistentHandle(rval) || | 4821 (isolate->api_state()->IsValidWeakPersistentHandle(rval))); |
| 4980 isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); | |
| 4981 #endif | 4822 #endif |
| 4982 Api::SetWeakHandleReturnValue(arguments, rval); | 4823 Api::SetWeakHandleReturnValue(arguments, rval); |
| 4983 } | 4824 } |
| 4984 | 4825 |
| 4985 | 4826 |
| 4986 // --- Environment --- | 4827 // --- Environment --- |
| 4987 RawString* Api::CallEnvironmentCallback(Thread* thread, const String& name) { | 4828 RawString* Api::CallEnvironmentCallback(Thread* thread, const String& name) { |
| 4988 Isolate* isolate = thread->isolate(); | 4829 Isolate* isolate = thread->isolate(); |
| 4989 Scope api_scope(thread); | 4830 Scope api_scope(thread); |
| 4990 Dart_EnvironmentCallback callback = isolate->environment_callback(); | 4831 Dart_EnvironmentCallback callback = isolate->environment_callback(); |
| (...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6086 ApiReallocate); | 5927 ApiReallocate); |
| 6087 writer.WriteFullSnapshot(); | 5928 writer.WriteFullSnapshot(); |
| 6088 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 5929 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); |
| 6089 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 5930 *isolate_snapshot_size = writer.IsolateSnapshotSize(); |
| 6090 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); | 5931 *instructions_snapshot_size = writer.InstructionsSnapshotSize(); |
| 6091 | 5932 |
| 6092 return Api::Success(); | 5933 return Api::Success(); |
| 6093 } | 5934 } |
| 6094 | 5935 |
| 6095 } // namespace dart | 5936 } // namespace dart |
| OLD | NEW |