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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 class Arguments; | 133 class Arguments; |
134 class Heap; | 134 class Heap; |
135 class HeapObject; | 135 class HeapObject; |
136 class Isolate; | 136 class Isolate; |
137 class Object; | 137 class Object; |
138 struct StreamedSource; | 138 struct StreamedSource; |
139 template<typename T> class CustomArguments; | 139 template<typename T> class CustomArguments; |
140 class PropertyCallbackArguments; | 140 class PropertyCallbackArguments; |
141 class FunctionCallbackArguments; | 141 class FunctionCallbackArguments; |
142 class GlobalHandles; | 142 class GlobalHandles; |
143 | |
144 class CallbackData { | |
145 public: | |
146 V8_INLINE v8::Isolate* GetIsolate() const { return isolate_; } | |
147 | |
148 protected: | |
149 explicit CallbackData(v8::Isolate* isolate) : isolate_(isolate) {} | |
150 | |
151 private: | |
152 v8::Isolate* isolate_; | |
153 }; | |
143 } | 154 } |
144 | 155 |
145 | 156 |
146 /** | 157 /** |
147 * General purpose unique identifier. | 158 * General purpose unique identifier. |
148 */ | 159 */ |
149 class UniqueId { | 160 class UniqueId { |
150 public: | 161 public: |
151 explicit UniqueId(intptr_t data) | 162 explicit UniqueId(intptr_t data) |
152 : data_(data) {} | 163 : data_(data) {} |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
411 V8_INLINE Local<T> Get(Isolate* isolate); | 422 V8_INLINE Local<T> Get(Isolate* isolate); |
412 V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } | 423 V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } |
413 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); | 424 template<class S> V8_INLINE void Set(Isolate* isolate, Local<S> handle); |
414 | 425 |
415 private: | 426 private: |
416 static const int kInitialValue = -1; | 427 static const int kInitialValue = -1; |
417 int index_; | 428 int index_; |
418 }; | 429 }; |
419 | 430 |
420 | 431 |
421 template<class T, class P> | 432 template <typename T> |
422 class WeakCallbackData { | 433 class PhantomCallbackData : public internal::CallbackData { |
434 public: | |
435 typedef void (*Callback)(const PhantomCallbackData<T>& data); | |
436 | |
437 V8_INLINE T* GetParameter() const { return parameter_; } | |
438 | |
439 PhantomCallbackData<T>(Isolate* isolate, T* parameter) | |
440 : internal::CallbackData(isolate), parameter_(parameter) {} | |
441 | |
442 private: | |
443 T* parameter_; | |
444 }; | |
445 | |
446 | |
447 template <class T, class P> | |
448 class WeakCallbackData : public PhantomCallbackData<P> { | |
423 public: | 449 public: |
424 typedef void (*Callback)(const WeakCallbackData<T, P>& data); | 450 typedef void (*Callback)(const WeakCallbackData<T, P>& data); |
425 | 451 |
426 V8_INLINE Isolate* GetIsolate() const { return isolate_; } | |
427 V8_INLINE Local<T> GetValue() const { return handle_; } | 452 V8_INLINE Local<T> GetValue() const { return handle_; } |
428 V8_INLINE P* GetParameter() const { return parameter_; } | |
429 | 453 |
430 private: | 454 private: |
431 friend class internal::GlobalHandles; | 455 friend class internal::GlobalHandles; |
432 WeakCallbackData(Isolate* isolate, Local<T> handle, P* parameter) | 456 WeakCallbackData(Isolate* isolate, P* parameter, Local<T> handle) |
433 : isolate_(isolate), handle_(handle), parameter_(parameter) { } | 457 : PhantomCallbackData<P>(isolate, parameter), handle_(handle) {} |
434 Isolate* isolate_; | |
435 Local<T> handle_; | 458 Local<T> handle_; |
436 P* parameter_; | |
437 }; | 459 }; |
438 | 460 |
439 | 461 |
462 template <typename T, typename U> | |
463 class InternalFieldsCallbackData : public internal::CallbackData { | |
464 public: | |
465 typedef void (*Callback)(const InternalFieldsCallbackData<T, U>& data); | |
466 | |
467 InternalFieldsCallbackData(Isolate* isolate, T* internalField1, | |
468 U* internalField2) | |
469 : internal::CallbackData(isolate), | |
470 internal_field1_(internalField1), | |
471 internal_field2_(internalField2) {} | |
472 | |
473 V8_INLINE T* GetInternalField1() const { return internal_field1_; } | |
474 V8_INLINE U* GetInternalField2() const { return internal_field2_; } | |
475 | |
476 private: | |
477 T* internal_field1_; | |
dcarney
2015/01/07 13:18:51
I'm a little late weighing in here, but I have a f
| |
478 U* internal_field2_; | |
479 }; | |
480 | |
481 | |
440 /** | 482 /** |
441 * An object reference that is independent of any handle scope. Where | 483 * 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 | 484 * 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 | 485 * allocated, a PersistentBase handle remains valid until it is explicitly |
444 * disposed. | 486 * disposed. |
445 * | 487 * |
446 * A persistent handle contains a reference to a storage cell within | 488 * 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 | 489 * 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 | 490 * the garbage collector whenever the object is moved. A new storage |
449 * cell can be created using the constructor or PersistentBase::Reset and | 491 * cell can be created using the constructor or PersistentBase::Reset and |
(...skipping 14 matching lines...) Expand all Loading... | |
464 template <class S> | 506 template <class S> |
465 V8_INLINE void Reset(Isolate* isolate, const Handle<S>& other); | 507 V8_INLINE void Reset(Isolate* isolate, const Handle<S>& other); |
466 | 508 |
467 /** | 509 /** |
468 * If non-empty, destroy the underlying storage cell | 510 * If non-empty, destroy the underlying storage cell |
469 * and create a new one with the contents of other if other is non empty | 511 * and create a new one with the contents of other if other is non empty |
470 */ | 512 */ |
471 template <class S> | 513 template <class S> |
472 V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other); | 514 V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other); |
473 | 515 |
474 V8_INLINE bool IsEmpty() const { return val_ == 0; } | 516 V8_INLINE bool IsEmpty() const { return val_ == NULL; } |
517 V8_INLINE void Empty() { val_ = 0; } | |
475 | 518 |
476 template <class S> | 519 template <class S> |
477 V8_INLINE bool operator==(const PersistentBase<S>& that) const { | 520 V8_INLINE bool operator==(const PersistentBase<S>& that) const { |
478 internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); | 521 internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); |
479 internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); | 522 internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); |
480 if (a == 0) return b == 0; | 523 if (a == NULL) return b == NULL; |
481 if (b == 0) return false; | 524 if (b == NULL) return false; |
482 return *a == *b; | 525 return *a == *b; |
483 } | 526 } |
484 | 527 |
485 template <class S> V8_INLINE bool operator==(const Handle<S>& that) const { | 528 template <class S> V8_INLINE bool operator==(const Handle<S>& that) const { |
486 internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); | 529 internal::Object** a = reinterpret_cast<internal::Object**>(this->val_); |
487 internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); | 530 internal::Object** b = reinterpret_cast<internal::Object**>(that.val_); |
488 if (a == 0) return b == 0; | 531 if (a == NULL) return b == NULL; |
489 if (b == 0) return false; | 532 if (b == NULL) return false; |
490 return *a == *b; | 533 return *a == *b; |
491 } | 534 } |
492 | 535 |
493 template <class S> | 536 template <class S> |
494 V8_INLINE bool operator!=(const PersistentBase<S>& that) const { | 537 V8_INLINE bool operator!=(const PersistentBase<S>& that) const { |
495 return !operator==(that); | 538 return !operator==(that); |
496 } | 539 } |
497 | 540 |
498 template <class S> V8_INLINE bool operator!=(const Handle<S>& that) const { | 541 template <class S> V8_INLINE bool operator!=(const Handle<S>& that) const { |
499 return !operator==(that); | 542 return !operator==(that); |
(...skipping 12 matching lines...) Expand all Loading... | |
512 typename WeakCallbackData<T, P>::Callback callback); | 555 typename WeakCallbackData<T, P>::Callback callback); |
513 | 556 |
514 template<typename S, typename P> | 557 template<typename S, typename P> |
515 V8_INLINE void SetWeak( | 558 V8_INLINE void SetWeak( |
516 P* parameter, | 559 P* parameter, |
517 typename WeakCallbackData<S, P>::Callback callback); | 560 typename WeakCallbackData<S, P>::Callback callback); |
518 | 561 |
519 // Phantom persistents work like weak persistents, except that the pointer to | 562 // Phantom persistents work like weak persistents, except that the pointer to |
520 // the object being collected is not available in the finalization callback. | 563 // the object being collected is not available in the finalization callback. |
521 // This enables the garbage collector to collect the object and any objects | 564 // This enables the garbage collector to collect the object and any objects |
522 // it references transitively in one GC cycle. | 565 // it references transitively in one GC cycle. At the moment you can either |
566 // specify a parameter for the callback or the location of two internal | |
567 // fields in the dying object. | |
523 template <typename P> | 568 template <typename P> |
524 V8_INLINE void SetPhantom(P* parameter, | 569 V8_INLINE void SetPhantom(P* parameter, |
525 typename WeakCallbackData<T, P>::Callback callback); | 570 typename PhantomCallbackData<P>::Callback callback); |
526 | 571 |
527 template <typename S, typename P> | 572 template <typename P, typename Q> |
528 V8_INLINE void SetPhantom(P* parameter, | 573 V8_INLINE void SetPhantom( |
529 typename WeakCallbackData<S, P>::Callback callback); | 574 void (*callback)(const InternalFieldsCallbackData<P, Q>&), |
575 int internal_field_index1, int internal_field_index2); | |
530 | 576 |
531 template<typename P> | 577 template<typename P> |
532 V8_INLINE P* ClearWeak(); | 578 V8_INLINE P* ClearWeak(); |
533 | 579 |
534 // TODO(dcarney): remove this. | 580 // TODO(dcarney): remove this. |
535 V8_INLINE void ClearWeak() { ClearWeak<void>(); } | 581 V8_INLINE void ClearWeak() { ClearWeak<void>(); } |
536 | 582 |
537 /** | 583 /** |
538 * Marks the reference to this object independent. Garbage collector is free | 584 * Marks the reference to this object independent. Garbage collector is free |
539 * to ignore any object groups containing this object. Weak callback for an | 585 * to ignore any object groups containing this object. Weak callback for an |
(...skipping 1945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2485 Local<String> ObjectProtoToString(); | 2531 Local<String> ObjectProtoToString(); |
2486 | 2532 |
2487 /** | 2533 /** |
2488 * Returns the name of the function invoked as a constructor for this object. | 2534 * Returns the name of the function invoked as a constructor for this object. |
2489 */ | 2535 */ |
2490 Local<String> GetConstructorName(); | 2536 Local<String> GetConstructorName(); |
2491 | 2537 |
2492 /** Gets the number of internal fields for this Object. */ | 2538 /** Gets the number of internal fields for this Object. */ |
2493 int InternalFieldCount(); | 2539 int InternalFieldCount(); |
2494 | 2540 |
2541 static const int kNoInternalFieldIndex = -1; | |
2542 | |
2495 /** Same as above, but works for Persistents */ | 2543 /** Same as above, but works for Persistents */ |
2496 V8_INLINE static int InternalFieldCount( | 2544 V8_INLINE static int InternalFieldCount( |
2497 const PersistentBase<Object>& object) { | 2545 const PersistentBase<Object>& object) { |
2498 return object.val_->InternalFieldCount(); | 2546 return object.val_->InternalFieldCount(); |
2499 } | 2547 } |
2500 | 2548 |
2501 /** Gets the value from an internal field. */ | 2549 /** Gets the value from an internal field. */ |
2502 V8_INLINE Local<Value> GetInternalField(int index); | 2550 V8_INLINE Local<Value> GetInternalField(int index); |
2503 | 2551 |
2504 /** Sets the value in an internal field. */ | 2552 /** Sets the value in an internal field. */ |
(...skipping 3103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5608 V8(); | 5656 V8(); |
5609 | 5657 |
5610 enum WeakHandleType { PhantomHandle, NonphantomHandle }; | 5658 enum WeakHandleType { PhantomHandle, NonphantomHandle }; |
5611 | 5659 |
5612 static internal::Object** GlobalizeReference(internal::Isolate* isolate, | 5660 static internal::Object** GlobalizeReference(internal::Isolate* isolate, |
5613 internal::Object** handle); | 5661 internal::Object** handle); |
5614 static internal::Object** CopyPersistent(internal::Object** handle); | 5662 static internal::Object** CopyPersistent(internal::Object** handle); |
5615 static void DisposeGlobal(internal::Object** global_handle); | 5663 static void DisposeGlobal(internal::Object** global_handle); |
5616 typedef WeakCallbackData<Value, void>::Callback WeakCallback; | 5664 typedef WeakCallbackData<Value, void>::Callback WeakCallback; |
5617 static void MakeWeak(internal::Object** global_handle, void* data, | 5665 static void MakeWeak(internal::Object** global_handle, void* data, |
5618 WeakCallback weak_callback, WeakHandleType phantom); | 5666 WeakCallback weak_callback); |
5667 static void MakePhantom(internal::Object** global_handle, void* data, | |
5668 PhantomCallbackData<void>::Callback weak_callback); | |
5669 static void MakePhantom( | |
5670 internal::Object** global_handle, | |
5671 InternalFieldsCallbackData<void, void>::Callback weak_callback, | |
5672 int internal_field_index1, | |
5673 int internal_field_index2 = Object::kNoInternalFieldIndex); | |
5619 static void* ClearWeak(internal::Object** global_handle); | 5674 static void* ClearWeak(internal::Object** global_handle); |
5620 static void Eternalize(Isolate* isolate, | 5675 static void Eternalize(Isolate* isolate, |
5621 Value* handle, | 5676 Value* handle, |
5622 int* index); | 5677 int* index); |
5623 static Local<Value> GetEternal(Isolate* isolate, int index); | 5678 static Local<Value> GetEternal(Isolate* isolate, int index); |
5624 | 5679 |
5625 template <class T> friend class Handle; | 5680 template <class T> friend class Handle; |
5626 template <class T> friend class Local; | 5681 template <class T> friend class Local; |
5627 template <class T> friend class Eternal; | 5682 template <class T> friend class Eternal; |
5628 template <class T> friend class PersistentBase; | 5683 template <class T> friend class PersistentBase; |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6217 static const int kTrueValueRootIndex = 8; | 6272 static const int kTrueValueRootIndex = 8; |
6218 static const int kFalseValueRootIndex = 9; | 6273 static const int kFalseValueRootIndex = 9; |
6219 static const int kEmptyStringRootIndex = 154; | 6274 static const int kEmptyStringRootIndex = 154; |
6220 | 6275 |
6221 // The external allocation limit should be below 256 MB on all architectures | 6276 // The external allocation limit should be below 256 MB on all architectures |
6222 // to avoid that resource-constrained embedders run low on memory. | 6277 // to avoid that resource-constrained embedders run low on memory. |
6223 static const int kExternalAllocationLimit = 192 * 1024 * 1024; | 6278 static const int kExternalAllocationLimit = 192 * 1024 * 1024; |
6224 | 6279 |
6225 static const int kNodeClassIdOffset = 1 * kApiPointerSize; | 6280 static const int kNodeClassIdOffset = 1 * kApiPointerSize; |
6226 static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; | 6281 static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3; |
6227 static const int kNodeStateMask = 0xf; | 6282 static const int kNodeStateMask = 0x7; |
6228 static const int kNodeStateIsWeakValue = 2; | 6283 static const int kNodeStateIsWeakValue = 2; |
6229 static const int kNodeStateIsPendingValue = 3; | 6284 static const int kNodeStateIsPendingValue = 3; |
6230 static const int kNodeStateIsNearDeathValue = 4; | 6285 static const int kNodeStateIsNearDeathValue = 4; |
6231 static const int kNodeIsIndependentShift = 4; | 6286 static const int kNodeIsIndependentShift = 3; |
6232 static const int kNodeIsPartiallyDependentShift = 5; | 6287 static const int kNodeIsPartiallyDependentShift = 4; |
6233 | 6288 |
6234 static const int kJSObjectType = 0xbd; | 6289 static const int kJSObjectType = 0xbd; |
6235 static const int kFirstNonstringType = 0x80; | 6290 static const int kFirstNonstringType = 0x80; |
6236 static const int kOddballType = 0x83; | 6291 static const int kOddballType = 0x83; |
6237 static const int kForeignType = 0x88; | 6292 static const int kForeignType = 0x88; |
6238 | 6293 |
6239 static const int kUndefinedOddballKind = 5; | 6294 static const int kUndefinedOddballKind = 5; |
6240 static const int kNullOddballKind = 3; | 6295 static const int kNullOddballKind = 3; |
6241 | 6296 |
6242 static const uint32_t kNumIsolateDataSlots = 4; | 6297 static const uint32_t kNumIsolateDataSlots = 4; |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6480 | 6535 |
6481 | 6536 |
6482 template <class T> | 6537 template <class T> |
6483 template <typename S, typename P> | 6538 template <typename S, typename P> |
6484 void PersistentBase<T>::SetWeak( | 6539 void PersistentBase<T>::SetWeak( |
6485 P* parameter, | 6540 P* parameter, |
6486 typename WeakCallbackData<S, P>::Callback callback) { | 6541 typename WeakCallbackData<S, P>::Callback callback) { |
6487 TYPE_CHECK(S, T); | 6542 TYPE_CHECK(S, T); |
6488 typedef typename WeakCallbackData<Value, void>::Callback Callback; | 6543 typedef typename WeakCallbackData<Value, void>::Callback Callback; |
6489 V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter, | 6544 V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter, |
6490 reinterpret_cast<Callback>(callback), V8::NonphantomHandle); | 6545 reinterpret_cast<Callback>(callback)); |
6491 } | 6546 } |
6492 | 6547 |
6493 | 6548 |
6494 template <class T> | 6549 template <class T> |
6495 template <typename P> | 6550 template <typename P> |
6496 void PersistentBase<T>::SetWeak( | 6551 void PersistentBase<T>::SetWeak( |
6497 P* parameter, | 6552 P* parameter, |
6498 typename WeakCallbackData<T, P>::Callback callback) { | 6553 typename WeakCallbackData<T, P>::Callback callback) { |
6499 SetWeak<T, P>(parameter, callback); | 6554 SetWeak<T, P>(parameter, callback); |
6500 } | 6555 } |
6501 | 6556 |
6502 | 6557 |
6503 template <class T> | 6558 template <class T> |
6504 template <typename S, typename P> | |
6505 void PersistentBase<T>::SetPhantom( | |
6506 P* parameter, typename WeakCallbackData<S, P>::Callback callback) { | |
6507 TYPE_CHECK(S, T); | |
6508 typedef typename WeakCallbackData<Value, void>::Callback Callback; | |
6509 V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter, | |
6510 reinterpret_cast<Callback>(callback), V8::PhantomHandle); | |
6511 } | |
6512 | |
6513 | |
6514 template <class T> | |
6515 template <typename P> | 6559 template <typename P> |
6516 void PersistentBase<T>::SetPhantom( | 6560 void PersistentBase<T>::SetPhantom( |
6517 P* parameter, typename WeakCallbackData<T, P>::Callback callback) { | 6561 P* parameter, typename PhantomCallbackData<P>::Callback callback) { |
6518 SetPhantom<T, P>(parameter, callback); | 6562 typedef typename PhantomCallbackData<void>::Callback Callback; |
6563 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, | |
6564 reinterpret_cast<Callback>(callback)); | |
6519 } | 6565 } |
6520 | 6566 |
6521 | 6567 |
6568 template <class T> | |
6569 template <typename U, typename V> | |
6570 void PersistentBase<T>::SetPhantom( | |
6571 void (*callback)(const InternalFieldsCallbackData<U, V>&), | |
6572 int internal_field_index1, int internal_field_index2) { | |
6573 typedef typename InternalFieldsCallbackData<void, void>::Callback Callback; | |
6574 V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), | |
6575 reinterpret_cast<Callback>(callback), internal_field_index1, | |
6576 internal_field_index2); | |
6577 } | |
6578 | |
6579 | |
6522 template <class T> | 6580 template <class T> |
6523 template <typename P> | 6581 template <typename P> |
6524 P* PersistentBase<T>::ClearWeak() { | 6582 P* PersistentBase<T>::ClearWeak() { |
6525 return reinterpret_cast<P*>( | 6583 return reinterpret_cast<P*>( |
6526 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); | 6584 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); |
6527 } | 6585 } |
6528 | 6586 |
6529 | 6587 |
6530 template <class T> | 6588 template <class T> |
6531 void PersistentBase<T>::MarkIndependent() { | 6589 void PersistentBase<T>::MarkIndependent() { |
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7505 */ | 7563 */ |
7506 | 7564 |
7507 | 7565 |
7508 } // namespace v8 | 7566 } // namespace v8 |
7509 | 7567 |
7510 | 7568 |
7511 #undef TYPE_CHECK | 7569 #undef TYPE_CHECK |
7512 | 7570 |
7513 | 7571 |
7514 #endif // V8_H_ | 7572 #endif // V8_H_ |
OLD | NEW |