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

Side by Side Diff: include/v8.h

Issue 2751263003: Give v8::Eternal a direct reference to the handle. (Closed)
Patch Set: Merge branch 'master' into slim-eternal Created 3 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
« 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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** \mainpage V8 API Reference Guide 5 /** \mainpage V8 API Reference Guide
6 * 6 *
7 * V8 is Google's open source JavaScript engine. 7 * V8 is Google's open source JavaScript engine.
8 * 8 *
9 * This set of documents provides reference material generated from the 9 * This set of documents provides reference material generated from the
10 * V8 header file, include/v8.h. 10 * V8 header file, include/v8.h.
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 } 353 }
354 354
355 private: 355 private:
356 T* val_; 356 T* val_;
357 }; 357 };
358 358
359 359
360 // Eternal handles are set-once handles that live for the life of the isolate. 360 // Eternal handles are set-once handles that live for the life of the isolate.
361 template <class T> class Eternal { 361 template <class T> class Eternal {
362 public: 362 public:
363 V8_INLINE Eternal() : index_(kInitialValue) { } 363 V8_INLINE Eternal() : val_(nullptr) {}
364 template<class S> 364 template <class S>
365 V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : index_(kInitialValue) { 365 V8_INLINE Eternal(Isolate* isolate, Local<S> handle) : val_(nullptr) {
366 Set(isolate, handle); 366 Set(isolate, handle);
367 } 367 }
368 // Can only be safely called if already set. 368 // Can only be safely called if already set.
369 V8_INLINE Local<T> Get(Isolate* isolate) const; 369 V8_INLINE Local<T> Get(Isolate* isolate) const;
370 V8_INLINE bool IsEmpty() const { return index_ == kInitialValue; } 370 V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
371 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); 371 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle);
372 372
373 private: 373 private:
374 static const int kInitialValue = -1; 374 T* val_;
375 int index_;
376 }; 375 };
377 376
378 377
379 static const int kInternalFieldsInWeakCallback = 2; 378 static const int kInternalFieldsInWeakCallback = 2;
380 static const int kEmbedderFieldsInWeakCallback = 2; 379 static const int kEmbedderFieldsInWeakCallback = 2;
381 380
382 template <typename T> 381 template <typename T>
383 class WeakCallbackInfo { 382 class WeakCallbackInfo {
384 public: 383 public:
385 typedef void (*Callback)(const WeakCallbackInfo<T>& data); 384 typedef void (*Callback)(const WeakCallbackInfo<T>& data);
(...skipping 7280 matching lines...) Expand 10 before | Expand all | Expand 10 after
7666 WeakCallbackInfo<void>::Callback weak_callback, 7665 WeakCallbackInfo<void>::Callback weak_callback,
7667 WeakCallbackType type); 7666 WeakCallbackType type);
7668 static void MakeWeak(internal::Object** location, void* data, 7667 static void MakeWeak(internal::Object** location, void* data,
7669 // Must be 0 or -1. 7668 // Must be 0 or -1.
7670 int internal_field_index1, 7669 int internal_field_index1,
7671 // Must be 1 or -1. 7670 // Must be 1 or -1.
7672 int internal_field_index2, 7671 int internal_field_index2,
7673 WeakCallbackInfo<void>::Callback weak_callback); 7672 WeakCallbackInfo<void>::Callback weak_callback);
7674 static void MakeWeak(internal::Object*** location_addr); 7673 static void MakeWeak(internal::Object*** location_addr);
7675 static void* ClearWeak(internal::Object** location); 7674 static void* ClearWeak(internal::Object** location);
7676 static void Eternalize(Isolate* isolate, 7675 static Value* Eternalize(Isolate* isolate, Value* handle);
7677 Value* handle,
7678 int* index);
7679 static Local<Value> GetEternal(Isolate* isolate, int index);
7680 7676
7681 static void RegisterExternallyReferencedObject(internal::Object** object, 7677 static void RegisterExternallyReferencedObject(internal::Object** object,
7682 internal::Isolate* isolate); 7678 internal::Isolate* isolate);
7683 7679
7684 template <class K, class V, class T> 7680 template <class K, class V, class T>
7685 friend class PersistentValueMapBase; 7681 friend class PersistentValueMapBase;
7686 7682
7687 static void FromJustIsNothing(); 7683 static void FromJustIsNothing();
7688 static void ToLocalEmpty(); 7684 static void ToLocalEmpty();
7689 static void InternalFieldOutOfBounds(int index); 7685 static void InternalFieldOutOfBounds(int index);
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after
8634 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr); 8630 internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
8635 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle( 8631 return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
8636 reinterpret_cast<internal::Isolate*>(isolate), *p))); 8632 reinterpret_cast<internal::Isolate*>(isolate), *p)));
8637 } 8633 }
8638 8634
8639 8635
8640 template<class T> 8636 template<class T>
8641 template<class S> 8637 template<class S>
8642 void Eternal<T>::Set(Isolate* isolate, Local<S> handle) { 8638 void Eternal<T>::Set(Isolate* isolate, Local<S> handle) {
8643 TYPE_CHECK(T, S); 8639 TYPE_CHECK(T, S);
8644 V8::Eternalize(isolate, reinterpret_cast<Value*>(*handle), &this->index_); 8640 val_ = reinterpret_cast<T*>(
8641 V8::Eternalize(isolate, reinterpret_cast<Value*>(*handle)));
8645 } 8642 }
8646 8643
8647 template <class T> 8644 template <class T>
8648 Local<T> Eternal<T>::Get(Isolate* isolate) const { 8645 Local<T> Eternal<T>::Get(Isolate* isolate) const {
8649 return Local<T>(reinterpret_cast<T*>(*V8::GetEternal(isolate, index_))); 8646 // The eternal handle will never go away, so as with the roots, we don't even
8647 // need to open a handle.
8648 return Local<T>(val_);
8650 } 8649 }
8651 8650
8652 8651
8653 template <class T> 8652 template <class T>
8654 Local<T> MaybeLocal<T>::ToLocalChecked() { 8653 Local<T> MaybeLocal<T>::ToLocalChecked() {
8655 if (V8_UNLIKELY(val_ == nullptr)) V8::ToLocalEmpty(); 8654 if (V8_UNLIKELY(val_ == nullptr)) V8::ToLocalEmpty();
8656 return Local<T>(val_); 8655 return Local<T>(val_);
8657 } 8656 }
8658 8657
8659 8658
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after
9837 */ 9836 */
9838 9837
9839 9838
9840 } // namespace v8 9839 } // namespace v8
9841 9840
9842 9841
9843 #undef TYPE_CHECK 9842 #undef TYPE_CHECK
9844 9843
9845 9844
9846 #endif // INCLUDE_V8_H_ 9845 #endif // INCLUDE_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