forked from vovgou/ClearScriptForUnity3d
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathV8SplitProxyManaged.h
More file actions
158 lines (134 loc) · 8.79 KB
/
V8SplitProxyManaged.h
File metadata and controls
158 lines (134 loc) · 8.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
#pragma once
//-----------------------------------------------------------------------------
// V8 split proxy managed method list
//-----------------------------------------------------------------------------
//-------------------------------------------------------------------------------
// IMPORTANT: maintain synchronization with V8SplitProxyManaged.CreateMethodTable
//-------------------------------------------------------------------------------
#define V8_SPLIT_PROXY_MANAGED_METHOD_LIST \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, ScheduleForwardingException, const V8Value& exception) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, ScheduleInvalidOperationException, const StdString& message) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, ScheduleScriptEngineException, const StdString& engineName, const StdString& message, const StdString& stackTrace, StdBool isFatal, StdBool executionStarted, const V8Value& scriptException, const V8Value& innerException) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, ScheduleScriptInterruptedException, const StdString& engineName, const StdString& message, const StdString& stackTrace, StdBool isFatal, StdBool executionStarted, const V8Value& scriptException, const V8Value& innerException) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostAction, void* pvAction) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, ProcessArrayBufferOrViewData, void* pvData, void* pvAction) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, ProcessCpuProfile, const v8::CpuProfile& profile, void* pvAction) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void*, CreateV8ObjectCache) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, CacheV8Object, void* pvCache, void* pvObject, void* pvV8Object) \
V8_SPLIT_PROXY_MANAGED_METHOD(void*, GetCachedV8Object, void* pvCache, void* pvObject) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetAllCachedV8Objects, void* pvCache, std::vector<void*>& v8ObjectPtrs) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, RemoveV8ObjectCacheEntry, void* pvCache, void* pvObject) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void*, CreateDebugAgent, const StdString& name, const StdString& version, int32_t port, StdBool remote, V8DebugCallbackHandle* pCallbackHandle) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SendDebugMessage, void* pvAgent, const StdString& content) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, DestroyDebugAgent, void* pvAgent) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(uint32_t, GetMaxScriptCacheSize) \
V8_SPLIT_PROXY_MANAGED_METHOD(uint32_t, GetMaxModuleCacheSize) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void*, AddRefHostObject, void* pvObject) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, ReleaseHostObject, void* pvObject) \
V8_SPLIT_PROXY_MANAGED_METHOD(IHostObjectUtil::Invocability, GetHostObjectInvocability, void* pvObject) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectNamedProperty, void* pvObject, const StdString& name, V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectNamedPropertyWithCacheability, void* pvObject, const StdString& name, V8Value& value, StdBool& isCacheable) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SetHostObjectNamedProperty, void* pvObject, const StdString& name, const V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, DeleteHostObjectNamedProperty, void* pvObject, const StdString& name) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectPropertyNames, void* pvObject, std::vector<StdString>& names) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectIndexedProperty, void* pvObject, int32_t index, V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SetHostObjectIndexedProperty, void* pvObject, int32_t index, const V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, DeleteHostObjectIndexedProperty, void* pvObject, int32_t index) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectPropertyIndices, void* pvObject, std::vector<int32_t>& indices) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostObject, void* pvObject, StdBool asConstructor, const std::vector<V8Value>& args, V8Value& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostObjectMethod, void* pvObject, const StdString& name, const std::vector<V8Value>& args, V8Value& result) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetEnumeratorForHostObject, void* pvObject, V8Value& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, AdvanceEnumerator, void* pvEnumerator, V8Value& value) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, QueueNativeCallback, NativeCallbackHandle* pCallbackHandle) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void*, CreateNativeCallbackTimer, int32_t dueTime, int32_t period, NativeCallbackHandle* pCallbackHandle) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, ChangeNativeCallbackTimer, void* pvTimer, int32_t dueTime, int32_t period) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, DestroyNativeCallbackTimer, void* pvTimer) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, LoadModule, void* pvSourceDocumentInfo, const StdString& specifier, StdString& resourceName, StdString& sourceMapUrl, uint64_t& uniqueId, StdBool& isModule, StdString& code, void*& pvDocumentInfo) \
V8_SPLIT_PROXY_MANAGED_METHOD(int32_t, CreateModuleContext, void* pvDocumentInfo, std::vector<StdString>& names, std::vector<V8Value>& values) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, TryParseInt32, const StdString& text, int32_t& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, WriteBytesToStream, void* pvStream, const uint8_t* pBytes, int32_t count)
//-----------------------------------------------------------------------------
// V8SplitProxyManaged
//-----------------------------------------------------------------------------
class V8SplitProxyManaged final: StaticBase
{
public:
enum class MethodSlot
{
#define V8_SPLIT_PROXY_MANAGED_METHOD(TYPE, NAME, ...) NAME,
V8_SPLIT_PROXY_MANAGED_METHOD_LIST
#undef V8_SPLIT_PROXY_MANAGED_METHOD
};
struct Method: StaticBase
{
#define V8_SPLIT_PROXY_MANAGED_METHOD(TYPE, NAME, ...) typedef MANAGED_METHOD(TYPE) NAME(__VA_ARGS__);
V8_SPLIT_PROXY_MANAGED_METHOD_LIST
#undef V8_SPLIT_PROXY_MANAGED_METHOD
};
static void** SetMethodTable(void** pMethodTable) noexcept;
static void SetHostException(HostException&& exception) noexcept;
template <typename T>
static T Invoke(const std::function<T(void** pMethodTable)>& action)
{
auto pMethodTable = ms_pMethodTable;
_ASSERTE(pMethodTable != nullptr);
BEGIN_PULSE_VALUE_SCOPE(&ms_pHostException, nullptr)
auto result = action(pMethodTable);
ThrowHostException();
return result;
END_PULSE_VALUE_SCOPE
}
static void InvokeVoid(const std::function<void(void** pMethodTable)>& action)
{
auto pMethodTable = ms_pMethodTable;
_ASSERTE(pMethodTable != nullptr);
BEGIN_PULSE_VALUE_SCOPE(&ms_pHostException, nullptr)
action(pMethodTable);
ThrowHostException();
END_PULSE_VALUE_SCOPE
}
template <typename T>
static T InvokeNoThrow(const std::function<T(void** pMethodTable)>& action) noexcept
{
auto pMethodTable = ms_pMethodTable;
_ASSERTE(pMethodTable != nullptr);
return action(pMethodTable);
}
static void InvokeVoidNoThrow(const std::function<void(void** pMethodTable)>& action) noexcept
{
auto pMethodTable = ms_pMethodTable;
_ASSERTE(pMethodTable != nullptr);
action(pMethodTable);
}
private:
static void ThrowHostException();
static thread_local void** ms_pMethodTable;
static thread_local HostException* ms_pHostException;
};
//-----------------------------------------------------------------------------
#define V8_SPLIT_PROXY_MANAGED_CALL(TABLE, NAME, ...) \
reinterpret_cast<V8SplitProxyManaged::Method::NAME*>((TABLE)[static_cast<std::underlying_type_t<V8SplitProxyManaged::MethodSlot>>(V8SplitProxyManaged::MethodSlot::NAME)])(__VA_ARGS__)
#define V8_SPLIT_PROXY_MANAGED_INVOKE(TYPE, NAME, ...) \
V8SplitProxyManaged::Invoke<TYPE>([&] (void** pMethodTable) noexcept { return V8_SPLIT_PROXY_MANAGED_CALL(pMethodTable, NAME, __VA_ARGS__); })
#define V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(NAME, ...) \
V8SplitProxyManaged::InvokeVoid([&] (void** pMethodTable) noexcept { V8_SPLIT_PROXY_MANAGED_CALL(pMethodTable, NAME, __VA_ARGS__); })
#define V8_SPLIT_PROXY_MANAGED_INVOKE_NOTHROW(TYPE, NAME, ...) \
V8SplitProxyManaged::InvokeNoThrow<TYPE>([&] (void** pMethodTable) noexcept { return V8_SPLIT_PROXY_MANAGED_CALL(pMethodTable, NAME, __VA_ARGS__); })
#define V8_SPLIT_PROXY_MANAGED_INVOKE_VOID_NOTHROW(NAME, ...) \
V8SplitProxyManaged::InvokeVoidNoThrow([&] (void** pMethodTable) noexcept { V8_SPLIT_PROXY_MANAGED_CALL(pMethodTable, NAME, __VA_ARGS__); })