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

Unified Diff: include/v8.h

Issue 2783843002: [api] Improve documentation for API handle types. (Closed)
Patch Set: [api] Improve documentation for API handle types. Created 3 years, 9 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index 4e445d2144f8fe48ccb8945f1d45501f244372de..06f8fe0514cd95f97ef80ac0d233fd3977315609 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -159,7 +159,6 @@ class GlobalHandles;
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
-
/**
* An object reference managed by the v8 garbage collector.
*
@@ -173,10 +172,16 @@ class GlobalHandles;
* allocated on the heap.
*
* There are two types of handles: local and persistent handles.
+ *
* Local handles are light-weight and transient and typically used in
- * local operations. They are managed by HandleScopes. Persistent
- * handles can be used when storing objects across several independent
- * operations and have to be explicitly deallocated when they're no
+ * local operations. They are managed by HandleScopes. That means that a
+ * HandleScope must exist on the stack when they are created and that they are
+ * only valid inside of the HandleScope active during their creation.
+ * For passing a local handle to an outer HandleScope, an EscapableHandleScope
+ * and its Escape() method must be used.
+ *
+ * Persistent handles can be used when storing objects across several
+ * independent operations and have to be explicitly deallocated when they're no
* longer used.
*
* It is safe to extract the object stored in the handle by
@@ -254,6 +259,11 @@ class Local {
return !operator==(that);
}
+ /**
+ * Cast a handle to a subclass, e.g. Local<Value> to Local<Object>.
+ * This is only valid if the handle actually refers to a value of the
+ * target type.
+ */
template <class S> V8_INLINE static Local<T> Cast(Local<S> that) {
#ifdef V8_ENABLE_CHECKS
// If we're going to perform the type check then we have to check
@@ -263,6 +273,11 @@ class Local {
return Local<T>(T::Cast(*that));
}
+ /**
+ * Calling this is equivalent to Local<S>::Cast().
+ * In particular, this is only valid if the handle actually refers to a value
+ * of the target type.
+ */
template <class S>
V8_INLINE Local<S> As() const {
return Local<S>::Cast(*this);
@@ -339,15 +354,26 @@ class MaybeLocal {
V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
+ /**
+ * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
+ * |false| is returned and |out| is left untouched.
+ */
template <class S>
V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const {
out->val_ = IsEmpty() ? nullptr : this->val_;
return !IsEmpty();
}
- // Will crash if the MaybeLocal<> is empty.
+ /**
+ * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
+ * V8 will crash the process.
+ */
V8_INLINE Local<T> ToLocalChecked();
+ /**
+ * Converts this MaybeLocal<> to a Local<>, using a default value if this
+ * MaybeLocal<> is empty.
+ */
template <class S>
V8_INLINE Local<S> FromMaybe(Local<S> default_value) const {
return IsEmpty() ? default_value : Local<S>(val_);
@@ -357,8 +383,10 @@ class MaybeLocal {
T* val_;
};
-
-// Eternal handles are set-once handles that live for the life of the isolate.
+/**
+ * Eternal handles are set-once handles that live for the lifetime of the
+ * isolate.
+ */
template <class T> class Eternal {
public:
V8_INLINE Eternal() : val_(nullptr) {}
@@ -438,10 +466,10 @@ enum class WeakCallbackType { kParameter, kInternalFields, kFinalizer };
* An object reference that is independent of any handle scope. Where
* a Local handle only lives as long as the HandleScope in which it was
* allocated, a PersistentBase handle remains valid until it is explicitly
- * disposed.
+ * disposed using Reset().
*
* A persistent handle contains a reference to a storage cell within
- * the v8 engine which holds an object value and which is updated by
+ * the V8 engine which holds an object value and which is updated by
* the garbage collector whenever the object is moved. A new storage
* cell can be created using the constructor or PersistentBase::Reset and
* existing handles can be disposed using PersistentBase::Reset.
@@ -899,6 +927,11 @@ class V8_EXPORT EscapableHandleScope : public HandleScope {
internal::Object** escape_slot_;
};
+/**
+ * A SealHandleScope acts like a handle scope in which no handle allocations
+ * are allowed. It can be useful for debugging handle leaks.
+ * Handles can be allocated within inner normal HandleScopes.
+ */
class V8_EXPORT SealHandleScope {
public:
SealHandleScope(Isolate* isolate);
@@ -1363,7 +1396,7 @@ class V8_EXPORT ScriptCompiler {
* CachedData instance is still valid; the tag has no other meaing.
*
* Background: The data carried by CachedData may depend on the exact
- * V8 version number or currently compiler flags. This means when
+ * V8 version number or current compiler flags. This means that when
* persisting CachedData, the embedder must take care to not pass in
* data from another V8 version, or the same version with different
* features enabled.
@@ -1683,21 +1716,21 @@ class V8_EXPORT ValueSerializer {
public:
virtual ~Delegate() {}
- /*
+ /**
* Handles the case where a DataCloneError would be thrown in the structured
* clone spec. Other V8 embedders may throw some other appropriate exception
* type.
*/
virtual void ThrowDataCloneError(Local<String> message) = 0;
- /*
+ /**
* The embedder overrides this method to write some kind of host object, if
* possible. If not, a suitable exception should be thrown and
* Nothing<bool>() returned.
*/
virtual Maybe<bool> WriteHostObject(Isolate* isolate, Local<Object> object);
- /*
+ /**
* Called when the ValueSerializer is going to serialize a
* SharedArrayBuffer object. The embedder must return an ID for the
* object, using the same ID if this SharedArrayBuffer has already been
@@ -1712,7 +1745,7 @@ class V8_EXPORT ValueSerializer {
virtual Maybe<uint32_t> GetWasmModuleTransferId(
Isolate* isolate, Local<WasmCompiledModule> module);
- /*
+ /**
* Allocates memory for the buffer of at least the size provided. The actual
* size (which may be greater or equal) is written to |actual_size|. If no
* buffer has been allocated yet, nullptr will be provided.
@@ -1724,7 +1757,7 @@ class V8_EXPORT ValueSerializer {
virtual void* ReallocateBufferMemory(void* old_buffer, size_t size,
size_t* actual_size);
- /*
+ /**
* Frees a buffer allocated with |ReallocateBufferMemory|.
*/
virtual void FreeBufferMemory(void* buffer);
@@ -1734,24 +1767,24 @@ class V8_EXPORT ValueSerializer {
ValueSerializer(Isolate* isolate, Delegate* delegate);
~ValueSerializer();
- /*
+ /**
* Writes out a header, which includes the format version.
*/
void WriteHeader();
- /*
+ /**
* Serializes a JavaScript value into the buffer.
*/
V8_WARN_UNUSED_RESULT Maybe<bool> WriteValue(Local<Context> context,
Local<Value> value);
- /*
+ /**
* Returns the stored data. This serializer should not be used once the buffer
* is released. The contents are undefined if a previous write has failed.
*/
V8_DEPRECATE_SOON("Use Release()", std::vector<uint8_t> ReleaseBuffer());
- /*
+ /**
* Returns the stored data (allocated using the delegate's
* AllocateBufferMemory) and its size. This serializer should not be used once
* the buffer is released. The contents are undefined if a previous write has
@@ -1759,7 +1792,7 @@ class V8_EXPORT ValueSerializer {
*/
V8_WARN_UNUSED_RESULT std::pair<uint8_t*, size_t> Release();
- /*
+ /**
* Marks an ArrayBuffer as havings its contents transferred out of band.
* Pass the corresponding ArrayBuffer in the deserializing context to
* ValueDeserializer::TransferArrayBuffer.
@@ -1767,7 +1800,7 @@ class V8_EXPORT ValueSerializer {
void TransferArrayBuffer(uint32_t transfer_id,
Local<ArrayBuffer> array_buffer);
- /*
+ /**
* Similar to TransferArrayBuffer, but for SharedArrayBuffer.
*/
V8_DEPRECATE_SOON("Use Delegate::GetSharedArrayBufferId",
@@ -1775,7 +1808,7 @@ class V8_EXPORT ValueSerializer {
uint32_t transfer_id,
Local<SharedArrayBuffer> shared_array_buffer));
- /*
+ /**
* Indicate whether to treat ArrayBufferView objects as host objects,
* i.e. pass them to Delegate::WriteHostObject. This should not be
* called when no Delegate was passed.
@@ -1784,7 +1817,7 @@ class V8_EXPORT ValueSerializer {
*/
void SetTreatArrayBufferViewsAsHostObjects(bool mode);
- /*
+ /**
* Write raw data in various common formats to the buffer.
* Note that integer types are written in base-128 varint format, not with a
* binary copy. For use during an override of Delegate::WriteHostObject.
@@ -1816,14 +1849,14 @@ class V8_EXPORT ValueDeserializer {
public:
virtual ~Delegate() {}
- /*
+ /**
* The embedder overrides this method to read some kind of host object, if
* possible. If not, a suitable exception should be thrown and
* MaybeLocal<Object>() returned.
*/
virtual MaybeLocal<Object> ReadHostObject(Isolate* isolate);
- /*
+ /**
* Get a WasmCompiledModule given a transfer_id previously provided
* by ValueSerializer::GetWasmModuleTransferId
*/
@@ -1836,25 +1869,25 @@ class V8_EXPORT ValueDeserializer {
Delegate* delegate);
~ValueDeserializer();
- /*
+ /**
* Reads and validates a header (including the format version).
* May, for example, reject an invalid or unsupported wire format.
*/
V8_WARN_UNUSED_RESULT Maybe<bool> ReadHeader(Local<Context> context);
- /*
+ /**
* Deserializes a JavaScript value from the buffer.
*/
V8_WARN_UNUSED_RESULT MaybeLocal<Value> ReadValue(Local<Context> context);
- /*
+ /**
* Accepts the array buffer corresponding to the one passed previously to
* ValueSerializer::TransferArrayBuffer.
*/
void TransferArrayBuffer(uint32_t transfer_id,
Local<ArrayBuffer> array_buffer);
- /*
+ /**
* Similar to TransferArrayBuffer, but for SharedArrayBuffer.
* The id is not necessarily in the same namespace as unshared ArrayBuffer
* objects.
@@ -1862,7 +1895,7 @@ class V8_EXPORT ValueDeserializer {
void TransferSharedArrayBuffer(uint32_t id,
Local<SharedArrayBuffer> shared_array_buffer);
- /*
+ /**
* Must be called before ReadHeader to enable support for reading the legacy
* wire format (i.e., which predates this being shipped).
*
@@ -1871,19 +1904,19 @@ class V8_EXPORT ValueDeserializer {
*/
void SetSupportsLegacyWireFormat(bool supports_legacy_wire_format);
- /*
+ /**
* Expect inline wasm in the data stream (rather than in-memory transfer)
*/
void SetExpectInlineWasm(bool allow_inline_wasm);
- /*
+ /**
* Reads the underlying wire format version. Likely mostly to be useful to
* legacy code reading old wire format versions. Must be called after
* ReadHeader.
*/
uint32_t GetWireFormatVersion() const;
- /*
+ /**
* Reads raw data in various common formats to the buffer.
* Note that integer types are read in base-128 varint format, not with a
* binary copy. For use during an override of Delegate::ReadHostObject.
@@ -2308,9 +2341,25 @@ class V8_EXPORT Name : public Primitive {
static void CheckCast(Value* obj);
};
+/**
+ * A flag describing different modes of string creation.
+ *
+ * Aside from performance implications there are no differences between the two
+ * creation modes.
+ */
+enum class NewStringType {
+ /**
+ * Create a new string, always allocating new storage memory.
+ */
+ kNormal,
-enum class NewStringType { kNormal, kInternalized };
-
+ /**
+ * Acts as a hint that the string should be created in the
+ * old generation heap space and be deduplicated if an identical string
+ * already exists.
+ */
+ kInternalized
+};
/**
* A JavaScript string value (ECMA-262, 4.3.17).
@@ -2325,7 +2374,7 @@ class V8_EXPORT String : public Name {
ONE_BYTE_ENCODING = 0x8
};
/**
- * Returns the number of characters in this string.
+ * Returns the number of characters (UTF-16 code units) in this string.
*/
int Length() const;
@@ -2336,14 +2385,16 @@ class V8_EXPORT String : public Name {
int Utf8Length() const;
/**
- * Returns whether this string is known to contain only one byte data.
+ * Returns whether this string is known to contain only one byte data,
+ * i.e. ISO-8859-1 code points.
* Does not read the string.
* False negatives are possible.
*/
bool IsOneByte() const;
/**
- * Returns whether this string contain only one byte data.
+ * Returns whether this string contain only one byte data,
+ * i.e. ISO-8859-1 code points.
* Will read the entire string in some cases.
*/
bool ContainsOnlyOneByte() const;
@@ -2650,7 +2701,7 @@ class V8_EXPORT String : public Name {
};
/**
- * Converts an object to a two-byte string.
+ * Converts an object to a two-byte (UTF-16-encoded) string.
* If conversion to a string fails (eg. due to an exception in the toString()
* method of the object) then the length() method returns 0 and the * operator
* returns NULL.
@@ -2685,22 +2736,30 @@ class V8_EXPORT String : public Name {
*/
class V8_EXPORT Symbol : public Name {
public:
- // Returns the print name string of the symbol, or undefined if none.
+ /**
+ * Returns the print name string of the symbol, or undefined if none.
+ */
Local<Value> Name() const;
- // Create a symbol. If name is not empty, it will be used as the description.
+ /**
+ * Create a symbol. If name is not empty, it will be used as the description.
+ */
static Local<Symbol> New(Isolate* isolate,
Local<String> name = Local<String>());
- // Access global symbol registry.
- // Note that symbols created this way are never collected, so
- // they should only be used for statically fixed properties.
- // Also, there is only one global name space for the names used as keys.
- // To minimize the potential for clashes, use qualified names as keys.
+ /**
+ * Access global symbol registry.
+ * Note that symbols created this way are never collected, so
+ * they should only be used for statically fixed properties.
+ * Also, there is only one global name space for the names used as keys.
+ * To minimize the potential for clashes, use qualified names as keys.
+ */
static Local<Symbol> For(Isolate *isolate, Local<String> name);
- // Retrieve a global symbol. Similar to |For|, but using a separate
- // registry that is not accessible by (and cannot clash with) JavaScript code.
+ /**
+ * Retrieve a global symbol. Similar to |For|, but using a separate
+ * registry that is not accessible by (and cannot clash with) JavaScript code.
+ */
static Local<Symbol> ForApi(Isolate *isolate, Local<String> name);
// Well-known symbols
@@ -2725,20 +2784,26 @@ class V8_EXPORT Symbol : public Name {
*/
class V8_EXPORT Private : public Data {
public:
- // Returns the print name string of the private symbol, or undefined if none.
+ /**
+ * Returns the print name string of the private symbol, or undefined if none.
+ */
Local<Value> Name() const;
- // Create a private symbol. If name is not empty, it will be the description.
+ /**
+ * Create a private symbol. If name is not empty, it will be the description.
+ */
static Local<Private> New(Isolate* isolate,
Local<String> name = Local<String>());
- // Retrieve a global private symbol. If a symbol with this name has not
- // been retrieved in the same isolate before, it is created.
- // Note that private symbols created this way are never collected, so
- // they should only be used for statically fixed properties.
- // Also, there is only one global name space for the names used as keys.
- // To minimize the potential for clashes, use qualified names as keys,
- // e.g., "Class#property".
+ /**
+ * Retrieve a global private symbol. If a symbol with this name has not
+ * been retrieved in the same isolate before, it is created.
+ * Note that private symbols created this way are never collected, so
+ * they should only be used for statically fixed properties.
+ * Also, there is only one global name space for the names used as keys.
+ * To minimize the potential for clashes, use qualified names as keys,
+ * e.g., "Class#property".
+ */
static Local<Private> ForApi(Isolate* isolate, Local<String> name);
private:
@@ -4063,7 +4128,8 @@ class V8_EXPORT ArrayBuffer : public Object {
/**
* malloc/free based convenience allocator.
*
- * Caller takes ownership.
+ * Caller takes ownership, i.e. the returned object needs to be freed using
+ * |delete allocator| once it is no longer in use.
*/
static Allocator* NewDefaultAllocator();
};
@@ -4107,8 +4173,11 @@ class V8_EXPORT ArrayBuffer : public Object {
/**
* Create a new ArrayBuffer over an existing memory block.
* The created array buffer is by default immediately in externalized state.
- * The memory block will not be reclaimed when a created ArrayBuffer
- * is garbage-collected.
+ * In externalized state, the memory block will not be reclaimed when a
+ * created ArrayBuffer is garbage-collected.
+ * In internalized state, the memory block will be released using
+ * |Allocator::Free| once all ArrayBuffers referencing it are collected by
+ * the garbage collector.
*/
static Local<ArrayBuffer> New(
Isolate* isolate, void* data, size_t byte_length,
@@ -6057,6 +6126,12 @@ class V8_EXPORT HeapStatistics {
size_t heap_size_limit() { return heap_size_limit_; }
size_t malloced_memory() { return malloced_memory_; }
size_t peak_malloced_memory() { return peak_malloced_memory_; }
+
+ /**
+ * Returns a 0/1 boolean, which signifies whether the |--zap_code_space|
+ * option is enabled or not, which makes V8 overwrite heap garbage with a bit
+ * pattern.
+ */
size_t does_zap_garbage() { return does_zap_garbage_; }
private:
@@ -7847,20 +7922,33 @@ class Maybe {
V8_INLINE bool IsNothing() const { return !has_value_; }
V8_INLINE bool IsJust() const { return has_value_; }
- // Will crash if the Maybe<> is nothing.
+ /**
+ * An alias for |FromJust|. Will crash if the Maybe<> is nothing.
+ */
V8_INLINE T ToChecked() const { return FromJust(); }
+ /**
+ * Converts this Maybe<> to a value of type T. If this Maybe<> is
+ * nothing (empty), |false| is returned and |out| is left untouched.
+ */
V8_WARN_UNUSED_RESULT V8_INLINE bool To(T* out) const {
if (V8_LIKELY(IsJust())) *out = value_;
return IsJust();
}
- // Will crash if the Maybe<> is nothing.
+ /**
+ * Converts this Maybe<> to a value of type T. If this Maybe<> is
+ * nothing (empty), V8 will crash the process.
+ */
V8_INLINE T FromJust() const {
if (V8_UNLIKELY(!IsJust())) V8::FromJustIsNothing();
return value_;
}
+ /**
+ * Converts this Maybe<> to a value of type T, using a default value if this
+ * Maybe<> is nothing (empty).
+ */
V8_INLINE T FromMaybe(const T& default_value) const {
return has_value_ ? value_ : default_value;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698