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

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

Issue 177093010: Use a tag bit for indicating prologue weak persistent handles, this avoids (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 9 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
« no previous file with comments | « runtime/vm/dart_api_impl.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/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 const ReusableObjectHandleScope& reuse, Dart_Handle dart_handle) { 148 const ReusableObjectHandleScope& reuse, Dart_Handle dart_handle) {
149 Object& ref = reuse.Handle(); 149 Object& ref = reuse.Handle();
150 ref = Api::UnwrapHandle(dart_handle); 150 ref = Api::UnwrapHandle(dart_handle);
151 if (ref.IsInstance()) { 151 if (ref.IsInstance()) {
152 return Instance::Cast(ref); 152 return Instance::Cast(ref);
153 } 153 }
154 return Object::null_instance(); 154 return Object::null_instance();
155 } 155 }
156 156
157 157
158 PersistentHandle* Api::UnwrapAsPersistentHandle(Dart_PersistentHandle object) {
159 ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(object));
160 return reinterpret_cast<PersistentHandle*>(object);
161 }
162
163
164 FinalizablePersistentHandle* Api::UnwrapAsWeakPersistentHandle(
165 Dart_WeakPersistentHandle object) {
166 ASSERT(Isolate::Current()->api_state()->IsValidWeakPersistentHandle(object) ||
167 Isolate::Current()->api_state()->
168 IsValidPrologueWeakPersistentHandle(object));
169 return reinterpret_cast<FinalizablePersistentHandle*>(object);
170 }
171
172
173 FinalizablePersistentHandle* Api::UnwrapAsPrologueWeakPersistentHandle(
174 Dart_WeakPersistentHandle object) {
175 ASSERT(Isolate::Current()->api_state()->IsValidPrologueWeakPersistentHandle(
176 object));
177 return reinterpret_cast<FinalizablePersistentHandle*>(object);
178 }
179
180
181 Dart_Handle Api::CheckIsolateState(Isolate* isolate) { 158 Dart_Handle Api::CheckIsolateState(Isolate* isolate) {
182 if (!isolate->AllowClassFinalization()) { 159 if (!isolate->AllowClassFinalization()) {
183 // Class finalization is blocked for the isolate. Do nothing. 160 // Class finalization is blocked for the isolate. Do nothing.
184 return Api::Success(); 161 return Api::Success();
185 } 162 }
186 if (ClassFinalizer::ProcessPendingClasses()) { 163 if (ClassFinalizer::ProcessPendingClasses()) {
187 return Api::Success(); 164 return Api::Success();
188 } 165 }
189 ASSERT(isolate->object_store()->sticky_error() != Object::null()); 166 ASSERT(isolate->object_store()->sticky_error() != Object::null());
190 return Api::NewHandle(isolate, isolate->object_store()->sticky_error()); 167 return Api::NewHandle(isolate, isolate->object_store()->sticky_error());
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 *value = false; 328 *value = false;
352 return true; 329 return true;
353 } 330 }
354 } 331 }
355 return false; 332 return false;
356 } 333 }
357 334
358 335
359 void Api::SetWeakHandleReturnValue(NativeArguments* args, 336 void Api::SetWeakHandleReturnValue(NativeArguments* args,
360 Dart_WeakPersistentHandle retval) { 337 Dart_WeakPersistentHandle retval) {
361 args->SetReturnUnsafe(Api::UnwrapAsWeakPersistentHandle(retval)->raw()); 338 args->SetReturnUnsafe(FinalizablePersistentHandle::Cast(retval)->raw());
339 }
340
341
342 PersistentHandle* PersistentHandle::Cast(Dart_PersistentHandle handle) {
343 ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(handle));
344 return reinterpret_cast<PersistentHandle*>(handle);
345 }
346
347
348 FinalizablePersistentHandle* FinalizablePersistentHandle::Cast(
349 Dart_WeakPersistentHandle handle) {
350 #if defined(DEBUG)
351 ApiState* state = Isolate::Current()->api_state();
352 ASSERT(state->IsValidWeakPersistentHandle(handle) ||
353 state->IsValidPrologueWeakPersistentHandle(handle));
354 #endif
355 uword addr = reinterpret_cast<uword>(handle);
356 return reinterpret_cast<FinalizablePersistentHandle*>(
357 addr & ~kWeakPersistentTagMask);
362 } 358 }
363 359
364 360
365 // --- Handles --- 361 // --- Handles ---
366 362
367 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { 363 DART_EXPORT bool Dart_IsError(Dart_Handle handle) {
368 TRACE_API_CALL(CURRENT_FUNC); 364 TRACE_API_CALL(CURRENT_FUNC);
369 return RawObject::IsErrorClassId(Api::ClassId(handle)); 365 return RawObject::IsErrorClassId(Api::ClassId(handle));
370 } 366 }
371 367
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 return false; 557 return false;
562 } 558 }
563 559
564 560
565 DART_EXPORT Dart_Handle Dart_HandleFromPersistent( 561 DART_EXPORT Dart_Handle Dart_HandleFromPersistent(
566 Dart_PersistentHandle object) { 562 Dart_PersistentHandle object) {
567 Isolate* isolate = Isolate::Current(); 563 Isolate* isolate = Isolate::Current();
568 CHECK_ISOLATE(isolate); 564 CHECK_ISOLATE(isolate);
569 ApiState* state = isolate->api_state(); 565 ApiState* state = isolate->api_state();
570 ASSERT(state != NULL); 566 ASSERT(state != NULL);
571 ASSERT(state->IsValidPersistentHandle(object)); 567 PersistentHandle* ref = PersistentHandle::Cast(object);
572 return Api::NewHandle(isolate, 568 return Api::NewHandle(isolate, ref->raw());
573 reinterpret_cast<PersistentHandle*>(object)->raw());
574 } 569 }
575 570
576 571
577 DART_EXPORT Dart_Handle Dart_HandleFromWeakPersistent( 572 DART_EXPORT Dart_Handle Dart_HandleFromWeakPersistent(
578 Dart_WeakPersistentHandle object) { 573 Dart_WeakPersistentHandle object) {
579 Isolate* isolate = Isolate::Current(); 574 Isolate* isolate = Isolate::Current();
580 CHECK_ISOLATE(isolate); 575 CHECK_ISOLATE(isolate);
581 ApiState* state = isolate->api_state(); 576 ApiState* state = isolate->api_state();
582 ASSERT(state != NULL); 577 ASSERT(state != NULL);
583 ASSERT(state->IsValidWeakPersistentHandle(object) || 578 FinalizablePersistentHandle* weak_ref =
584 state->IsValidPrologueWeakPersistentHandle(object)); 579 FinalizablePersistentHandle::Cast(object);
585 return Api::NewHandle( 580 return Api::NewHandle(isolate, weak_ref->raw());
586 isolate, reinterpret_cast<FinalizablePersistentHandle*>(object)->raw());
587 } 581 }
588 582
589 583
590 DART_EXPORT Dart_PersistentHandle Dart_NewPersistentHandle(Dart_Handle object) { 584 DART_EXPORT Dart_PersistentHandle Dart_NewPersistentHandle(Dart_Handle object) {
591 Isolate* isolate = Isolate::Current(); 585 Isolate* isolate = Isolate::Current();
592 DARTSCOPE(isolate); 586 DARTSCOPE(isolate);
593 ApiState* state = isolate->api_state(); 587 ApiState* state = isolate->api_state();
594 ASSERT(state != NULL); 588 ASSERT(state != NULL);
595 const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object)); 589 const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object));
596 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); 590 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle();
597 new_ref->set_raw(old_ref); 591 new_ref->set_raw(old_ref);
598 return reinterpret_cast<Dart_PersistentHandle>(new_ref); 592 return new_ref->apiHandle();
599 } 593 }
600 594
601 595
602 DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1, 596 DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
603 Dart_Handle obj2) { 597 Dart_Handle obj2) {
604 Isolate* isolate = Isolate::Current(); 598 Isolate* isolate = Isolate::Current();
605 DARTSCOPE(isolate); 599 DARTSCOPE(isolate);
606 ApiState* state = isolate->api_state(); 600 ApiState* state = isolate->api_state();
607 ASSERT(state != NULL); 601 ASSERT(state != NULL);
608 ASSERT(state->IsValidPersistentHandle(obj1)); 602 ASSERT(state->IsValidPersistentHandle(obj1));
609 const Object& obj2_ref = Object::Handle(isolate, Api::UnwrapHandle(obj2)); 603 const Object& obj2_ref = Object::Handle(isolate, Api::UnwrapHandle(obj2));
610 PersistentHandle* obj1_ref = Api::UnwrapAsPersistentHandle(obj1); 604 PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1);
611 obj1_ref->set_raw(obj2_ref); 605 obj1_ref->set_raw(obj2_ref);
612 } 606 }
613 607
614 608
615 static Dart_WeakPersistentHandle AllocateFinalizableHandle( 609 static Dart_WeakPersistentHandle AllocateFinalizableHandle(
616 Isolate* isolate, 610 Isolate* isolate,
617 FinalizablePersistentHandles* handles,
618 Dart_Handle object, 611 Dart_Handle object,
612 bool is_prologue,
619 void* peer, 613 void* peer,
620 Dart_WeakPersistentHandleFinalizer callback) { 614 Dart_WeakPersistentHandleFinalizer callback) {
615 ApiState* state = isolate->api_state();
616 ASSERT(state != NULL);
621 ReusableObjectHandleScope reused_obj_handle(isolate); 617 ReusableObjectHandleScope reused_obj_handle(isolate);
622 Object& ref = reused_obj_handle.Handle(); 618 Object& ref = reused_obj_handle.Handle();
623 ref = Api::UnwrapHandle(object); 619 ref = Api::UnwrapHandle(object);
624 FinalizablePersistentHandle* finalizable_ref = handles->AllocateHandle(); 620 FinalizablePersistentHandle* finalizable_ref = is_prologue ?
621 state->prologue_weak_persistent_handles().AllocateHandle() :
622 state->weak_persistent_handles().AllocateHandle();
623
625 finalizable_ref->set_raw(ref); 624 finalizable_ref->set_raw(ref);
626 finalizable_ref->set_peer(peer); 625 finalizable_ref->set_peer(peer);
627 finalizable_ref->set_callback(callback); 626 finalizable_ref->set_callback(callback);
628 return reinterpret_cast<Dart_WeakPersistentHandle>(finalizable_ref); 627 if (is_prologue) {
628 return finalizable_ref->apiPrologueHandle();
629 } else {
630 return finalizable_ref->apiHandle();
631 }
629 } 632 }
630 633
631 634
632 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle( 635 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
633 Dart_Handle object, 636 Dart_Handle object,
634 void* peer, 637 void* peer,
635 Dart_WeakPersistentHandleFinalizer callback) { 638 Dart_WeakPersistentHandleFinalizer callback) {
636 Isolate* isolate = Isolate::Current(); 639 Isolate* isolate = Isolate::Current();
637 CHECK_ISOLATE(isolate); 640 CHECK_ISOLATE(isolate);
638 ApiState* state = isolate->api_state();
639 ASSERT(state != NULL);
640 return AllocateFinalizableHandle(isolate, 641 return AllocateFinalizableHandle(isolate,
641 &state->weak_persistent_handles(),
642 object, 642 object,
643 false,
643 peer, 644 peer,
644 callback); 645 callback);
645 } 646 }
646 647
647 648
648 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle( 649 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle(
649 Dart_Handle object, 650 Dart_Handle object,
650 void* peer, 651 void* peer,
651 Dart_WeakPersistentHandleFinalizer callback) { 652 Dart_WeakPersistentHandleFinalizer callback) {
652 Isolate* isolate = Isolate::Current(); 653 Isolate* isolate = Isolate::Current();
653 CHECK_ISOLATE(isolate); 654 CHECK_ISOLATE(isolate);
654 ApiState* state = isolate->api_state();
655 ASSERT(state != NULL);
656 return AllocateFinalizableHandle(isolate, 655 return AllocateFinalizableHandle(isolate,
657 &state->prologue_weak_persistent_handles(),
658 object, 656 object,
657 true,
659 peer, 658 peer,
660 callback); 659 callback);
661 } 660 }
662 661
663 662
664 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) { 663 DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object) {
665 Isolate* isolate = Isolate::Current(); 664 Isolate* isolate = Isolate::Current();
666 CHECK_ISOLATE(isolate); 665 CHECK_ISOLATE(isolate);
667 ApiState* state = isolate->api_state(); 666 ApiState* state = isolate->api_state();
668 ASSERT(state != NULL); 667 ASSERT(state != NULL);
669 PersistentHandle* ref = Api::UnwrapAsPersistentHandle(object); 668 PersistentHandle* ref = PersistentHandle::Cast(object);
670 ASSERT(!state->IsProtectedHandle(ref)); 669 ASSERT(!state->IsProtectedHandle(ref));
671 if (!state->IsProtectedHandle(ref)) { 670 if (!state->IsProtectedHandle(ref)) {
672 state->persistent_handles().FreeHandle(ref); 671 state->persistent_handles().FreeHandle(ref);
673 } 672 }
674 } 673 }
675 674
676 675
677 DART_EXPORT void Dart_DeleteWeakPersistentHandle( 676 DART_EXPORT void Dart_DeleteWeakPersistentHandle(
678 Dart_WeakPersistentHandle object) { 677 Dart_WeakPersistentHandle object) {
679 Isolate* isolate = Isolate::Current(); 678 Isolate* isolate = Isolate::Current();
680 CHECK_ISOLATE(isolate); 679 CHECK_ISOLATE(isolate);
681 ApiState* state = isolate->api_state(); 680 ApiState* state = isolate->api_state();
682 ASSERT(state != NULL); 681 ASSERT(state != NULL);
683 if (state->IsValidPrologueWeakPersistentHandle(object)) { 682 if (FinalizablePersistentHandle::IsPrologueWeakPersistentHandle(object)) {
684 FinalizablePersistentHandle* prologue_weak_ref = 683 ASSERT(state->IsValidPrologueWeakPersistentHandle(object));
685 Api::UnwrapAsPrologueWeakPersistentHandle(object); 684 FinalizablePersistentHandle* weak_ref =
686 state->prologue_weak_persistent_handles().FreeHandle(prologue_weak_ref); 685 FinalizablePersistentHandle::Cast(object);
687 return; 686 state->prologue_weak_persistent_handles().FreeHandle(weak_ref);
687 } else {
688 ASSERT(!state->IsValidPrologueWeakPersistentHandle(object));
689 FinalizablePersistentHandle* weak_ref =
690 FinalizablePersistentHandle::Cast(object);
691 state->weak_persistent_handles().FreeHandle(weak_ref);
688 } 692 }
689 FinalizablePersistentHandle* weak_ref =
690 Api::UnwrapAsWeakPersistentHandle(object);
691 state->weak_persistent_handles().FreeHandle(weak_ref);
692 return;
693 } 693 }
694 694
695 695
696 DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle( 696 DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(
697 Dart_WeakPersistentHandle object) { 697 Dart_WeakPersistentHandle object) {
698 #if defined(DEBUG)
698 Isolate* isolate = Isolate::Current(); 699 Isolate* isolate = Isolate::Current();
699 CHECK_ISOLATE(isolate); 700 CHECK_ISOLATE(isolate);
700 ApiState* state = isolate->api_state(); 701 ApiState* state = isolate->api_state();
701 ASSERT(state != NULL); 702 ASSERT(state != NULL);
702 return state->IsValidPrologueWeakPersistentHandle(object); 703 ASSERT(state->IsValidPrologueWeakPersistentHandle(object) ==
704 FinalizablePersistentHandle::IsPrologueWeakPersistentHandle(object));
705 #endif
706 return FinalizablePersistentHandle::IsPrologueWeakPersistentHandle(object);
703 } 707 }
704 708
705 709
706 DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet( 710 DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet(
707 Dart_WeakPersistentHandle* keys, 711 Dart_WeakPersistentHandle* keys,
708 intptr_t num_keys, 712 intptr_t num_keys,
709 Dart_WeakPersistentHandle* values, 713 Dart_WeakPersistentHandle* values,
710 intptr_t num_values) { 714 intptr_t num_values) {
711 Isolate* isolate = Isolate::Current(); 715 Isolate* isolate = Isolate::Current();
712 CHECK_ISOLATE(isolate); 716 CHECK_ISOLATE(isolate);
(...skipping 3894 matching lines...) Expand 10 before | Expand all | Expand 10 after
4607 4611
4608 4612
4609 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( 4613 DART_EXPORT void Dart_RegisterRootServiceRequestCallback(
4610 const char* name, 4614 const char* name,
4611 Dart_ServiceRequestCallback callback, 4615 Dart_ServiceRequestCallback callback,
4612 void* user_data) { 4616 void* user_data) {
4613 Service::RegisterRootEmbedderCallback(name, callback, user_data); 4617 Service::RegisterRootEmbedderCallback(name, callback, user_data);
4614 } 4618 }
4615 4619
4616 } // namespace dart 4620 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698