OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #ifndef VM_DART_API_STATE_H_ | 5 #ifndef VM_DART_API_STATE_H_ |
6 #define VM_DART_API_STATE_H_ | 6 #define VM_DART_API_STATE_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 | 9 |
10 #include "platform/thread.h" | 10 #include "platform/thread.h" |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
85 // check for integer overflow. If you use AllocUnsafe, you are | 85 // check for integer overflow. If you use AllocUnsafe, you are |
86 // responsible for avoiding integer overflow yourself. | 86 // responsible for avoiding integer overflow yourself. |
87 uword AllocUnsafe(intptr_t size) { return zone_.AllocUnsafe(size); } | 87 uword AllocUnsafe(intptr_t size) { return zone_.AllocUnsafe(size); } |
88 | 88 |
89 // Compute the total size of this zone. This includes wasted space that is | 89 // Compute the total size of this zone. This includes wasted space that is |
90 // due to internal fragmentation in the segments. | 90 // due to internal fragmentation in the segments. |
91 intptr_t SizeInBytes() const { return zone_.SizeInBytes(); } | 91 intptr_t SizeInBytes() const { return zone_.SizeInBytes(); } |
92 | 92 |
93 Zone* GetZone() { return &zone_; } | 93 Zone* GetZone() { return &zone_; } |
94 | 94 |
95 void Reinit(Isolate* isolate) { | |
96 if (isolate == NULL) { | |
97 zone_.Link(NULL); | |
98 } else { | |
99 zone_.Link(isolate->current_zone()); | |
100 isolate->set_current_zone(&zone_); | |
101 } | |
102 } | |
103 | |
104 void Reset(Isolate* isolate) { | |
105 if (isolate != NULL && isolate->current_zone() == &zone_) { | |
srdjan
2013/07/22 18:18:16
Say: parentheseeeeeeees
siva
2013/07/22 18:42:09
Done :-)
On 2013/07/22 18:18:16, srdjan wrote:
| |
106 isolate->set_current_zone(zone_.previous_); | |
107 } | |
108 zone_.DeleteAll(); | |
109 } | |
110 | |
95 private: | 111 private: |
96 Zone zone_; | 112 Zone zone_; |
97 | 113 |
98 template<typename T> friend class ApiGrowableArray; | 114 template<typename T> friend class ApiGrowableArray; |
99 DISALLOW_COPY_AND_ASSIGN(ApiZone); | 115 DISALLOW_COPY_AND_ASSIGN(ApiZone); |
100 }; | 116 }; |
101 | 117 |
102 | 118 |
103 // Implementation of local handles which are handed out from every | 119 // Implementation of local handles which are handed out from every |
104 // dart API call, these handles are valid only in the present scope | 120 // dart API call, these handles are valid only in the present scope |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 } | 274 } |
259 | 275 |
260 | 276 |
261 // Visit all object pointers stored in the various handles. | 277 // Visit all object pointers stored in the various handles. |
262 void VisitObjectPointers(ObjectPointerVisitor* visitor) { | 278 void VisitObjectPointers(ObjectPointerVisitor* visitor) { |
263 Handles<kLocalHandleSizeInWords, | 279 Handles<kLocalHandleSizeInWords, |
264 kLocalHandlesPerChunk, | 280 kLocalHandlesPerChunk, |
265 kOffsetOfRawPtrInLocalHandle>::VisitObjectPointers(visitor); | 281 kOffsetOfRawPtrInLocalHandle>::VisitObjectPointers(visitor); |
266 } | 282 } |
267 | 283 |
284 // Reset the local handles block for reuse. | |
285 void Reset() { | |
286 Handles<kLocalHandleSizeInWords, | |
287 kLocalHandlesPerChunk, | |
288 kOffsetOfRawPtrInLocalHandle>::Reset(); | |
289 } | |
290 | |
268 // Allocates a handle in the current handle scope. This handle is valid only | 291 // Allocates a handle in the current handle scope. This handle is valid only |
269 // in the current handle scope and is destroyed when the current handle | 292 // in the current handle scope and is destroyed when the current handle |
270 // scope ends. | 293 // scope ends. |
271 LocalHandle* AllocateHandle() { | 294 LocalHandle* AllocateHandle() { |
272 return reinterpret_cast<LocalHandle*>(AllocateScopedHandle()); | 295 return reinterpret_cast<LocalHandle*>(AllocateScopedHandle()); |
273 } | 296 } |
274 | 297 |
275 // Validate if passed in handle is a Local Handle. | 298 // Validate if passed in handle is a Local Handle. |
276 bool IsValidHandle(Dart_Handle object) const { | 299 bool IsValidHandle(Dart_Handle object) const { |
277 return IsValidScopedHandle(reinterpret_cast<uword>(object)); | 300 return IsValidScopedHandle(reinterpret_cast<uword>(object)); |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
498 // Structure used for the implementation of local scopes used in dart_api. | 521 // Structure used for the implementation of local scopes used in dart_api. |
499 // These local scopes manage handles and memory allocated in the scope. | 522 // These local scopes manage handles and memory allocated in the scope. |
500 class ApiLocalScope { | 523 class ApiLocalScope { |
501 public: | 524 public: |
502 ApiLocalScope(ApiLocalScope* previous, uword stack_marker) : | 525 ApiLocalScope(ApiLocalScope* previous, uword stack_marker) : |
503 previous_(previous), stack_marker_(stack_marker) { } | 526 previous_(previous), stack_marker_(stack_marker) { } |
504 ~ApiLocalScope() { | 527 ~ApiLocalScope() { |
505 previous_ = NULL; | 528 previous_ = NULL; |
506 } | 529 } |
507 | 530 |
531 // Reinit the ApiLocalScope to new values. | |
532 void Reinit(Isolate* isolate, ApiLocalScope* previous, uword stack_marker) { | |
533 previous_ = previous; | |
534 stack_marker_ = stack_marker; | |
535 zone_.Reinit(isolate); | |
536 } | |
537 | |
538 // Reset the ApiLocalScope so that it can be reused again. | |
539 void Reset(Isolate* isolate) { | |
540 local_handles_.Reset(); | |
541 zone_.Reset(isolate); | |
542 previous_ = NULL; | |
543 stack_marker_ = 0; | |
544 } | |
545 | |
508 // Accessors. | 546 // Accessors. |
509 ApiLocalScope* previous() const { return previous_; } | 547 ApiLocalScope* previous() const { return previous_; } |
510 uword stack_marker() const { return stack_marker_; } | 548 uword stack_marker() const { return stack_marker_; } |
511 void set_previous(ApiLocalScope* value) { previous_ = value; } | 549 void set_previous(ApiLocalScope* value) { previous_ = value; } |
512 LocalHandles* local_handles() { return &local_handles_; } | 550 LocalHandles* local_handles() { return &local_handles_; } |
513 Zone* zone() { return zone_.GetZone(); } | 551 Zone* zone() { return zone_.GetZone(); } |
514 | 552 |
515 private: | 553 private: |
516 ApiLocalScope* previous_; | 554 ApiLocalScope* previous_; |
517 uword stack_marker_; | 555 uword stack_marker_; |
518 LocalHandles local_handles_; | 556 LocalHandles local_handles_; |
519 ApiZone zone_; | 557 ApiZone zone_; |
520 | 558 |
521 DISALLOW_COPY_AND_ASSIGN(ApiLocalScope); | 559 DISALLOW_COPY_AND_ASSIGN(ApiLocalScope); |
522 }; | 560 }; |
523 | 561 |
524 | 562 |
525 // Implementation of the API State used in dart api for maintaining | 563 // Implementation of the API State used in dart api for maintaining |
526 // local scopes, persistent handles etc. These are setup on a per isolate | 564 // local scopes, persistent handles etc. These are setup on a per isolate |
527 // basis and destroyed when the isolate is shutdown. | 565 // basis and destroyed when the isolate is shutdown. |
528 class ApiState { | 566 class ApiState { |
529 public: | 567 public: |
530 ApiState() : top_scope_(NULL), delayed_weak_reference_sets_(NULL), | 568 ApiState() : persistent_handles_(), |
531 null_(NULL), true_(NULL), false_(NULL), | 569 weak_persistent_handles_(), |
570 prologue_weak_persistent_handles_(), | |
571 reusable_scope_(NULL), | |
572 top_scope_(NULL), | |
573 delayed_weak_reference_sets_(NULL), | |
574 null_(NULL), | |
575 true_(NULL), | |
576 false_(NULL), | |
532 acquired_error_(NULL) {} | 577 acquired_error_(NULL) {} |
533 ~ApiState() { | 578 ~ApiState() { |
534 while (top_scope_ != NULL) { | 579 while (top_scope_ != NULL) { |
535 ApiLocalScope* scope = top_scope_; | 580 ApiLocalScope* scope = top_scope_; |
536 top_scope_ = top_scope_->previous(); | 581 top_scope_ = top_scope_->previous(); |
537 delete scope; | 582 delete scope; |
538 } | 583 } |
539 if (null_ != NULL) { | 584 if (null_ != NULL) { |
540 persistent_handles().FreeHandle(null_); | 585 persistent_handles().FreeHandle(null_); |
541 null_ = NULL; | 586 null_ = NULL; |
542 } | 587 } |
543 if (true_ != NULL) { | 588 if (true_ != NULL) { |
544 persistent_handles().FreeHandle(true_); | 589 persistent_handles().FreeHandle(true_); |
545 true_ = NULL; | 590 true_ = NULL; |
546 } | 591 } |
547 if (false_ != NULL) { | 592 if (false_ != NULL) { |
548 persistent_handles().FreeHandle(false_); | 593 persistent_handles().FreeHandle(false_); |
549 false_ = NULL; | 594 false_ = NULL; |
550 } | 595 } |
551 if (acquired_error_ != NULL) { | 596 if (acquired_error_ != NULL) { |
552 persistent_handles().FreeHandle(acquired_error_); | 597 persistent_handles().FreeHandle(acquired_error_); |
553 acquired_error_ = NULL; | 598 acquired_error_ = NULL; |
554 } | 599 } |
555 } | 600 } |
556 | 601 |
557 // Accessors. | 602 // Accessors. |
603 ApiLocalScope* reusable_scope() const { return reusable_scope_; } | |
604 void set_reusable_scope(ApiLocalScope* value) { | |
605 ASSERT(value == NULL || reusable_scope_ == NULL); | |
606 reusable_scope_ = value; | |
607 } | |
558 ApiLocalScope* top_scope() const { return top_scope_; } | 608 ApiLocalScope* top_scope() const { return top_scope_; } |
559 void set_top_scope(ApiLocalScope* value) { top_scope_ = value; } | 609 void set_top_scope(ApiLocalScope* value) { top_scope_ = value; } |
560 | 610 |
561 PersistentHandles& persistent_handles() { return persistent_handles_; } | 611 PersistentHandles& persistent_handles() { return persistent_handles_; } |
562 | 612 |
563 FinalizablePersistentHandles& weak_persistent_handles() { | 613 FinalizablePersistentHandles& weak_persistent_handles() { |
564 return weak_persistent_handles_; | 614 return weak_persistent_handles_; |
565 } | 615 } |
566 | 616 |
567 FinalizablePersistentHandles& prologue_weak_persistent_handles() { | 617 FinalizablePersistentHandles& prologue_weak_persistent_handles() { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
673 } | 723 } |
674 | 724 |
675 void DelayWeakReferenceSet(WeakReferenceSet* reference_set) { | 725 void DelayWeakReferenceSet(WeakReferenceSet* reference_set) { |
676 WeakReferenceSet::Push(reference_set, &delayed_weak_reference_sets_); | 726 WeakReferenceSet::Push(reference_set, &delayed_weak_reference_sets_); |
677 } | 727 } |
678 | 728 |
679 private: | 729 private: |
680 PersistentHandles persistent_handles_; | 730 PersistentHandles persistent_handles_; |
681 FinalizablePersistentHandles weak_persistent_handles_; | 731 FinalizablePersistentHandles weak_persistent_handles_; |
682 FinalizablePersistentHandles prologue_weak_persistent_handles_; | 732 FinalizablePersistentHandles prologue_weak_persistent_handles_; |
733 ApiLocalScope* reusable_scope_; | |
683 ApiLocalScope* top_scope_; | 734 ApiLocalScope* top_scope_; |
684 WeakReferenceSet* delayed_weak_reference_sets_; | 735 WeakReferenceSet* delayed_weak_reference_sets_; |
685 | 736 |
686 // Persistent handles to important objects. | 737 // Persistent handles to important objects. |
687 PersistentHandle* null_; | 738 PersistentHandle* null_; |
688 PersistentHandle* true_; | 739 PersistentHandle* true_; |
689 PersistentHandle* false_; | 740 PersistentHandle* false_; |
690 PersistentHandle* acquired_error_; | 741 PersistentHandle* acquired_error_; |
691 | 742 |
692 DISALLOW_COPY_AND_ASSIGN(ApiState); | 743 DISALLOW_COPY_AND_ASSIGN(ApiState); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
731 ApiNativeScope::Current()->zone()) {} | 782 ApiNativeScope::Current()->zone()) {} |
732 ApiGrowableArray() | 783 ApiGrowableArray() |
733 : BaseGrowableArray<T, ValueObject>( | 784 : BaseGrowableArray<T, ValueObject>( |
734 ApiNativeScope::Current()->zone()) {} | 785 ApiNativeScope::Current()->zone()) {} |
735 }; | 786 }; |
736 | 787 |
737 | 788 |
738 } // namespace dart | 789 } // namespace dart |
739 | 790 |
740 #endif // VM_DART_API_STATE_H_ | 791 #endif // VM_DART_API_STATE_H_ |
OLD | NEW |