mirror of
https://github.com/smallmain/cocos-enhance-kit.git
synced 2025-11-08 15:05:24 +00:00
补充某些必要的文件
This commit is contained in:
72
cocos2d-x/external/android/x86/include/v8/APIDesign.md
vendored
Normal file
72
cocos2d-x/external/android/x86/include/v8/APIDesign.md
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
# 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<> or v8::MaybeLocal<> result,
|
||||
and by taking a v8::Local<v8::Context> 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.
|
||||
The exception to this are profiling features exposed via v8-profiler.h.
|
||||
Changes to the inspector protocol need to ensure backwards compatibility and
|
||||
commitment to maintain.
|
||||
4
cocos2d-x/external/android/x86/include/v8/DEPS
vendored
Normal file
4
cocos2d-x/external/android/x86/include/v8/DEPS
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
include_rules = [
|
||||
# v8-inspector-protocol.h depends on generated files under include/inspector.
|
||||
"+inspector",
|
||||
]
|
||||
18
cocos2d-x/external/android/x86/include/v8/OWNERS
vendored
Normal file
18
cocos2d-x/external/android/x86/include/v8/OWNERS
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
adamk@chromium.org
|
||||
danno@chromium.org
|
||||
ulan@chromium.org
|
||||
verwaest@chromium.org
|
||||
yangguo@chromium.org
|
||||
|
||||
per-file *DEPS=file:../COMMON_OWNERS
|
||||
per-file v8-internal.h=file:../COMMON_OWNERS
|
||||
per-file v8-inspector.h=dgozman@chromium.org
|
||||
per-file v8-inspector.h=pfeldman@chromium.org
|
||||
per-file v8-inspector.h=kozyatinskiy@chromium.org
|
||||
per-file v8-inspector-protocol.h=dgozman@chromium.org
|
||||
per-file v8-inspector-protocol.h=pfeldman@chromium.org
|
||||
per-file v8-inspector-protocol.h=kozyatinskiy@chromium.org
|
||||
per-file js_protocol.pdl=dgozman@chromium.org
|
||||
per-file js_protocol.pdl=pfeldman@chromium.org
|
||||
|
||||
# COMPONENT: Blink>JavaScript>API
|
||||
9
cocos2d-x/external/android/x86/include/v8/libplatform/DEPS
vendored
Normal file
9
cocos2d-x/external/android/x86/include/v8/libplatform/DEPS
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
include_rules = [
|
||||
"+libplatform/libplatform-export.h",
|
||||
]
|
||||
|
||||
specific_include_rules = {
|
||||
"libplatform\.h": [
|
||||
"+libplatform/v8-tracing.h",
|
||||
],
|
||||
}
|
||||
29
cocos2d-x/external/android/x86/include/v8/libplatform/libplatform-export.h
vendored
Normal file
29
cocos2d-x/external/android/x86/include/v8/libplatform/libplatform-export.h
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
#ifndef V8_LIBPLATFORM_LIBPLATFORM_EXPORT_H_
|
||||
#define V8_LIBPLATFORM_LIBPLATFORM_EXPORT_H_
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
#ifdef BUILDING_V8_PLATFORM_SHARED
|
||||
#define V8_PLATFORM_EXPORT __declspec(dllexport)
|
||||
#elif USING_V8_PLATFORM_SHARED
|
||||
#define V8_PLATFORM_EXPORT __declspec(dllimport)
|
||||
#else
|
||||
#define V8_PLATFORM_EXPORT
|
||||
#endif // BUILDING_V8_PLATFORM_SHARED
|
||||
|
||||
#else // defined(_WIN32)
|
||||
|
||||
// Setup for Linux shared library export.
|
||||
#ifdef BUILDING_V8_PLATFORM_SHARED
|
||||
#define V8_PLATFORM_EXPORT __attribute__((visibility("default")))
|
||||
#else
|
||||
#define V8_PLATFORM_EXPORT
|
||||
#endif
|
||||
|
||||
#endif // defined(_WIN32)
|
||||
|
||||
#endif // V8_LIBPLATFORM_LIBPLATFORM_EXPORT_H_
|
||||
83
cocos2d-x/external/android/x86/include/v8/libplatform/libplatform.h
vendored
Normal file
83
cocos2d-x/external/android/x86/include/v8/libplatform/libplatform.h
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
#ifndef V8_LIBPLATFORM_LIBPLATFORM_H_
|
||||
#define V8_LIBPLATFORM_LIBPLATFORM_H_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "libplatform/libplatform-export.h"
|
||||
#include "libplatform/v8-tracing.h"
|
||||
#include "v8-platform.h" // NOLINT(build/include)
|
||||
#include "v8config.h" // NOLINT(build/include)
|
||||
|
||||
namespace v8 {
|
||||
namespace platform {
|
||||
|
||||
enum class IdleTaskSupport { kDisabled, kEnabled };
|
||||
enum class InProcessStackDumping { kDisabled, kEnabled };
|
||||
|
||||
enum class MessageLoopBehavior : bool {
|
||||
kDoNotWait = false,
|
||||
kWaitForWork = true
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns a new instance of the default v8::Platform implementation.
|
||||
*
|
||||
* The caller will take ownership of the returned pointer. |thread_pool_size|
|
||||
* is the number of worker threads to allocate for background jobs. If a value
|
||||
* of zero is passed, a suitable default based on the current number of
|
||||
* processors online will be chosen.
|
||||
* 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 std::unique_ptr<v8::Platform> NewDefaultPlatform(
|
||||
int thread_pool_size = 0,
|
||||
IdleTaskSupport idle_task_support = IdleTaskSupport::kDisabled,
|
||||
InProcessStackDumping in_process_stack_dumping =
|
||||
InProcessStackDumping::kDisabled,
|
||||
std::unique_ptr<v8::TracingController> tracing_controller = {});
|
||||
|
||||
/**
|
||||
* Pumps the message loop for the given isolate.
|
||||
*
|
||||
* The caller has to make sure that this is called from the right thread.
|
||||
* Returns true if a task was executed, and false otherwise. Unless requested
|
||||
* through the |behavior| parameter, this call does not block if no task is
|
||||
* pending. The |platform| has to be created using |NewDefaultPlatform|.
|
||||
*/
|
||||
V8_PLATFORM_EXPORT bool PumpMessageLoop(
|
||||
v8::Platform* platform, v8::Isolate* isolate,
|
||||
MessageLoopBehavior behavior = MessageLoopBehavior::kDoNotWait);
|
||||
|
||||
/**
|
||||
* Runs pending idle tasks for at most |idle_time_in_seconds| seconds.
|
||||
*
|
||||
* The caller has to make sure that this is called from the right thread.
|
||||
* This call does not block if no task is pending. The |platform| has to be
|
||||
* created using |NewDefaultPlatform|.
|
||||
*/
|
||||
V8_PLATFORM_EXPORT void RunIdleTasks(v8::Platform* platform,
|
||||
v8::Isolate* isolate,
|
||||
double idle_time_in_seconds);
|
||||
|
||||
/**
|
||||
* Attempts to set the tracing controller for the given platform.
|
||||
*
|
||||
* The |platform| has to be created using |NewDefaultPlatform|.
|
||||
*
|
||||
*/
|
||||
V8_DEPRECATE_SOON("Access the DefaultPlatform directly")
|
||||
V8_PLATFORM_EXPORT void SetTracingController(
|
||||
v8::Platform* platform,
|
||||
v8::platform::tracing::TracingController* tracing_controller);
|
||||
|
||||
} // namespace platform
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_LIBPLATFORM_LIBPLATFORM_H_
|
||||
318
cocos2d-x/external/android/x86/include/v8/libplatform/v8-tracing.h
vendored
Normal file
318
cocos2d-x/external/android/x86/include/v8/libplatform/v8-tracing.h
vendored
Normal file
@@ -0,0 +1,318 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
#ifndef V8_LIBPLATFORM_V8_TRACING_H_
|
||||
#define V8_LIBPLATFORM_V8_TRACING_H_
|
||||
|
||||
#include <atomic>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
#include "libplatform/libplatform-export.h"
|
||||
#include "v8-platform.h" // NOLINT(build/include)
|
||||
|
||||
namespace perfetto {
|
||||
class TracingSession;
|
||||
}
|
||||
|
||||
namespace v8 {
|
||||
|
||||
namespace base {
|
||||
class Mutex;
|
||||
} // namespace base
|
||||
|
||||
namespace platform {
|
||||
namespace tracing {
|
||||
|
||||
class TraceEventListener;
|
||||
class JSONTraceEventListener;
|
||||
|
||||
const int kTraceMaxNumArgs = 2;
|
||||
|
||||
class V8_PLATFORM_EXPORT TraceObject {
|
||||
public:
|
||||
union ArgValue {
|
||||
V8_DEPRECATED("use as_uint ? true : false") bool as_bool;
|
||||
uint64_t as_uint;
|
||||
int64_t as_int;
|
||||
double as_double;
|
||||
const void* as_pointer;
|
||||
const char* as_string;
|
||||
};
|
||||
|
||||
TraceObject() = default;
|
||||
~TraceObject();
|
||||
void Initialize(
|
||||
char phase, const uint8_t* category_enabled_flag, const char* name,
|
||||
const char* scope, uint64_t id, uint64_t bind_id, int 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, int64_t timestamp, int64_t cpu_timestamp);
|
||||
void UpdateDuration(int64_t timestamp, int64_t cpu_timestamp);
|
||||
void InitializeForTesting(
|
||||
char phase, const uint8_t* category_enabled_flag, const char* name,
|
||||
const char* scope, uint64_t id, uint64_t bind_id, int 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, int pid, int tid, int64_t ts, int64_t tts,
|
||||
uint64_t duration, uint64_t cpu_duration);
|
||||
|
||||
int pid() const { return pid_; }
|
||||
int tid() const { return tid_; }
|
||||
char phase() const { return phase_; }
|
||||
const uint8_t* category_enabled_flag() const {
|
||||
return category_enabled_flag_;
|
||||
}
|
||||
const char* name() const { return name_; }
|
||||
const char* scope() const { return scope_; }
|
||||
uint64_t id() const { return id_; }
|
||||
uint64_t bind_id() const { return bind_id_; }
|
||||
int num_args() const { return num_args_; }
|
||||
const char** arg_names() { return arg_names_; }
|
||||
uint8_t* arg_types() { return arg_types_; }
|
||||
ArgValue* arg_values() { return arg_values_; }
|
||||
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables() {
|
||||
return arg_convertables_;
|
||||
}
|
||||
unsigned int flags() const { return flags_; }
|
||||
int64_t ts() { return ts_; }
|
||||
int64_t tts() { return tts_; }
|
||||
uint64_t duration() { return duration_; }
|
||||
uint64_t cpu_duration() { return cpu_duration_; }
|
||||
|
||||
private:
|
||||
int pid_;
|
||||
int tid_;
|
||||
char phase_;
|
||||
const char* name_;
|
||||
const char* scope_;
|
||||
const uint8_t* category_enabled_flag_;
|
||||
uint64_t id_;
|
||||
uint64_t bind_id_;
|
||||
int num_args_ = 0;
|
||||
const char* arg_names_[kTraceMaxNumArgs];
|
||||
uint8_t arg_types_[kTraceMaxNumArgs];
|
||||
ArgValue arg_values_[kTraceMaxNumArgs];
|
||||
std::unique_ptr<v8::ConvertableToTraceFormat>
|
||||
arg_convertables_[kTraceMaxNumArgs];
|
||||
char* parameter_copy_storage_ = nullptr;
|
||||
unsigned int flags_;
|
||||
int64_t ts_;
|
||||
int64_t tts_;
|
||||
uint64_t duration_;
|
||||
uint64_t cpu_duration_;
|
||||
|
||||
// Disallow copy and assign
|
||||
TraceObject(const TraceObject&) = delete;
|
||||
void operator=(const TraceObject&) = delete;
|
||||
};
|
||||
|
||||
class V8_PLATFORM_EXPORT TraceWriter {
|
||||
public:
|
||||
TraceWriter() = default;
|
||||
virtual ~TraceWriter() = default;
|
||||
virtual void AppendTraceEvent(TraceObject* trace_event) = 0;
|
||||
virtual void Flush() = 0;
|
||||
|
||||
static TraceWriter* CreateJSONTraceWriter(std::ostream& stream);
|
||||
static TraceWriter* CreateJSONTraceWriter(std::ostream& stream,
|
||||
const std::string& tag);
|
||||
|
||||
private:
|
||||
// Disallow copy and assign
|
||||
TraceWriter(const TraceWriter&) = delete;
|
||||
void operator=(const TraceWriter&) = delete;
|
||||
};
|
||||
|
||||
class V8_PLATFORM_EXPORT TraceBufferChunk {
|
||||
public:
|
||||
explicit TraceBufferChunk(uint32_t seq);
|
||||
|
||||
void Reset(uint32_t new_seq);
|
||||
bool IsFull() const { return next_free_ == kChunkSize; }
|
||||
TraceObject* AddTraceEvent(size_t* event_index);
|
||||
TraceObject* GetEventAt(size_t index) { return &chunk_[index]; }
|
||||
|
||||
uint32_t seq() const { return seq_; }
|
||||
size_t size() const { return next_free_; }
|
||||
|
||||
static const size_t kChunkSize = 64;
|
||||
|
||||
private:
|
||||
size_t next_free_ = 0;
|
||||
TraceObject chunk_[kChunkSize];
|
||||
uint32_t seq_;
|
||||
|
||||
// Disallow copy and assign
|
||||
TraceBufferChunk(const TraceBufferChunk&) = delete;
|
||||
void operator=(const TraceBufferChunk&) = delete;
|
||||
};
|
||||
|
||||
class V8_PLATFORM_EXPORT TraceBuffer {
|
||||
public:
|
||||
TraceBuffer() = default;
|
||||
virtual ~TraceBuffer() = default;
|
||||
|
||||
virtual TraceObject* AddTraceEvent(uint64_t* handle) = 0;
|
||||
virtual TraceObject* GetEventByHandle(uint64_t handle) = 0;
|
||||
virtual bool Flush() = 0;
|
||||
|
||||
static const size_t kRingBufferChunks = 1024;
|
||||
|
||||
static TraceBuffer* CreateTraceBufferRingBuffer(size_t max_chunks,
|
||||
TraceWriter* trace_writer);
|
||||
|
||||
private:
|
||||
// Disallow copy and assign
|
||||
TraceBuffer(const TraceBuffer&) = delete;
|
||||
void operator=(const TraceBuffer&) = delete;
|
||||
};
|
||||
|
||||
// Options determines how the trace buffer stores data.
|
||||
enum TraceRecordMode {
|
||||
// Record until the trace buffer is full.
|
||||
RECORD_UNTIL_FULL,
|
||||
|
||||
// Record until the user ends the trace. The trace buffer is a fixed size
|
||||
// and we use it as a ring buffer during recording.
|
||||
RECORD_CONTINUOUSLY,
|
||||
|
||||
// Record until the trace buffer is full, but with a huge buffer size.
|
||||
RECORD_AS_MUCH_AS_POSSIBLE,
|
||||
|
||||
// Echo to console. Events are discarded.
|
||||
ECHO_TO_CONSOLE,
|
||||
};
|
||||
|
||||
class V8_PLATFORM_EXPORT TraceConfig {
|
||||
public:
|
||||
typedef std::vector<std::string> StringList;
|
||||
|
||||
static TraceConfig* CreateDefaultTraceConfig();
|
||||
|
||||
TraceConfig() : enable_systrace_(false), enable_argument_filter_(false) {}
|
||||
TraceRecordMode GetTraceRecordMode() const { return record_mode_; }
|
||||
bool IsSystraceEnabled() const { return enable_systrace_; }
|
||||
bool IsArgumentFilterEnabled() const { return enable_argument_filter_; }
|
||||
|
||||
void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; }
|
||||
void EnableSystrace() { enable_systrace_ = true; }
|
||||
void EnableArgumentFilter() { enable_argument_filter_ = true; }
|
||||
|
||||
void AddIncludedCategory(const char* included_category);
|
||||
|
||||
bool IsCategoryGroupEnabled(const char* category_group) const;
|
||||
|
||||
private:
|
||||
TraceRecordMode record_mode_;
|
||||
bool enable_systrace_ : 1;
|
||||
bool enable_argument_filter_ : 1;
|
||||
StringList included_categories_;
|
||||
|
||||
// Disallow copy and assign
|
||||
TraceConfig(const TraceConfig&) = delete;
|
||||
void operator=(const TraceConfig&) = delete;
|
||||
};
|
||||
|
||||
#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:
|
||||
// The pointer returned from GetCategoryGroupEnabled() points to a value with
|
||||
// zero or more of the following bits. Used in this class only. The
|
||||
// TRACE_EVENT macros should only use the value as a bool. These values must
|
||||
// be in sync with macro values in TraceEvent.h in Blink.
|
||||
enum CategoryGroupEnabledFlags {
|
||||
// Category group enabled for the recording mode.
|
||||
ENABLED_FOR_RECORDING = 1 << 0,
|
||||
// Category group enabled by SetEventCallbackEnabled().
|
||||
ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
|
||||
// Category group enabled to export events to ETW.
|
||||
ENABLED_FOR_ETW_EXPORT = 1 << 3
|
||||
};
|
||||
|
||||
TracingController();
|
||||
~TracingController() override;
|
||||
|
||||
// Takes ownership of |trace_buffer|.
|
||||
void Initialize(TraceBuffer* trace_buffer);
|
||||
#ifdef V8_USE_PERFETTO
|
||||
// Must be called before StartTracing() if V8_USE_PERFETTO is true. Provides
|
||||
// the output stream for the JSON trace data.
|
||||
void InitializeForPerfetto(std::ostream* output_stream);
|
||||
// Provide an optional listener for testing that will receive trace events.
|
||||
// Must be called before StartTracing().
|
||||
void SetTraceEventListenerForTesting(TraceEventListener* listener);
|
||||
#endif
|
||||
|
||||
// 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) override;
|
||||
uint64_t AddTraceEventWithTimestamp(
|
||||
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, int64_t timestamp) override;
|
||||
void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
|
||||
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();
|
||||
|
||||
static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag);
|
||||
|
||||
protected:
|
||||
virtual int64_t CurrentTimestampMicroseconds();
|
||||
virtual int64_t CurrentCpuTimestampMicroseconds();
|
||||
|
||||
private:
|
||||
void UpdateCategoryGroupEnabledFlag(size_t category_index);
|
||||
void UpdateCategoryGroupEnabledFlags();
|
||||
|
||||
std::unique_ptr<TraceBuffer> trace_buffer_;
|
||||
std::unique_ptr<TraceConfig> trace_config_;
|
||||
std::unique_ptr<base::Mutex> mutex_;
|
||||
std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
|
||||
std::atomic_bool recording_{false};
|
||||
#ifdef V8_USE_PERFETTO
|
||||
std::ostream* output_stream_ = nullptr;
|
||||
std::unique_ptr<JSONTraceEventListener> json_listener_;
|
||||
TraceEventListener* listener_for_testing_ = nullptr;
|
||||
std::unique_ptr<perfetto::TracingSession> tracing_session_;
|
||||
#endif
|
||||
|
||||
// Disallow copy and assign
|
||||
TracingController(const TracingController&) = delete;
|
||||
void operator=(const TracingController&) = delete;
|
||||
};
|
||||
|
||||
#undef V8_PLATFORM_NON_EXPORTED_BASE
|
||||
|
||||
} // namespace tracing
|
||||
} // namespace platform
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_LIBPLATFORM_V8_TRACING_H_
|
||||
13
cocos2d-x/external/android/x86/include/v8/v8-inspector-protocol.h
vendored
Normal file
13
cocos2d-x/external/android/x86/include/v8/v8-inspector-protocol.h
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
#ifndef V8_V8_INSPECTOR_PROTOCOL_H_
|
||||
#define V8_V8_INSPECTOR_PROTOCOL_H_
|
||||
|
||||
#include "inspector/Debugger.h" // NOLINT(build/include)
|
||||
#include "inspector/Runtime.h" // NOLINT(build/include)
|
||||
#include "inspector/Schema.h" // NOLINT(build/include)
|
||||
#include "v8-inspector.h" // NOLINT(build/include)
|
||||
|
||||
#endif // V8_V8_INSPECTOR_PROTOCOL_H_
|
||||
325
cocos2d-x/external/android/x86/include/v8/v8-inspector.h
vendored
Normal file
325
cocos2d-x/external/android/x86/include/v8/v8-inspector.h
vendored
Normal file
@@ -0,0 +1,325 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
#ifndef V8_V8_INSPECTOR_H_
|
||||
#define V8_V8_INSPECTOR_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <cctype>
|
||||
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "v8.h" // NOLINT(build/include)
|
||||
|
||||
namespace v8_inspector {
|
||||
|
||||
namespace protocol {
|
||||
namespace Debugger {
|
||||
namespace API {
|
||||
class SearchMatch;
|
||||
}
|
||||
}
|
||||
namespace Runtime {
|
||||
namespace API {
|
||||
class RemoteObject;
|
||||
class StackTrace;
|
||||
class StackTraceId;
|
||||
}
|
||||
}
|
||||
namespace Schema {
|
||||
namespace API {
|
||||
class Domain;
|
||||
}
|
||||
}
|
||||
} // namespace protocol
|
||||
|
||||
class V8_EXPORT StringView {
|
||||
public:
|
||||
StringView() : m_is8Bit(true), m_length(0), m_characters8(nullptr) {}
|
||||
|
||||
StringView(const uint8_t* characters, size_t length)
|
||||
: m_is8Bit(true), m_length(length), m_characters8(characters) {}
|
||||
|
||||
StringView(const uint16_t* characters, size_t length)
|
||||
: m_is8Bit(false), m_length(length), m_characters16(characters) {}
|
||||
|
||||
bool is8Bit() const { return m_is8Bit; }
|
||||
size_t length() const { return m_length; }
|
||||
|
||||
// TODO(dgozman): add DCHECK(m_is8Bit) to accessors once platform can be used
|
||||
// here.
|
||||
const uint8_t* characters8() const { return m_characters8; }
|
||||
const uint16_t* characters16() const { return m_characters16; }
|
||||
|
||||
private:
|
||||
bool m_is8Bit;
|
||||
size_t m_length;
|
||||
union {
|
||||
const uint8_t* m_characters8;
|
||||
const uint16_t* m_characters16;
|
||||
};
|
||||
};
|
||||
|
||||
class V8_EXPORT StringBuffer {
|
||||
public:
|
||||
virtual ~StringBuffer() = default;
|
||||
virtual const StringView& string() = 0;
|
||||
// This method copies contents.
|
||||
static std::unique_ptr<StringBuffer> create(const StringView&);
|
||||
};
|
||||
|
||||
class V8_EXPORT V8ContextInfo {
|
||||
public:
|
||||
V8ContextInfo(v8::Local<v8::Context> context, int contextGroupId,
|
||||
const StringView& humanReadableName)
|
||||
: context(context),
|
||||
contextGroupId(contextGroupId),
|
||||
humanReadableName(humanReadableName),
|
||||
hasMemoryOnConsole(false) {}
|
||||
|
||||
v8::Local<v8::Context> context;
|
||||
// Each v8::Context is a part of a group. The group id must be non-zero.
|
||||
int contextGroupId;
|
||||
StringView humanReadableName;
|
||||
StringView origin;
|
||||
StringView auxData;
|
||||
bool hasMemoryOnConsole;
|
||||
|
||||
static int executionContextId(v8::Local<v8::Context> context);
|
||||
|
||||
// Disallow copying and allocating this one.
|
||||
enum NotNullTagEnum { NotNullLiteral };
|
||||
void* operator new(size_t) = delete;
|
||||
void* operator new(size_t, NotNullTagEnum, void*) = delete;
|
||||
void* operator new(size_t, void*) = delete;
|
||||
V8ContextInfo(const V8ContextInfo&) = delete;
|
||||
V8ContextInfo& operator=(const V8ContextInfo&) = delete;
|
||||
};
|
||||
|
||||
class V8_EXPORT V8StackTrace {
|
||||
public:
|
||||
virtual StringView firstNonEmptySourceURL() const = 0;
|
||||
virtual bool isEmpty() const = 0;
|
||||
virtual StringView topSourceURL() const = 0;
|
||||
virtual int topLineNumber() const = 0;
|
||||
virtual int topColumnNumber() const = 0;
|
||||
virtual StringView topScriptId() const = 0;
|
||||
virtual StringView topFunctionName() const = 0;
|
||||
|
||||
virtual ~V8StackTrace() = default;
|
||||
virtual std::unique_ptr<protocol::Runtime::API::StackTrace>
|
||||
buildInspectorObject() const = 0;
|
||||
virtual std::unique_ptr<protocol::Runtime::API::StackTrace>
|
||||
buildInspectorObject(int maxAsyncDepth) const = 0;
|
||||
virtual std::unique_ptr<StringBuffer> toString() const = 0;
|
||||
|
||||
// Safe to pass between threads, drops async chain.
|
||||
virtual std::unique_ptr<V8StackTrace> clone() = 0;
|
||||
};
|
||||
|
||||
class V8_EXPORT V8InspectorSession {
|
||||
public:
|
||||
virtual ~V8InspectorSession() = default;
|
||||
|
||||
// Cross-context inspectable values (DOM nodes in different worlds, etc.).
|
||||
class V8_EXPORT Inspectable {
|
||||
public:
|
||||
virtual v8::Local<v8::Value> get(v8::Local<v8::Context>) = 0;
|
||||
virtual ~Inspectable() = default;
|
||||
};
|
||||
virtual void addInspectedObject(std::unique_ptr<Inspectable>) = 0;
|
||||
|
||||
// Dispatching protocol messages.
|
||||
static bool canDispatchMethod(const StringView& method);
|
||||
virtual void dispatchProtocolMessage(const StringView& message) = 0;
|
||||
virtual std::vector<uint8_t> state() = 0;
|
||||
virtual std::vector<std::unique_ptr<protocol::Schema::API::Domain>>
|
||||
supportedDomains() = 0;
|
||||
|
||||
// Debugger actions.
|
||||
virtual void schedulePauseOnNextStatement(const StringView& breakReason,
|
||||
const StringView& breakDetails) = 0;
|
||||
virtual void cancelPauseOnNextStatement() = 0;
|
||||
virtual void breakProgram(const StringView& breakReason,
|
||||
const StringView& breakDetails) = 0;
|
||||
virtual void setSkipAllPauses(bool) = 0;
|
||||
virtual void resume() = 0;
|
||||
virtual void stepOver() = 0;
|
||||
virtual std::vector<std::unique_ptr<protocol::Debugger::API::SearchMatch>>
|
||||
searchInTextByLines(const StringView& text, const StringView& query,
|
||||
bool caseSensitive, bool isRegex) = 0;
|
||||
|
||||
// Remote objects.
|
||||
virtual std::unique_ptr<protocol::Runtime::API::RemoteObject> wrapObject(
|
||||
v8::Local<v8::Context>, v8::Local<v8::Value>, const StringView& groupName,
|
||||
bool generatePreview) = 0;
|
||||
|
||||
virtual bool unwrapObject(std::unique_ptr<StringBuffer>* error,
|
||||
const StringView& objectId, v8::Local<v8::Value>*,
|
||||
v8::Local<v8::Context>*,
|
||||
std::unique_ptr<StringBuffer>* objectGroup) = 0;
|
||||
virtual void releaseObjectGroup(const StringView&) = 0;
|
||||
};
|
||||
|
||||
class V8_EXPORT V8InspectorClient {
|
||||
public:
|
||||
virtual ~V8InspectorClient() = default;
|
||||
|
||||
virtual void runMessageLoopOnPause(int contextGroupId) {}
|
||||
virtual void quitMessageLoopOnPause() {}
|
||||
virtual void runIfWaitingForDebugger(int contextGroupId) {}
|
||||
|
||||
virtual void muteMetrics(int contextGroupId) {}
|
||||
virtual void unmuteMetrics(int contextGroupId) {}
|
||||
|
||||
virtual void beginUserGesture() {}
|
||||
virtual void endUserGesture() {}
|
||||
|
||||
virtual std::unique_ptr<StringBuffer> valueSubtype(v8::Local<v8::Value>) {
|
||||
return nullptr;
|
||||
}
|
||||
virtual bool formatAccessorsAsProperties(v8::Local<v8::Value>) {
|
||||
return false;
|
||||
}
|
||||
virtual bool isInspectableHeapObject(v8::Local<v8::Object>) { return true; }
|
||||
|
||||
virtual v8::Local<v8::Context> ensureDefaultContextInGroup(
|
||||
int contextGroupId) {
|
||||
return v8::Local<v8::Context>();
|
||||
}
|
||||
virtual void beginEnsureAllContextsInGroup(int contextGroupId) {}
|
||||
virtual void endEnsureAllContextsInGroup(int contextGroupId) {}
|
||||
|
||||
virtual void installAdditionalCommandLineAPI(v8::Local<v8::Context>,
|
||||
v8::Local<v8::Object>) {}
|
||||
virtual void consoleAPIMessage(int contextGroupId,
|
||||
v8::Isolate::MessageErrorLevel level,
|
||||
const StringView& message,
|
||||
const StringView& url, unsigned lineNumber,
|
||||
unsigned columnNumber, V8StackTrace*) {}
|
||||
virtual v8::MaybeLocal<v8::Value> memoryInfo(v8::Isolate*,
|
||||
v8::Local<v8::Context>) {
|
||||
return v8::MaybeLocal<v8::Value>();
|
||||
}
|
||||
|
||||
virtual void consoleTime(const StringView& title) {}
|
||||
virtual void consoleTimeEnd(const StringView& title) {}
|
||||
virtual void consoleTimeStamp(const StringView& title) {}
|
||||
virtual void consoleClear(int contextGroupId) {}
|
||||
virtual double currentTimeMS() { return 0; }
|
||||
typedef void (*TimerCallback)(void*);
|
||||
virtual void startRepeatingTimer(double, TimerCallback, void* data) {}
|
||||
virtual void cancelTimer(void* data) {}
|
||||
|
||||
// TODO(dgozman): this was added to support service worker shadow page. We
|
||||
// should not connect at all.
|
||||
virtual bool canExecuteScripts(int contextGroupId) { return true; }
|
||||
|
||||
virtual void maxAsyncCallStackDepthChanged(int depth) {}
|
||||
|
||||
virtual std::unique_ptr<StringBuffer> resourceNameToUrl(
|
||||
const StringView& resourceName) {
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
// These stack trace ids are intended to be passed between debuggers and be
|
||||
// resolved later. This allows to track cross-debugger calls and step between
|
||||
// them if a single client connects to multiple debuggers.
|
||||
struct V8_EXPORT V8StackTraceId {
|
||||
uintptr_t id;
|
||||
std::pair<int64_t, int64_t> debugger_id;
|
||||
bool should_pause = false;
|
||||
|
||||
V8StackTraceId();
|
||||
V8StackTraceId(const V8StackTraceId&) = default;
|
||||
V8StackTraceId(uintptr_t id, const std::pair<int64_t, int64_t> debugger_id);
|
||||
V8StackTraceId(uintptr_t id, const std::pair<int64_t, int64_t> debugger_id,
|
||||
bool should_pause);
|
||||
explicit V8StackTraceId(const StringView&);
|
||||
V8StackTraceId& operator=(const V8StackTraceId&) = default;
|
||||
V8StackTraceId& operator=(V8StackTraceId&&) noexcept = default;
|
||||
~V8StackTraceId() = default;
|
||||
|
||||
bool IsInvalid() const;
|
||||
std::unique_ptr<StringBuffer> ToString();
|
||||
};
|
||||
|
||||
class V8_EXPORT V8Inspector {
|
||||
public:
|
||||
static std::unique_ptr<V8Inspector> create(v8::Isolate*, V8InspectorClient*);
|
||||
virtual ~V8Inspector() = default;
|
||||
|
||||
// Contexts instrumentation.
|
||||
virtual void contextCreated(const V8ContextInfo&) = 0;
|
||||
virtual void contextDestroyed(v8::Local<v8::Context>) = 0;
|
||||
virtual void resetContextGroup(int contextGroupId) = 0;
|
||||
virtual v8::MaybeLocal<v8::Context> contextById(int contextId) = 0;
|
||||
|
||||
// Various instrumentation.
|
||||
virtual void idleStarted() = 0;
|
||||
virtual void idleFinished() = 0;
|
||||
|
||||
// Async stack traces instrumentation.
|
||||
virtual void asyncTaskScheduled(const StringView& taskName, void* task,
|
||||
bool recurring) = 0;
|
||||
virtual void asyncTaskCanceled(void* task) = 0;
|
||||
virtual void asyncTaskStarted(void* task) = 0;
|
||||
virtual void asyncTaskFinished(void* task) = 0;
|
||||
virtual void allAsyncTasksCanceled() = 0;
|
||||
|
||||
virtual V8StackTraceId storeCurrentStackTrace(
|
||||
const StringView& description) = 0;
|
||||
virtual void externalAsyncTaskStarted(const V8StackTraceId& parent) = 0;
|
||||
virtual void externalAsyncTaskFinished(const V8StackTraceId& parent) = 0;
|
||||
|
||||
// Exceptions instrumentation.
|
||||
virtual unsigned exceptionThrown(
|
||||
v8::Local<v8::Context>, const StringView& message,
|
||||
v8::Local<v8::Value> exception, const StringView& detailedMessage,
|
||||
const StringView& url, unsigned lineNumber, unsigned columnNumber,
|
||||
std::unique_ptr<V8StackTrace>, int scriptId) = 0;
|
||||
virtual void exceptionRevoked(v8::Local<v8::Context>, unsigned exceptionId,
|
||||
const StringView& message) = 0;
|
||||
|
||||
// Connection.
|
||||
class V8_EXPORT Channel {
|
||||
public:
|
||||
virtual ~Channel() = default;
|
||||
virtual void sendResponse(int callId,
|
||||
std::unique_ptr<StringBuffer> message) = 0;
|
||||
virtual void sendNotification(std::unique_ptr<StringBuffer> message) = 0;
|
||||
virtual void flushProtocolNotifications() = 0;
|
||||
};
|
||||
virtual std::unique_ptr<V8InspectorSession> connect(
|
||||
int contextGroupId, Channel*, const StringView& state) = 0;
|
||||
|
||||
// API methods.
|
||||
virtual std::unique_ptr<V8StackTrace> createStackTrace(
|
||||
v8::Local<v8::StackTrace>) = 0;
|
||||
virtual std::unique_ptr<V8StackTrace> captureStackTrace(bool fullStack) = 0;
|
||||
|
||||
// Performance counters.
|
||||
class V8_EXPORT Counters : public std::enable_shared_from_this<Counters> {
|
||||
public:
|
||||
explicit Counters(v8::Isolate* isolate);
|
||||
~Counters();
|
||||
const std::unordered_map<std::string, int>& getCountersMap() const {
|
||||
return m_countersMap;
|
||||
}
|
||||
|
||||
private:
|
||||
static int* getCounterPtr(const char* name);
|
||||
|
||||
v8::Isolate* m_isolate;
|
||||
std::unordered_map<std::string, int> m_countersMap;
|
||||
};
|
||||
|
||||
virtual std::shared_ptr<Counters> enableCounters() = 0;
|
||||
};
|
||||
|
||||
} // namespace v8_inspector
|
||||
|
||||
#endif // V8_V8_INSPECTOR_H_
|
||||
390
cocos2d-x/external/android/x86/include/v8/v8-internal.h
vendored
Normal file
390
cocos2d-x/external/android/x86/include/v8/v8-internal.h
vendored
Normal file
@@ -0,0 +1,390 @@
|
||||
// Copyright 2018 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.
|
||||
|
||||
#ifndef INCLUDE_V8_INTERNAL_H_
|
||||
#define INCLUDE_V8_INTERNAL_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <type_traits>
|
||||
|
||||
#include "v8-version.h" // NOLINT(build/include)
|
||||
#include "v8config.h" // NOLINT(build/include)
|
||||
|
||||
namespace v8 {
|
||||
|
||||
class Context;
|
||||
class Data;
|
||||
class Isolate;
|
||||
|
||||
namespace internal {
|
||||
|
||||
class Isolate;
|
||||
|
||||
typedef uintptr_t Address;
|
||||
static const Address kNullAddress = 0;
|
||||
|
||||
/**
|
||||
* Configuration of tagging scheme.
|
||||
*/
|
||||
const int kApiSystemPointerSize = sizeof(void*);
|
||||
const int kApiDoubleSize = sizeof(double);
|
||||
const int kApiInt32Size = sizeof(int32_t);
|
||||
const int kApiInt64Size = sizeof(int64_t);
|
||||
|
||||
// Tag information for HeapObject.
|
||||
const int kHeapObjectTag = 1;
|
||||
const int kWeakHeapObjectTag = 3;
|
||||
const int kHeapObjectTagSize = 2;
|
||||
const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
|
||||
|
||||
// Tag information for Smi.
|
||||
const int kSmiTag = 0;
|
||||
const int kSmiTagSize = 1;
|
||||
const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
|
||||
|
||||
template <size_t tagged_ptr_size>
|
||||
struct SmiTagging;
|
||||
|
||||
constexpr intptr_t kIntptrAllBitsSet = intptr_t{-1};
|
||||
constexpr uintptr_t kUintptrAllBitsSet =
|
||||
static_cast<uintptr_t>(kIntptrAllBitsSet);
|
||||
|
||||
// Smi constants for systems where tagged pointer is a 32-bit value.
|
||||
template <>
|
||||
struct SmiTagging<4> {
|
||||
enum { kSmiShiftSize = 0, kSmiValueSize = 31 };
|
||||
|
||||
static constexpr intptr_t kSmiMinValue =
|
||||
static_cast<intptr_t>(kUintptrAllBitsSet << (kSmiValueSize - 1));
|
||||
static constexpr intptr_t kSmiMaxValue = -(kSmiMinValue + 1);
|
||||
|
||||
V8_INLINE static int SmiToInt(const internal::Address value) {
|
||||
int shift_bits = kSmiTagSize + kSmiShiftSize;
|
||||
// Truncate and shift down (requires >> to be sign extending).
|
||||
return static_cast<int32_t>(static_cast<uint32_t>(value)) >> shift_bits;
|
||||
}
|
||||
V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
|
||||
// Is value in range [kSmiMinValue, kSmiMaxValue].
|
||||
// Use unsigned operations in order to avoid undefined behaviour in case of
|
||||
// signed integer overflow.
|
||||
return (static_cast<uintptr_t>(value) -
|
||||
static_cast<uintptr_t>(kSmiMinValue)) <=
|
||||
(static_cast<uintptr_t>(kSmiMaxValue) -
|
||||
static_cast<uintptr_t>(kSmiMinValue));
|
||||
}
|
||||
};
|
||||
|
||||
// Smi constants for systems where tagged pointer is a 64-bit value.
|
||||
template <>
|
||||
struct SmiTagging<8> {
|
||||
enum { kSmiShiftSize = 31, kSmiValueSize = 32 };
|
||||
|
||||
static constexpr intptr_t kSmiMinValue =
|
||||
static_cast<intptr_t>(kUintptrAllBitsSet << (kSmiValueSize - 1));
|
||||
static constexpr intptr_t kSmiMaxValue = -(kSmiMinValue + 1);
|
||||
|
||||
V8_INLINE static int SmiToInt(const internal::Address value) {
|
||||
int shift_bits = kSmiTagSize + kSmiShiftSize;
|
||||
// Shift down and throw away top 32 bits.
|
||||
return static_cast<int>(static_cast<intptr_t>(value) >> shift_bits);
|
||||
}
|
||||
V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
|
||||
// To be representable as a long smi, the value must be a 32-bit integer.
|
||||
return (value == static_cast<int32_t>(value));
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
static_assert(
|
||||
kApiSystemPointerSize == kApiInt64Size,
|
||||
"Pointer compression can be enabled only for 64-bit architectures");
|
||||
const int kApiTaggedSize = kApiInt32Size;
|
||||
#else
|
||||
const int kApiTaggedSize = kApiSystemPointerSize;
|
||||
#endif
|
||||
|
||||
#ifdef V8_31BIT_SMIS_ON_64BIT_ARCH
|
||||
using PlatformSmiTagging = SmiTagging<kApiInt32Size>;
|
||||
#else
|
||||
using PlatformSmiTagging = SmiTagging<kApiTaggedSize>;
|
||||
#endif
|
||||
|
||||
// TODO(ishell): Consinder adding kSmiShiftBits = kSmiShiftSize + kSmiTagSize
|
||||
// since it's used much more often than the inividual constants.
|
||||
const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
|
||||
const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
|
||||
const int kSmiMinValue = static_cast<int>(PlatformSmiTagging::kSmiMinValue);
|
||||
const int kSmiMaxValue = static_cast<int>(PlatformSmiTagging::kSmiMaxValue);
|
||||
constexpr bool SmiValuesAre31Bits() { return kSmiValueSize == 31; }
|
||||
constexpr bool SmiValuesAre32Bits() { return kSmiValueSize == 32; }
|
||||
|
||||
V8_INLINE static constexpr internal::Address IntToSmi(int value) {
|
||||
return (static_cast<Address>(value) << (kSmiTagSize + kSmiShiftSize)) |
|
||||
kSmiTag;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class exports constants and functionality from within v8 that
|
||||
* is necessary to implement inline functions in the v8 api. Don't
|
||||
* depend on functions and constants defined here.
|
||||
*/
|
||||
class Internals {
|
||||
public:
|
||||
// These values match non-compiler-dependent values defined within
|
||||
// the implementation of v8.
|
||||
static const int kHeapObjectMapOffset = 0;
|
||||
static const int kMapInstanceTypeOffset = 1 * kApiTaggedSize + kApiInt32Size;
|
||||
static const int kStringResourceOffset =
|
||||
1 * kApiTaggedSize + 2 * kApiInt32Size;
|
||||
|
||||
static const int kOddballKindOffset = 4 * kApiTaggedSize + kApiDoubleSize;
|
||||
static const int kForeignAddressOffset = kApiTaggedSize;
|
||||
static const int kJSObjectHeaderSize = 3 * kApiTaggedSize;
|
||||
static const int kFixedArrayHeaderSize = 2 * kApiTaggedSize;
|
||||
static const int kEmbedderDataArrayHeaderSize = 2 * kApiTaggedSize;
|
||||
static const int kEmbedderDataSlotSize = kApiSystemPointerSize;
|
||||
static const int kNativeContextEmbedderDataOffset = 6 * kApiTaggedSize;
|
||||
static const int kFullStringRepresentationMask = 0x0f;
|
||||
static const int kStringEncodingMask = 0x8;
|
||||
static const int kExternalTwoByteRepresentationTag = 0x02;
|
||||
static const int kExternalOneByteRepresentationTag = 0x0a;
|
||||
|
||||
static const uint32_t kNumIsolateDataSlots = 4;
|
||||
|
||||
// IsolateData layout guarantees.
|
||||
static const int kIsolateEmbedderDataOffset = 0;
|
||||
static const int kExternalMemoryOffset =
|
||||
kNumIsolateDataSlots * kApiSystemPointerSize;
|
||||
static const int kExternalMemoryLimitOffset =
|
||||
kExternalMemoryOffset + kApiInt64Size;
|
||||
static const int kExternalMemoryAtLastMarkCompactOffset =
|
||||
kExternalMemoryLimitOffset + kApiInt64Size;
|
||||
static const int kIsolateFastCCallCallerFpOffset =
|
||||
kExternalMemoryAtLastMarkCompactOffset + kApiInt64Size;
|
||||
static const int kIsolateFastCCallCallerPcOffset =
|
||||
kIsolateFastCCallCallerFpOffset + kApiSystemPointerSize;
|
||||
static const int kIsolateStackGuardOffset =
|
||||
kIsolateFastCCallCallerPcOffset + kApiSystemPointerSize;
|
||||
static const int kIsolateRootsOffset =
|
||||
kIsolateStackGuardOffset + 7 * kApiSystemPointerSize;
|
||||
|
||||
static const int kUndefinedValueRootIndex = 4;
|
||||
static const int kTheHoleValueRootIndex = 5;
|
||||
static const int kNullValueRootIndex = 6;
|
||||
static const int kTrueValueRootIndex = 7;
|
||||
static const int kFalseValueRootIndex = 8;
|
||||
static const int kEmptyStringRootIndex = 9;
|
||||
|
||||
static const int kNodeClassIdOffset = 1 * kApiSystemPointerSize;
|
||||
static const int kNodeFlagsOffset = 1 * kApiSystemPointerSize + 3;
|
||||
static const int kNodeStateMask = 0x7;
|
||||
static const int kNodeStateIsWeakValue = 2;
|
||||
static const int kNodeStateIsPendingValue = 3;
|
||||
|
||||
static const int kFirstNonstringType = 0x40;
|
||||
static const int kOddballType = 0x43;
|
||||
static const int kForeignType = 0x46;
|
||||
static const int kJSSpecialApiObjectType = 0x410;
|
||||
static const int kJSApiObjectType = 0x420;
|
||||
static const int kJSObjectType = 0x421;
|
||||
|
||||
static const int kUndefinedOddballKind = 5;
|
||||
static const int kNullOddballKind = 3;
|
||||
|
||||
// Constants used by PropertyCallbackInfo to check if we should throw when an
|
||||
// error occurs.
|
||||
static const int kThrowOnError = 0;
|
||||
static const int kDontThrow = 1;
|
||||
static const int kInferShouldThrowMode = 2;
|
||||
|
||||
// Soft limit for AdjustAmountofExternalAllocatedMemory. Trigger an
|
||||
// incremental GC once the external memory reaches this limit.
|
||||
static constexpr int kExternalAllocationSoftLimit = 64 * 1024 * 1024;
|
||||
|
||||
V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
|
||||
V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
|
||||
#ifdef V8_ENABLE_CHECKS
|
||||
CheckInitializedImpl(isolate);
|
||||
#endif
|
||||
}
|
||||
|
||||
V8_INLINE static bool HasHeapObjectTag(const internal::Address value) {
|
||||
return (value & kHeapObjectTagMask) == static_cast<Address>(kHeapObjectTag);
|
||||
}
|
||||
|
||||
V8_INLINE static int SmiValue(const internal::Address value) {
|
||||
return PlatformSmiTagging::SmiToInt(value);
|
||||
}
|
||||
|
||||
V8_INLINE static constexpr internal::Address IntToSmi(int value) {
|
||||
return internal::IntToSmi(value);
|
||||
}
|
||||
|
||||
V8_INLINE static constexpr bool IsValidSmi(intptr_t value) {
|
||||
return PlatformSmiTagging::IsValidSmi(value);
|
||||
}
|
||||
|
||||
V8_INLINE static int GetInstanceType(const internal::Address obj) {
|
||||
typedef internal::Address A;
|
||||
A map = ReadTaggedPointerField(obj, kHeapObjectMapOffset);
|
||||
return ReadRawField<uint16_t>(map, kMapInstanceTypeOffset);
|
||||
}
|
||||
|
||||
V8_INLINE static int GetOddballKind(const internal::Address obj) {
|
||||
return SmiValue(ReadTaggedSignedField(obj, kOddballKindOffset));
|
||||
}
|
||||
|
||||
V8_INLINE static bool IsExternalTwoByteString(int instance_type) {
|
||||
int representation = (instance_type & kFullStringRepresentationMask);
|
||||
return representation == kExternalTwoByteRepresentationTag;
|
||||
}
|
||||
|
||||
V8_INLINE static uint8_t GetNodeFlag(internal::Address* obj, int shift) {
|
||||
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
||||
return *addr & static_cast<uint8_t>(1U << shift);
|
||||
}
|
||||
|
||||
V8_INLINE static void UpdateNodeFlag(internal::Address* obj, bool value,
|
||||
int shift) {
|
||||
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
||||
uint8_t mask = static_cast<uint8_t>(1U << shift);
|
||||
*addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift));
|
||||
}
|
||||
|
||||
V8_INLINE static uint8_t GetNodeState(internal::Address* obj) {
|
||||
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
||||
return *addr & kNodeStateMask;
|
||||
}
|
||||
|
||||
V8_INLINE static void UpdateNodeState(internal::Address* obj, uint8_t value) {
|
||||
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
|
||||
*addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
|
||||
}
|
||||
|
||||
V8_INLINE static void SetEmbedderData(v8::Isolate* isolate, uint32_t slot,
|
||||
void* data) {
|
||||
internal::Address addr = reinterpret_cast<internal::Address>(isolate) +
|
||||
kIsolateEmbedderDataOffset +
|
||||
slot * kApiSystemPointerSize;
|
||||
*reinterpret_cast<void**>(addr) = data;
|
||||
}
|
||||
|
||||
V8_INLINE static void* GetEmbedderData(const v8::Isolate* isolate,
|
||||
uint32_t slot) {
|
||||
internal::Address addr = reinterpret_cast<internal::Address>(isolate) +
|
||||
kIsolateEmbedderDataOffset +
|
||||
slot * kApiSystemPointerSize;
|
||||
return *reinterpret_cast<void* const*>(addr);
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Address* GetRoot(v8::Isolate* isolate, int index) {
|
||||
internal::Address addr = reinterpret_cast<internal::Address>(isolate) +
|
||||
kIsolateRootsOffset +
|
||||
index * kApiSystemPointerSize;
|
||||
return reinterpret_cast<internal::Address*>(addr);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
V8_INLINE static T ReadRawField(internal::Address heap_object_ptr,
|
||||
int offset) {
|
||||
internal::Address addr = heap_object_ptr + offset - kHeapObjectTag;
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
if (sizeof(T) > kApiTaggedSize) {
|
||||
// TODO(ishell, v8:8875): When pointer compression is enabled 8-byte size
|
||||
// fields (external pointers, doubles and BigInt data) are only
|
||||
// kTaggedSize aligned so we have to use unaligned pointer friendly way of
|
||||
// accessing them in order to avoid undefined behavior in C++ code.
|
||||
T r;
|
||||
memcpy(&r, reinterpret_cast<void*>(addr), sizeof(T));
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
return *reinterpret_cast<const T*>(addr);
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Address ReadTaggedPointerField(
|
||||
internal::Address heap_object_ptr, int offset) {
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
|
||||
internal::Address root = GetRootFromOnHeapAddress(heap_object_ptr);
|
||||
return root + static_cast<internal::Address>(static_cast<intptr_t>(value));
|
||||
#else
|
||||
return ReadRawField<internal::Address>(heap_object_ptr, offset);
|
||||
#endif
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Address ReadTaggedSignedField(
|
||||
internal::Address heap_object_ptr, int offset) {
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
|
||||
return static_cast<internal::Address>(static_cast<intptr_t>(value));
|
||||
#else
|
||||
return ReadRawField<internal::Address>(heap_object_ptr, offset);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
// See v8:7703 or src/ptr-compr.* for details about pointer compression.
|
||||
static constexpr size_t kPtrComprHeapReservationSize = size_t{1} << 32;
|
||||
static constexpr size_t kPtrComprIsolateRootAlignment = size_t{1} << 32;
|
||||
|
||||
V8_INLINE static internal::Address GetRootFromOnHeapAddress(
|
||||
internal::Address addr) {
|
||||
return addr & -static_cast<intptr_t>(kPtrComprIsolateRootAlignment);
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Address DecompressTaggedAnyField(
|
||||
internal::Address heap_object_ptr, int32_t value) {
|
||||
internal::Address root_mask = static_cast<internal::Address>(
|
||||
-static_cast<intptr_t>(value & kSmiTagMask));
|
||||
internal::Address root_or_zero =
|
||||
root_mask & GetRootFromOnHeapAddress(heap_object_ptr);
|
||||
return root_or_zero +
|
||||
static_cast<internal::Address>(static_cast<intptr_t>(value));
|
||||
}
|
||||
#endif // V8_COMPRESS_POINTERS
|
||||
};
|
||||
|
||||
// Only perform cast check for types derived from v8::Data since
|
||||
// other types do not implement the Cast method.
|
||||
template <bool PerformCheck>
|
||||
struct CastCheck {
|
||||
template <class T>
|
||||
static void Perform(T* data);
|
||||
};
|
||||
|
||||
template <>
|
||||
template <class T>
|
||||
void CastCheck<true>::Perform(T* data) {
|
||||
T::Cast(data);
|
||||
}
|
||||
|
||||
template <>
|
||||
template <class T>
|
||||
void CastCheck<false>::Perform(T* data) {}
|
||||
|
||||
template <class T>
|
||||
V8_INLINE void PerformCastCheck(T* data) {
|
||||
CastCheck<std::is_base_of<Data, T>::value>::Perform(data);
|
||||
}
|
||||
|
||||
// {obj} must be the raw tagged pointer representation of a HeapObject
|
||||
// that's guaranteed to never be in ReadOnlySpace.
|
||||
V8_EXPORT internal::Isolate* IsolateFromNeverReadOnlySpaceObject(Address obj);
|
||||
|
||||
// Returns if we need to throw when an error occurs. This infers the language
|
||||
// mode based on the current context and the closure. This returns true if the
|
||||
// language mode is strict.
|
||||
V8_EXPORT bool ShouldThrowOnError(v8::internal::Isolate* isolate);
|
||||
|
||||
// A base class for backing stores, which is needed due to vagaries of
|
||||
// how static casts work with std::shared_ptr.
|
||||
class BackingStoreBase {};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
||||
#endif // INCLUDE_V8_INTERNAL_H_
|
||||
448
cocos2d-x/external/android/x86/include/v8/v8-platform.h
vendored
Normal file
448
cocos2d-x/external/android/x86/include/v8/v8-platform.h
vendored
Normal file
@@ -0,0 +1,448 @@
|
||||
// Copyright 2013 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.
|
||||
|
||||
#ifndef V8_V8_PLATFORM_H_
|
||||
#define V8_V8_PLATFORM_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h> // For abort.
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "v8config.h" // NOLINT(build/include)
|
||||
|
||||
namespace v8 {
|
||||
|
||||
class Isolate;
|
||||
|
||||
/**
|
||||
* A Task represents a unit of work.
|
||||
*/
|
||||
class Task {
|
||||
public:
|
||||
virtual ~Task() = default;
|
||||
|
||||
virtual void Run() = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* An IdleTask represents a unit of work to be performed in idle time.
|
||||
* The Run method is invoked with an argument that specifies the deadline in
|
||||
* seconds returned by MonotonicallyIncreasingTime().
|
||||
* The idle task is expected to complete by this deadline.
|
||||
*/
|
||||
class IdleTask {
|
||||
public:
|
||||
virtual ~IdleTask() = default;
|
||||
virtual void Run(double deadline_in_seconds) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* A TaskRunner allows scheduling of tasks. The TaskRunner may still be used to
|
||||
* post tasks after the isolate gets destructed, but these tasks may not get
|
||||
* executed anymore. All tasks posted to a given TaskRunner will be invoked in
|
||||
* sequence. Tasks can be posted from any thread.
|
||||
*/
|
||||
class TaskRunner {
|
||||
public:
|
||||
/**
|
||||
* Schedules a task to be invoked by this TaskRunner. The TaskRunner
|
||||
* implementation takes ownership of |task|.
|
||||
*/
|
||||
virtual void PostTask(std::unique_ptr<Task> task) = 0;
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked by this TaskRunner. The TaskRunner
|
||||
* implementation takes ownership of |task|. The |task| cannot be nested
|
||||
* within other task executions.
|
||||
*
|
||||
* Requires that |TaskRunner::NonNestableTasksEnabled()| is true.
|
||||
*/
|
||||
virtual void PostNonNestableTask(std::unique_ptr<Task> task) {}
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked by this TaskRunner. The task is scheduled
|
||||
* after the given number of seconds |delay_in_seconds|. The TaskRunner
|
||||
* implementation takes ownership of |task|.
|
||||
*/
|
||||
virtual void PostDelayedTask(std::unique_ptr<Task> task,
|
||||
double delay_in_seconds) = 0;
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked by this TaskRunner. The task is scheduled
|
||||
* after the given number of seconds |delay_in_seconds|. The TaskRunner
|
||||
* implementation takes ownership of |task|. The |task| cannot be nested
|
||||
* within other task executions.
|
||||
*
|
||||
* Requires that |TaskRunner::NonNestableDelayedTasksEnabled()| is true.
|
||||
*/
|
||||
virtual void PostNonNestableDelayedTask(std::unique_ptr<Task> task,
|
||||
double delay_in_seconds) {}
|
||||
|
||||
/**
|
||||
* Schedules an idle task to be invoked by this TaskRunner. The task is
|
||||
* scheduled when the embedder is idle. Requires that
|
||||
* |TaskRunner::IdleTasksEnabled()| is true. Idle tasks may be reordered
|
||||
* relative to other task types and may be starved for an arbitrarily long
|
||||
* time if no idle time is available. The TaskRunner implementation takes
|
||||
* ownership of |task|.
|
||||
*/
|
||||
virtual void PostIdleTask(std::unique_ptr<IdleTask> task) = 0;
|
||||
|
||||
/**
|
||||
* Returns true if idle tasks are enabled for this TaskRunner.
|
||||
*/
|
||||
virtual bool IdleTasksEnabled() = 0;
|
||||
|
||||
/**
|
||||
* Returns true if non-nestable tasks are enabled for this TaskRunner.
|
||||
*/
|
||||
virtual bool NonNestableTasksEnabled() const { return false; }
|
||||
|
||||
/**
|
||||
* Returns true if non-nestable delayed tasks are enabled for this TaskRunner.
|
||||
*/
|
||||
virtual bool NonNestableDelayedTasksEnabled() const { return false; }
|
||||
|
||||
TaskRunner() = default;
|
||||
virtual ~TaskRunner() = default;
|
||||
|
||||
TaskRunner(const TaskRunner&) = delete;
|
||||
TaskRunner& operator=(const TaskRunner&) = delete;
|
||||
};
|
||||
|
||||
/**
|
||||
* The interface represents complex arguments to trace events.
|
||||
*/
|
||||
class ConvertableToTraceFormat {
|
||||
public:
|
||||
virtual ~ConvertableToTraceFormat() = default;
|
||||
|
||||
/**
|
||||
* Append the class info to the provided |out| string. The appended
|
||||
* data must be a valid JSON object. Strings must be properly quoted, and
|
||||
* escaped. There is no processing applied to the content after it is
|
||||
* appended.
|
||||
*/
|
||||
virtual void AppendAsTraceFormat(std::string* out) const = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* 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. These function calls are
|
||||
* 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 these functions on their own; they are 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;
|
||||
}
|
||||
virtual uint64_t AddTraceEventWithTimestamp(
|
||||
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, int64_t timestamp) {
|
||||
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*) {}
|
||||
};
|
||||
|
||||
/**
|
||||
* A V8 memory page allocator.
|
||||
*
|
||||
* Can be implemented by an embedder to manage large host OS allocations.
|
||||
*/
|
||||
class PageAllocator {
|
||||
public:
|
||||
virtual ~PageAllocator() = default;
|
||||
|
||||
/**
|
||||
* Gets the page granularity for AllocatePages and FreePages. Addresses and
|
||||
* lengths for those calls should be multiples of AllocatePageSize().
|
||||
*/
|
||||
virtual size_t AllocatePageSize() = 0;
|
||||
|
||||
/**
|
||||
* Gets the page granularity for SetPermissions and ReleasePages. Addresses
|
||||
* and lengths for those calls should be multiples of CommitPageSize().
|
||||
*/
|
||||
virtual size_t CommitPageSize() = 0;
|
||||
|
||||
/**
|
||||
* Sets the random seed so that GetRandomMmapAddr() will generate repeatable
|
||||
* sequences of random mmap addresses.
|
||||
*/
|
||||
virtual void SetRandomMmapSeed(int64_t seed) = 0;
|
||||
|
||||
/**
|
||||
* Returns a randomized address, suitable for memory allocation under ASLR.
|
||||
* The address will be aligned to AllocatePageSize.
|
||||
*/
|
||||
virtual void* GetRandomMmapAddr() = 0;
|
||||
|
||||
/**
|
||||
* Memory permissions.
|
||||
*/
|
||||
enum Permission {
|
||||
kNoAccess,
|
||||
kRead,
|
||||
kReadWrite,
|
||||
// TODO(hpayer): Remove this flag. Memory should never be rwx.
|
||||
kReadWriteExecute,
|
||||
kReadExecute
|
||||
};
|
||||
|
||||
/**
|
||||
* Allocates memory in range with the given alignment and permission.
|
||||
*/
|
||||
virtual void* AllocatePages(void* address, size_t length, size_t alignment,
|
||||
Permission permissions) = 0;
|
||||
|
||||
/**
|
||||
* Frees memory in a range that was allocated by a call to AllocatePages.
|
||||
*/
|
||||
virtual bool FreePages(void* address, size_t length) = 0;
|
||||
|
||||
/**
|
||||
* Releases memory in a range that was allocated by a call to AllocatePages.
|
||||
*/
|
||||
virtual bool ReleasePages(void* address, size_t length,
|
||||
size_t new_length) = 0;
|
||||
|
||||
/**
|
||||
* Sets permissions on pages in an allocated range.
|
||||
*/
|
||||
virtual bool SetPermissions(void* address, size_t length,
|
||||
Permission permissions) = 0;
|
||||
|
||||
/**
|
||||
* Frees memory in the given [address, address + size) range. address and size
|
||||
* should be operating system page-aligned. The next write to this
|
||||
* memory area brings the memory transparently back.
|
||||
*/
|
||||
virtual bool DiscardSystemPages(void* address, size_t size) { return true; }
|
||||
};
|
||||
|
||||
/**
|
||||
* V8 Platform abstraction layer.
|
||||
*
|
||||
* The embedder has to provide an implementation of this interface before
|
||||
* initializing the rest of V8.
|
||||
*/
|
||||
class Platform {
|
||||
public:
|
||||
virtual ~Platform() = default;
|
||||
|
||||
/**
|
||||
* Allows the embedder to manage memory page allocations.
|
||||
*/
|
||||
virtual PageAllocator* GetPageAllocator() {
|
||||
// TODO(bbudge) Make this abstract after all embedders implement this.
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the embedder to respond in cases where V8 can't allocate large
|
||||
* blocks of memory. V8 retries the failed allocation once after calling this
|
||||
* method. On success, execution continues; otherwise V8 exits with a fatal
|
||||
* error.
|
||||
* Embedder overrides of this function must NOT call back into V8.
|
||||
*/
|
||||
virtual void OnCriticalMemoryPressure() {
|
||||
// TODO(bbudge) Remove this when embedders override the following method.
|
||||
// See crbug.com/634547.
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the embedder to respond in cases where V8 can't allocate large
|
||||
* memory regions. The |length| parameter is the amount of memory needed.
|
||||
* Returns true if memory is now available. Returns false if no memory could
|
||||
* be made available. V8 will retry allocations until this method returns
|
||||
* false.
|
||||
*
|
||||
* Embedder overrides of this function must NOT call back into V8.
|
||||
*/
|
||||
virtual bool OnCriticalMemoryPressure(size_t length) { return false; }
|
||||
|
||||
/**
|
||||
* Gets the number of worker threads used by
|
||||
* Call(BlockingTask)OnWorkerThread(). This can be used to estimate the number
|
||||
* of tasks a work package should be split into. A return value of 0 means
|
||||
* that there are no worker threads available. Note that a value of 0 won't
|
||||
* prohibit V8 from posting tasks using |CallOnWorkerThread|.
|
||||
*/
|
||||
virtual int NumberOfWorkerThreads() = 0;
|
||||
|
||||
/**
|
||||
* Returns a TaskRunner which can be used to post a task on the foreground.
|
||||
* This function should only be called from a foreground thread.
|
||||
*/
|
||||
virtual std::shared_ptr<v8::TaskRunner> GetForegroundTaskRunner(
|
||||
Isolate* isolate) = 0;
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked on a worker thread.
|
||||
*/
|
||||
virtual void CallOnWorkerThread(std::unique_ptr<Task> task) = 0;
|
||||
|
||||
/**
|
||||
* Schedules a task that blocks the main thread to be invoked with
|
||||
* high-priority on a worker thread.
|
||||
*/
|
||||
virtual void CallBlockingTaskOnWorkerThread(std::unique_ptr<Task> task) {
|
||||
// Embedders may optionally override this to process these tasks in a high
|
||||
// priority pool.
|
||||
CallOnWorkerThread(std::move(task));
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked with low-priority on a worker thread.
|
||||
*/
|
||||
virtual void CallLowPriorityTaskOnWorkerThread(std::unique_ptr<Task> task) {
|
||||
// Embedders may optionally override this to process these tasks in a low
|
||||
// priority pool.
|
||||
CallOnWorkerThread(std::move(task));
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked on a worker thread after |delay_in_seconds|
|
||||
* expires.
|
||||
*/
|
||||
virtual void CallDelayedOnWorkerThread(std::unique_ptr<Task> task,
|
||||
double delay_in_seconds) = 0;
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked on a foreground thread wrt a specific
|
||||
* |isolate|. Tasks posted for the same isolate should be execute in order of
|
||||
* scheduling. The definition of "foreground" is opaque to V8.
|
||||
*/
|
||||
V8_DEPRECATED("Use a taskrunner acquired by GetForegroundTaskRunner instead.")
|
||||
virtual void CallOnForegroundThread(Isolate* isolate, Task* task) { abort(); }
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked on a foreground thread wrt a specific
|
||||
* |isolate| after the given number of seconds |delay_in_seconds|.
|
||||
* Tasks posted for the same isolate should be execute in order of
|
||||
* scheduling. The definition of "foreground" is opaque to V8.
|
||||
*/
|
||||
V8_DEPRECATED("Use a taskrunner acquired by GetForegroundTaskRunner instead.")
|
||||
virtual void CallDelayedOnForegroundThread(Isolate* isolate, Task* task,
|
||||
double delay_in_seconds) {
|
||||
abort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedules a task to be invoked on a foreground thread wrt a specific
|
||||
* |isolate| when the embedder is idle.
|
||||
* Requires that SupportsIdleTasks(isolate) is true.
|
||||
* Idle tasks may be reordered relative to other task types and may be
|
||||
* starved for an arbitrarily long time if no idle time is available.
|
||||
* The definition of "foreground" is opaque to V8.
|
||||
*/
|
||||
V8_DEPRECATED("Use a taskrunner acquired by GetForegroundTaskRunner instead.")
|
||||
virtual void CallIdleOnForegroundThread(Isolate* isolate, IdleTask* task) {
|
||||
abort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if idle tasks are enabled for the given |isolate|.
|
||||
*/
|
||||
virtual bool IdleTasksEnabled(Isolate* isolate) { return false; }
|
||||
|
||||
/**
|
||||
* Monotonically increasing time in seconds from an arbitrary fixed point in
|
||||
* the past. This function is expected to return at least
|
||||
* millisecond-precision values. For this reason,
|
||||
* it is recommended that the fixed point be no further in the past than
|
||||
* the epoch.
|
||||
**/
|
||||
virtual double MonotonicallyIncreasingTime() = 0;
|
||||
|
||||
/**
|
||||
* Current wall-clock time in milliseconds since epoch.
|
||||
* This function is expected to return at least millisecond-precision values.
|
||||
*/
|
||||
virtual double CurrentClockTimeMillis() = 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;
|
||||
|
||||
/**
|
||||
* Tells the embedder to generate and upload a crashdump during an unexpected
|
||||
* but non-critical scenario.
|
||||
*/
|
||||
virtual void DumpWithoutCrashing() {}
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Default implementation of current wall-clock time in milliseconds
|
||||
* since epoch. Useful for implementing |CurrentClockTimeMillis| if
|
||||
* nothing special needed.
|
||||
*/
|
||||
V8_EXPORT static double SystemClockTimeMillis();
|
||||
};
|
||||
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_V8_PLATFORM_H_
|
||||
1058
cocos2d-x/external/android/x86/include/v8/v8-profiler.h
vendored
Normal file
1058
cocos2d-x/external/android/x86/include/v8/v8-profiler.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
50
cocos2d-x/external/android/x86/include/v8/v8-testing.h
vendored
Normal file
50
cocos2d-x/external/android/x86/include/v8/v8-testing.h
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
// Copyright 2010 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.
|
||||
|
||||
#ifndef V8_V8_TEST_H_
|
||||
#define V8_V8_TEST_H_
|
||||
|
||||
#include "v8.h" // NOLINT(build/include)
|
||||
|
||||
/**
|
||||
* Testing support for the V8 JavaScript engine.
|
||||
*/
|
||||
namespace v8 {
|
||||
class V8_EXPORT Testing {
|
||||
public:
|
||||
enum V8_DEPRECATED("Don't use this (d8-specific testing logic).") StressType {
|
||||
kStressTypeOpt,
|
||||
kStressTypeDeopt
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the type of stressing to do. The default if not set is kStressTypeOpt.
|
||||
*/
|
||||
V8_DEPRECATED("Don't use this (d8-specific testing logic).")
|
||||
static void SetStressRunType(StressType type);
|
||||
|
||||
/**
|
||||
* Get the number of runs of a given test that is required to get the full
|
||||
* stress coverage.
|
||||
*/
|
||||
V8_DEPRECATED("Don't use this (d8-specific testing logic).")
|
||||
static int GetStressRuns();
|
||||
|
||||
/**
|
||||
* Indicate the number of the run which is about to start. The value of run
|
||||
* should be between 0 and one less than the result from GetStressRuns()
|
||||
*/
|
||||
V8_DEPRECATED("Don't use this (d8-specific testing logic).")
|
||||
static void PrepareStressRun(int run);
|
||||
|
||||
/**
|
||||
* Force deoptimization of all functions.
|
||||
*/
|
||||
V8_DEPRECATED("Don't use this (d8-specific testing logic).")
|
||||
static void DeoptimizeAll(Isolate* isolate);
|
||||
};
|
||||
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_V8_TEST_H_
|
||||
652
cocos2d-x/external/android/x86/include/v8/v8-util.h
vendored
Normal file
652
cocos2d-x/external/android/x86/include/v8/v8-util.h
vendored
Normal file
@@ -0,0 +1,652 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
#ifndef V8_UTIL_H_
|
||||
#define V8_UTIL_H_
|
||||
|
||||
#include "v8.h" // NOLINT(build/include)
|
||||
#include <assert.h>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
/**
|
||||
* Support for Persistent containers.
|
||||
*
|
||||
* C++11 embedders can use STL containers with Global values,
|
||||
* but pre-C++11 does not support the required move semantic and hence
|
||||
* may want these container classes.
|
||||
*/
|
||||
namespace v8 {
|
||||
|
||||
typedef uintptr_t PersistentContainerValue;
|
||||
static const uintptr_t kPersistentContainerNotFound = 0;
|
||||
enum PersistentContainerCallbackType {
|
||||
kNotWeak,
|
||||
// These correspond to v8::WeakCallbackType
|
||||
kWeakWithParameter,
|
||||
kWeakWithInternalFields
|
||||
};
|
||||
|
||||
/**
|
||||
* A default trait implementation for PersistentValueMap which uses std::map
|
||||
* as a backing map.
|
||||
*
|
||||
* Users will have to implement their own weak callbacks & dispose traits.
|
||||
*/
|
||||
template<typename K, typename V>
|
||||
class StdMapTraits {
|
||||
public:
|
||||
// STL map & related:
|
||||
typedef std::map<K, PersistentContainerValue> Impl;
|
||||
typedef typename Impl::iterator Iterator;
|
||||
|
||||
static bool Empty(Impl* impl) { return impl->empty(); }
|
||||
static size_t Size(Impl* impl) { return impl->size(); }
|
||||
static void Swap(Impl& a, Impl& b) { std::swap(a, b); } // NOLINT
|
||||
static Iterator Begin(Impl* impl) { return impl->begin(); }
|
||||
static Iterator End(Impl* impl) { return impl->end(); }
|
||||
static K Key(Iterator it) { return it->first; }
|
||||
static PersistentContainerValue Value(Iterator it) { return it->second; }
|
||||
static PersistentContainerValue Set(Impl* impl, K key,
|
||||
PersistentContainerValue value) {
|
||||
std::pair<Iterator, bool> res = impl->insert(std::make_pair(key, value));
|
||||
PersistentContainerValue old_value = kPersistentContainerNotFound;
|
||||
if (!res.second) {
|
||||
old_value = res.first->second;
|
||||
res.first->second = value;
|
||||
}
|
||||
return old_value;
|
||||
}
|
||||
static PersistentContainerValue Get(Impl* impl, K key) {
|
||||
Iterator it = impl->find(key);
|
||||
if (it == impl->end()) return kPersistentContainerNotFound;
|
||||
return it->second;
|
||||
}
|
||||
static PersistentContainerValue Remove(Impl* impl, K key) {
|
||||
Iterator it = impl->find(key);
|
||||
if (it == impl->end()) return kPersistentContainerNotFound;
|
||||
PersistentContainerValue value = it->second;
|
||||
impl->erase(it);
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A default trait implementation for PersistentValueMap, which inherits
|
||||
* a std:map backing map from StdMapTraits and holds non-weak persistent
|
||||
* objects and has no special Dispose handling.
|
||||
*
|
||||
* You should not derive from this class, since MapType depends on the
|
||||
* surrounding class, and hence a subclass cannot simply inherit the methods.
|
||||
*/
|
||||
template<typename K, typename V>
|
||||
class DefaultPersistentValueMapTraits : public StdMapTraits<K, V> {
|
||||
public:
|
||||
// Weak callback & friends:
|
||||
static const PersistentContainerCallbackType kCallbackType = kNotWeak;
|
||||
typedef PersistentValueMap<K, V, DefaultPersistentValueMapTraits<K, V> >
|
||||
MapType;
|
||||
typedef void WeakCallbackDataType;
|
||||
|
||||
static WeakCallbackDataType* WeakCallbackParameter(
|
||||
MapType* map, const K& key, Local<V> value) {
|
||||
return nullptr;
|
||||
}
|
||||
static MapType* MapFromWeakCallbackInfo(
|
||||
const WeakCallbackInfo<WeakCallbackDataType>& data) {
|
||||
return nullptr;
|
||||
}
|
||||
static K KeyFromWeakCallbackInfo(
|
||||
const WeakCallbackInfo<WeakCallbackDataType>& data) {
|
||||
return K();
|
||||
}
|
||||
static void DisposeCallbackData(WeakCallbackDataType* data) { }
|
||||
static void Dispose(Isolate* isolate, Global<V> value, K key) {}
|
||||
};
|
||||
|
||||
|
||||
template <typename K, typename V>
|
||||
class DefaultGlobalMapTraits : public StdMapTraits<K, V> {
|
||||
private:
|
||||
template <typename T>
|
||||
struct RemovePointer;
|
||||
|
||||
public:
|
||||
// Weak callback & friends:
|
||||
static const PersistentContainerCallbackType kCallbackType = kNotWeak;
|
||||
typedef GlobalValueMap<K, V, DefaultGlobalMapTraits<K, V> > MapType;
|
||||
typedef void WeakCallbackDataType;
|
||||
|
||||
static WeakCallbackDataType* WeakCallbackParameter(MapType* map, const K& key,
|
||||
Local<V> value) {
|
||||
return nullptr;
|
||||
}
|
||||
static MapType* MapFromWeakCallbackInfo(
|
||||
const WeakCallbackInfo<WeakCallbackDataType>& data) {
|
||||
return nullptr;
|
||||
}
|
||||
static K KeyFromWeakCallbackInfo(
|
||||
const WeakCallbackInfo<WeakCallbackDataType>& data) {
|
||||
return K();
|
||||
}
|
||||
static void DisposeCallbackData(WeakCallbackDataType* data) {}
|
||||
static void OnWeakCallback(
|
||||
const WeakCallbackInfo<WeakCallbackDataType>& data) {}
|
||||
static void Dispose(Isolate* isolate, Global<V> value, K key) {}
|
||||
// This is a second pass callback, so SetSecondPassCallback cannot be called.
|
||||
static void DisposeWeak(const WeakCallbackInfo<WeakCallbackDataType>& data) {}
|
||||
|
||||
private:
|
||||
template <typename T>
|
||||
struct RemovePointer<T*> {
|
||||
typedef T Type;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A map wrapper that allows using Global as a mapped value.
|
||||
* C++11 embedders don't need this class, as they can use Global
|
||||
* directly in std containers.
|
||||
*
|
||||
* The map relies on a backing map, whose type and accessors are described
|
||||
* by the Traits class. The backing map will handle values of type
|
||||
* PersistentContainerValue, with all conversion into and out of V8
|
||||
* handles being transparently handled by this class.
|
||||
*/
|
||||
template <typename K, typename V, typename Traits>
|
||||
class PersistentValueMapBase {
|
||||
public:
|
||||
Isolate* GetIsolate() { return isolate_; }
|
||||
|
||||
/**
|
||||
* Return size of the map.
|
||||
*/
|
||||
size_t Size() { return Traits::Size(&impl_); }
|
||||
|
||||
/**
|
||||
* Return whether the map holds weak persistents.
|
||||
*/
|
||||
bool IsWeak() { return Traits::kCallbackType != kNotWeak; }
|
||||
|
||||
/**
|
||||
* Get value stored in map.
|
||||
*/
|
||||
Local<V> Get(const K& key) {
|
||||
return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, key)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a value is contained in the map.
|
||||
*/
|
||||
bool Contains(const K& key) {
|
||||
return Traits::Get(&impl_, key) != kPersistentContainerNotFound;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get value stored in map and set it in returnValue.
|
||||
* Return true if a value was found.
|
||||
*/
|
||||
bool SetReturnValue(const K& key,
|
||||
ReturnValue<Value> returnValue) {
|
||||
return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return value for key and remove it from the map.
|
||||
*/
|
||||
Global<V> Remove(const K& key) {
|
||||
return Release(Traits::Remove(&impl_, key)).Pass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Traverses the map repeatedly,
|
||||
* in case side effects of disposal cause insertions.
|
||||
**/
|
||||
void Clear() {
|
||||
typedef typename Traits::Iterator It;
|
||||
HandleScope handle_scope(isolate_);
|
||||
// TODO(dcarney): figure out if this swap and loop is necessary.
|
||||
while (!Traits::Empty(&impl_)) {
|
||||
typename Traits::Impl impl;
|
||||
Traits::Swap(impl_, impl);
|
||||
for (It i = Traits::Begin(&impl); i != Traits::End(&impl); ++i) {
|
||||
Traits::Dispose(isolate_, Release(Traits::Value(i)).Pass(),
|
||||
Traits::Key(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper class for GetReference/SetWithReference. Do not use outside
|
||||
* that context.
|
||||
*/
|
||||
class PersistentValueReference {
|
||||
public:
|
||||
PersistentValueReference() : value_(kPersistentContainerNotFound) { }
|
||||
PersistentValueReference(const PersistentValueReference& other)
|
||||
: value_(other.value_) { }
|
||||
|
||||
Local<V> NewLocal(Isolate* isolate) const {
|
||||
return Local<V>::New(isolate, FromVal(value_));
|
||||
}
|
||||
bool IsEmpty() const {
|
||||
return value_ == kPersistentContainerNotFound;
|
||||
}
|
||||
template<typename T>
|
||||
bool SetReturnValue(ReturnValue<T> returnValue) {
|
||||
return SetReturnValueFromVal(&returnValue, value_);
|
||||
}
|
||||
void Reset() {
|
||||
value_ = kPersistentContainerNotFound;
|
||||
}
|
||||
void operator=(const PersistentValueReference& other) {
|
||||
value_ = other.value_;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class PersistentValueMapBase;
|
||||
friend class PersistentValueMap<K, V, Traits>;
|
||||
friend class GlobalValueMap<K, V, Traits>;
|
||||
|
||||
explicit PersistentValueReference(PersistentContainerValue value)
|
||||
: value_(value) { }
|
||||
|
||||
void operator=(PersistentContainerValue value) {
|
||||
value_ = value;
|
||||
}
|
||||
|
||||
PersistentContainerValue value_;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get a reference to a map value. This enables fast, repeated access
|
||||
* to a value stored in the map while the map remains unchanged.
|
||||
*
|
||||
* Careful: This is potentially unsafe, so please use with care.
|
||||
* The value will become invalid if the value for this key changes
|
||||
* in the underlying map, as a result of Set or Remove for the same
|
||||
* key; as a result of the weak callback for the same key; or as a
|
||||
* result of calling Clear() or destruction of the map.
|
||||
*/
|
||||
PersistentValueReference GetReference(const K& key) {
|
||||
return PersistentValueReference(Traits::Get(&impl_, key));
|
||||
}
|
||||
|
||||
protected:
|
||||
explicit PersistentValueMapBase(Isolate* isolate)
|
||||
: isolate_(isolate), label_(nullptr) {}
|
||||
PersistentValueMapBase(Isolate* isolate, const char* label)
|
||||
: isolate_(isolate), label_(label) {}
|
||||
|
||||
~PersistentValueMapBase() { Clear(); }
|
||||
|
||||
Isolate* isolate() { return isolate_; }
|
||||
typename Traits::Impl* impl() { return &impl_; }
|
||||
|
||||
static V* FromVal(PersistentContainerValue v) {
|
||||
return reinterpret_cast<V*>(v);
|
||||
}
|
||||
|
||||
static PersistentContainerValue ClearAndLeak(Global<V>* persistent) {
|
||||
V* v = persistent->val_;
|
||||
persistent->val_ = nullptr;
|
||||
return reinterpret_cast<PersistentContainerValue>(v);
|
||||
}
|
||||
|
||||
static PersistentContainerValue Leak(Global<V>* persistent) {
|
||||
return reinterpret_cast<PersistentContainerValue>(persistent->val_);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a container value as Global and make sure the weak
|
||||
* callback is properly disposed of. All remove functionality should go
|
||||
* through this.
|
||||
*/
|
||||
static Global<V> Release(PersistentContainerValue v) {
|
||||
Global<V> p;
|
||||
p.val_ = FromVal(v);
|
||||
if (Traits::kCallbackType != kNotWeak && p.IsWeak()) {
|
||||
Traits::DisposeCallbackData(
|
||||
p.template ClearWeak<typename Traits::WeakCallbackDataType>());
|
||||
}
|
||||
return p.Pass();
|
||||
}
|
||||
|
||||
void RemoveWeak(const K& key) {
|
||||
Global<V> p;
|
||||
p.val_ = FromVal(Traits::Remove(&impl_, key));
|
||||
p.Reset();
|
||||
}
|
||||
|
||||
void AnnotateStrongRetainer(Global<V>* persistent) {
|
||||
persistent->AnnotateStrongRetainer(label_);
|
||||
}
|
||||
|
||||
private:
|
||||
PersistentValueMapBase(PersistentValueMapBase&);
|
||||
void operator=(PersistentValueMapBase&);
|
||||
|
||||
static bool SetReturnValueFromVal(ReturnValue<Value>* returnValue,
|
||||
PersistentContainerValue value) {
|
||||
bool hasValue = value != kPersistentContainerNotFound;
|
||||
if (hasValue) {
|
||||
returnValue->SetInternal(
|
||||
*reinterpret_cast<internal::Address*>(FromVal(value)));
|
||||
}
|
||||
return hasValue;
|
||||
}
|
||||
|
||||
Isolate* isolate_;
|
||||
typename Traits::Impl impl_;
|
||||
const char* label_;
|
||||
};
|
||||
|
||||
template <typename K, typename V, typename Traits>
|
||||
class PersistentValueMap : public PersistentValueMapBase<K, V, Traits> {
|
||||
public:
|
||||
explicit PersistentValueMap(Isolate* isolate)
|
||||
: PersistentValueMapBase<K, V, Traits>(isolate) {}
|
||||
PersistentValueMap(Isolate* isolate, const char* label)
|
||||
: PersistentValueMapBase<K, V, Traits>(isolate, label) {}
|
||||
|
||||
typedef
|
||||
typename PersistentValueMapBase<K, V, Traits>::PersistentValueReference
|
||||
PersistentValueReference;
|
||||
|
||||
/**
|
||||
* Put value into map. Depending on Traits::kIsWeak, the value will be held
|
||||
* by the map strongly or weakly.
|
||||
* Returns old value as Global.
|
||||
*/
|
||||
Global<V> Set(const K& key, Local<V> value) {
|
||||
Global<V> persistent(this->isolate(), value);
|
||||
return SetUnique(key, &persistent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put value into map, like Set(const K&, Local<V>).
|
||||
*/
|
||||
Global<V> Set(const K& key, Global<V> value) {
|
||||
return SetUnique(key, &value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put the value into the map, and set the 'weak' callback when demanded
|
||||
* by the Traits class.
|
||||
*/
|
||||
Global<V> SetUnique(const K& key, Global<V>* persistent) {
|
||||
if (Traits::kCallbackType == kNotWeak) {
|
||||
this->AnnotateStrongRetainer(persistent);
|
||||
} else {
|
||||
WeakCallbackType callback_type =
|
||||
Traits::kCallbackType == kWeakWithInternalFields
|
||||
? WeakCallbackType::kInternalFields
|
||||
: WeakCallbackType::kParameter;
|
||||
Local<V> value(Local<V>::New(this->isolate(), *persistent));
|
||||
persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
|
||||
Traits::WeakCallbackParameter(this, key, value), WeakCallback,
|
||||
callback_type);
|
||||
}
|
||||
PersistentContainerValue old_value =
|
||||
Traits::Set(this->impl(), key, this->ClearAndLeak(persistent));
|
||||
return this->Release(old_value).Pass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a value into the map and update the reference.
|
||||
* Restrictions of GetReference apply here as well.
|
||||
*/
|
||||
Global<V> Set(const K& key, Global<V> value,
|
||||
PersistentValueReference* reference) {
|
||||
*reference = this->Leak(&value);
|
||||
return SetUnique(key, &value);
|
||||
}
|
||||
|
||||
private:
|
||||
static void WeakCallback(
|
||||
const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
|
||||
if (Traits::kCallbackType != kNotWeak) {
|
||||
PersistentValueMap<K, V, Traits>* persistentValueMap =
|
||||
Traits::MapFromWeakCallbackInfo(data);
|
||||
K key = Traits::KeyFromWeakCallbackInfo(data);
|
||||
Traits::Dispose(data.GetIsolate(),
|
||||
persistentValueMap->Remove(key).Pass(), key);
|
||||
Traits::DisposeCallbackData(data.GetParameter());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename K, typename V, typename Traits>
|
||||
class GlobalValueMap : public PersistentValueMapBase<K, V, Traits> {
|
||||
public:
|
||||
explicit GlobalValueMap(Isolate* isolate)
|
||||
: PersistentValueMapBase<K, V, Traits>(isolate) {}
|
||||
GlobalValueMap(Isolate* isolate, const char* label)
|
||||
: PersistentValueMapBase<K, V, Traits>(isolate, label) {}
|
||||
|
||||
typedef
|
||||
typename PersistentValueMapBase<K, V, Traits>::PersistentValueReference
|
||||
PersistentValueReference;
|
||||
|
||||
/**
|
||||
* Put value into map. Depending on Traits::kIsWeak, the value will be held
|
||||
* by the map strongly or weakly.
|
||||
* Returns old value as Global.
|
||||
*/
|
||||
Global<V> Set(const K& key, Local<V> value) {
|
||||
Global<V> persistent(this->isolate(), value);
|
||||
return SetUnique(key, &persistent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put value into map, like Set(const K&, Local<V>).
|
||||
*/
|
||||
Global<V> Set(const K& key, Global<V> value) {
|
||||
return SetUnique(key, &value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put the value into the map, and set the 'weak' callback when demanded
|
||||
* by the Traits class.
|
||||
*/
|
||||
Global<V> SetUnique(const K& key, Global<V>* persistent) {
|
||||
if (Traits::kCallbackType == kNotWeak) {
|
||||
this->AnnotateStrongRetainer(persistent);
|
||||
} else {
|
||||
WeakCallbackType callback_type =
|
||||
Traits::kCallbackType == kWeakWithInternalFields
|
||||
? WeakCallbackType::kInternalFields
|
||||
: WeakCallbackType::kParameter;
|
||||
Local<V> value(Local<V>::New(this->isolate(), *persistent));
|
||||
persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
|
||||
Traits::WeakCallbackParameter(this, key, value), OnWeakCallback,
|
||||
callback_type);
|
||||
}
|
||||
PersistentContainerValue old_value =
|
||||
Traits::Set(this->impl(), key, this->ClearAndLeak(persistent));
|
||||
return this->Release(old_value).Pass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a value into the map and update the reference.
|
||||
* Restrictions of GetReference apply here as well.
|
||||
*/
|
||||
Global<V> Set(const K& key, Global<V> value,
|
||||
PersistentValueReference* reference) {
|
||||
*reference = this->Leak(&value);
|
||||
return SetUnique(key, &value);
|
||||
}
|
||||
|
||||
private:
|
||||
static void OnWeakCallback(
|
||||
const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
|
||||
if (Traits::kCallbackType != kNotWeak) {
|
||||
auto map = Traits::MapFromWeakCallbackInfo(data);
|
||||
K key = Traits::KeyFromWeakCallbackInfo(data);
|
||||
map->RemoveWeak(key);
|
||||
Traits::OnWeakCallback(data);
|
||||
data.SetSecondPassCallback(SecondWeakCallback);
|
||||
}
|
||||
}
|
||||
|
||||
static void SecondWeakCallback(
|
||||
const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
|
||||
Traits::DisposeWeak(data);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A map that uses Global as value and std::map as the backing
|
||||
* implementation. Persistents are held non-weak.
|
||||
*
|
||||
* C++11 embedders don't need this class, as they can use
|
||||
* Global directly in std containers.
|
||||
*/
|
||||
template<typename K, typename V,
|
||||
typename Traits = DefaultPersistentValueMapTraits<K, V> >
|
||||
class StdPersistentValueMap : public PersistentValueMap<K, V, Traits> {
|
||||
public:
|
||||
explicit StdPersistentValueMap(Isolate* isolate)
|
||||
: PersistentValueMap<K, V, Traits>(isolate) {}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A map that uses Global as value and std::map as the backing
|
||||
* implementation. Globals are held non-weak.
|
||||
*
|
||||
* C++11 embedders don't need this class, as they can use
|
||||
* Global directly in std containers.
|
||||
*/
|
||||
template <typename K, typename V,
|
||||
typename Traits = DefaultGlobalMapTraits<K, V> >
|
||||
class StdGlobalValueMap : public GlobalValueMap<K, V, Traits> {
|
||||
public:
|
||||
explicit StdGlobalValueMap(Isolate* isolate)
|
||||
: GlobalValueMap<K, V, Traits>(isolate) {}
|
||||
};
|
||||
|
||||
|
||||
class DefaultPersistentValueVectorTraits {
|
||||
public:
|
||||
typedef std::vector<PersistentContainerValue> Impl;
|
||||
|
||||
static void Append(Impl* impl, PersistentContainerValue value) {
|
||||
impl->push_back(value);
|
||||
}
|
||||
static bool IsEmpty(const Impl* impl) {
|
||||
return impl->empty();
|
||||
}
|
||||
static size_t Size(const Impl* impl) {
|
||||
return impl->size();
|
||||
}
|
||||
static PersistentContainerValue Get(const Impl* impl, size_t i) {
|
||||
return (i < impl->size()) ? impl->at(i) : kPersistentContainerNotFound;
|
||||
}
|
||||
static void ReserveCapacity(Impl* impl, size_t capacity) {
|
||||
impl->reserve(capacity);
|
||||
}
|
||||
static void Clear(Impl* impl) {
|
||||
impl->clear();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A vector wrapper that safely stores Global values.
|
||||
* C++11 embedders don't need this class, as they can use Global
|
||||
* directly in std containers.
|
||||
*
|
||||
* This class relies on a backing vector implementation, whose type and methods
|
||||
* are described by the Traits class. The backing map will handle values of type
|
||||
* PersistentContainerValue, with all conversion into and out of V8
|
||||
* handles being transparently handled by this class.
|
||||
*/
|
||||
template<typename V, typename Traits = DefaultPersistentValueVectorTraits>
|
||||
class PersistentValueVector {
|
||||
public:
|
||||
explicit PersistentValueVector(Isolate* isolate) : isolate_(isolate) { }
|
||||
|
||||
~PersistentValueVector() {
|
||||
Clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Append a value to the vector.
|
||||
*/
|
||||
void Append(Local<V> value) {
|
||||
Global<V> persistent(isolate_, value);
|
||||
Traits::Append(&impl_, ClearAndLeak(&persistent));
|
||||
}
|
||||
|
||||
/**
|
||||
* Append a persistent's value to the vector.
|
||||
*/
|
||||
void Append(Global<V> persistent) {
|
||||
Traits::Append(&impl_, ClearAndLeak(&persistent));
|
||||
}
|
||||
|
||||
/**
|
||||
* Are there any values in the vector?
|
||||
*/
|
||||
bool IsEmpty() const {
|
||||
return Traits::IsEmpty(&impl_);
|
||||
}
|
||||
|
||||
/**
|
||||
* How many elements are in the vector?
|
||||
*/
|
||||
size_t Size() const {
|
||||
return Traits::Size(&impl_);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the i-th value in the vector.
|
||||
*/
|
||||
Local<V> Get(size_t index) const {
|
||||
return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, index)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all elements from the vector.
|
||||
*/
|
||||
void Clear() {
|
||||
size_t length = Traits::Size(&impl_);
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
Global<V> p;
|
||||
p.val_ = FromVal(Traits::Get(&impl_, i));
|
||||
}
|
||||
Traits::Clear(&impl_);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reserve capacity in the vector.
|
||||
* (Efficiency gains depend on the backing implementation.)
|
||||
*/
|
||||
void ReserveCapacity(size_t capacity) {
|
||||
Traits::ReserveCapacity(&impl_, capacity);
|
||||
}
|
||||
|
||||
private:
|
||||
static PersistentContainerValue ClearAndLeak(Global<V>* persistent) {
|
||||
V* v = persistent->val_;
|
||||
persistent->val_ = nullptr;
|
||||
return reinterpret_cast<PersistentContainerValue>(v);
|
||||
}
|
||||
|
||||
static V* FromVal(PersistentContainerValue v) {
|
||||
return reinterpret_cast<V*>(v);
|
||||
}
|
||||
|
||||
Isolate* isolate_;
|
||||
typename Traits::Impl impl_;
|
||||
};
|
||||
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_UTIL_H
|
||||
24
cocos2d-x/external/android/x86/include/v8/v8-value-serializer-version.h
vendored
Normal file
24
cocos2d-x/external/android/x86/include/v8/v8-value-serializer-version.h
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
// 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.
|
||||
|
||||
/**
|
||||
* Compile-time constants.
|
||||
*
|
||||
* This header provides access to information about the value serializer at
|
||||
* compile time, without declaring or defining any symbols that require linking
|
||||
* to V8.
|
||||
*/
|
||||
|
||||
#ifndef INCLUDE_V8_VALUE_SERIALIZER_VERSION_H_
|
||||
#define INCLUDE_V8_VALUE_SERIALIZER_VERSION_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace v8 {
|
||||
|
||||
constexpr uint32_t CurrentValueSerializerFormatVersion() { return 13; }
|
||||
|
||||
} // namespace v8
|
||||
|
||||
#endif // INCLUDE_V8_VALUE_SERIALIZER_VERSION_H_
|
||||
38
cocos2d-x/external/android/x86/include/v8/v8-version-string.h
vendored
Normal file
38
cocos2d-x/external/android/x86/include/v8/v8-version-string.h
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
// 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.
|
||||
|
||||
#ifndef V8_VERSION_STRING_H_
|
||||
#define V8_VERSION_STRING_H_
|
||||
|
||||
#include "v8-version.h" // NOLINT(build/include)
|
||||
|
||||
// This is here rather than v8-version.h to keep that file simple and
|
||||
// machine-processable.
|
||||
|
||||
#if V8_IS_CANDIDATE_VERSION
|
||||
#define V8_CANDIDATE_STRING " (candidate)"
|
||||
#else
|
||||
#define V8_CANDIDATE_STRING ""
|
||||
#endif
|
||||
|
||||
#ifndef V8_EMBEDDER_STRING
|
||||
#define V8_EMBEDDER_STRING ""
|
||||
#endif
|
||||
|
||||
#define V8_SX(x) #x
|
||||
#define V8_S(x) V8_SX(x)
|
||||
|
||||
#if V8_PATCH_LEVEL > 0
|
||||
#define V8_VERSION_STRING \
|
||||
V8_S(V8_MAJOR_VERSION) \
|
||||
"." V8_S(V8_MINOR_VERSION) "." V8_S(V8_BUILD_NUMBER) "." V8_S( \
|
||||
V8_PATCH_LEVEL) V8_EMBEDDER_STRING V8_CANDIDATE_STRING
|
||||
#else
|
||||
#define V8_VERSION_STRING \
|
||||
V8_S(V8_MAJOR_VERSION) \
|
||||
"." V8_S(V8_MINOR_VERSION) "." V8_S(V8_BUILD_NUMBER) \
|
||||
V8_EMBEDDER_STRING V8_CANDIDATE_STRING
|
||||
#endif
|
||||
|
||||
#endif // V8_VERSION_STRING_H_
|
||||
20
cocos2d-x/external/android/x86/include/v8/v8-version.h
vendored
Normal file
20
cocos2d-x/external/android/x86/include/v8/v8-version.h
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
// Copyright 2015 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.
|
||||
|
||||
#ifndef V8_INCLUDE_VERSION_H_ // V8_VERSION_H_ conflicts with src/version.h
|
||||
#define V8_INCLUDE_VERSION_H_
|
||||
|
||||
// These macros define the version number for the current version.
|
||||
// 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 8
|
||||
#define V8_MINOR_VERSION 0
|
||||
#define V8_BUILD_NUMBER 426
|
||||
#define V8_PATCH_LEVEL 16
|
||||
|
||||
// Use 1 for candidates and 0 otherwise.
|
||||
// (Boolean macro values are not supported by all preprocessors.)
|
||||
#define V8_IS_CANDIDATE_VERSION 0
|
||||
|
||||
#endif // V8_INCLUDE_VERSION_H_
|
||||
31
cocos2d-x/external/android/x86/include/v8/v8-wasm-trap-handler-posix.h
vendored
Normal file
31
cocos2d-x/external/android/x86/include/v8/v8-wasm-trap-handler-posix.h
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
// Copyright 2018 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.
|
||||
|
||||
#ifndef V8_WASM_TRAP_HANDLER_POSIX_H_
|
||||
#define V8_WASM_TRAP_HANDLER_POSIX_H_
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#include "v8config.h" // NOLINT(build/include)
|
||||
|
||||
namespace v8 {
|
||||
/**
|
||||
* This function determines whether a memory access violation has been an
|
||||
* out-of-bounds memory access in WebAssembly. If so, it will modify the context
|
||||
* parameter and add a return address where the execution can continue after the
|
||||
* signal handling, and return true. Otherwise, false will be returned.
|
||||
*
|
||||
* The parameters to this function correspond to those passed to a Posix signal
|
||||
* handler. Use this function only on Linux and Mac.
|
||||
*
|
||||
* \param sig_code The signal code, e.g. SIGSEGV.
|
||||
* \param info A pointer to the siginfo_t struct provided to the signal handler.
|
||||
* \param context A pointer to a ucontext_t struct provided to the signal
|
||||
* handler.
|
||||
*/
|
||||
V8_EXPORT bool TryHandleWebAssemblyTrapPosix(int sig_code, siginfo_t* info,
|
||||
void* context);
|
||||
|
||||
} // namespace v8
|
||||
#endif // V8_WASM_TRAP_HANDLER_POSIX_H_
|
||||
28
cocos2d-x/external/android/x86/include/v8/v8-wasm-trap-handler-win.h
vendored
Normal file
28
cocos2d-x/external/android/x86/include/v8/v8-wasm-trap-handler-win.h
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
// Copyright 2018 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.
|
||||
|
||||
#ifndef V8_WASM_TRAP_HANDLER_WIN_H_
|
||||
#define V8_WASM_TRAP_HANDLER_WIN_H_
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "v8config.h" // NOLINT(build/include)
|
||||
|
||||
namespace v8 {
|
||||
/**
|
||||
* This function determines whether a memory access violation has been an
|
||||
* out-of-bounds memory access in WebAssembly. If so, it will modify the
|
||||
* exception parameter and add a return address where the execution can continue
|
||||
* after the exception handling, and return true. Otherwise the return value
|
||||
* will be false.
|
||||
*
|
||||
* The parameter to this function corresponds to the one passed to a Windows
|
||||
* vectored exception handler. Use this function only on Windows.
|
||||
*
|
||||
* \param exception An EXCEPTION_POINTERS* as provided to the exception handler.
|
||||
*/
|
||||
V8_EXPORT bool TryHandleWebAssemblyTrapWindows(EXCEPTION_POINTERS* exception);
|
||||
|
||||
} // namespace v8
|
||||
#endif // V8_WASM_TRAP_HANDLER_WIN_H_
|
||||
11779
cocos2d-x/external/android/x86/include/v8/v8.h
vendored
Normal file
11779
cocos2d-x/external/android/x86/include/v8/v8.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
466
cocos2d-x/external/android/x86/include/v8/v8config.h
vendored
Normal file
466
cocos2d-x/external/android/x86/include/v8/v8config.h
vendored
Normal file
@@ -0,0 +1,466 @@
|
||||
// Copyright 2013 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.
|
||||
|
||||
#ifndef V8CONFIG_H_
|
||||
#define V8CONFIG_H_
|
||||
|
||||
// clang-format off
|
||||
|
||||
// Platform headers for feature detection below.
|
||||
#if defined(__ANDROID__)
|
||||
# include <sys/cdefs.h>
|
||||
#elif defined(__APPLE__)
|
||||
# include <TargetConditionals.h>
|
||||
#elif defined(__linux__)
|
||||
# include <features.h>
|
||||
#endif
|
||||
|
||||
|
||||
// This macro allows to test for the version of the GNU C library (or
|
||||
// a compatible C library that masquerades as glibc). It evaluates to
|
||||
// 0 if libc is not GNU libc or compatible.
|
||||
// Use like:
|
||||
// #if V8_GLIBC_PREREQ(2, 3)
|
||||
// ...
|
||||
// #endif
|
||||
#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
|
||||
# define V8_GLIBC_PREREQ(major, minor) \
|
||||
((__GLIBC__ * 100 + __GLIBC_MINOR__) >= ((major) * 100 + (minor)))
|
||||
#else
|
||||
# define V8_GLIBC_PREREQ(major, minor) 0
|
||||
#endif
|
||||
|
||||
|
||||
// This macro allows to test for the version of the GNU C++ compiler.
|
||||
// Note that this also applies to compilers that masquerade as GCC,
|
||||
// for example clang and the Intel C++ compiler for Linux.
|
||||
// Use like:
|
||||
// #if V8_GNUC_PREREQ(4, 3, 1)
|
||||
// ...
|
||||
// #endif
|
||||
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||
# define V8_GNUC_PREREQ(major, minor, patchlevel) \
|
||||
((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= \
|
||||
((major) * 10000 + (minor) * 100 + (patchlevel)))
|
||||
#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
|
||||
# define V8_GNUC_PREREQ(major, minor, patchlevel) \
|
||||
((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= \
|
||||
((major) * 10000 + (minor) * 100 + (patchlevel)))
|
||||
#else
|
||||
# define V8_GNUC_PREREQ(major, minor, patchlevel) 0
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Operating system detection (host)
|
||||
//
|
||||
// V8_OS_ANDROID - Android
|
||||
// V8_OS_BSD - BSDish (Mac OS X, Net/Free/Open/DragonFlyBSD)
|
||||
// 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_IOS - iOS
|
||||
// V8_OS_NETBSD - NetBSD
|
||||
// V8_OS_OPENBSD - OpenBSD
|
||||
// V8_OS_POSIX - POSIX compatible (mostly everything except Windows)
|
||||
// V8_OS_QNX - QNX Neutrino
|
||||
// V8_OS_SOLARIS - Sun Solaris and OpenSolaris
|
||||
// V8_OS_AIX - AIX
|
||||
// V8_OS_WIN - Microsoft Windows
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
# define V8_OS_ANDROID 1
|
||||
# define V8_OS_LINUX 1
|
||||
# define V8_OS_POSIX 1
|
||||
#elif defined(__APPLE__)
|
||||
# define V8_OS_BSD 1
|
||||
# define V8_OS_MACOSX 1
|
||||
# define V8_OS_POSIX 1
|
||||
# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
|
||||
# define V8_OS_IOS 1
|
||||
# endif // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
|
||||
#elif defined(__CYGWIN__)
|
||||
# define V8_OS_CYGWIN 1
|
||||
# define V8_OS_POSIX 1
|
||||
#elif defined(__linux__)
|
||||
# define V8_OS_LINUX 1
|
||||
# define V8_OS_POSIX 1
|
||||
#elif defined(__sun)
|
||||
# define V8_OS_POSIX 1
|
||||
# define V8_OS_SOLARIS 1
|
||||
#elif defined(_AIX)
|
||||
#define V8_OS_POSIX 1
|
||||
#define V8_OS_AIX 1
|
||||
#elif defined(__FreeBSD__)
|
||||
# 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
|
||||
# define V8_OS_POSIX 1
|
||||
#elif defined(__NetBSD__)
|
||||
# define V8_OS_BSD 1
|
||||
# define V8_OS_NETBSD 1
|
||||
# define V8_OS_POSIX 1
|
||||
#elif defined(__OpenBSD__)
|
||||
# define V8_OS_BSD 1
|
||||
# define V8_OS_OPENBSD 1
|
||||
# define V8_OS_POSIX 1
|
||||
#elif defined(__QNXNTO__)
|
||||
# define V8_OS_POSIX 1
|
||||
# define V8_OS_QNX 1
|
||||
#elif defined(_WIN32)
|
||||
# define V8_OS_WIN 1
|
||||
#endif
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Operating system detection (target)
|
||||
//
|
||||
// V8_TARGET_OS_ANDROID
|
||||
// V8_TARGET_OS_FUCHSIA
|
||||
// V8_TARGET_OS_IOS
|
||||
// V8_TARGET_OS_LINUX
|
||||
// V8_TARGET_OS_MACOSX
|
||||
// V8_TARGET_OS_WIN
|
||||
//
|
||||
// If not set explicitly, these fall back to corresponding V8_OS_ values.
|
||||
|
||||
#ifdef V8_HAVE_TARGET_OS
|
||||
|
||||
// The target OS is provided, just check that at least one known value is set.
|
||||
# if !defined(V8_TARGET_OS_ANDROID) \
|
||||
&& !defined(V8_TARGET_OS_FUCHSIA) \
|
||||
&& !defined(V8_TARGET_OS_IOS) \
|
||||
&& !defined(V8_TARGET_OS_LINUX) \
|
||||
&& !defined(V8_TARGET_OS_MACOSX) \
|
||||
&& !defined(V8_TARGET_OS_WIN)
|
||||
# error No known target OS defined.
|
||||
# endif
|
||||
|
||||
#else // V8_HAVE_TARGET_OS
|
||||
|
||||
# if defined(V8_TARGET_OS_ANDROID) \
|
||||
|| defined(V8_TARGET_OS_FUCHSIA) \
|
||||
|| defined(V8_TARGET_OS_IOS) \
|
||||
|| defined(V8_TARGET_OS_LINUX) \
|
||||
|| defined(V8_TARGET_OS_MACOSX) \
|
||||
|| defined(V8_TARGET_OS_WIN)
|
||||
# error A target OS is defined but V8_HAVE_TARGET_OS is unset.
|
||||
# endif
|
||||
|
||||
// Fall back to the detected host OS.
|
||||
#ifdef V8_OS_ANDROID
|
||||
# define V8_TARGET_OS_ANDROID
|
||||
#endif
|
||||
|
||||
#ifdef V8_OS_FUCHSIA
|
||||
# define V8_TARGET_OS_FUCHSIA
|
||||
#endif
|
||||
|
||||
#ifdef V8_OS_IOS
|
||||
# define V8_TARGET_OS_IOS
|
||||
#endif
|
||||
|
||||
#ifdef V8_OS_LINUX
|
||||
# define V8_TARGET_OS_LINUX
|
||||
#endif
|
||||
|
||||
#ifdef V8_OS_MACOSX
|
||||
# define V8_TARGET_OS_MACOSX
|
||||
#endif
|
||||
|
||||
#ifdef V8_OS_WIN
|
||||
# define V8_TARGET_OS_WIN
|
||||
#endif
|
||||
|
||||
#endif // V8_HAVE_TARGET_OS
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// C library detection
|
||||
//
|
||||
// V8_LIBC_MSVCRT - MSVC libc
|
||||
// V8_LIBC_BIONIC - Bionic libc
|
||||
// V8_LIBC_BSD - BSD libc derivate
|
||||
// V8_LIBC_GLIBC - GNU C library
|
||||
// V8_LIBC_UCLIBC - uClibc
|
||||
//
|
||||
// Note that testing for libc must be done using #if not #ifdef. For example,
|
||||
// to test for the GNU C library, use:
|
||||
// #if V8_LIBC_GLIBC
|
||||
// ...
|
||||
// #endif
|
||||
|
||||
#if defined (_MSC_VER)
|
||||
# define V8_LIBC_MSVCRT 1
|
||||
#elif defined(__BIONIC__)
|
||||
# define V8_LIBC_BIONIC 1
|
||||
# define V8_LIBC_BSD 1
|
||||
#elif defined(__UCLIBC__)
|
||||
// Must test for UCLIBC before GLIBC, as UCLIBC pretends to be GLIBC.
|
||||
# define V8_LIBC_UCLIBC 1
|
||||
#elif defined(__GLIBC__) || defined(__GNU_LIBRARY__)
|
||||
# define V8_LIBC_GLIBC 1
|
||||
#else
|
||||
# define V8_LIBC_BSD V8_OS_BSD
|
||||
#endif
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Compiler detection
|
||||
//
|
||||
// V8_CC_GNU - GCC, or clang in gcc mode
|
||||
// V8_CC_INTEL - Intel C++
|
||||
// V8_CC_MINGW - Minimalist GNU for Windows
|
||||
// V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32)
|
||||
// V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64)
|
||||
// V8_CC_MSVC - Microsoft Visual C/C++, or clang in cl.exe mode
|
||||
//
|
||||
// C++11 feature detection
|
||||
//
|
||||
// Compiler-specific feature detection
|
||||
//
|
||||
// V8_HAS_ATTRIBUTE_ALWAYS_INLINE - __attribute__((always_inline))
|
||||
// supported
|
||||
// V8_HAS_ATTRIBUTE_NONNULL - __attribute__((nonnull)) supported
|
||||
// V8_HAS_ATTRIBUTE_NOINLINE - __attribute__((noinline)) 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))
|
||||
// supported
|
||||
// V8_HAS_BUILTIN_BSWAP16 - __builtin_bswap16() supported
|
||||
// V8_HAS_BUILTIN_BSWAP32 - __builtin_bswap32() supported
|
||||
// V8_HAS_BUILTIN_BSWAP64 - __builtin_bswap64() supported
|
||||
// V8_HAS_BUILTIN_CLZ - __builtin_clz() supported
|
||||
// V8_HAS_BUILTIN_CTZ - __builtin_ctz() supported
|
||||
// V8_HAS_BUILTIN_EXPECT - __builtin_expect() supported
|
||||
// V8_HAS_BUILTIN_FRAME_ADDRESS - __builtin_frame_address() supported
|
||||
// V8_HAS_BUILTIN_POPCOUNT - __builtin_popcount() supported
|
||||
// V8_HAS_BUILTIN_SADD_OVERFLOW - __builtin_sadd_overflow() supported
|
||||
// V8_HAS_BUILTIN_SSUB_OVERFLOW - __builtin_ssub_overflow() supported
|
||||
// V8_HAS_BUILTIN_UADD_OVERFLOW - __builtin_uadd_overflow() supported
|
||||
// V8_HAS_COMPUTED_GOTO - computed goto/labels as values
|
||||
// supported
|
||||
// V8_HAS_DECLSPEC_NOINLINE - __declspec(noinline) supported
|
||||
// V8_HAS_DECLSPEC_SELECTANY - __declspec(selectany) supported
|
||||
// V8_HAS___FORCEINLINE - __forceinline supported
|
||||
//
|
||||
// Note that testing for compilers and/or features must be done using #if
|
||||
// not #ifdef. For example, to test for Intel C++ Compiler, use:
|
||||
// #if V8_CC_INTEL
|
||||
// ...
|
||||
// #endif
|
||||
|
||||
#if defined(__clang__)
|
||||
|
||||
#if defined(__GNUC__) // Clang in gcc mode.
|
||||
# define V8_CC_GNU 1
|
||||
#endif
|
||||
|
||||
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
|
||||
# define V8_HAS_ATTRIBUTE_NONNULL (__has_attribute(nonnull))
|
||||
# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))
|
||||
# define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))
|
||||
# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
|
||||
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
|
||||
(__has_attribute(warn_unused_result))
|
||||
|
||||
# define V8_HAS_BUILTIN_ASSUME_ALIGNED (__has_builtin(__builtin_assume_aligned))
|
||||
# define V8_HAS_BUILTIN_BSWAP16 (__has_builtin(__builtin_bswap16))
|
||||
# define V8_HAS_BUILTIN_BSWAP32 (__has_builtin(__builtin_bswap32))
|
||||
# define V8_HAS_BUILTIN_BSWAP64 (__has_builtin(__builtin_bswap64))
|
||||
# define V8_HAS_BUILTIN_CLZ (__has_builtin(__builtin_clz))
|
||||
# define V8_HAS_BUILTIN_CTZ (__has_builtin(__builtin_ctz))
|
||||
# define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect))
|
||||
# define V8_HAS_BUILTIN_FRAME_ADDRESS (__has_builtin(__builtin_frame_address))
|
||||
# define V8_HAS_BUILTIN_POPCOUNT (__has_builtin(__builtin_popcount))
|
||||
# define V8_HAS_BUILTIN_SADD_OVERFLOW (__has_builtin(__builtin_sadd_overflow))
|
||||
# define V8_HAS_BUILTIN_SSUB_OVERFLOW (__has_builtin(__builtin_ssub_overflow))
|
||||
# define V8_HAS_BUILTIN_UADD_OVERFLOW (__has_builtin(__builtin_uadd_overflow))
|
||||
|
||||
// Clang has no __has_feature for computed gotos.
|
||||
// GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
|
||||
# define V8_HAS_COMPUTED_GOTO 1
|
||||
|
||||
// Whether constexpr has full C++14 semantics, in particular that non-constexpr
|
||||
// code is allowed as long as it's not executed for any constexpr instantiation.
|
||||
# define V8_HAS_CXX14_CONSTEXPR 1
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
|
||||
# define V8_CC_GNU 1
|
||||
# if defined(__INTEL_COMPILER) // Intel C++ also masquerades as GCC 3.2.0
|
||||
# define V8_CC_INTEL 1
|
||||
# endif
|
||||
# if defined(__MINGW32__)
|
||||
# define V8_CC_MINGW32 1
|
||||
# endif
|
||||
# if defined(__MINGW64__)
|
||||
# define V8_CC_MINGW64 1
|
||||
# endif
|
||||
# define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64)
|
||||
|
||||
// always_inline is available in gcc 4.0 but not very reliable until 4.4.
|
||||
// Works around "sorry, unimplemented: inlining failed" build errors with
|
||||
// older compilers.
|
||||
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE 1
|
||||
# define V8_HAS_ATTRIBUTE_NOINLINE 1
|
||||
# define V8_HAS_ATTRIBUTE_UNUSED 1
|
||||
# define V8_HAS_ATTRIBUTE_VISIBILITY 1
|
||||
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT (!V8_CC_INTEL)
|
||||
|
||||
# define V8_HAS_BUILTIN_ASSUME_ALIGNED 1
|
||||
# define V8_HAS_BUILTIN_CLZ 1
|
||||
# define V8_HAS_BUILTIN_CTZ 1
|
||||
# define V8_HAS_BUILTIN_EXPECT 1
|
||||
# define V8_HAS_BUILTIN_FRAME_ADDRESS 1
|
||||
# define V8_HAS_BUILTIN_POPCOUNT 1
|
||||
|
||||
// GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
|
||||
#define V8_HAS_COMPUTED_GOTO 1
|
||||
|
||||
// Whether constexpr has full C++14 semantics, in particular that non-constexpr
|
||||
// code is allowed as long as it's not executed for any constexpr instantiation.
|
||||
// GCC only supports this since version 6.
|
||||
# define V8_HAS_CXX14_CONSTEXPR (V8_GNUC_PREREQ(6, 0, 0))
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define V8_CC_MSVC 1
|
||||
|
||||
# define V8_HAS_DECLSPEC_NOINLINE 1
|
||||
# define V8_HAS_DECLSPEC_SELECTANY 1
|
||||
|
||||
# define V8_HAS___FORCEINLINE 1
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Helper macros
|
||||
|
||||
// A macro used to make better inlining. Don't bother for debug builds.
|
||||
// Use like:
|
||||
// V8_INLINE int GetZero() { return 0; }
|
||||
#if !defined(DEBUG) && V8_HAS_ATTRIBUTE_ALWAYS_INLINE
|
||||
# define V8_INLINE inline __attribute__((always_inline))
|
||||
#elif !defined(DEBUG) && V8_HAS___FORCEINLINE
|
||||
# define V8_INLINE __forceinline
|
||||
#else
|
||||
# define V8_INLINE inline
|
||||
#endif
|
||||
|
||||
#if V8_HAS_BUILTIN_ASSUME_ALIGNED
|
||||
# define V8_ASSUME_ALIGNED(ptr, alignment) \
|
||||
__builtin_assume_aligned((ptr), (alignment))
|
||||
#else
|
||||
# define V8_ASSUME_ALIGNED(ptr, alignment) (ptr)
|
||||
#endif
|
||||
|
||||
|
||||
// A macro to mark specific arguments as non-null.
|
||||
// Use like:
|
||||
// int add(int* x, int y, int* z) V8_NONNULL(1, 3) { return *x + y + *z; }
|
||||
#if V8_HAS_ATTRIBUTE_NONNULL
|
||||
# define V8_NONNULL(...) __attribute__((nonnull(__VA_ARGS__)))
|
||||
#else
|
||||
# define V8_NONNULL(...) /* NOT SUPPORTED */
|
||||
#endif
|
||||
|
||||
|
||||
// A macro used to tell the compiler to never inline a particular function.
|
||||
// Don't bother for debug builds.
|
||||
// Use like:
|
||||
// V8_NOINLINE int GetMinusOne() { return -1; }
|
||||
#if !defined(DEBUG) && V8_HAS_ATTRIBUTE_NOINLINE
|
||||
# define V8_NOINLINE __attribute__((noinline))
|
||||
#elif !defined(DEBUG) && V8_HAS_DECLSPEC_NOINLINE
|
||||
# define V8_NOINLINE __declspec(noinline)
|
||||
#else
|
||||
# define V8_NOINLINE /* NOT SUPPORTED */
|
||||
#endif
|
||||
|
||||
|
||||
// A macro (V8_DEPRECATED) to mark classes or functions as deprecated.
|
||||
#if defined(V8_DEPRECATION_WARNINGS)
|
||||
# define V8_DEPRECATED(message) [[deprecated(message)]]
|
||||
#else
|
||||
# define V8_DEPRECATED(message)
|
||||
#endif
|
||||
|
||||
|
||||
// A macro (V8_DEPRECATE_SOON) to make it easier to see what will be deprecated.
|
||||
#if defined(V8_IMMINENT_DEPRECATION_WARNINGS)
|
||||
# define V8_DEPRECATE_SOON(message) [[deprecated(message)]]
|
||||
#else
|
||||
# define V8_DEPRECATE_SOON(message)
|
||||
#endif
|
||||
|
||||
|
||||
// A macro to provide the compiler with branch prediction information.
|
||||
#if V8_HAS_BUILTIN_EXPECT
|
||||
# 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
|
||||
|
||||
|
||||
// Annotate a function indicating the caller must examine the return value.
|
||||
// Use like:
|
||||
// int foo() V8_WARN_UNUSED_RESULT;
|
||||
#if V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT
|
||||
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
|
||||
#else
|
||||
#define V8_WARN_UNUSED_RESULT /* NOT SUPPORTED */
|
||||
#endif
|
||||
|
||||
#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
|
||||
#error Inconsistent build configuration: To build the V8 shared library \
|
||||
set BUILDING_V8_SHARED, to include its headers for linking against the \
|
||||
V8 shared library set USING_V8_SHARED.
|
||||
#endif
|
||||
|
||||
#ifdef V8_OS_WIN
|
||||
|
||||
// Setup for Windows DLL export/import. When building the V8 DLL the
|
||||
// BUILDING_V8_SHARED needs to be defined. When building a program which uses
|
||||
// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
|
||||
// static library or building a program which uses the V8 static library neither
|
||||
// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
|
||||
#ifdef BUILDING_V8_SHARED
|
||||
# define V8_EXPORT __declspec(dllexport)
|
||||
#elif USING_V8_SHARED
|
||||
# define V8_EXPORT __declspec(dllimport)
|
||||
#else
|
||||
# define V8_EXPORT
|
||||
#endif // BUILDING_V8_SHARED
|
||||
|
||||
#else // V8_OS_WIN
|
||||
|
||||
// Setup for Linux shared library export.
|
||||
#if V8_HAS_ATTRIBUTE_VISIBILITY
|
||||
# ifdef BUILDING_V8_SHARED
|
||||
# define V8_EXPORT __attribute__ ((visibility("default")))
|
||||
# else
|
||||
# define V8_EXPORT
|
||||
# endif
|
||||
#else
|
||||
# define V8_EXPORT
|
||||
#endif
|
||||
|
||||
#endif // V8_OS_WIN
|
||||
|
||||
// clang-format on
|
||||
|
||||
#endif // V8CONFIG_H_
|
||||
Reference in New Issue
Block a user