OLD | NEW |
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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 class Heap; | 130 class Heap; |
131 class HeapObject; | 131 class HeapObject; |
132 class Isolate; | 132 class Isolate; |
133 class Object; | 133 class Object; |
134 struct StreamedSource; | 134 struct StreamedSource; |
135 template<typename T> class CustomArguments; | 135 template<typename T> class CustomArguments; |
136 class PropertyCallbackArguments; | 136 class PropertyCallbackArguments; |
137 class FunctionCallbackArguments; | 137 class FunctionCallbackArguments; |
138 class GlobalHandles; | 138 class GlobalHandles; |
139 | 139 |
| 140 template <typename T> |
140 class CallbackData { | 141 class CallbackData { |
141 public: | 142 public: |
142 V8_INLINE v8::Isolate* GetIsolate() const { return isolate_; } | 143 V8_INLINE v8::Isolate* GetIsolate() const { return isolate_; } |
143 | 144 |
144 protected: | 145 explicit CallbackData(v8::Isolate* isolate, T* parameter) |
145 explicit CallbackData(v8::Isolate* isolate) : isolate_(isolate) {} | 146 : isolate_(isolate), parameter_(parameter) {} |
| 147 V8_INLINE T* GetParameter() const { return parameter_; } |
146 | 148 |
147 private: | 149 private: |
148 v8::Isolate* isolate_; | 150 v8::Isolate* isolate_; |
| 151 T* parameter_; |
149 }; | 152 }; |
150 } | 153 } |
151 | 154 |
152 | 155 |
153 /** | 156 /** |
154 * General purpose unique identifier. | 157 * General purpose unique identifier. |
155 */ | 158 */ |
156 class UniqueId { | 159 class UniqueId { |
157 public: | 160 public: |
158 explicit UniqueId(intptr_t data) | 161 explicit UniqueId(intptr_t data) |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 V8_INLINE Local<T> Get(Isolate* isolate); | 421 V8_INLINE Local<T> Get(Isolate* isolate); |
419 V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } | 422 V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } |
420 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); | 423 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); |
421 | 424 |
422 private: | 425 private: |
423 static const int kInitialValue = -1; | 426 static const int kInitialValue = -1; |
424 int index_; | 427 int index_; |
425 }; | 428 }; |
426 | 429 |
427 | 430 |
428 template <typename T> | 431 template <typename T, typename U = void, typename V = void> |
429 class PhantomCallbackData : public internal::CallbackData { | 432 class PhantomCallbackData : public internal::CallbackData<T> { |
430 public: | 433 public: |
431 typedef void (*Callback)(const PhantomCallbackData<T>& data); | 434 typedef void (*Callback)(const PhantomCallbackData<T, U, V>& data); |
432 | 435 |
433 V8_INLINE T* GetParameter() const { return parameter_; } | 436 V8_INLINE U* GetInternalField1() const { return internal_field1_; } |
| 437 V8_INLINE V* GetInternalField2() const { return internal_field2_; } |
434 | 438 |
435 PhantomCallbackData<T>(Isolate* isolate, T* parameter) | 439 PhantomCallbackData(Isolate* isolate, T* parameter, U* internal_field1, |
436 : internal::CallbackData(isolate), parameter_(parameter) {} | 440 V* internal_field2) |
| 441 : internal::CallbackData<T>(isolate, parameter), |
| 442 internal_field1_(internal_field1), |
| 443 internal_field2_(internal_field2) {} |
437 | 444 |
438 private: | 445 private: |
439 T* parameter_; | 446 U* internal_field1_; |
| 447 V* internal_field2_; |
440 }; | 448 }; |
441 | 449 |
442 | 450 |
443 template <class T, class P> | 451 template <class T, class P> |
444 class WeakCallbackData : public PhantomCallbackData<P> { | 452 class WeakCallbackData : public internal::CallbackData<P> { |
445 public: | 453 public: |
446 typedef void (*Callback)(const WeakCallbackData<T, P>& data); | 454 typedef void (*Callback)(const WeakCallbackData<T, P>& data); |
447 | 455 |
448 V8_INLINE Local<T> GetValue() const { return handle_; } | 456 V8_INLINE Local<T> GetValue() const { return handle_; } |
449 | 457 |
450 private: | 458 private: |
451 friend class internal::GlobalHandles; | 459 friend class internal::GlobalHandles; |
452 WeakCallbackData(Isolate* isolate, P* parameter, Local<T> handle) | 460 WeakCallbackData(Isolate* isolate, P* parameter, Local<T> handle) |
453 : PhantomCallbackData<P>(isolate, parameter), handle_(handle) {} | 461 : internal::CallbackData<P>(isolate, parameter), handle_(handle) {} |
454 Local<T> handle_; | 462 Local<T> handle_; |
455 }; | 463 }; |
456 | 464 |
457 | 465 |
458 template <typename T, typename U> | |
459 class InternalFieldsCallbackData : public internal::CallbackData { | |
460 public: | |
461 typedef void (*Callback)(const InternalFieldsCallbackData<T, U>& data); | |
462 | |
463 InternalFieldsCallbackData(Isolate* isolate, T* internalField1, | |
464 U* internalField2) | |
465 : internal::CallbackData(isolate), | |
466 internal_field1_(internalField1), | |
467 internal_field2_(internalField2) {} | |
468 | |
469 V8_INLINE T* GetInternalField1() const { return internal_field1_; } | |
470 V8_INLINE U* GetInternalField2() const { return internal_field2_; } | |
471 | |
472 private: | |
473 T* internal_field1_; | |
474 U* internal_field2_; | |
475 }; | |
476 | |
477 | |
478 /** | 466 /** |
479 * An object reference that is independent of any handle scope. Where | 467 * An object reference that is independent of any handle scope. Where |
480 * a Local handle only lives as long as the HandleScope in which it was | 468 * a Local handle only lives as long as the HandleScope in which it was |
481 * allocated, a PersistentBase handle remains valid until it is explicitly | 469 * allocated, a PersistentBase handle remains valid until it is explicitly |
482 * disposed. | 470 * disposed. |
483 * | 471 * |
484 * A persistent handle contains a reference to a storage cell within | 472 * A persistent handle contains a reference to a storage cell within |
485 * the v8 engine which holds an object value and which is updated by | 473 * the v8 engine which holds an object value and which is updated by |
486 * the garbage collector whenever the object is moved. A new storage | 474 * the garbage collector whenever the object is moved. A new storage |
487 * cell can be created using the constructor or PersistentBase::Reset and | 475 * cell can be created using the constructor or PersistentBase::Reset and |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 P* parameter, | 543 P* parameter, |
556 typename WeakCallbackData<S, P>::Callback callback); | 544 typename WeakCallbackData<S, P>::Callback callback); |
557 | 545 |
558 // Phantom persistents work like weak persistents, except that the pointer to | 546 // Phantom persistents work like weak persistents, except that the pointer to |
559 // the object being collected is not available in the finalization callback. | 547 // the object being collected is not available in the finalization callback. |
560 // This enables the garbage collector to collect the object and any objects | 548 // This enables the garbage collector to collect the object and any objects |
561 // it references transitively in one GC cycle. At the moment you can either | 549 // it references transitively in one GC cycle. At the moment you can either |
562 // specify a parameter for the callback or the location of two internal | 550 // specify a parameter for the callback or the location of two internal |
563 // fields in the dying object. | 551 // fields in the dying object. |
564 template <typename P> | 552 template <typename P> |
565 V8_INLINE void SetPhantom(P* parameter, | 553 V8_INLINE void SetPhantom( |
566 typename PhantomCallbackData<P>::Callback callback); | 554 P* parameter, |
567 | 555 typename PhantomCallbackData<P, void, void>::Callback callback); |
568 template <typename P, typename Q> | 556 template <typename P, typename Q> |
569 V8_INLINE void SetPhantom( | 557 V8_INLINE void SetPhantom( |
570 void (*callback)(const InternalFieldsCallbackData<P, Q>&), | 558 P* parameter, int internal_field_index1, |
571 int internal_field_index1, int internal_field_index2); | 559 typename PhantomCallbackData<P, Q, void>::Callback callback); |
| 560 template <typename P, typename Q, typename R> |
| 561 V8_INLINE void SetPhantom( |
| 562 P* parameter, int internal_field_index1, int internal_field_index2, |
| 563 typename PhantomCallbackData<P, Q, R>::Callback callback); |
572 | 564 |
573 template<typename P> | 565 template<typename P> |
574 V8_INLINE P* ClearWeak(); | 566 V8_INLINE P* ClearWeak(); |
575 | 567 |
576 // TODO(dcarney): remove this. | 568 // TODO(dcarney): remove this. |
577 V8_INLINE void ClearWeak() { ClearWeak<void>(); } | 569 V8_INLINE void ClearWeak() { ClearWeak<void>(); } |
578 | 570 |
579 /** | 571 /** |
580 * Marks the reference to this object independent. Garbage collector is free | 572 * Marks the reference to this object independent. Garbage collector is free |
581 * 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 5006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5588 | 5580 |
5589 enum WeakHandleType { PhantomHandle, NonphantomHandle }; | 5581 enum WeakHandleType { PhantomHandle, NonphantomHandle }; |
5590 | 5582 |
5591 static internal::Object** GlobalizeReference(internal::Isolate* isolate, | 5583 static internal::Object** GlobalizeReference(internal::Isolate* isolate, |
5592 internal::Object** handle); | 5584 internal::Object** handle); |
5593 static internal::Object** CopyPersistent(internal::Object** handle); | 5585 static internal::Object** CopyPersistent(internal::Object** handle); |
5594 static void DisposeGlobal(internal::Object** global_handle); | 5586 static void DisposeGlobal(internal::Object** global_handle); |
5595 typedef WeakCallbackData<Value, void>::Callback WeakCallback; | 5587 typedef WeakCallbackData<Value, void>::Callback WeakCallback; |
5596 static void MakeWeak(internal::Object** global_handle, void* data, | 5588 static void MakeWeak(internal::Object** global_handle, void* data, |
5597 WeakCallback weak_callback); | 5589 WeakCallback weak_callback); |
5598 static void MakePhantom(internal::Object** global_handle, void* data, | |
5599 PhantomCallbackData<void>::Callback weak_callback); | |
5600 static void MakePhantom( | 5590 static void MakePhantom( |
5601 internal::Object** global_handle, | 5591 internal::Object** global_handle, void* data, |
5602 InternalFieldsCallbackData<void, void>::Callback weak_callback, | 5592 // Must be 0 or kNoInternalFieldIndex. |
5603 int internal_field_index1, | 5593 int internal_field_index1, |
5604 int internal_field_index2 = Object::kNoInternalFieldIndex); | 5594 // Must be 1 or kNoInternalFieldIndex. |
| 5595 int internal_field_index2, |
| 5596 PhantomCallbackData<void, void, void>::Callback weak_callback); |
5605 static void* ClearWeak(internal::Object** global_handle); | 5597 static void* ClearWeak(internal::Object** global_handle); |
5606 static void Eternalize(Isolate* isolate, | 5598 static void Eternalize(Isolate* isolate, |
5607 Value* handle, | 5599 Value* handle, |
5608 int* index); | 5600 int* index); |
5609 static Local<Value> GetEternal(Isolate* isolate, int index); | 5601 static Local<Value> GetEternal(Isolate* isolate, int index); |
5610 | 5602 |
5611 template <class T> friend class Handle; | 5603 template <class T> friend class Handle; |
5612 template <class T> friend class Local; | 5604 template <class T> friend class Local; |
5613 template <class T> friend class Eternal; | 5605 template <class T> friend class Eternal; |
5614 template <class T> friend class PersistentBase; | 5606 template <class T> friend class PersistentBase; |
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6482 void PersistentBase<T>::SetWeak( | 6474 void PersistentBase<T>::SetWeak( |
6483 P* parameter, | 6475 P* parameter, |
6484 typename WeakCallbackData<T, P>::Callback callback) { | 6476 typename WeakCallbackData<T, P>::Callback callback) { |
6485 SetWeak<T, P>(parameter, callback); | 6477 SetWeak<T, P>(parameter, callback); |
6486 } | 6478 } |
6487 | 6479 |
6488 | 6480 |
6489 template <class T> | 6481 template <class T> |
6490 template <typename P> | 6482 template <typename P> |
6491 void PersistentBase<T>::SetPhantom( | 6483 void PersistentBase<T>::SetPhantom( |
6492 P* parameter, typename PhantomCallbackData<P>::Callback callback) { | 6484 P* parameter, |
6493 typedef typename PhantomCallbackData<void>::Callback Callback; | 6485 typename PhantomCallbackData<P, void, void>::Callback callback) { |
| 6486 typedef typename PhantomCallbackData<void, void, void>::Callback Callback; |
6494 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, | 6487 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, |
| 6488 Object::kNoInternalFieldIndex, Object::kNoInternalFieldIndex, |
6495 reinterpret_cast<Callback>(callback)); | 6489 reinterpret_cast<Callback>(callback)); |
6496 } | 6490 } |
6497 | 6491 |
6498 | 6492 |
6499 template <class T> | 6493 template <class T> |
6500 template <typename U, typename V> | 6494 template <typename P, typename Q> |
6501 void PersistentBase<T>::SetPhantom( | 6495 void PersistentBase<T>::SetPhantom( |
6502 void (*callback)(const InternalFieldsCallbackData<U, V>&), | 6496 P* parameter, int internal_field_index1, |
6503 int internal_field_index1, int internal_field_index2) { | 6497 typename PhantomCallbackData<P, Q, void>::Callback callback) { |
6504 typedef typename InternalFieldsCallbackData<void, void>::Callback Callback; | 6498 typedef typename PhantomCallbackData<void, void, void>::Callback Callback; |
6505 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), | 6499 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, |
6506 reinterpret_cast<Callback>(callback), internal_field_index1, | 6500 internal_field_index1, Object::kNoInternalFieldIndex, |
6507 internal_field_index2); | 6501 reinterpret_cast<Callback>(callback)); |
6508 } | 6502 } |
6509 | 6503 |
6510 | 6504 |
| 6505 template <class T> |
| 6506 template <typename P, typename Q, typename R> |
| 6507 void PersistentBase<T>::SetPhantom( |
| 6508 P* parameter, int internal_field_index1, int internal_field_index2, |
| 6509 typename PhantomCallbackData<P, Q, R>::Callback callback) { |
| 6510 typedef typename PhantomCallbackData<void, void, void>::Callback Callback; |
| 6511 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, |
| 6512 internal_field_index1, internal_field_index2, |
| 6513 reinterpret_cast<Callback>(callback)); |
| 6514 } |
| 6515 |
| 6516 |
6511 template <class T> | 6517 template <class T> |
6512 template <typename P> | 6518 template <typename P> |
6513 P* PersistentBase<T>::ClearWeak() { | 6519 P* PersistentBase<T>::ClearWeak() { |
6514 return reinterpret_cast<P*>( | 6520 return reinterpret_cast<P*>( |
6515 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); | 6521 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); |
6516 } | 6522 } |
6517 | 6523 |
6518 | 6524 |
6519 template <class T> | 6525 template <class T> |
6520 void PersistentBase<T>::MarkIndependent() { | 6526 void PersistentBase<T>::MarkIndependent() { |
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7494 */ | 7500 */ |
7495 | 7501 |
7496 | 7502 |
7497 } // namespace v8 | 7503 } // namespace v8 |
7498 | 7504 |
7499 | 7505 |
7500 #undef TYPE_CHECK | 7506 #undef TYPE_CHECK |
7501 | 7507 |
7502 | 7508 |
7503 #endif // V8_H_ | 7509 #endif // V8_H_ |
OLD | NEW |