| 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 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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_ |
| OLD | NEW |