summaryrefslogtreecommitdiff
path: root/chromium/v8/include
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-09-18 14:34:04 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-10-04 11:15:27 +0000
commite6430e577f105ad8813c92e75c54660c4985026e (patch)
tree88115e5d1fb471fea807111924dcccbeadbf9e4f /chromium/v8/include
parent53d399fe6415a96ea6986ec0d402a9c07da72453 (diff)
downloadqtwebengine-chromium-e6430e577f105ad8813c92e75c54660c4985026e.tar.gz
BASELINE: Update Chromium to 61.0.3163.99
Change-Id: I8452f34574d88ca2b27af9bd56fc9ff3f16b1367 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/v8/include')
-rw-r--r--chromium/v8/include/APIDesign.md69
-rw-r--r--chromium/v8/include/OWNERS4
-rw-r--r--chromium/v8/include/PRESUBMIT.py29
-rw-r--r--chromium/v8/include/libplatform/libplatform.h7
-rw-r--r--chromium/v8/include/libplatform/v8-tracing.h32
-rw-r--r--chromium/v8/include/v8-platform.h89
-rw-r--r--chromium/v8/include/v8-version.h6
-rw-r--r--chromium/v8/include/v8.h330
-rw-r--r--chromium/v8/include/v8config.h19
9 files changed, 465 insertions, 120 deletions
diff --git a/chromium/v8/include/APIDesign.md b/chromium/v8/include/APIDesign.md
new file mode 100644
index 00000000000..8830fff7d18
--- /dev/null
+++ b/chromium/v8/include/APIDesign.md
@@ -0,0 +1,69 @@
+# The V8 public C++ API
+
+# Overview
+
+The V8 public C++ API aims to support four use cases:
+
+1. Enable applications that embed V8 (called the embedder) to configure and run
+ one or more instances of V8.
+2. Expose ECMAScript-like capabilities to the embedder.
+3. Enable the embedder to interact with ECMAScript by exposing API objects.
+4. Provide access to the V8 debugger (inspector).
+
+# Configuring and running an instance of V8
+
+V8 requires access to certain OS-level primitives such as the ability to
+schedule work on threads, or allocate memory.
+
+The embedder can define how to access those primitives via the v8::Platform
+interface. While V8 bundles a basic implementation, embedders are highly
+encouraged to implement v8::Platform themselves.
+
+Currently, the v8::ArrayBuffer::Allocator is passed to the v8::Isolate factory
+method, however, conceptually it should also be part of the v8::Platform since
+all instances of V8 should share one allocator.
+
+Once the v8::Platform is configured, an v8::Isolate can be created. All
+further interactions with V8 should explicitly reference the v8::Isolate they
+refer to. All API methods should eventually take an v8::Isolate parameter.
+
+When a given instance of V8 is no longer needed, it can be destroyed by
+disposing the respective v8::Isolate. If the embedder wishes to free all memory
+associated with the v8::Isolate, it has to first clear all global handles
+associated with that v8::Isolate.
+
+# ECMAScript-like capabilities
+
+In general, the C++ API shouldn't enable capabilities that aren't available to
+scripts running in V8. Experience has shown that it's not possible to maintain
+such API methods in the long term. However, capabilities also available to
+scripts, i.e., ones that are defined in the ECMAScript standard are there to
+stay, and we can safely expose them to embedders.
+
+The C++ API should also be pleasant to use, and not require learning new
+paradigms. Similarly to how the API exposed to scripts aims to provide good
+ergonomics, we should aim to provide a reasonable developer experience for this
+API surface.
+
+ECMAScript makes heavy use of exceptions, however, V8's C++ code doesn't use
+C++ exceptions. Therefore, all API methods that can throw exceptions should
+indicate so by returning a v8::Maybe&lt;&gt; or v8::MaybeLocal&lt;&gt; result,
+and by taking a v8::Local&lt;v8::Context&gt; parameter that indicates in which
+context a possible exception should be thrown.
+
+# API objects
+
+V8 allows embedders to define special objects that expose additional
+capabilities and APIs to scripts. The most prominent example is exposing the
+HTML DOM in Blink. Other examples are e.g. node.js. It is less clear what kind
+of capabilities we want to expose via this API surface. As a rule of thumb, we
+want to expose operations as defined in the WebIDL and HTML spec: we
+assume that those requirements are somewhat stable, and that they are a
+superset of the requirements of other embedders including node.js.
+
+Ideally, the API surfaces defined in those specs hook into the ECMAScript spec
+which in turn guarantees long-term stability of the API.
+
+# The V8 inspector
+
+All debugging capabilities of V8 should be exposed via the inspector protocol.
diff --git a/chromium/v8/include/OWNERS b/chromium/v8/include/OWNERS
index 07f8a610c5f..28f038f80b2 100644
--- a/chromium/v8/include/OWNERS
+++ b/chromium/v8/include/OWNERS
@@ -1,7 +1,9 @@
+adamk@chromium.org
danno@chromium.org
-jochen@chromium.org
per-file v8-inspector.h=dgozman@chromium.org
per-file v8-inspector.h=pfeldman@chromium.org
per-file v8-inspector-protocol.h=dgozman@chromium.org
per-file v8-inspector-protocol.h=pfeldman@chromium.org
+
+# COMPONENT: Blink>JavaScript>API
diff --git a/chromium/v8/include/PRESUBMIT.py b/chromium/v8/include/PRESUBMIT.py
new file mode 100644
index 00000000000..386f2e50061
--- /dev/null
+++ b/chromium/v8/include/PRESUBMIT.py
@@ -0,0 +1,29 @@
+# Copyright 2017 the V8 project authors. All rights reserved.')
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Presubmit script for //v8/include
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into depot_tools.
+"""
+
+import os
+
+
+def PostUploadHook(cl, change, output_api):
+ """git cl upload will call this hook after the issue is created/modified.
+
+ This hook adds extra try bots to the CL description in order to run layout
+ tests in addition to CQ try bots.
+ """
+ def header_filter(f):
+ return '.h' in os.path.split(f.LocalPath())[1]
+ if not change.AffectedFiles(file_filter=header_filter):
+ return []
+ return output_api.EnsureCQIncludeTrybotsAreAdded(
+ cl,
+ [
+ 'master.tryserver.chromium.linux:linux_chromium_rel_ng'
+ ],
+ 'Automatically added layout test trybots to run tests on CQ.')
diff --git a/chromium/v8/include/libplatform/libplatform.h b/chromium/v8/include/libplatform/libplatform.h
index e9450456299..b615088300e 100644
--- a/chromium/v8/include/libplatform/libplatform.h
+++ b/chromium/v8/include/libplatform/libplatform.h
@@ -30,12 +30,15 @@ enum class MessageLoopBehavior : bool {
* If |idle_task_support| is enabled then the platform will accept idle
* tasks (IdleTasksEnabled will return true) and will rely on the embedder
* calling v8::platform::RunIdleTasks to process the idle tasks.
+ * If |tracing_controller| is nullptr, the default platform will create a
+ * v8::platform::TracingController instance and use it.
*/
V8_PLATFORM_EXPORT v8::Platform* CreateDefaultPlatform(
int thread_pool_size = 0,
IdleTaskSupport idle_task_support = IdleTaskSupport::kDisabled,
InProcessStackDumping in_process_stack_dumping =
- InProcessStackDumping::kEnabled);
+ InProcessStackDumping::kEnabled,
+ v8::TracingController* tracing_controller = nullptr);
/**
* Pumps the message loop for the given isolate.
@@ -67,6 +70,8 @@ V8_PLATFORM_EXPORT void RunIdleTasks(v8::Platform* platform,
* Attempts to set the tracing controller for the given platform.
*
* The |platform| has to be created using |CreateDefaultPlatform|.
+ *
+ * DEPRECATED: Will be removed soon.
*/
V8_PLATFORM_EXPORT void SetTracingController(
v8::Platform* platform,
diff --git a/chromium/v8/include/libplatform/v8-tracing.h b/chromium/v8/include/libplatform/v8-tracing.h
index 902f8ea93db..8c1febf7627 100644
--- a/chromium/v8/include/libplatform/v8-tracing.h
+++ b/chromium/v8/include/libplatform/v8-tracing.h
@@ -209,7 +209,15 @@ class V8_PLATFORM_EXPORT TraceConfig {
void operator=(const TraceConfig&) = delete;
};
-class V8_PLATFORM_EXPORT TracingController {
+#if defined(_MSC_VER)
+#define V8_PLATFORM_NON_EXPORTED_BASE(code) \
+ __pragma(warning(suppress : 4275)) code
+#else
+#define V8_PLATFORM_NON_EXPORTED_BASE(code) code
+#endif // defined(_MSC_VER)
+
+class V8_PLATFORM_EXPORT TracingController
+ : public V8_PLATFORM_NON_EXPORTED_BASE(v8::TracingController) {
public:
enum Mode { DISABLED = 0, RECORDING_MODE };
@@ -227,25 +235,29 @@ class V8_PLATFORM_EXPORT TracingController {
};
TracingController();
- ~TracingController();
+ ~TracingController() override;
void Initialize(TraceBuffer* trace_buffer);
- const uint8_t* GetCategoryGroupEnabled(const char* category_group);
- static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag);
+
+ // v8::TracingController implementation.
+ const uint8_t* GetCategoryGroupEnabled(const char* category_group) override;
uint64_t AddTraceEvent(
char phase, const uint8_t* category_enabled_flag, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
- unsigned int flags);
+ unsigned int flags) override;
void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
- const char* name, uint64_t handle);
+ const char* name, uint64_t handle) override;
+ void AddTraceStateObserver(
+ v8::TracingController::TraceStateObserver* observer) override;
+ void RemoveTraceStateObserver(
+ v8::TracingController::TraceStateObserver* observer) override;
void StartTracing(TraceConfig* trace_config);
void StopTracing();
- void AddTraceStateObserver(Platform::TraceStateObserver* observer);
- void RemoveTraceStateObserver(Platform::TraceStateObserver* observer);
+ static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag);
private:
const uint8_t* GetCategoryGroupEnabledInternal(const char* category_group);
@@ -255,7 +267,7 @@ class V8_PLATFORM_EXPORT TracingController {
std::unique_ptr<TraceBuffer> trace_buffer_;
std::unique_ptr<TraceConfig> trace_config_;
std::unique_ptr<base::Mutex> mutex_;
- std::unordered_set<Platform::TraceStateObserver*> observers_;
+ std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
Mode mode_ = DISABLED;
// Disallow copy and assign
@@ -263,6 +275,8 @@ class V8_PLATFORM_EXPORT TracingController {
void operator=(const TracingController&) = delete;
};
+#undef V8_PLATFORM_NON_EXPORTED_BASE
+
} // namespace tracing
} // namespace platform
} // namespace v8
diff --git a/chromium/v8/include/v8-platform.h b/chromium/v8/include/v8-platform.h
index 8f6d8042abd..3df78a81c0a 100644
--- a/chromium/v8/include/v8-platform.h
+++ b/chromium/v8/include/v8-platform.h
@@ -53,6 +53,66 @@ class ConvertableToTraceFormat {
};
/**
+ * V8 Tracing controller.
+ *
+ * Can be implemented by an embedder to record trace events from V8.
+ */
+class TracingController {
+ public:
+ virtual ~TracingController() = default;
+
+ /**
+ * Called by TRACE_EVENT* macros, don't call this directly.
+ * The name parameter is a category group for example:
+ * TRACE_EVENT0("v8,parse", "V8.Parse")
+ * The pointer returned points to a value with zero or more of the bits
+ * defined in CategoryGroupEnabledFlags.
+ **/
+ virtual const uint8_t* GetCategoryGroupEnabled(const char* name) {
+ static uint8_t no = 0;
+ return &no;
+ }
+
+ /**
+ * Adds a trace event to the platform tracing system. This function call is
+ * usually the result of a TRACE_* macro from trace_event_common.h when
+ * tracing and the category of the particular trace are enabled. It is not
+ * advisable to call this function on its own; it is really only meant to be
+ * used by the trace macros. The returned handle can be used by
+ * UpdateTraceEventDuration to update the duration of COMPLETE events.
+ */
+ virtual uint64_t AddTraceEvent(
+ char phase, const uint8_t* category_enabled_flag, const char* name,
+ const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
+ const char** arg_names, const uint8_t* arg_types,
+ const uint64_t* arg_values,
+ std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
+ unsigned int flags) {
+ return 0;
+ }
+
+ /**
+ * Sets the duration field of a COMPLETE trace event. It must be called with
+ * the handle returned from AddTraceEvent().
+ **/
+ virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
+ const char* name, uint64_t handle) {}
+
+ class TraceStateObserver {
+ public:
+ virtual ~TraceStateObserver() = default;
+ virtual void OnTraceEnabled() = 0;
+ virtual void OnTraceDisabled() = 0;
+ };
+
+ /** Adds tracing state change observer. */
+ virtual void AddTraceStateObserver(TraceStateObserver*) {}
+
+ /** Removes tracing state change observer. */
+ virtual void RemoveTraceStateObserver(TraceStateObserver*) {}
+};
+
+/**
* V8 Platform abstraction layer.
*
* The embedder has to provide an implementation of this interface before
@@ -135,6 +195,20 @@ class Platform {
* the epoch.
**/
virtual double MonotonicallyIncreasingTime() = 0;
+ typedef void (*StackTracePrinter)();
+
+ /**
+ * Returns a function pointer that print a stack trace of the current stack
+ * on invocation. Disables printing of the stack trace if nullptr.
+ */
+ virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
+
+ /**
+ * Returns an instance of a v8::TracingController. This must be non-nullptr.
+ */
+ virtual TracingController* GetTracingController() = 0;
+
+ // DEPRECATED methods, use TracingController interface instead.
/**
* Called by TRACE_EVENT* macros, don't call this directly.
@@ -200,26 +274,13 @@ class Platform {
virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
const char* name, uint64_t handle) {}
- class TraceStateObserver {
- public:
- virtual ~TraceStateObserver() = default;
- virtual void OnTraceEnabled() = 0;
- virtual void OnTraceDisabled() = 0;
- };
+ typedef v8::TracingController::TraceStateObserver TraceStateObserver;
/** Adds tracing state change observer. */
virtual void AddTraceStateObserver(TraceStateObserver*) {}
/** Removes tracing state change observer. */
virtual void RemoveTraceStateObserver(TraceStateObserver*) {}
-
- typedef void (*StackTracePrinter)();
-
- /**
- * Returns a function pointer that print a stack trace of the current stack
- * on invocation. Disables printing of the stack trace if nullptr.
- */
- virtual StackTracePrinter GetStackTracePrinter() { return nullptr; }
};
} // namespace v8
diff --git a/chromium/v8/include/v8-version.h b/chromium/v8/include/v8-version.h
index b89bb0fe9c6..6e42708504c 100644
--- a/chromium/v8/include/v8-version.h
+++ b/chromium/v8/include/v8-version.h
@@ -9,9 +9,9 @@
// NOTE these macros are used by some of the tool scripts and the build
// system so their names cannot be changed without changing the scripts.
#define V8_MAJOR_VERSION 6
-#define V8_MINOR_VERSION 0
-#define V8_BUILD_NUMBER 286
-#define V8_PATCH_LEVEL 57
+#define V8_MINOR_VERSION 1
+#define V8_BUILD_NUMBER 534
+#define V8_PATCH_LEVEL 39
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
diff --git a/chromium/v8/include/v8.h b/chromium/v8/include/v8.h
index da3cdfdcbd7..2f9bc602366 100644
--- a/chromium/v8/include/v8.h
+++ b/chromium/v8/include/v8.h
@@ -869,8 +869,6 @@ class V8_EXPORT HandleScope {
HandleScope(const HandleScope&) = delete;
void operator=(const HandleScope&) = delete;
- void* operator new(size_t size);
- void operator delete(void*, size_t);
protected:
V8_INLINE HandleScope() {}
@@ -881,6 +879,13 @@ class V8_EXPORT HandleScope {
internal::Object* value);
private:
+ // Declaring operator new and delete as deleted is not spec compliant.
+ // Therefore declare them private instead to disable dynamic alloc
+ void* operator new(size_t size);
+ void* operator new[](size_t size);
+ void operator delete(void*, size_t);
+ void operator delete[](void*, size_t);
+
// Uses heap_object to obtain the current Isolate.
static internal::Object** CreateHandle(internal::HeapObject* heap_object,
internal::Object* value);
@@ -921,10 +926,15 @@ class V8_EXPORT EscapableHandleScope : public HandleScope {
EscapableHandleScope(const EscapableHandleScope&) = delete;
void operator=(const EscapableHandleScope&) = delete;
+
+ private:
+ // Declaring operator new and delete as deleted is not spec compliant.
+ // Therefore declare them private instead to disable dynamic alloc
void* operator new(size_t size);
+ void* operator new[](size_t size);
void operator delete(void*, size_t);
+ void operator delete[](void*, size_t);
- private:
internal::Object** Escape(internal::Object** escape_value);
internal::Object** escape_slot_;
};
@@ -941,10 +951,15 @@ class V8_EXPORT SealHandleScope {
SealHandleScope(const SealHandleScope&) = delete;
void operator=(const SealHandleScope&) = delete;
+
+ private:
+ // Declaring operator new and delete as deleted is not spec compliant.
+ // Therefore declare them private instead to disable dynamic alloc
void* operator new(size_t size);
+ void* operator new[](size_t size);
void operator delete(void*, size_t);
+ void operator delete[](void*, size_t);
- private:
internal::Isolate* const isolate_;
internal::Object** prev_limit_;
int prev_sealed_level_;
@@ -1016,9 +1031,6 @@ class ScriptOrigin {
V8_INLINE Local<Value> ResourceName() const;
V8_INLINE Local<Integer> ResourceLineOffset() const;
V8_INLINE Local<Integer> ResourceColumnOffset() const;
- /**
- * Returns true for embedder's debugger scripts
- */
V8_INLINE Local<Integer> ScriptID() const;
V8_INLINE Local<Value> SourceMapUrl() const;
V8_INLINE ScriptOriginOptions Options() const { return options_; }
@@ -1032,7 +1044,6 @@ class ScriptOrigin {
Local<Value> source_map_url_;
};
-
/**
* A compiled JavaScript script, not yet tied to a Context.
*/
@@ -1065,6 +1076,22 @@ class V8_EXPORT UnboundScript {
};
/**
+ * A location in JavaScript source.
+ */
+class V8_EXPORT Location {
+ public:
+ int GetLineNumber() { return line_number_; }
+ int GetColumnNumber() { return column_number_; }
+
+ Location(int line_number, int column_number)
+ : line_number_(line_number), column_number_(column_number) {}
+
+ private:
+ int line_number_;
+ int column_number_;
+};
+
+/**
* This is an unfinished experimental feature, and is only exposed
* here for internal testing purposes. DO NOT USE.
*
@@ -1073,6 +1100,28 @@ class V8_EXPORT UnboundScript {
class V8_EXPORT Module {
public:
/**
+ * The different states a module can be in.
+ */
+ enum Status {
+ kUninstantiated,
+ kInstantiating,
+ kInstantiated,
+ kEvaluating,
+ kEvaluated,
+ kErrored
+ };
+
+ /**
+ * Returns the module's current status.
+ */
+ Status GetStatus() const;
+
+ /**
+ * For a module in kErrored status, this returns the corresponding exception.
+ */
+ Local<Value> GetException() const;
+
+ /**
* Returns the number of modules requested by this module.
*/
int GetModuleRequestsLength() const;
@@ -1084,6 +1133,12 @@ class V8_EXPORT Module {
Local<String> GetModuleRequest(int i) const;
/**
+ * Returns the source location (line number and column number) of the ith
+ * module specifier's first occurrence in this module.
+ */
+ Location GetModuleRequestLocation(int i) const;
+
+ /**
* Returns the identity hash for this object.
*/
int GetIdentityHash() const;
@@ -1095,40 +1150,29 @@ class V8_EXPORT Module {
/**
* ModuleDeclarationInstantiation
*
- * Returns false if an exception occurred during instantiation. (In the case
- * where the callback throws an exception, that exception is propagated.)
+ * Returns an empty Maybe<bool> if an exception occurred during
+ * instantiation. (In the case where the callback throws an exception, that
+ * exception is propagated.)
*/
- V8_WARN_UNUSED_RESULT bool Instantiate(Local<Context> context,
- ResolveCallback callback);
+ V8_DEPRECATED("Use Maybe<bool> version",
+ bool Instantiate(Local<Context> context,
+ ResolveCallback callback));
+ V8_WARN_UNUSED_RESULT Maybe<bool> InstantiateModule(Local<Context> context,
+ ResolveCallback callback);
/**
* ModuleEvaluation
*
* Returns the completion value.
+ * TODO(neis): Be more precise or say nothing.
*/
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Evaluate(Local<Context> context);
-};
-
-/**
- * This is an unfinished experimental feature, and is only exposed
- * here for internal testing purposes. DO NOT USE.
- *
- * A compiled JavaScript module.
- */
-class V8_EXPORT DynamicImportResult {
- public:
- /**
- * Resolves the promise with the namespace object of the given
- * module.
- */
- V8_WARN_UNUSED_RESULT bool FinishDynamicImportSuccess(Local<Context> context,
- Local<Module> module);
/**
- * Rejects the promise with the given exception.
+ * Returns the namespace object of this module. The module must have
+ * been successfully instantiated before and must not be errored.
*/
- V8_WARN_UNUSED_RESULT bool FinishDynamicImportFailure(Local<Context> context,
- Local<Value> exception);
+ Local<Value> GetModuleNamespace();
};
/**
@@ -3053,12 +3097,9 @@ class V8_EXPORT Object : public Value {
//
// Note also that this only works for named properties.
V8_DEPRECATED("Use CreateDataProperty / DefineOwnProperty",
- bool ForceSet(Local<Value> key, Local<Value> value,
- PropertyAttribute attribs = None));
- V8_DEPRECATE_SOON("Use CreateDataProperty / DefineOwnProperty",
- Maybe<bool> ForceSet(Local<Context> context,
- Local<Value> key, Local<Value> value,
- PropertyAttribute attribs = None));
+ Maybe<bool> ForceSet(Local<Context> context, Local<Value> key,
+ Local<Value> value,
+ PropertyAttribute attribs = None));
V8_DEPRECATE_SOON("Use maybe version", Local<Value> Get(Local<Value> key));
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
@@ -4247,7 +4288,18 @@ class V8_EXPORT ArrayBuffer : public Object {
*/
class V8_EXPORT Contents { // NOLINT
public:
- Contents() : data_(NULL), byte_length_(0) {}
+ Contents()
+ : data_(nullptr),
+ byte_length_(0),
+ allocation_base_(nullptr),
+ allocation_length_(0),
+ allocation_mode_(Allocator::AllocationMode::kNormal) {}
+
+ void* AllocationBase() const { return allocation_base_; }
+ size_t AllocationLength() const { return allocation_length_; }
+ Allocator::AllocationMode AllocationMode() const {
+ return allocation_mode_;
+ }
void* Data() const { return data_; }
size_t ByteLength() const { return byte_length_; }
@@ -4255,6 +4307,9 @@ class V8_EXPORT ArrayBuffer : public Object {
private:
void* data_;
size_t byte_length_;
+ void* allocation_base_;
+ size_t allocation_length_;
+ Allocator::AllocationMode allocation_mode_;
friend class ArrayBuffer;
};
@@ -4603,7 +4658,18 @@ class V8_EXPORT SharedArrayBuffer : public Object {
*/
class V8_EXPORT Contents { // NOLINT
public:
- Contents() : data_(NULL), byte_length_(0) {}
+ Contents()
+ : data_(nullptr),
+ byte_length_(0),
+ allocation_base_(nullptr),
+ allocation_length_(0),
+ allocation_mode_(ArrayBuffer::Allocator::AllocationMode::kNormal) {}
+
+ void* AllocationBase() const { return allocation_base_; }
+ size_t AllocationLength() const { return allocation_length_; }
+ ArrayBuffer::Allocator::AllocationMode AllocationMode() const {
+ return allocation_mode_;
+ }
void* Data() const { return data_; }
size_t ByteLength() const { return byte_length_; }
@@ -4611,6 +4677,9 @@ class V8_EXPORT SharedArrayBuffer : public Object {
private:
void* data_;
size_t byte_length_;
+ void* allocation_base_;
+ size_t allocation_length_;
+ ArrayBuffer::Allocator::AllocationMode allocation_mode_;
friend class SharedArrayBuffer;
};
@@ -4857,6 +4926,7 @@ class V8_EXPORT External : public Value {
F(ArrayProto_forEach, array_for_each_iterator) \
F(ArrayProto_keys, array_keys_iterator) \
F(ArrayProto_values, array_values_iterator) \
+ F(ErrorPrototype, initial_error_prototype) \
F(IteratorPrototype, initial_iterator_prototype)
enum Intrinsic {
@@ -5921,6 +5991,8 @@ V8_INLINE Local<Boolean> False(Isolate* isolate);
*
* The arguments for set_max_semi_space_size, set_max_old_space_size,
* set_max_executable_size, set_code_range_size specify limits in MB.
+ *
+ * The argument for set_max_semi_space_size_in_kb is in KB.
*/
class V8_EXPORT ResourceConstraints {
public:
@@ -5938,10 +6010,28 @@ class V8_EXPORT ResourceConstraints {
void ConfigureDefaults(uint64_t physical_memory,
uint64_t virtual_memory_limit);
- int max_semi_space_size() const { return max_semi_space_size_; }
- void set_max_semi_space_size(int limit_in_mb) {
- max_semi_space_size_ = limit_in_mb;
+ // Returns the max semi-space size in MB.
+ V8_DEPRECATE_SOON("Use max_semi_space_size_in_kb()",
+ int max_semi_space_size()) {
+ return static_cast<int>(max_semi_space_size_in_kb_ / 1024);
}
+
+ // Sets the max semi-space size in MB.
+ V8_DEPRECATE_SOON("Use set_max_semi_space_size_in_kb(size_t limit_in_kb)",
+ void set_max_semi_space_size(int limit_in_mb)) {
+ max_semi_space_size_in_kb_ = limit_in_mb * 1024;
+ }
+
+ // Returns the max semi-space size in KB.
+ size_t max_semi_space_size_in_kb() const {
+ return max_semi_space_size_in_kb_;
+ }
+
+ // Sets the max semi-space size in KB.
+ void set_max_semi_space_size_in_kb(size_t limit_in_kb) {
+ max_semi_space_size_in_kb_ = limit_in_kb;
+ }
+
int max_old_space_size() const { return max_old_space_size_; }
void set_max_old_space_size(int limit_in_mb) {
max_old_space_size_ = limit_in_mb;
@@ -5967,7 +6057,10 @@ class V8_EXPORT ResourceConstraints {
}
private:
- int max_semi_space_size_;
+ // max_semi_space_size_ is in KB
+ size_t max_semi_space_size_in_kb_;
+
+ // The remaining limits are in MB
int max_old_space_size_;
int max_executable_size_;
uint32_t* stack_limit_;
@@ -6055,21 +6148,23 @@ typedef void (*DeprecatedCallCompletedCallback)();
/**
* HostImportDynamicallyCallback is called when we require the
* embedder to load a module. This is used as part of the dynamic
- * import syntax. The behavior of this callback is not specified in
- * EcmaScript.
+ * import syntax.
*
* The referrer is the name of the file which calls the dynamic
* import. The referrer can be used to resolve the module location.
*
* The specifier is the name of the module that should be imported.
*
- * The DynamicImportResult object is used to signal success or failure
- * by calling it's respective methods.
+ * The embedder must compile, instantiate, evaluate the Module, and
+ * obtain it's namespace object.
*
+ * The Promise returned from this function is forwarded to userland
+ * JavaScript. The embedder must resolve this promise with the module
+ * namespace object. In case of an exception, the embedder must reject
+ * this promise with the exception.
*/
-typedef void (*HostImportModuleDynamicallyCallback)(
- Isolate* isolate, Local<String> referrer, Local<String> specifier,
- Local<DynamicImportResult> result);
+typedef MaybeLocal<Promise> (*HostImportModuleDynamicallyCallback)(
+ Local<Context> context, Local<String> referrer, Local<String> specifier);
/**
* PromiseHook with type kInit is called when a new promise is
@@ -6192,11 +6287,18 @@ typedef void (*FailedAccessCheckCallback)(Local<Object> target,
* Callback to check if code generation from strings is allowed. See
* Context::AllowCodeGenerationFromStrings.
*/
-typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context);
+typedef bool (*DeprecatedAllowCodeGenerationFromStringsCallback)(
+ Local<Context> context);
+typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context,
+ Local<String> source);
-// --- WASM compilation callbacks ---
+// --- WebAssembly compilation callbacks ---
typedef bool (*ExtensionCallback)(const FunctionCallbackInfo<Value>&);
+// --- Callback for APIs defined on v8-supported objects, but implemented
+// by the embedder. Example: WebAssembly.{compile|instantiate}Streaming ---
+typedef void (*ApiImplementationCallback)(const FunctionCallbackInfo<Value>&);
+
// --- Garbage Collection Callbacks ---
/**
@@ -6620,8 +6722,7 @@ class V8_EXPORT Isolate {
add_histogram_sample_callback(nullptr),
array_buffer_allocator(nullptr),
external_references(nullptr),
- allow_atomics_wait(true),
- host_import_module_dynamically_callback_(nullptr) {}
+ allow_atomics_wait(true) {}
/**
* The optional entry_hook allows the host application to provide the
@@ -6684,16 +6785,6 @@ class V8_EXPORT Isolate {
* this isolate. This can also be configured via SetAllowAtomicsWait.
*/
bool allow_atomics_wait;
-
- /**
- * This is an unfinished experimental feature, and is only exposed
- * here for internal testing purposes. DO NOT USE.
- *
- * This specifies the callback called by the upcoming dynamic
- * import() language feature to load modules.
- */
- HostImportModuleDynamicallyCallback
- host_import_module_dynamically_callback_;
};
@@ -6832,6 +6923,7 @@ class V8_EXPORT Isolate {
kAssigmentExpressionLHSIsCallInSloppy = 36,
kAssigmentExpressionLHSIsCallInStrict = 37,
kPromiseConstructorReturnedUndefined = 38,
+ kConstructorNonUndefinedPrimitiveReturn = 39,
// If you add new values here, you'll also need to update Chromium's:
// UseCounter.h, V8PerIsolateData.cpp, histograms.xml
@@ -6885,6 +6977,16 @@ class V8_EXPORT Isolate {
AbortOnUncaughtExceptionCallback callback);
/**
+ * This is an unfinished experimental feature, and is only exposed
+ * here for internal testing purposes. DO NOT USE.
+ *
+ * This specifies the callback called by the upcoming dynamic
+ * import() language feature to load modules.
+ */
+ void SetHostImportModuleDynamicallyCallback(
+ HostImportModuleDynamicallyCallback callback);
+
+ /**
* Optional notification that the system is running low on memory.
* V8 uses these notifications to guide heuristics.
* It is allowed to call this function from another thread while
@@ -7082,6 +7184,12 @@ class V8_EXPORT Isolate {
Local<Context> GetEnteredOrMicrotaskContext();
/**
+ * Returns the Context that corresponds to the Incumbent realm in HTML spec.
+ * https://html.spec.whatwg.org/multipage/webappapis.html#incumbent
+ */
+ Local<Context> GetIncumbentContext();
+
+ /**
* Schedules an exception to be thrown when returning to JavaScript. When an
* exception has been scheduled it is illegal to invoke any JavaScript
* operation; the caller must return immediately and only after the exception
@@ -7133,6 +7241,17 @@ class V8_EXPORT Isolate {
*/
void RemoveGCEpilogueCallback(GCCallback callback);
+ typedef size_t (*GetExternallyAllocatedMemoryInBytesCallback)();
+
+ /**
+ * Set the callback that tells V8 how much memory is currently allocated
+ * externally of the V8 heap. Ideally this memory is somehow connected to V8
+ * objects and may get freed-up when the corresponding V8 objects get
+ * collected by a V8 garbage collection.
+ */
+ void SetGetExternallyAllocatedMemoryInBytesCallback(
+ GetExternallyAllocatedMemoryInBytesCallback callback);
+
/**
* Forcefully terminate the current thread of JavaScript execution
* in the given isolate.
@@ -7448,14 +7567,18 @@ class V8_EXPORT Isolate {
*/
void SetAllowCodeGenerationFromStringsCallback(
AllowCodeGenerationFromStringsCallback callback);
+ V8_DEPRECATED("Use callback with source parameter.",
+ void SetAllowCodeGenerationFromStringsCallback(
+ DeprecatedAllowCodeGenerationFromStringsCallback callback));
/**
- * Embedder over{ride|load} injection points for wasm APIs.
+ * Embedder over{ride|load} injection points for wasm APIs. The expectation
+ * is that the embedder sets them at most once.
*/
void SetWasmModuleCallback(ExtensionCallback callback);
- void SetWasmCompileCallback(ExtensionCallback callback);
void SetWasmInstanceCallback(ExtensionCallback callback);
- void SetWasmInstantiateCallback(ExtensionCallback callback);
+
+ void SetWasmCompileStreamingCallback(ApiImplementationCallback callback);
/**
* Check if V8 is dead and therefore unusable. This is the case after
@@ -7552,14 +7675,19 @@ class V8_EXPORT Isolate {
~Isolate() = delete;
Isolate(const Isolate&) = delete;
Isolate& operator=(const Isolate&) = delete;
+ // Deleting operator new and delete here is allowed as ctor and dtor is also
+ // deleted.
void* operator new(size_t size) = delete;
+ void* operator new[](size_t size) = delete;
void operator delete(void*, size_t) = delete;
+ void operator delete[](void*, size_t) = delete;
private:
template <class K, class V, class Traits>
friend class PersistentValueMapBase;
void ReportExternalAllocationLimitReached();
+ void CheckMemoryPressure();
};
class V8_EXPORT StartupData {
@@ -7607,8 +7735,9 @@ class V8_EXPORT V8 {
* strings should be allowed.
*/
V8_INLINE static V8_DEPRECATED(
- "Use isolate version", void SetAllowCodeGenerationFromStringsCallback(
- AllowCodeGenerationFromStringsCallback that));
+ "Use isolate version",
+ void SetAllowCodeGenerationFromStringsCallback(
+ DeprecatedAllowCodeGenerationFromStringsCallback that));
/**
* Check if V8 is dead and therefore unusable. This is the case after
@@ -7919,7 +8048,7 @@ class V8_EXPORT V8 {
*/
static void ShutdownPlatform();
-#if V8_OS_LINUX && V8_TARGET_ARCH_X64 && !V8_OS_ANDROID
+#if V8_OS_POSIX
/**
* Give the V8 signal handler a chance to handle a fault.
*
@@ -7940,7 +8069,7 @@ class V8_EXPORT V8 {
* points to a ucontext_t structure.
*/
static bool TryHandleSignal(int signal_number, void* info, void* context);
-#endif // V8_OS_LINUX
+#endif // V8_OS_POSIX
/**
* Enable the default signal handler rather than using one provided by the
@@ -8279,10 +8408,15 @@ class V8_EXPORT TryCatch {
TryCatch(const TryCatch&) = delete;
void operator=(const TryCatch&) = delete;
+
+ private:
+ // Declaring operator new and delete as deleted is not spec compliant.
+ // Therefore declare them private instead to disable dynamic alloc
void* operator new(size_t size);
+ void* operator new[](size_t size);
void operator delete(void*, size_t);
+ void operator delete[](void*, size_t);
- private:
void ResetInternal();
internal::Isolate* isolate_;
@@ -8535,6 +8669,27 @@ class V8_EXPORT Context {
Local<Context> context_;
};
+ /**
+ * Stack-allocated class to support the backup incumbent settings object
+ * stack.
+ * https://html.spec.whatwg.org/multipage/webappapis.html#backup-incumbent-settings-object-stack
+ */
+ class BackupIncumbentScope {
+ public:
+ /**
+ * |backup_incumbent_context| is pushed onto the backup incumbent settings
+ * object stack.
+ */
+ explicit BackupIncumbentScope(Local<Context> backup_incumbent_context);
+ ~BackupIncumbentScope();
+
+ private:
+ friend class internal::Isolate;
+
+ Local<Context> backup_incumbent_context_;
+ const BackupIncumbentScope* prev_ = nullptr;
+ };
+
private:
friend class Value;
friend class Script;
@@ -8782,6 +8937,8 @@ class Internals {
static const int kExternalMemoryOffset = 4 * kApiPointerSize;
static const int kExternalMemoryLimitOffset =
kExternalMemoryOffset + kApiInt64Size;
+ static const int kExternalMemoryAtLastMarkCompactOffset =
+ kExternalMemoryLimitOffset + kApiInt64Size;
static const int kIsolateRootsOffset = kExternalMemoryLimitOffset +
kApiInt64Size + kApiInt64Size +
kApiPointerSize + kApiPointerSize;
@@ -10000,13 +10157,32 @@ uint32_t Isolate::GetNumberOfDataSlots() {
int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
int64_t change_in_bytes) {
typedef internal::Internals I;
+ const int64_t kMemoryReducerActivationLimit = 32 * 1024 * 1024;
int64_t* external_memory = reinterpret_cast<int64_t*>(
reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryOffset);
- const int64_t external_memory_limit = *reinterpret_cast<int64_t*>(
+ int64_t* external_memory_limit = reinterpret_cast<int64_t*>(
reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryLimitOffset);
+ int64_t* external_memory_at_last_mc =
+ reinterpret_cast<int64_t*>(reinterpret_cast<uint8_t*>(this) +
+ I::kExternalMemoryAtLastMarkCompactOffset);
const int64_t amount = *external_memory + change_in_bytes;
+
*external_memory = amount;
- if (change_in_bytes > 0 && amount > external_memory_limit) {
+
+ int64_t allocation_diff_since_last_mc =
+ *external_memory_at_last_mc - *external_memory;
+ allocation_diff_since_last_mc = allocation_diff_since_last_mc < 0
+ ? -allocation_diff_since_last_mc
+ : allocation_diff_since_last_mc;
+ if (allocation_diff_since_last_mc > kMemoryReducerActivationLimit) {
+ CheckMemoryPressure();
+ }
+
+ if (change_in_bytes < 0) {
+ *external_memory_limit += change_in_bytes;
+ }
+
+ if (change_in_bytes > 0 && amount > *external_memory_limit) {
ReportExternalAllocationLimitReached();
}
return *external_memory;
@@ -10036,11 +10212,11 @@ void* Context::GetAlignedPointerFromEmbedderData(int index) {
#endif
}
-
void V8::SetAllowCodeGenerationFromStringsCallback(
- AllowCodeGenerationFromStringsCallback callback) {
+ DeprecatedAllowCodeGenerationFromStringsCallback callback) {
Isolate* isolate = Isolate::GetCurrent();
- isolate->SetAllowCodeGenerationFromStringsCallback(callback);
+ isolate->SetAllowCodeGenerationFromStringsCallback(
+ reinterpret_cast<AllowCodeGenerationFromStringsCallback>(callback));
}
diff --git a/chromium/v8/include/v8config.h b/chromium/v8/include/v8config.h
index 964949c24c3..69cf3b78c8b 100644
--- a/chromium/v8/include/v8config.h
+++ b/chromium/v8/include/v8config.h
@@ -61,6 +61,7 @@
// V8_OS_CYGWIN - Cygwin
// V8_OS_DRAGONFLYBSD - DragonFlyBSD
// V8_OS_FREEBSD - FreeBSD
+// V8_OS_FUCHSIA - Fuchsia
// V8_OS_LINUX - Linux
// V8_OS_MACOSX - Mac OS X
// V8_OS_NETBSD - NetBSD
@@ -95,6 +96,9 @@
# define V8_OS_BSD 1
# define V8_OS_FREEBSD 1
# define V8_OS_POSIX 1
+#elif defined(__Fuchsia__)
+# define V8_OS_FUCHSIA 1
+# define V8_OS_POSIX 1
#elif defined(__DragonFly__)
# define V8_OS_BSD 1
# define V8_OS_DRAGONFLYBSD 1
@@ -169,7 +173,6 @@
// supported
// V8_HAS_ATTRIBUTE_DEPRECATED - __attribute__((deprecated)) supported
// V8_HAS_ATTRIBUTE_NOINLINE - __attribute__((noinline)) supported
-// V8_HAS_ATTRIBUTE_NORETURN - __attribute__((noreturn)) supported
// V8_HAS_ATTRIBUTE_UNUSED - __attribute__((unused)) supported
// V8_HAS_ATTRIBUTE_VISIBILITY - __attribute__((visibility)) supported
// V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT - __attribute__((warn_unused_result))
@@ -209,7 +212,6 @@
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
# define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated))
# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))
-# define V8_HAS_ATTRIBUTE_NORETURN (__has_attribute(noreturn))
# define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))
# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
@@ -250,7 +252,6 @@
# define V8_HAS_ATTRIBUTE_DEPRECATED (V8_GNUC_PREREQ(3, 4, 0))
# define V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE (V8_GNUC_PREREQ(4, 5, 0))
# define V8_HAS_ATTRIBUTE_NOINLINE (V8_GNUC_PREREQ(3, 4, 0))
-# define V8_HAS_ATTRIBUTE_NORETURN (V8_GNUC_PREREQ(2, 5, 0))
# define V8_HAS_ATTRIBUTE_UNUSED (V8_GNUC_PREREQ(2, 95, 0))
# define V8_HAS_ATTRIBUTE_VISIBILITY (V8_GNUC_PREREQ(4, 3, 0))
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
@@ -311,18 +312,6 @@
#endif
-// A macro used to tell the compiler that a particular function never returns.
-// Use like:
-// V8_NORETURN void MyAbort() { abort(); }
-#if V8_HAS_ATTRIBUTE_NORETURN
-# define V8_NORETURN __attribute__((noreturn))
-#elif V8_HAS_DECLSPEC_NORETURN
-# define V8_NORETURN __declspec(noreturn)
-#else
-# define V8_NORETURN /* NOT SUPPORTED */
-#endif
-
-
// A macro (V8_DEPRECATED) to mark classes or functions as deprecated.
#if defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE
#define V8_DEPRECATED(message, declarator) \