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

Side by Side Diff: include/v8.h

Issue 753553002: Phantom references support internal fields (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 6 years 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') | src/global-handles.cc » ('J')
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 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 V8_INLINE Local<T> Get(Isolate* isolate); 411 V8_INLINE Local<T> Get(Isolate* isolate);
412 V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } 412 V8_INLINE bool IsEmpty() { return index_ == kInitialValue; }
413 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); 413 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle);
414 414
415 private: 415 private:
416 static const int kInitialValue = -1; 416 static const int kInitialValue = -1;
417 int index_; 417 int index_;
418 }; 418 };
419 419
420 420
421 template<class T>
422 class CallbackData {
423 public:
424 V8_INLINE Isolate* GetIsolate() const { return isolate_; }
425 V8_INLINE T* GetParameter() const { return parameter_; }
426
427 protected:
428 CallbackData(Isolate* isolate, T* parameter)
429 : isolate_(isolate), parameter_(parameter) { }
430
431 private:
432 Isolate* isolate_;
433 T* parameter_;
434 };
435
421 template<class T, class P> 436 template<class T, class P>
422 class WeakCallbackData { 437 class WeakCallbackData : public CallbackData<P> {
423 public: 438 public:
424 typedef void (*Callback)(const WeakCallbackData<T, P>& data); 439 typedef void (*Callback)(const WeakCallbackData<T, P>& data);
425 440
426 V8_INLINE Isolate* GetIsolate() const { return isolate_; }
427 V8_INLINE Local<T> GetValue() const { return handle_; } 441 V8_INLINE Local<T> GetValue() const { return handle_; }
428 V8_INLINE P* GetParameter() const { return parameter_; }
429 442
430 private: 443 private:
431 friend class internal::GlobalHandles; 444 friend class internal::GlobalHandles;
432 WeakCallbackData(Isolate* isolate, Local<T> handle, P* parameter) 445 WeakCallbackData(Isolate* isolate, Local<T> handle, P* parameter)
433 : isolate_(isolate), handle_(handle), parameter_(parameter) { } 446 : CallbackData<P>(isolate, parameter), handle_(handle) { }
434 Isolate* isolate_;
435 Local<T> handle_; 447 Local<T> handle_;
436 P* parameter_;
437 }; 448 };
438 449
439 450
451 template<typename T>
452 class PhantomCallbackData : public CallbackData<T> {
453 public:
454 typedef void (*Callback)(const PhantomCallbackData<T>& data);
455
456 V8_INLINE void* GetInternalField1() const { return internal_field1_; }
457 V8_INLINE void* GetInternalField2() const { return internal_field2_; }
458
459 private:
460 friend class internal::GlobalHandles;
461 PhantomCallbackData(Isolate* isolate, void* internalField1, void* internalFiel d2)
462 : CallbackData<T>(isolate, NULL),
463 internal_field1_(internalField1),
464 internal_field2_(internalField2) { }
465 PhantomCallbackData(Isolate* isolate, T* parameter)
466 : CallbackData<T>(isolate, parameter),
467 internal_field1_(NULL),
468 internal_field2_(NULL) { }
469 void* internal_field1_;
470 void* internal_field2_;
471 };
472
473
440 /** 474 /**
441 * An object reference that is independent of any handle scope. Where 475 * An object reference that is independent of any handle scope. Where
442 * a Local handle only lives as long as the HandleScope in which it was 476 * a Local handle only lives as long as the HandleScope in which it was
443 * allocated, a PersistentBase handle remains valid until it is explicitly 477 * allocated, a PersistentBase handle remains valid until it is explicitly
444 * disposed. 478 * disposed.
445 * 479 *
446 * A persistent handle contains a reference to a storage cell within 480 * A persistent handle contains a reference to a storage cell within
447 * the v8 engine which holds an object value and which is updated by 481 * the v8 engine which holds an object value and which is updated by
448 * the garbage collector whenever the object is moved. A new storage 482 * the garbage collector whenever the object is moved. A new storage
449 * cell can be created using the constructor or PersistentBase::Reset and 483 * cell can be created using the constructor or PersistentBase::Reset and
(...skipping 14 matching lines...) Expand all
464 template <class S> 498 template <class S>
465 V8_INLINE void Reset(Isolate* isolate, const Handle<S>& other); 499 V8_INLINE void Reset(Isolate* isolate, const Handle<S>& other);
466 500
467 /** 501 /**
468 * If non-empty, destroy the underlying storage cell 502 * If non-empty, destroy the underlying storage cell
469 * and create a new one with the contents of other if other is non empty 503 * and create a new one with the contents of other if other is non empty
470 */ 504 */
471 template <class S> 505 template <class S>
472 V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other); 506 V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other);
473 507
474 V8_INLINE bool IsEmpty() const { return val_ == 0; } 508 V8_INLINE bool IsEmpty() const { return val_ == NULL; }
509 V8_INLINE void Empty() { val_ = NULL; }
475 510
476 template <class S> 511 template <class S>
477 V8_INLINE bool operator==(const PersistentBase<S>& that) const { 512 V8_INLINE bool operator==(const PersistentBase<S>& that) const {
478 internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); 513 internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
479 internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); 514 internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
480 if (a == 0) return b == 0; 515 if (a == 0) return b == 0;
481 if (b == 0) return false; 516 if (b == 0) return false;
482 return *a == *b; 517 return *a == *b;
483 } 518 }
484 519
(...skipping 30 matching lines...) Expand all
515 V8_INLINE void SetWeak( 550 V8_INLINE void SetWeak(
516 P* parameter, 551 P* parameter,
517 typename WeakCallbackData<S, P>::Callback callback); 552 typename WeakCallbackData<S, P>::Callback callback);
518 553
519 // Phantom persistents work like weak persistents, except that the pointer to 554 // Phantom persistents work like weak persistents, except that the pointer to
520 // the object being collected is not available in the finalization callback. 555 // the object being collected is not available in the finalization callback.
521 // This enables the garbage collector to collect the object and any objects 556 // This enables the garbage collector to collect the object and any objects
522 // it references transitively in one GC cycle. 557 // it references transitively in one GC cycle.
523 template <typename P> 558 template <typename P>
524 V8_INLINE void SetPhantom(P* parameter, 559 V8_INLINE void SetPhantom(P* parameter,
525 typename WeakCallbackData<T, P>::Callback callback); 560 typename PhantomCallbackData<P>::Callback callback);
526 561
527 template <typename S, typename P> 562 V8_INLINE void SetPhantom(typename PhantomCallbackData<void>::Callback callbac k,
528 V8_INLINE void SetPhantom(P* parameter, 563 int internalFieldOffset1, int internalFieldOffset2);
529 typename WeakCallbackData<S, P>::Callback callback);
530 564
531 template<typename P> 565 template<typename P>
532 V8_INLINE P* ClearWeak(); 566 V8_INLINE P* ClearWeak();
533 567
534 // TODO(dcarney): remove this. 568 // TODO(dcarney): remove this.
535 V8_INLINE void ClearWeak() { ClearWeak<void>(); } 569 V8_INLINE void ClearWeak() { ClearWeak<void>(); }
536 570
537 /** 571 /**
538 * Marks the reference to this object independent. Garbage collector is free 572 * Marks the reference to this object independent. Garbage collector is free
539 * to ignore any object groups containing this object. Weak callback for an 573 * to ignore any object groups containing this object. Weak callback for an
(...skipping 1936 matching lines...) Expand 10 before | Expand all | Expand 10 after
2476 Local<String> ObjectProtoToString(); 2510 Local<String> ObjectProtoToString();
2477 2511
2478 /** 2512 /**
2479 * Returns the name of the function invoked as a constructor for this object. 2513 * Returns the name of the function invoked as a constructor for this object.
2480 */ 2514 */
2481 Local<String> GetConstructorName(); 2515 Local<String> GetConstructorName();
2482 2516
2483 /** Gets the number of internal fields for this Object. */ 2517 /** Gets the number of internal fields for this Object. */
2484 int InternalFieldCount(); 2518 int InternalFieldCount();
2485 2519
2520 static const int kNoInternalFieldIndex = -1;
2521
2486 /** Same as above, but works for Persistents */ 2522 /** Same as above, but works for Persistents */
2487 V8_INLINE static int InternalFieldCount( 2523 V8_INLINE static int InternalFieldCount(
2488 const PersistentBase<Object>& object) { 2524 const PersistentBase<Object>& object) {
2489 return object.val_->InternalFieldCount(); 2525 return object.val_->InternalFieldCount();
2490 } 2526 }
2491 2527
2492 /** Gets the value from an internal field. */ 2528 /** Gets the value from an internal field. */
2493 V8_INLINE Local<Value> GetInternalField(int index); 2529 V8_INLINE Local<Value> GetInternalField(int index);
2494 2530
2495 /** Sets the value in an internal field. */ 2531 /** Sets the value in an internal field. */
(...skipping 2984 matching lines...) Expand 10 before | Expand all | Expand 10 after
5480 private: 5516 private:
5481 V8(); 5517 V8();
5482 5518
5483 enum WeakHandleType { PhantomHandle, NonphantomHandle }; 5519 enum WeakHandleType { PhantomHandle, NonphantomHandle };
5484 5520
5485 static internal::Object** GlobalizeReference(internal::Isolate* isolate, 5521 static internal::Object** GlobalizeReference(internal::Isolate* isolate,
5486 internal::Object** handle); 5522 internal::Object** handle);
5487 static internal::Object** CopyPersistent(internal::Object** handle); 5523 static internal::Object** CopyPersistent(internal::Object** handle);
5488 static void DisposeGlobal(internal::Object** global_handle); 5524 static void DisposeGlobal(internal::Object** global_handle);
5489 typedef WeakCallbackData<Value, void>::Callback WeakCallback; 5525 typedef WeakCallbackData<Value, void>::Callback WeakCallback;
5526 typedef PhantomCallbackData<void>::Callback PhantomCallback;
5490 static void MakeWeak(internal::Object** global_handle, void* data, 5527 static void MakeWeak(internal::Object** global_handle, void* data,
5491 WeakCallback weak_callback, WeakHandleType phantom); 5528 WeakCallback weak_callback);
5529 static void MakePhantom(
5530 internal::Object** global_handle, void* data,
5531 PhantomCallback weak_callback,
5532 int internal_field_index1 = Object::kNoInternalFieldIndex,
5533 int internal_field_index2 = Object::kNoInternalFieldIndex);
5492 static void* ClearWeak(internal::Object** global_handle); 5534 static void* ClearWeak(internal::Object** global_handle);
5493 static void Eternalize(Isolate* isolate, 5535 static void Eternalize(Isolate* isolate,
5494 Value* handle, 5536 Value* handle,
5495 int* index); 5537 int* index);
5496 static Local<Value> GetEternal(Isolate* isolate, int index); 5538 static Local<Value> GetEternal(Isolate* isolate, int index);
5497 5539
5498 template <class T> friend class Handle; 5540 template <class T> friend class Handle;
5499 template <class T> friend class Local; 5541 template <class T> friend class Local;
5500 template <class T> friend class Eternal; 5542 template <class T> friend class Eternal;
5501 template <class T> friend class PersistentBase; 5543 template <class T> friend class PersistentBase;
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
6090 static const int kTrueValueRootIndex = 8; 6132 static const int kTrueValueRootIndex = 8;
6091 static const int kFalseValueRootIndex = 9; 6133 static const int kFalseValueRootIndex = 9;
6092 static const int kEmptyStringRootIndex = 154; 6134 static const int kEmptyStringRootIndex = 154;
6093 6135
6094 // The external allocation limit should be below 256 MB on all architectures 6136 // The external allocation limit should be below 256 MB on all architectures
6095 // to avoid that resource-constrained embedders run low on memory. 6137 // to avoid that resource-constrained embedders run low on memory.
6096 static const int kExternalAllocationLimit = 192 * 1024 * 1024; 6138 static const int kExternalAllocationLimit = 192 * 1024 * 1024;
6097 6139
6098 static const int kNodeClassIdOffset = 1 * kApiPointerSize; 6140 static const int kNodeClassIdOffset = 1 * kApiPointerSize;
6099 static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; 6141 static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
6100 static const int kNodeStateMask = 0xf; 6142 static const int kNodeStateMask = 0x7;
6101 static const int kNodeStateIsWeakValue = 2; 6143 static const int kNodeStateIsWeakValue = 2;
6102 static const int kNodeStateIsPendingValue = 3; 6144 static const int kNodeStateIsPendingValue = 3;
6103 static const int kNodeStateIsNearDeathValue = 4; 6145 static const int kNodeStateIsNearDeathValue = 4;
6104 static const int kNodeIsIndependentShift = 4; 6146 static const int kNodeIsIndependentShift = 3;
6105 static const int kNodeIsPartiallyDependentShift = 5; 6147 static const int kNodeIsPartiallyDependentShift = 4;
6106 6148
6107 static const int kJSObjectType = 0xbd; 6149 static const int kJSObjectType = 0xbd;
6108 static const int kFirstNonstringType = 0x80; 6150 static const int kFirstNonstringType = 0x80;
6109 static const int kOddballType = 0x83; 6151 static const int kOddballType = 0x83;
6110 static const int kForeignType = 0x88; 6152 static const int kForeignType = 0x88;
6111 6153
6112 static const int kUndefinedOddballKind = 5; 6154 static const int kUndefinedOddballKind = 5;
6113 static const int kNullOddballKind = 3; 6155 static const int kNullOddballKind = 3;
6114 6156
6115 static const uint32_t kNumIsolateDataSlots = 4; 6157 static const uint32_t kNumIsolateDataSlots = 4;
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
6353 6395
6354 6396
6355 template <class T> 6397 template <class T>
6356 template <typename S, typename P> 6398 template <typename S, typename P>
6357 void PersistentBase<T>::SetWeak( 6399 void PersistentBase<T>::SetWeak(
6358 P* parameter, 6400 P* parameter,
6359 typename WeakCallbackData<S, P>::Callback callback) { 6401 typename WeakCallbackData<S, P>::Callback callback) {
6360 TYPE_CHECK(S, T); 6402 TYPE_CHECK(S, T);
6361 typedef typename WeakCallbackData<Value, void>::Callback Callback; 6403 typedef typename WeakCallbackData<Value, void>::Callback Callback;
6362 V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter, 6404 V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter,
6363 reinterpret_cast<Callback>(callback), V8::NonphantomHandle); 6405 reinterpret_cast<Callback>(callback));
6364 } 6406 }
6365 6407
6366 6408
6367 template <class T> 6409 template <class T>
6368 template <typename P> 6410 template <typename P>
6369 void PersistentBase<T>::SetWeak( 6411 void PersistentBase<T>::SetWeak(
6370 P* parameter, 6412 P* parameter,
6371 typename WeakCallbackData<T, P>::Callback callback) { 6413 typename WeakCallbackData<T, P>::Callback callback) {
6372 SetWeak<T, P>(parameter, callback); 6414 SetWeak<T, P>(parameter, callback);
6373 } 6415 }
6374 6416
6375 6417
6376 template <class T> 6418 template <class T>
6377 template <typename S, typename P>
6378 void PersistentBase<T>::SetPhantom(
6379 P* parameter, typename WeakCallbackData<S, P>::Callback callback) {
6380 TYPE_CHECK(S, T);
6381 typedef typename WeakCallbackData<Value, void>::Callback Callback;
6382 V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter,
6383 reinterpret_cast<Callback>(callback), V8::PhantomHandle);
6384 }
6385
6386
6387 template <class T>
6388 template <typename P> 6419 template <typename P>
6389 void PersistentBase<T>::SetPhantom( 6420 void PersistentBase<T>::SetPhantom(
6390 P* parameter, typename WeakCallbackData<T, P>::Callback callback) { 6421 P* parameter, typename PhantomCallbackData<P>::Callback callback) {
6391 SetPhantom<T, P>(parameter, callback); 6422 typedef typename PhantomCallbackData<void>::Callback Callback;
6423 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter,
6424 reinterpret_cast<Callback>(callback),
6425 Object::kNoInternalFieldIndex, Object::kNoInternalFieldIndex);
6392 } 6426 }
6393 6427
6394 6428
6429 template <class T>
6430 void PersistentBase<T>::SetPhantom(
6431 typename PhantomCallbackData<void>::Callback callback,
6432 int internal_field_index1, int internal_field_index2) {
6433 typedef typename PhantomCallbackData<void>::Callback Callback;
6434 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), 0,
6435 reinterpret_cast<Callback>(callback), internal_field_index1,
6436 internal_field_index2);
6437 }
6438
6439
6395 template <class T> 6440 template <class T>
6396 template <typename P> 6441 template <typename P>
6397 P* PersistentBase<T>::ClearWeak() { 6442 P* PersistentBase<T>::ClearWeak() {
6398 return reinterpret_cast<P*>( 6443 return reinterpret_cast<P*>(
6399 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); 6444 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
6400 } 6445 }
6401 6446
6402 6447
6403 template <class T> 6448 template <class T>
6404 void PersistentBase<T>::MarkIndependent() { 6449 void PersistentBase<T>::MarkIndependent() {
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
7378 */ 7423 */
7379 7424
7380 7425
7381 } // namespace v8 7426 } // namespace v8
7382 7427
7383 7428
7384 #undef TYPE_CHECK 7429 #undef TYPE_CHECK
7385 7430
7386 7431
7387 #endif // V8_H_ 7432 #endif // V8_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.cc » ('j') | src/global-handles.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698