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

Side by Side Diff: include/v8.h

Issue 197263002: Implement PersistentValueMap, a map that stores UniquePersistent values. Part 2. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix use-after-free in test-api.cc. Now works on win32 Debug. 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 | « no previous file | src/api.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 class Data; 133 class Data;
134 template<typename T> class PropertyCallbackInfo; 134 template<typename T> class PropertyCallbackInfo;
135 class StackTrace; 135 class StackTrace;
136 class StackFrame; 136 class StackFrame;
137 class Isolate; 137 class Isolate;
138 class DeclaredAccessorDescriptor; 138 class DeclaredAccessorDescriptor;
139 class ObjectOperationDescriptor; 139 class ObjectOperationDescriptor;
140 class RawOperationDescriptor; 140 class RawOperationDescriptor;
141 class CallHandlerHelper; 141 class CallHandlerHelper;
142 class EscapableHandleScope; 142 class EscapableHandleScope;
143 template<typename T> class ReturnValue;
143 144
144 namespace internal { 145 namespace internal {
145 class Arguments; 146 class Arguments;
146 class Heap; 147 class Heap;
147 class HeapObject; 148 class HeapObject;
148 class Isolate; 149 class Isolate;
149 class Object; 150 class Object;
150 template<typename T> class CustomArguments; 151 template<typename T> class CustomArguments;
151 class PropertyCallbackArguments; 152 class PropertyCallbackArguments;
152 class FunctionCallbackArguments; 153 class FunctionCallbackArguments;
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 template<class F> friend class Handle; 406 template<class F> friend class Handle;
406 template<class F> friend class Local; 407 template<class F> friend class Local;
407 template<class F> friend class FunctionCallbackInfo; 408 template<class F> friend class FunctionCallbackInfo;
408 template<class F> friend class PropertyCallbackInfo; 409 template<class F> friend class PropertyCallbackInfo;
409 friend class String; 410 friend class String;
410 friend class Object; 411 friend class Object;
411 friend class Context; 412 friend class Context;
412 template<class F> friend class internal::CustomArguments; 413 template<class F> friend class internal::CustomArguments;
413 friend class HandleScope; 414 friend class HandleScope;
414 friend class EscapableHandleScope; 415 friend class EscapableHandleScope;
416 template<class F1, class F2, class F3> friend class PersistentValueMap;
415 417
416 V8_INLINE static Local<T> New(Isolate* isolate, T* that); 418 V8_INLINE static Local<T> New(Isolate* isolate, T* that);
417 }; 419 };
418 420
419 421
420 // Eternal handles are set-once handles that live for the life of the isolate. 422 // Eternal handles are set-once handles that live for the life of the isolate.
421 template <class T> class Eternal { 423 template <class T> class Eternal {
422 public: 424 public:
423 V8_INLINE Eternal() : index_(kInitialValue) { } 425 V8_INLINE Eternal() : index_(kInitialValue) { }
424 template<class S> 426 template<class S>
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 template<typename P> 522 template<typename P>
521 V8_INLINE void SetWeak( 523 V8_INLINE void SetWeak(
522 P* parameter, 524 P* parameter,
523 typename WeakCallbackData<T, P>::Callback callback); 525 typename WeakCallbackData<T, P>::Callback callback);
524 526
525 template<typename S, typename P> 527 template<typename S, typename P>
526 V8_INLINE void SetWeak( 528 V8_INLINE void SetWeak(
527 P* parameter, 529 P* parameter,
528 typename WeakCallbackData<S, P>::Callback callback); 530 typename WeakCallbackData<S, P>::Callback callback);
529 531
530 V8_INLINE void ClearWeak(); 532 template<typename P>
533 V8_INLINE P* ClearWeak();
534
535 // TODO(dcarney): remove this.
536 V8_INLINE void ClearWeak() { ClearWeak<void>(); }
531 537
532 /** 538 /**
533 * Marks the reference to this object independent. Garbage collector is free 539 * Marks the reference to this object independent. Garbage collector is free
534 * to ignore any object groups containing this object. Weak callback for an 540 * to ignore any object groups containing this object. Weak callback for an
535 * independent handle should not assume that it will be preceded by a global 541 * independent handle should not assume that it will be preceded by a global
536 * GC prologue callback or followed by a global GC epilogue callback. 542 * GC prologue callback or followed by a global GC epilogue callback.
537 */ 543 */
538 V8_INLINE void MarkIndependent(); 544 V8_INLINE void MarkIndependent();
539 545
540 /** 546 /**
(...skipping 28 matching lines...) Expand all
569 575
570 private: 576 private:
571 friend class Isolate; 577 friend class Isolate;
572 friend class Utils; 578 friend class Utils;
573 template<class F> friend class Handle; 579 template<class F> friend class Handle;
574 template<class F> friend class Local; 580 template<class F> friend class Local;
575 template<class F1, class F2> friend class Persistent; 581 template<class F1, class F2> friend class Persistent;
576 template<class F> friend class UniquePersistent; 582 template<class F> friend class UniquePersistent;
577 template<class F> friend class PersistentBase; 583 template<class F> friend class PersistentBase;
578 template<class F> friend class ReturnValue; 584 template<class F> friend class ReturnValue;
585 template<class F1, class F2, class F3> friend class PersistentValueMap;
579 friend class Object; 586 friend class Object;
580 587
581 explicit V8_INLINE PersistentBase(T* val) : val_(val) {} 588 explicit V8_INLINE PersistentBase(T* val) : val_(val) {}
582 PersistentBase(PersistentBase& other); // NOLINT 589 PersistentBase(PersistentBase& other); // NOLINT
583 void operator=(PersistentBase&); 590 void operator=(PersistentBase&);
584 V8_INLINE static T* New(Isolate* isolate, T* that); 591 V8_INLINE static T* New(Isolate* isolate, T* that);
585 592
586 T* val_; 593 T* val_;
587 }; 594 };
588 595
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 * Note: Persistent class hierarchy is subject to future changes. 744 * Note: Persistent class hierarchy is subject to future changes.
738 */ 745 */
739 template<class T> 746 template<class T>
740 class UniquePersistent : public PersistentBase<T> { 747 class UniquePersistent : public PersistentBase<T> {
741 struct RValue { 748 struct RValue {
742 V8_INLINE explicit RValue(UniquePersistent* obj) : object(obj) {} 749 V8_INLINE explicit RValue(UniquePersistent* obj) : object(obj) {}
743 UniquePersistent* object; 750 UniquePersistent* object;
744 }; 751 };
745 752
746 public: 753 public:
747 /** 754 /**
748 * A UniquePersistent with no storage cell. 755 * A UniquePersistent with no storage cell.
749 */ 756 */
750 V8_INLINE UniquePersistent() : PersistentBase<T>(0) { } 757 V8_INLINE UniquePersistent() : PersistentBase<T>(0) { }
751 /** 758 /**
752 * Construct a UniquePersistent from a Handle. 759 * Construct a UniquePersistent from a Handle.
753 * When the Handle is non-empty, a new storage cell is created 760 * When the Handle is non-empty, a new storage cell is created
754 * pointing to the same object, and no flags are set. 761 * pointing to the same object, and no flags are set.
755 */ 762 */
756 template <class S> 763 template <class S>
757 V8_INLINE UniquePersistent(Isolate* isolate, Handle<S> that) 764 V8_INLINE UniquePersistent(Isolate* isolate, Handle<S> that)
(...skipping 17 matching lines...) Expand all
775 : PersistentBase<T>(rvalue.object->val_) { 782 : PersistentBase<T>(rvalue.object->val_) {
776 rvalue.object->val_ = 0; 783 rvalue.object->val_ = 0;
777 } 784 }
778 V8_INLINE ~UniquePersistent() { this->Reset(); } 785 V8_INLINE ~UniquePersistent() { this->Reset(); }
779 /** 786 /**
780 * Move via assignment. 787 * Move via assignment.
781 */ 788 */
782 template<class S> 789 template<class S>
783 V8_INLINE UniquePersistent& operator=(UniquePersistent<S> rhs) { 790 V8_INLINE UniquePersistent& operator=(UniquePersistent<S> rhs) {
784 TYPE_CHECK(T, S); 791 TYPE_CHECK(T, S);
792 this->Reset();
785 this->val_ = rhs.val_; 793 this->val_ = rhs.val_;
786 rhs.val_ = 0; 794 rhs.val_ = 0;
787 return *this; 795 return *this;
788 } 796 }
789 /** 797 /**
790 * Cast operator for moves. 798 * Cast operator for moves.
791 */ 799 */
792 V8_INLINE operator RValue() { return RValue(this); } 800 V8_INLINE operator RValue() { return RValue(this); }
793 /** 801 /**
794 * Pass allows returning uniques from functions, etc. 802 * Pass allows returning uniques from functions, etc.
795 */ 803 */
796 V8_INLINE UniquePersistent Pass() { return UniquePersistent(RValue(this)); } 804 V8_INLINE UniquePersistent Pass() { return UniquePersistent(RValue(this)); }
797 805
798 private: 806 private:
799 UniquePersistent(UniquePersistent&); 807 UniquePersistent(UniquePersistent&);
800 void operator=(UniquePersistent&); 808 void operator=(UniquePersistent&);
801 }; 809 };
802 810
803 811
812 typedef uintptr_t PersistentContainerValue;
813 static const uintptr_t kPersistentContainerNotFound = 0;
814
815 /**
816 * A map wrapper that allows using UniquePersistent as a mapped value.
817 * C++11 embedders don't need this class, as they can use UniquePersistent
818 * directly in std containers.
819 *
820 * The map relies on a backing map, whose type and accessors are described
821 * by the Traits class. The backing map will handle values of type
822 * PersistentContainerValue, with all conversion into and out of V8
823 * handles being transparently handled by this class.
824 */
825 template<class K, class V, class Traits>
826 class PersistentValueMap {
827 public:
828 V8_INLINE explicit PersistentValueMap(Isolate* isolate) : isolate_(isolate) {}
829
830 V8_INLINE ~PersistentValueMap() { Clear(); }
831
832 V8_INLINE Isolate* GetIsolate() { return isolate_; }
833
834 /**
835 * Return size of the map.
836 */
837 V8_INLINE size_t Size() { return Traits::Size(&impl_); }
838
839 /**
840 * Get value stored in map.
841 */
842 V8_INLINE Local<V> Get(const K& key) {
843 return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, key)));
844 }
845
846 /**
847 * Check whether a value is contained in the map.
848 */
849 V8_INLINE bool Contains(const K& key) {
850 return Traits::Get(&impl_, key) != 0;
851 }
852
853 /**
854 * Get value stored in map and set it in returnValue.
855 * Return true if a value was found.
856 */
857 V8_INLINE bool SetReturnValue(const K& key,
858 ReturnValue<Value>& returnValue);
859
860 /**
861 * Call Isolate::SetReference with the given parent and the map value.
862 */
863 V8_INLINE void SetReference(const K& key,
864 const v8::Persistent<v8::Object>& parent) {
865 GetIsolate()->SetReference(
866 reinterpret_cast<internal::Object**>(parent.val_),
867 reinterpret_cast<internal::Object**>(FromVal(Traits::Get(&impl_, key))));
868 }
869
870 /**
871 * Put value into map. Depending on Traits::kIsWeak, the value will be held
872 * by the map strongly or weakly.
873 * Returns old value as UniquePersistent.
874 */
875 UniquePersistent<V> Set(const K& key, Local<V> value) {
876 UniquePersistent<V> persistent(isolate_, value);
877 return SetUnique(key, &persistent);
878 }
879
880 /**
881 * Put value into map, like Set(const K&, Local<V>).
882 */
883 UniquePersistent<V> Set(const K& key, UniquePersistent<V> value) {
884 return SetUnique(key, &value);
885 }
886
887 /**
888 * Return value for key and remove it from the map.
889 */
890 V8_INLINE UniquePersistent<V> Remove(const K& key) {
891 return Release(Traits::Remove(&impl_, key)).Pass();
892 }
893
894 /**
895 * Traverses the map repeatedly,
896 * in case side effects of disposal cause insertions.
897 **/
898 void Clear();
899
900 private:
901 PersistentValueMap(PersistentValueMap&);
902 void operator=(PersistentValueMap&);
903
904 /**
905 * Put the value into the map, and set the 'weak' callback when demanded
906 * by the Traits class.
907 */
908 UniquePersistent<V> SetUnique(const K& key, UniquePersistent<V>* persistent) {
909 if (Traits::kIsWeak) {
910 Local<V> value(Local<V>::New(isolate_, *persistent));
911 persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
912 Traits::WeakCallbackParameter(&impl_, key, value), WeakCallback);
913 }
914 PersistentContainerValue old_value =
915 Traits::Set(&impl_, key, ClearAndLeak(persistent));
916 return Release(old_value).Pass();
917 }
918
919 static void WeakCallback(
920 const WeakCallbackData<V, typename Traits::WeakCallbackDataType>& data);
921 V8_INLINE static V* FromVal(PersistentContainerValue v) {
922 return reinterpret_cast<V*>(v);
923 }
924 V8_INLINE static PersistentContainerValue ClearAndLeak(
925 UniquePersistent<V>* persistent) {
926 V* v = persistent->val_;
927 persistent->val_ = 0;
928 return reinterpret_cast<PersistentContainerValue>(v);
929 }
930
931 /**
932 * Return a container value as UniquePersistent and make sure the weak
933 * callback is properly disposed of. All remove functionality should go
934 * through this.
935 */
936 V8_INLINE static UniquePersistent<V> Release(PersistentContainerValue v) {
937 UniquePersistent<V> p;
938 p.val_ = FromVal(v);
939 if (Traits::kIsWeak && !p.IsEmpty()) {
940 Traits::DisposeCallbackData(
941 p.template ClearWeak<typename Traits::WeakCallbackDataType>());
942 }
943 return p.Pass();
944 }
945
946 Isolate* isolate_;
947 typename Traits::Impl impl_;
948 };
949
950
804 /** 951 /**
805 * A stack-allocated class that governs a number of local handles. 952 * A stack-allocated class that governs a number of local handles.
806 * After a handle scope has been created, all local handles will be 953 * After a handle scope has been created, all local handles will be
807 * allocated within that handle scope until either the handle scope is 954 * allocated within that handle scope until either the handle scope is
808 * deleted or another handle scope is created. If there is already a 955 * deleted or another handle scope is created. If there is already a
809 * handle scope and a new one is created, all allocations will take 956 * handle scope and a new one is created, all allocations will take
810 * place in the new handle scope until it is deleted. After that, 957 * place in the new handle scope until it is deleted. After that,
811 * new handles will again be allocated in the original handle scope. 958 * new handles will again be allocated in the original handle scope.
812 * 959 *
813 * After the handle scope of a local handle has been deleted the 960 * After the handle scope of a local handle has been deleted the
(...skipping 1567 matching lines...) Expand 10 before | Expand all | Expand 10 after
2381 V8_INLINE void SetNull(); 2528 V8_INLINE void SetNull();
2382 V8_INLINE void SetUndefined(); 2529 V8_INLINE void SetUndefined();
2383 V8_INLINE void SetEmptyString(); 2530 V8_INLINE void SetEmptyString();
2384 // Convenience getter for Isolate 2531 // Convenience getter for Isolate
2385 V8_INLINE Isolate* GetIsolate(); 2532 V8_INLINE Isolate* GetIsolate();
2386 2533
2387 private: 2534 private:
2388 template<class F> friend class ReturnValue; 2535 template<class F> friend class ReturnValue;
2389 template<class F> friend class FunctionCallbackInfo; 2536 template<class F> friend class FunctionCallbackInfo;
2390 template<class F> friend class PropertyCallbackInfo; 2537 template<class F> friend class PropertyCallbackInfo;
2538 template<class F, class G, class H> friend class PersistentValueMap;
2539 V8_INLINE void SetInternal(internal::Object* value) { *value_ = value; }
2391 V8_INLINE internal::Object* GetDefaultValue(); 2540 V8_INLINE internal::Object* GetDefaultValue();
2392 V8_INLINE explicit ReturnValue(internal::Object** slot); 2541 V8_INLINE explicit ReturnValue(internal::Object** slot);
2393 internal::Object** value_; 2542 internal::Object** value_;
2394 }; 2543 };
2395 2544
2396 2545
2397 /** 2546 /**
2398 * The argument information given to function call callbacks. This 2547 * The argument information given to function call callbacks. This
2399 * class provides access to information about the context of the call, 2548 * class provides access to information about the context of the call,
2400 * including the receiver, the number and values of arguments, and 2549 * including the receiver, the number and values of arguments, and
(...skipping 1827 matching lines...) Expand 10 before | Expand all | Expand 10 after
4228 * instead to influence the garbage collection schedule. 4377 * instead to influence the garbage collection schedule.
4229 */ 4378 */
4230 void RequestGarbageCollectionForTesting(GarbageCollectionType type); 4379 void RequestGarbageCollectionForTesting(GarbageCollectionType type);
4231 4380
4232 /** 4381 /**
4233 * Set the callback to invoke for logging event. 4382 * Set the callback to invoke for logging event.
4234 */ 4383 */
4235 void SetEventLogger(LogEventCallback that); 4384 void SetEventLogger(LogEventCallback that);
4236 4385
4237 private: 4386 private:
4387 template<class K, class V, class Traits> friend class PersistentValueMap;
4388
4238 Isolate(); 4389 Isolate();
4239 Isolate(const Isolate&); 4390 Isolate(const Isolate&);
4240 ~Isolate(); 4391 ~Isolate();
4241 Isolate& operator=(const Isolate&); 4392 Isolate& operator=(const Isolate&);
4242 void* operator new(size_t size); 4393 void* operator new(size_t size);
4243 void operator delete(void*, size_t); 4394 void operator delete(void*, size_t);
4244 4395
4245 void SetObjectGroupId(internal::Object** object, UniqueId id); 4396 void SetObjectGroupId(internal::Object** object, UniqueId id);
4246 void SetReferenceFromGroup(UniqueId id, internal::Object** object); 4397 void SetReferenceFromGroup(UniqueId id, internal::Object** object);
4247 void SetReference(internal::Object** parent, internal::Object** child); 4398 void SetReference(internal::Object** parent, internal::Object** child);
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
4822 V8(); 4973 V8();
4823 4974
4824 static internal::Object** GlobalizeReference(internal::Isolate* isolate, 4975 static internal::Object** GlobalizeReference(internal::Isolate* isolate,
4825 internal::Object** handle); 4976 internal::Object** handle);
4826 static internal::Object** CopyPersistent(internal::Object** handle); 4977 static internal::Object** CopyPersistent(internal::Object** handle);
4827 static void DisposeGlobal(internal::Object** global_handle); 4978 static void DisposeGlobal(internal::Object** global_handle);
4828 typedef WeakCallbackData<Value, void>::Callback WeakCallback; 4979 typedef WeakCallbackData<Value, void>::Callback WeakCallback;
4829 static void MakeWeak(internal::Object** global_handle, 4980 static void MakeWeak(internal::Object** global_handle,
4830 void* data, 4981 void* data,
4831 WeakCallback weak_callback); 4982 WeakCallback weak_callback);
4832 static void ClearWeak(internal::Object** global_handle); 4983 static void* ClearWeak(internal::Object** global_handle);
4833 static void Eternalize(Isolate* isolate, 4984 static void Eternalize(Isolate* isolate,
4834 Value* handle, 4985 Value* handle,
4835 int* index); 4986 int* index);
4836 static Local<Value> GetEternal(Isolate* isolate, int index); 4987 static Local<Value> GetEternal(Isolate* isolate, int index);
4837 4988
4838 template <class T> friend class Handle; 4989 template <class T> friend class Handle;
4839 template <class T> friend class Local; 4990 template <class T> friend class Local;
4840 template <class T> friend class Eternal; 4991 template <class T> friend class Eternal;
4841 template <class T> friend class PersistentBase; 4992 template <class T> friend class PersistentBase;
4842 template <class T, class M> friend class Persistent; 4993 template <class T, class M> friend class Persistent;
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
5735 template <class T> 5886 template <class T>
5736 template <typename P> 5887 template <typename P>
5737 void PersistentBase<T>::SetWeak( 5888 void PersistentBase<T>::SetWeak(
5738 P* parameter, 5889 P* parameter,
5739 typename WeakCallbackData<T, P>::Callback callback) { 5890 typename WeakCallbackData<T, P>::Callback callback) {
5740 SetWeak<T, P>(parameter, callback); 5891 SetWeak<T, P>(parameter, callback);
5741 } 5892 }
5742 5893
5743 5894
5744 template <class T> 5895 template <class T>
5745 void PersistentBase<T>::ClearWeak() { 5896 template<typename P>
5746 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)); 5897 P* PersistentBase<T>::ClearWeak() {
5898 return reinterpret_cast<P*>(
5899 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
5747 } 5900 }
5748 5901
5749 5902
5750 template <class T> 5903 template <class T>
5751 void PersistentBase<T>::MarkIndependent() { 5904 void PersistentBase<T>::MarkIndependent() {
5752 typedef internal::Internals I; 5905 typedef internal::Internals I;
5753 if (this->IsEmpty()) return; 5906 if (this->IsEmpty()) return;
5754 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), 5907 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
5755 true, 5908 true,
5756 I::kNodeIsIndependentShift); 5909 I::kNodeIsIndependentShift);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5789 template <class T> 5942 template <class T>
5790 uint16_t PersistentBase<T>::WrapperClassId() const { 5943 uint16_t PersistentBase<T>::WrapperClassId() const {
5791 typedef internal::Internals I; 5944 typedef internal::Internals I;
5792 if (this->IsEmpty()) return 0; 5945 if (this->IsEmpty()) return 0;
5793 internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_); 5946 internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
5794 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset; 5947 uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
5795 return *reinterpret_cast<uint16_t*>(addr); 5948 return *reinterpret_cast<uint16_t*>(addr);
5796 } 5949 }
5797 5950
5798 5951
5952 template <class K, class V, class Traits>
5953 bool PersistentValueMap<K, V, Traits>::SetReturnValue(const K& key,
5954 ReturnValue<Value>& returnValue) {
5955 PersistentContainerValue value = Traits::Get(&impl_, key);
5956 bool hasValue = value != 0;
5957 if (hasValue) {
5958 returnValue.SetInternal(
5959 *reinterpret_cast<internal::Object**>(FromVal(value)));
5960 }
5961 return hasValue;
5962 }
5963
5964 template <class K, class V, class Traits>
5965 void PersistentValueMap<K, V, Traits>::Clear() {
5966 typedef typename Traits::Iterator It;
5967 HandleScope handle_scope(isolate_);
5968 // TODO(dcarney): figure out if this swap and loop is necessary.
5969 while (!Traits::Empty(&impl_)) {
5970 typename Traits::Impl impl;
5971 Traits::Swap(impl_, impl);
5972 for (It i = Traits::Begin(&impl); i != Traits::End(&impl); ++i) {
5973 Traits::Dispose(isolate_, Release(Traits::Value(i)).Pass(), &impl,
5974 Traits::Key(i));
5975 }
5976 }
5977 }
5978
5979
5980 template <class K, class V, class Traits>
5981 void PersistentValueMap<K, V, Traits>::WeakCallback(
5982 const WeakCallbackData<V, typename Traits::WeakCallbackDataType>& data) {
5983 typename Traits::Impl* impl = Traits::ImplFromWeakCallbackData(data);
5984 K key = Traits::KeyFromWeakCallbackData(data);
5985 PersistentContainerValue value = Traits::Remove(impl, key);
5986 Traits::Dispose(data.GetIsolate(), Release(value).Pass(), impl, key);
5987 }
5988
5989
5799 template<typename T> 5990 template<typename T>
5800 ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {} 5991 ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {}
5801 5992
5802 template<typename T> 5993 template<typename T>
5803 template<typename S> 5994 template<typename S>
5804 void ReturnValue<T>::Set(const Persistent<S>& handle) { 5995 void ReturnValue<T>::Set(const Persistent<S>& handle) {
5805 TYPE_CHECK(T, S); 5996 TYPE_CHECK(T, S);
5806 if (V8_UNLIKELY(handle.IsEmpty())) { 5997 if (V8_UNLIKELY(handle.IsEmpty())) {
5807 *value_ = GetDefaultValue(); 5998 *value_ = GetDefaultValue();
5808 } else { 5999 } else {
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
6506 */ 6697 */
6507 6698
6508 6699
6509 } // namespace v8 6700 } // namespace v8
6510 6701
6511 6702
6512 #undef TYPE_CHECK 6703 #undef TYPE_CHECK
6513 6704
6514 6705
6515 #endif // V8_H_ 6706 #endif // V8_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698