| 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 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 | 456 |
| 457 | 457 |
| 458 // kParameter will pass a void* parameter back to the callback, kInternalFields | 458 // kParameter will pass a void* parameter back to the callback, kInternalFields |
| 459 // will pass the first two internal fields back to the callback, kFinalizer | 459 // will pass the first two internal fields back to the callback, kFinalizer |
| 460 // will pass a void* parameter back, but is invoked before the object is | 460 // will pass a void* parameter back, but is invoked before the object is |
| 461 // actually collected, so it can be resurrected. In the last case, it is not | 461 // actually collected, so it can be resurrected. In the last case, it is not |
| 462 // possible to request a second pass callback. | 462 // possible to request a second pass callback. |
| 463 enum class WeakCallbackType { kParameter, kInternalFields, kFinalizer }; | 463 enum class WeakCallbackType { kParameter, kInternalFields, kFinalizer }; |
| 464 | 464 |
| 465 /** | 465 /** |
| 466 * A reporter class that embedder will use to report reachable references found | |
| 467 * by EmbedderHeapTracer. | |
| 468 */ | |
| 469 class V8_EXPORT EmbedderReachableReferenceReporter { | |
| 470 public: | |
| 471 virtual void ReportExternalReference(Value* object) = 0; | |
| 472 virtual ~EmbedderReachableReferenceReporter() = default; | |
| 473 }; | |
| 474 | |
| 475 /** | |
| 476 * An object reference that is independent of any handle scope. Where | 466 * An object reference that is independent of any handle scope. Where |
| 477 * a Local handle only lives as long as the HandleScope in which it was | 467 * a Local handle only lives as long as the HandleScope in which it was |
| 478 * allocated, a PersistentBase handle remains valid until it is explicitly | 468 * allocated, a PersistentBase handle remains valid until it is explicitly |
| 479 * disposed. | 469 * disposed. |
| 480 * | 470 * |
| 481 * A persistent handle contains a reference to a storage cell within | 471 * A persistent handle contains a reference to a storage cell within |
| 482 * the v8 engine which holds an object value and which is updated by | 472 * the v8 engine which holds an object value and which is updated by |
| 483 * the garbage collector whenever the object is moved. A new storage | 473 * the garbage collector whenever the object is moved. A new storage |
| 484 * cell can be created using the constructor or PersistentBase::Reset and | 474 * cell can be created using the constructor or PersistentBase::Reset and |
| 485 * existing handles can be disposed using PersistentBase::Reset. | 475 * existing handles can be disposed using PersistentBase::Reset. |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 */ | 552 */ |
| 563 V8_INLINE void SetWeak(); | 553 V8_INLINE void SetWeak(); |
| 564 | 554 |
| 565 template<typename P> | 555 template<typename P> |
| 566 V8_INLINE P* ClearWeak(); | 556 V8_INLINE P* ClearWeak(); |
| 567 | 557 |
| 568 // TODO(dcarney): remove this. | 558 // TODO(dcarney): remove this. |
| 569 V8_INLINE void ClearWeak() { ClearWeak<void>(); } | 559 V8_INLINE void ClearWeak() { ClearWeak<void>(); } |
| 570 | 560 |
| 571 /** | 561 /** |
| 572 * Deprecated. | |
| 573 * TODO(hlopko): remove once migration to reporter is finished. | |
| 574 */ | |
| 575 V8_INLINE void RegisterExternalReference(Isolate* isolate) const {} | |
| 576 | |
| 577 /** | |
| 578 * Allows the embedder to tell the v8 garbage collector that a certain object | 562 * Allows the embedder to tell the v8 garbage collector that a certain object |
| 579 * is alive. Only allowed when the embedder is asked to trace its heap by | 563 * is alive. Only allowed when the embedder is asked to trace its heap by |
| 580 * EmbedderHeapTracer. | 564 * EmbedderHeapTracer. |
| 581 */ | 565 */ |
| 582 V8_INLINE void RegisterExternalReference( | 566 V8_INLINE void RegisterExternalReference(Isolate* isolate) const; |
| 583 EmbedderReachableReferenceReporter* reporter) const; | |
| 584 | 567 |
| 585 /** | 568 /** |
| 586 * Marks the reference to this object independent. Garbage collector is free | 569 * Marks the reference to this object independent. Garbage collector is free |
| 587 * to ignore any object groups containing this object. Weak callback for an | 570 * to ignore any object groups containing this object. Weak callback for an |
| 588 * independent handle should not assume that it will be preceded by a global | 571 * independent handle should not assume that it will be preceded by a global |
| 589 * GC prologue callback or followed by a global GC epilogue callback. | 572 * GC prologue callback or followed by a global GC epilogue callback. |
| 590 */ | 573 */ |
| 591 V8_INLINE void MarkIndependent(); | 574 V8_INLINE void MarkIndependent(); |
| 592 | 575 |
| 593 /** | 576 /** |
| (...skipping 5568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6162 * Memory pressure level for the MemoryPressureNotification. | 6145 * Memory pressure level for the MemoryPressureNotification. |
| 6163 * kNone hints V8 that there is no memory pressure. | 6146 * kNone hints V8 that there is no memory pressure. |
| 6164 * kModerate hints V8 to speed up incremental garbage collection at the cost of | 6147 * kModerate hints V8 to speed up incremental garbage collection at the cost of |
| 6165 * of higher latency due to garbage collection pauses. | 6148 * of higher latency due to garbage collection pauses. |
| 6166 * kCritical hints V8 to free memory as soon as possible. Garbage collection | 6149 * kCritical hints V8 to free memory as soon as possible. Garbage collection |
| 6167 * pauses at this level will be large. | 6150 * pauses at this level will be large. |
| 6168 */ | 6151 */ |
| 6169 enum class MemoryPressureLevel { kNone, kModerate, kCritical }; | 6152 enum class MemoryPressureLevel { kNone, kModerate, kCritical }; |
| 6170 | 6153 |
| 6171 /** | 6154 /** |
| 6172 * Interface for tracing through the embedder heap. During the v8 garbage | 6155 * Interface for tracing through the embedder heap. During a v8 garbage |
| 6173 * collection, v8 collects hidden fields of all potential wrappers, and at the | 6156 * collection, v8 collects hidden fields of all potential wrappers, and at the |
| 6174 * end of its marking phase iterates the collection and asks the embedder to | 6157 * end of its marking phase iterates the collection and asks the embedder to |
| 6175 * trace through its heap and use reporter to report each js object reachable | 6158 * trace through its heap and use reporter to report each JavaScript object |
| 6176 * from any of the given wrappers. | 6159 * reachable from any of the given wrappers. |
| 6177 * | 6160 * |
| 6178 * Before the first call to the TraceWrappersFrom function TracePrologue will be | 6161 * Before the first call to the TraceWrappersFrom function TracePrologue will be |
| 6179 * called. When the garbage collection cycle is finished, TraceEpilogue will be | 6162 * called. When the garbage collection cycle is finished, TraceEpilogue will be |
| 6180 * called. | 6163 * called. |
| 6181 */ | 6164 */ |
| 6182 class V8_EXPORT EmbedderHeapTracer { | 6165 class V8_EXPORT EmbedderHeapTracer { |
| 6183 public: | 6166 public: |
| 6184 enum ForceCompletionAction { FORCE_COMPLETION, DO_NOT_FORCE_COMPLETION }; | 6167 enum ForceCompletionAction { FORCE_COMPLETION, DO_NOT_FORCE_COMPLETION }; |
| 6185 | 6168 |
| 6186 struct AdvanceTracingActions { | 6169 struct AdvanceTracingActions { |
| 6187 explicit AdvanceTracingActions(ForceCompletionAction force_completion_) | 6170 explicit AdvanceTracingActions(ForceCompletionAction force_completion_) |
| 6188 : force_completion(force_completion_) {} | 6171 : force_completion(force_completion_) {} |
| 6189 | 6172 |
| 6190 ForceCompletionAction force_completion; | 6173 ForceCompletionAction force_completion; |
| 6191 }; | 6174 }; |
| 6192 | 6175 |
| 6193 /** | 6176 /** |
| 6194 * V8 will call this method with internal fields of found wrappers. The | 6177 * Called by v8 to register internal fields of found wrappers. |
| 6195 * embedder is expected to store them in its marking deque and trace | 6178 * |
| 6196 * reachable wrappers from them when called through |AdvanceTracing|. | 6179 * The embedder is expected to store them somewhere and trace reachable |
| 6180 * wrappers from them when called through |AdvanceTracing|. |
| 6197 */ | 6181 */ |
| 6198 virtual void RegisterV8References( | 6182 virtual void RegisterV8References( |
| 6199 const std::vector<std::pair<void*, void*> >& internal_fields) = 0; | 6183 const std::vector<std::pair<void*, void*> >& internal_fields) = 0; |
| 6200 | 6184 |
| 6201 /** | 6185 /** |
| 6202 * Deprecated. | 6186 * Called at the beginning of a GC cycle. |
| 6203 * TODO(hlopko) Remove once the migration to reporter is finished. | |
| 6204 */ | 6187 */ |
| 6205 virtual void TracePrologue() {} | 6188 virtual void TracePrologue() = 0; |
| 6206 | 6189 |
| 6207 /** | 6190 /** |
| 6208 * V8 will call this method at the beginning of a GC cycle. Embedder is | 6191 * Called to to make a tracing step in the embedder. |
| 6209 * expected to use EmbedderReachableReferenceReporter for reporting all | 6192 * |
| 6210 * reachable v8 objects. | 6193 * The embedder is expected to trace its heap starting from wrappers reported |
| 6211 */ | 6194 * by RegisterV8References method, and report back all reachable wrappers. |
| 6212 virtual void TracePrologue(EmbedderReachableReferenceReporter* reporter) {} | 6195 * Furthermore, the embedder is expected to stop tracing by the given |
| 6213 | 6196 * deadline. |
| 6214 /** | |
| 6215 * Embedder is expected to trace its heap starting from wrappers reported by | |
| 6216 * RegisterV8References method, and use reporter for all reachable wrappers. | |
| 6217 * Embedder is expected to stop tracing by the given deadline. | |
| 6218 * | 6197 * |
| 6219 * Returns true if there is still work to do. | 6198 * Returns true if there is still work to do. |
| 6220 */ | 6199 */ |
| 6221 virtual bool AdvanceTracing(double deadline_in_ms, | 6200 virtual bool AdvanceTracing(double deadline_in_ms, |
| 6222 AdvanceTracingActions actions) = 0; | 6201 AdvanceTracingActions actions) = 0; |
| 6223 | 6202 |
| 6224 /** | 6203 /** |
| 6225 * V8 will call this method at the end of a GC cycle. | 6204 * Called at the end of a GC cycle. |
| 6226 * | 6205 * |
| 6227 * Note that allocation is *not* allowed within |TraceEpilogue|. | 6206 * Note that allocation is *not* allowed within |TraceEpilogue|. |
| 6228 */ | 6207 */ |
| 6229 virtual void TraceEpilogue() = 0; | 6208 virtual void TraceEpilogue() = 0; |
| 6230 | 6209 |
| 6231 /** | 6210 /** |
| 6232 * Let embedder know v8 entered final marking pause (no more incremental steps | 6211 * Called upon entering the final marking pause. No more incremental marking |
| 6233 * will follow). | 6212 * steps will follow this call. |
| 6234 */ | 6213 */ |
| 6235 virtual void EnterFinalPause() {} | 6214 virtual void EnterFinalPause() = 0; |
| 6236 | 6215 |
| 6237 /** | 6216 /** |
| 6238 * Throw away all intermediate data and reset to the initial state. | 6217 * Called when tracing is aborted. |
| 6218 * |
| 6219 * The embedder is expected to throw away all intermediate data and reset to |
| 6220 * the initial state. |
| 6239 */ | 6221 */ |
| 6240 virtual void AbortTracing() {} | 6222 virtual void AbortTracing() = 0; |
| 6241 | 6223 |
| 6242 /** | 6224 /** |
| 6243 * Returns the number of wrappers that are still to be traced by the embedder. | 6225 * Returns the number of wrappers that are still to be traced by the embedder. |
| 6244 */ | 6226 */ |
| 6245 virtual size_t NumberOfWrappersToTrace() { return 0; } | 6227 virtual size_t NumberOfWrappersToTrace() { return 0; } |
| 6246 | 6228 |
| 6247 protected: | 6229 protected: |
| 6248 virtual ~EmbedderHeapTracer() = default; | 6230 virtual ~EmbedderHeapTracer() = default; |
| 6249 }; | 6231 }; |
| 6250 | 6232 |
| (...skipping 1292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7543 // Must be 1 or -1. | 7525 // Must be 1 or -1. |
| 7544 int internal_field_index2, | 7526 int internal_field_index2, |
| 7545 WeakCallbackInfo<void>::Callback weak_callback); | 7527 WeakCallbackInfo<void>::Callback weak_callback); |
| 7546 static void MakeWeak(internal::Object*** location_addr); | 7528 static void MakeWeak(internal::Object*** location_addr); |
| 7547 static void* ClearWeak(internal::Object** location); | 7529 static void* ClearWeak(internal::Object** location); |
| 7548 static void Eternalize(Isolate* isolate, | 7530 static void Eternalize(Isolate* isolate, |
| 7549 Value* handle, | 7531 Value* handle, |
| 7550 int* index); | 7532 int* index); |
| 7551 static Local<Value> GetEternal(Isolate* isolate, int index); | 7533 static Local<Value> GetEternal(Isolate* isolate, int index); |
| 7552 | 7534 |
| 7535 static void RegisterExternallyReferencedObject(internal::Object** object, |
| 7536 internal::Isolate* isolate); |
| 7537 |
| 7553 template <class K, class V, class T> | 7538 template <class K, class V, class T> |
| 7554 friend class PersistentValueMapBase; | 7539 friend class PersistentValueMapBase; |
| 7555 | 7540 |
| 7556 static void FromJustIsNothing(); | 7541 static void FromJustIsNothing(); |
| 7557 static void ToLocalEmpty(); | 7542 static void ToLocalEmpty(); |
| 7558 static void InternalFieldOutOfBounds(int index); | 7543 static void InternalFieldOutOfBounds(int index); |
| 7559 template <class T> friend class Local; | 7544 template <class T> friend class Local; |
| 7560 template <class T> | 7545 template <class T> |
| 7561 friend class MaybeLocal; | 7546 friend class MaybeLocal; |
| 7562 template <class T> | 7547 template <class T> |
| (...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8613 } | 8598 } |
| 8614 | 8599 |
| 8615 template <class T> | 8600 template <class T> |
| 8616 template <typename P> | 8601 template <typename P> |
| 8617 P* PersistentBase<T>::ClearWeak() { | 8602 P* PersistentBase<T>::ClearWeak() { |
| 8618 return reinterpret_cast<P*>( | 8603 return reinterpret_cast<P*>( |
| 8619 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); | 8604 V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_))); |
| 8620 } | 8605 } |
| 8621 | 8606 |
| 8622 template <class T> | 8607 template <class T> |
| 8623 void PersistentBase<T>::RegisterExternalReference( | 8608 void PersistentBase<T>::RegisterExternalReference(Isolate* isolate) const { |
| 8624 EmbedderReachableReferenceReporter* reporter) const { | |
| 8625 if (IsEmpty()) return; | 8609 if (IsEmpty()) return; |
| 8626 reporter->ReportExternalReference(this->val_); | 8610 V8::RegisterExternallyReferencedObject( |
| 8611 reinterpret_cast<internal::Object**>(this->val_), |
| 8612 reinterpret_cast<internal::Isolate*>(isolate)); |
| 8627 } | 8613 } |
| 8628 | 8614 |
| 8629 template <class T> | 8615 template <class T> |
| 8630 void PersistentBase<T>::MarkIndependent() { | 8616 void PersistentBase<T>::MarkIndependent() { |
| 8631 typedef internal::Internals I; | 8617 typedef internal::Internals I; |
| 8632 if (this->IsEmpty()) return; | 8618 if (this->IsEmpty()) return; |
| 8633 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), | 8619 I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), |
| 8634 true, | 8620 true, |
| 8635 I::kNodeIsIndependentShift); | 8621 I::kNodeIsIndependentShift); |
| 8636 } | 8622 } |
| (...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9705 */ | 9691 */ |
| 9706 | 9692 |
| 9707 | 9693 |
| 9708 } // namespace v8 | 9694 } // namespace v8 |
| 9709 | 9695 |
| 9710 | 9696 |
| 9711 #undef TYPE_CHECK | 9697 #undef TYPE_CHECK |
| 9712 | 9698 |
| 9713 | 9699 |
| 9714 #endif // INCLUDE_V8_H_ | 9700 #endif // INCLUDE_V8_H_ |
| OLD | NEW |