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

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

Issue 1459173004: Remove support for object grouping during Garbage Collection (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review Created 5 years 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
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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" 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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698