Version 3.18.4
Added a preliminary API for ES6 ArrayBuffers
Replaced qsort with std::sort. (Chromium issue 2639)
Performance and stability improvements on all platforms.
git-svn-id: http://v8.googlecode.com/svn/trunk@14456 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/include/v8.h b/include/v8.h
index 8efb7c3..f300884 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -92,6 +92,14 @@
#define V8_DEPRECATED(declarator) declarator
#endif
+#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
+ #define V8_UNLIKELY(condition) __builtin_expect((condition), 0)
+ #define V8_LIKELY(condition) __builtin_expect((condition), 1)
+#else
+ #define V8_UNLIKELY(condition) (condition)
+ #define V8_LIKELY(condition) (condition)
+#endif
+
/**
* The v8 JavaScript engine.
*/
@@ -145,6 +153,31 @@
}
+/**
+ * General purpose unique identifier.
+ */
+class UniqueId {
+ public:
+ explicit UniqueId(intptr_t data)
+ : data_(data) {}
+
+ bool operator==(const UniqueId& other) const {
+ return data_ == other.data_;
+ }
+
+ bool operator!=(const UniqueId& other) const {
+ return data_ != other.data_;
+ }
+
+ bool operator<(const UniqueId& other) const {
+ return data_ < other.data_;
+ }
+
+ private:
+ intptr_t data_;
+};
+
+
// --- Weak Handles ---
@@ -377,6 +410,14 @@
template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { }
/**
+ * A constructor that creates a new global cell pointing to that. In contrast
+ * to the copy constructor, this creates a new persistent handle which needs
+ * to be separately disposed.
+ */
+ template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
+ : Handle<T>(New(isolate, that)) { }
+
+ /**
* "Casts" a plain handle which is known to be a persistent handle
* to a persistent handle.
*/
@@ -1142,12 +1183,10 @@
int Utf8Length() const;
/**
- * A fast conservative check for non-ASCII characters. May
- * return true even for ASCII strings, but if it returns
- * false you can be sure that all characters are in the range
- * 0-127.
+ * This function is no longer useful.
*/
- bool MayContainNonAscii() const;
+ // TODO(dcarney): deprecate
+ V8_INLINE(bool MayContainNonAscii()) const { return true; }
/**
* Returns whether this string contains only one byte data.
@@ -1971,6 +2010,43 @@
/**
+ * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
+ * This API is experimental and may change significantly.
+ */
+class V8EXPORT ArrayBuffer : public Object {
+ public:
+ /**
+ * Data length in bytes.
+ */
+ size_t ByteLength() const;
+ /**
+ * Raw pointer to the array buffer data
+ */
+ void* Data() const;
+
+ /**
+ * Create a new ArrayBuffer. Allocate |byte_length| bytes.
+ * Allocated memory will be owned by a created ArrayBuffer and
+ * will be deallocated when it is garbage-collected.
+ */
+ static Local<ArrayBuffer> New(size_t byte_length);
+
+ /**
+ * Create a new ArrayBuffer over an existing memory block.
+ * The memory block will not be reclaimed when a created ArrayBuffer
+ * is garbage-collected.
+ */
+ static Local<ArrayBuffer> New(void* data, size_t byte_length);
+
+ V8_INLINE(static ArrayBuffer* Cast(Value* obj));
+
+ private:
+ ArrayBuffer();
+ static void CheckCast(Value* obj);
+};
+
+
+/**
* An instance of the built-in Date constructor (ECMA-262, 15.9).
*/
class V8EXPORT Date : public Object {
@@ -2983,7 +3059,8 @@
enum GCCallbackFlags {
kNoGCCallbackFlags = 0,
- kGCCallbackFlagCompacted = 1 << 0
+ kGCCallbackFlagCompacted = 1 << 0,
+ kGCCallbackFlagConstructRetainedObjectInfos = 1 << 1
};
typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags);
@@ -3140,6 +3217,39 @@
/** Returns the context that is on the top of the stack. */
Local<Context> GetCurrentContext();
+ /**
+ * Allows the host application to group objects together. If one
+ * object in the group is alive, all objects in the group are alive.
+ * After each garbage collection, object groups are removed. It is
+ * intended to be used in the before-garbage-collection callback
+ * function, for instance to simulate DOM tree connections among JS
+ * wrapper objects. Object groups for all dependent handles need to
+ * be provided for kGCTypeMarkSweepCompact collections, for all other
+ * garbage collection types it is sufficient to provide object groups
+ * for partially dependent handles only.
+ */
+ void SetObjectGroupId(const Persistent<Value>& object,
+ UniqueId id);
+
+ /**
+ * Allows the host application to declare implicit references from an object
+ * group to an object. If the objects of the object group are alive, the child
+ * object is alive too. After each garbage collection, all implicit references
+ * are removed. It is intended to be used in the before-garbage-collection
+ * callback function.
+ */
+ void SetReferenceFromGroup(UniqueId id,
+ const Persistent<Value>& child);
+
+ /**
+ * Allows the host application to declare implicit references from an object
+ * to another object. If the parent object is alive, the child object is alive
+ * too. After each garbage collection, all implicit references are removed. It
+ * is intended to be used in the before-garbage-collection callback function.
+ */
+ void SetReference(const Persistent<Object>& parent,
+ const Persistent<Value>& child);
+
private:
Isolate();
Isolate(const Isolate&);
@@ -3544,6 +3654,8 @@
* for partially dependent handles only.
* See v8-profiler.h for RetainedObjectInfo interface description.
*/
+ // TODO(marja): deprecate AddObjectGroup. Use Isolate::SetObjectGroupId and
+ // HeapProfiler::SetRetainedObjectInfo instead.
static void AddObjectGroup(Persistent<Value>* objects,
size_t length,
RetainedObjectInfo* info = NULL);
@@ -3559,6 +3671,8 @@
* are removed. It is intended to be used in the before-garbage-collection
* callback function.
*/
+ // TODO(marja): Deprecate AddImplicitReferences. Use
+ // Isolate::SetReferenceFromGroup instead.
static void AddImplicitReferences(Persistent<Object> parent,
Persistent<Value>* children,
size_t length);
@@ -4429,7 +4543,7 @@
static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
static const int kContextHeaderSize = 2 * kApiPointerSize;
- static const int kContextEmbedderDataIndex = 55;
+ static const int kContextEmbedderDataIndex = 56;
static const int kFullStringRepresentationMask = 0x07;
static const int kStringEncodingMask = 0x4;
static const int kExternalTwoByteRepresentationTag = 0x02;
@@ -4871,7 +4985,7 @@
O* obj = *reinterpret_cast<O**>(this);
// Fast path: If the object is a plain JSObject, which is the common case, we
// know where to find the internal fields and can return the value directly.
- if (I::GetInstanceType(obj) == I::kJSObjectType) {
+ if (V8_LIKELY(I::GetInstanceType(obj) == I::kJSObjectType)) {
int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
return I::ReadField<void*>(obj, offset);
}
@@ -5102,6 +5216,14 @@
}
+ArrayBuffer* ArrayBuffer::Cast(v8::Value* value) {
+#ifdef V8_ENABLE_CHECKS
+ CheckCast(value);
+#endif
+ return static_cast<ArrayBuffer*>(value);
+}
+
+
Function* Function::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
CheckCast(value);