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

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

Issue 238063011: Modify the Weak Reference Set creation API to make it easier to create (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 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" 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/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 // If 'size' would be a significant fraction of new space, then use old. 86 // If 'size' would be a significant fraction of new space, then use old.
87 static const int kExtNewRatio = 16; 87 static const int kExtNewRatio = 16;
88 if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) { 88 if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) {
89 return Heap::kOld; 89 return Heap::kOld;
90 } else { 90 } else {
91 return Heap::kNew; 91 return Heap::kNew;
92 } 92 }
93 } 93 }
94 94
95 95
96 WeakReferenceSetBuilder* ApiState::NewWeakReferenceSetBuilder() {
97 return new WeakReferenceSetBuilder(this);
98 }
99
100
101 void ApiState::DelayWeakReferenceSet(WeakReferenceSet* reference_set) {
102 WeakReferenceSet::Push(reference_set, &delayed_weak_reference_sets_);
103 }
104
105
96 Dart_Handle Api::InitNewHandle(Isolate* isolate, RawObject* raw) { 106 Dart_Handle Api::InitNewHandle(Isolate* isolate, RawObject* raw) {
97 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles(); 107 LocalHandles* local_handles = Api::TopScope(isolate)->local_handles();
98 ASSERT(local_handles != NULL); 108 ASSERT(local_handles != NULL);
99 LocalHandle* ref = local_handles->AllocateHandle(); 109 LocalHandle* ref = local_handles->AllocateHandle();
100 ref->set_raw(raw); 110 ref->set_raw(raw);
101 return reinterpret_cast<Dart_Handle>(ref); 111 return reinterpret_cast<Dart_Handle>(ref);
102 } 112 }
103 113
104 114
105 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) { 115 Dart_Handle Api::NewHandle(Isolate* isolate, RawObject* raw) {
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 745
736 746
737 DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle( 747 DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(
738 Dart_WeakPersistentHandle object) { 748 Dart_WeakPersistentHandle object) {
739 FinalizablePersistentHandle* weak_ref = 749 FinalizablePersistentHandle* weak_ref =
740 FinalizablePersistentHandle::Cast(object); 750 FinalizablePersistentHandle::Cast(object);
741 return weak_ref->IsPrologueWeakPersistent(); 751 return weak_ref->IsPrologueWeakPersistent();
742 } 752 }
743 753
744 754
745 DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet( 755 DART_EXPORT Dart_WeakReferenceSetBuilder Dart_NewWeakReferenceSetBuilder() {
746 Dart_WeakPersistentHandle* keys,
747 intptr_t num_keys,
748 Dart_WeakPersistentHandle* values,
749 intptr_t num_values) {
750 Isolate* isolate = Isolate::Current(); 756 Isolate* isolate = Isolate::Current();
751 CHECK_ISOLATE(isolate); 757 CHECK_ISOLATE(isolate);
752 ApiState* state = isolate->api_state(); 758 ApiState* state = isolate->api_state();
753 ASSERT(state != NULL); 759 ASSERT(state != NULL);
754 if (keys == NULL) { 760 return reinterpret_cast<Dart_WeakReferenceSetBuilder>(
755 RETURN_NULL_ERROR(keys); 761 state->NewWeakReferenceSetBuilder());
762 }
763
764
765 DART_EXPORT Dart_WeakReferenceSet Dart_NewWeakReferenceSet(
766 Dart_WeakReferenceSetBuilder set_builder,
767 Dart_WeakPersistentHandle key,
768 Dart_WeakPersistentHandle value) {
769 ASSERT(set_builder != NULL && key != NULL);
770 WeakReferenceSetBuilder* builder =
771 reinterpret_cast<WeakReferenceSetBuilder*>(set_builder);
772 WeakReferenceSet* reference_set = builder->NewWeakReferenceSet();
773 reference_set->AppendKey(key);
774 if (value != NULL) {
775 reference_set->AppendValue(value);
756 } 776 }
757 if (num_keys <= 0) { 777 return reinterpret_cast<Dart_WeakReferenceSet>(reference_set);
758 return Api::NewError( 778 }
759 "%s expects argument 'num_keys' to be greater than 0.", 779
760 CURRENT_FUNC); 780
781 DART_EXPORT Dart_Handle Dart_AppendToWeakReferenceSet(
782 Dart_WeakReferenceSet reference_set,
783 Dart_WeakPersistentHandle key,
784 Dart_WeakPersistentHandle value) {
785 ASSERT(reference_set != NULL);
786 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
787 set->Append(key, value);
788 return Api::Success();
789 }
790
791
792 DART_EXPORT Dart_Handle Dart_AppendKeyToWeakReferenceSet(
793 Dart_WeakReferenceSet reference_set,
794 Dart_WeakPersistentHandle key) {
795 ASSERT(reference_set != NULL);
796 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
797 set->AppendKey(key);
798 return Api::Success();
799 }
800
801
802 DART_EXPORT Dart_Handle Dart_AppendValueToWeakReferenceSet(
803 Dart_WeakReferenceSet reference_set,
804 Dart_WeakPersistentHandle value) {
805 ASSERT(reference_set != NULL);
806 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
807 set->AppendValue(value);
808 return Api::Success();
809 }
810
811
812 DART_EXPORT Dart_Handle Dart_RegisterWeakReferenceSet(
813 Dart_WeakReferenceSetBuilder set_builder,
814 Dart_WeakReferenceSet reference_set) {
815 ASSERT(set_builder != NULL);
816 ASSERT(reference_set != NULL);
817 WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
818 if (!set->IsSingleton()) {
819 WeakReferenceSetBuilder* builder =
820 reinterpret_cast<WeakReferenceSetBuilder*>(set_builder);
821 ApiState* state = builder->api_state();
822 ASSERT(state == Isolate::Current()->api_state());
823 state->DelayWeakReferenceSet(set);
761 } 824 }
762 if (values == NULL) {
763 RETURN_NULL_ERROR(values);
764 }
765 if (num_values <= 0) {
766 return Api::NewError(
767 "%s expects argument 'num_values' to be greater than 0.",
768 CURRENT_FUNC);
769 }
770
771 WeakReferenceSet* reference_set = new WeakReferenceSet(keys, num_keys,
772 values, num_values);
773 state->DelayWeakReferenceSet(reference_set);
774 return Api::Success(); 825 return Api::Success();
775 } 826 }
776 827
777 828
778 // --- Garbage Collection Callbacks -- 829 // --- Garbage Collection Callbacks --
779 830
780 DART_EXPORT Dart_Handle Dart_SetGcCallbacks( 831 DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
781 Dart_GcPrologueCallback prologue_callback, 832 Dart_GcPrologueCallback prologue_callback,
782 Dart_GcEpilogueCallback epilogue_callback) { 833 Dart_GcEpilogueCallback epilogue_callback) {
783 Isolate* isolate = Isolate::Current(); 834 Isolate* isolate = Isolate::Current();
(...skipping 3928 matching lines...) Expand 10 before | Expand all | Expand 10 after
4712 4763
4713 4764
4714 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( 4765 DART_EXPORT void Dart_RegisterRootServiceRequestCallback(
4715 const char* name, 4766 const char* name,
4716 Dart_ServiceRequestCallback callback, 4767 Dart_ServiceRequestCallback callback,
4717 void* user_data) { 4768 void* user_data) {
4718 Service::RegisterRootEmbedderCallback(name, callback, user_data); 4769 Service::RegisterRootEmbedderCallback(name, callback, user_data);
4719 } 4770 }
4720 4771
4721 } // namespace dart 4772 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698