emnapi 1.11.0 → 2.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CMakeLists.txt +127 -57
- package/README.md +164 -776
- package/cmake/wasm32.cmake +0 -3
- package/common.gypi +16 -14
- package/dist/library_async_work.js +390 -0
- package/dist/library_napi.js +1476 -2802
- package/dist/library_threadsafe_function.js +1178 -0
- package/dist/library_v8.js +1594 -0
- package/emnapi.gyp +37 -0
- package/include/node/emnapi.h +13 -2
- package/include/node/js_native_api_types.h +22 -0
- package/include/node/node.h +198 -0
- package/include/node/node_api.h +0 -10
- package/include/node/node_buffer.h +92 -0
- package/include/node/node_object_wrap.h +132 -0
- package/include/node/node_version.h +110 -0
- package/include/node/uv/unix.h +1 -0
- package/include/node/uv/version.h +43 -0
- package/include/node/uv.h +6 -0
- package/index.js +15 -7
- package/lib/wasm32-emscripten/libemnapi-mt.a +0 -0
- package/lib/wasm32-emscripten/libemnapi.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-napi-rs-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi.a +0 -0
- package/lib/wasm64-emscripten/libemnapi-mt.a +0 -0
- package/lib/wasm64-emscripten/libemnapi.a +0 -0
- package/package.json +1 -1
- package/src/async_cleanup_hook.c +6 -6
- package/src/emnapi_internal.h +5 -10
- package/src/js_native_api.c +37 -21
- package/src/js_native_api_internal.h +66 -0
- package/src/node_api.c +1 -1
- package/src/threadsafe_function.c +2 -2
- package/src/uv/unix/thread.c +21 -0
- package/src/v8/array.cc +19 -0
- package/src/v8/boolean.cc +26 -0
- package/src/v8/date.cc +15 -0
- package/src/v8/exception.cc +48 -0
- package/src/v8/external.cc +23 -0
- package/src/v8/function.cc +35 -0
- package/src/v8/handle_scope.cc +46 -0
- package/src/v8/internal.cc +126 -0
- package/src/v8/internal.h +41 -0
- package/src/v8/isolate.cc +35 -0
- package/src/v8/json.cc +25 -0
- package/src/v8/node.cc +24 -0
- package/src/v8/number.cc +62 -0
- package/src/v8/object.cc +106 -0
- package/src/v8/script.cc +75 -0
- package/src/v8/string.cc +104 -0
- package/src/v8/template.cc +234 -0
- package/src/v8/try_catch.cc +50 -0
- package/src/v8/v8_impl.h +42 -0
- package/src/v8/value.cc +138 -0
- package/lib/wasm32/libdlmalloc-mt.a +0 -0
- package/lib/wasm32/libdlmalloc.a +0 -0
- package/lib/wasm32/libemmalloc-mt.a +0 -0
- package/lib/wasm32/libemmalloc.a +0 -0
- package/lib/wasm32/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32/libemnapi-basic.a +0 -0
- package/lib/wasm32/libemnapi.a +0 -0
- package/lib/wasm32-emscripten/libemnapi-basic.a +0 -0
- package/lib/wasm32-wasi/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasi/libemnapi-basic.a +0 -0
- package/lib/wasm32-wasi/libemnapi.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-basic-napi-rs-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-basic.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi-napi-rs-mt.a +0 -0
- package/lib/wasm32-wasi-threads/libemnapi.a +0 -0
- package/lib/wasm32-wasip1/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasip1/libemnapi-basic.a +0 -0
- package/lib/wasm32-wasip1/libemnapi.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-basic-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-basic-napi-rs-mt.a +0 -0
- package/lib/wasm32-wasip1-threads/libemnapi-basic.a +0 -0
- package/lib/wasm64-emscripten/libemnapi-basic.a +0 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
#include "internal.h"
|
|
3
|
+
|
|
4
|
+
namespace v8 {
|
|
5
|
+
|
|
6
|
+
extern "C" {
|
|
7
|
+
V8_EXTERN internal::Address _v8_globalize_reference(
|
|
8
|
+
internal::Isolate* isolate, internal::Address value);
|
|
9
|
+
V8_EXTERN internal::Address _v8_copy_global_reference(internal::Address from);
|
|
10
|
+
V8_EXTERN internal::Address _v8_local_from_global_reference(internal::Address ref);
|
|
11
|
+
V8_EXTERN void _v8_move_global_reference(internal::Address from,
|
|
12
|
+
internal::Address to);
|
|
13
|
+
V8_EXTERN void _v8_dispose_global(internal::Address global_handle);
|
|
14
|
+
V8_EXTERN void _v8_make_weak(internal::Address location,
|
|
15
|
+
void* data,
|
|
16
|
+
void (*callback)(
|
|
17
|
+
WeakCallbackInfo<void>::Callback weak_callback,
|
|
18
|
+
void* data, WeakCallbackType type,
|
|
19
|
+
void* internal_field1, void* internal_field2),
|
|
20
|
+
WeakCallbackInfo<void>::Callback weak_callback,
|
|
21
|
+
WeakCallbackType type);
|
|
22
|
+
V8_EXTERN void* _v8_clear_weak(internal::Address location);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
namespace internal {
|
|
26
|
+
|
|
27
|
+
Isolate* IsolateFromNeverReadOnlySpaceObject(unsigned long obj) {
|
|
28
|
+
return reinterpret_cast<Isolate*>(v8::Isolate::GetCurrent());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void Internals::CheckInitializedImpl(v8::Isolate*) {}
|
|
32
|
+
|
|
33
|
+
void VerifyHandleIsNonEmpty(bool is_empty) {
|
|
34
|
+
if (is_empty) {
|
|
35
|
+
abort();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Isolate::Isolate(): data_{} {
|
|
40
|
+
*reinterpret_cast<internal::Address*>(data_ + internal::Internals::kIsolateRootsOffset + v8::internal::kApiSystemPointerSize * v8::internal::Internals::kUndefinedValueRootIndex) = static_cast<internal::Address>(v8impl::Constant::kUndefined);
|
|
41
|
+
*reinterpret_cast<internal::Address*>(data_ + internal::Internals::kIsolateRootsOffset + v8::internal::kApiSystemPointerSize * v8::internal::Internals::kTheHoleValueRootIndex) = static_cast<internal::Address>(v8impl::Constant::kHole);
|
|
42
|
+
*reinterpret_cast<internal::Address*>(data_ + internal::Internals::kIsolateRootsOffset + v8::internal::kApiSystemPointerSize * v8::internal::Internals::kNullValueRootIndex) = static_cast<internal::Address>(v8impl::Constant::kNull);
|
|
43
|
+
*reinterpret_cast<internal::Address*>(data_ + internal::Internals::kIsolateRootsOffset + v8::internal::kApiSystemPointerSize * v8::internal::Internals::kFalseValueRootIndex) = static_cast<internal::Address>(v8impl::Constant::kFalse);
|
|
44
|
+
*reinterpret_cast<internal::Address*>(data_ + internal::Internals::kIsolateRootsOffset + v8::internal::kApiSystemPointerSize * v8::internal::Internals::kTrueValueRootIndex) = static_cast<internal::Address>(v8impl::Constant::kTrue);
|
|
45
|
+
*reinterpret_cast<internal::Address*>(data_ + internal::Internals::kIsolateRootsOffset + v8::internal::kApiSystemPointerSize * v8::internal::Internals::kEmptyStringRootIndex) = static_cast<internal::Address>(v8impl::Constant::kEmptyString);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
struct GlobalHandle {
|
|
49
|
+
Address object;
|
|
50
|
+
Address ref;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
namespace api_internal {
|
|
56
|
+
|
|
57
|
+
void ToLocalEmpty() {
|
|
58
|
+
abort();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void FromJustIsNothing() {
|
|
62
|
+
abort();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
internal::Address* GlobalizeReference(internal::Isolate* isolate,
|
|
66
|
+
internal::Address value) {
|
|
67
|
+
internal::Address ref_id = _v8_globalize_reference(isolate, value);
|
|
68
|
+
return reinterpret_cast<internal::Address*>(new internal::GlobalHandle{0x80000000u + ref_id, ref_id});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void DisposeGlobal(internal::Address* global_handle) {
|
|
72
|
+
_v8_dispose_global(reinterpret_cast<internal::GlobalHandle*>(global_handle)->ref);
|
|
73
|
+
delete reinterpret_cast<internal::GlobalHandle*>(global_handle);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
internal::Address* CopyGlobalReference(internal::Address* from) {
|
|
77
|
+
internal::Address ref_id = _v8_copy_global_reference(reinterpret_cast<internal::GlobalHandle*>(from)->ref);
|
|
78
|
+
return reinterpret_cast<internal::Address*>(new internal::GlobalHandle{0x80000000u + ref_id, ref_id});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
internal::Address LocalFromGlobalReference(internal::Address global_handle) {
|
|
82
|
+
return _v8_local_from_global_reference(global_handle);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
void MoveGlobalReference(internal::Address** from, internal::Address** to) {
|
|
86
|
+
if (*from == *to) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
*to = *from;
|
|
90
|
+
*from = nullptr;
|
|
91
|
+
// _v8_move_global_reference(**from, **to);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
namespace {
|
|
95
|
+
static void WeakCallback(WeakCallbackInfo<void>::Callback weak_callback,
|
|
96
|
+
void* data,
|
|
97
|
+
WeakCallbackType type,
|
|
98
|
+
void* internal_field1,
|
|
99
|
+
void* internal_field2) {
|
|
100
|
+
void* embedder_fields[kEmbedderFieldsInWeakCallback] = {
|
|
101
|
+
internal_field1, internal_field2
|
|
102
|
+
};
|
|
103
|
+
WeakCallbackInfo<void>::Callback second = nullptr;
|
|
104
|
+
WeakCallbackInfo<void> info(
|
|
105
|
+
Isolate::GetCurrent(), data,
|
|
106
|
+
embedder_fields, &second);
|
|
107
|
+
weak_callback(info);
|
|
108
|
+
if (second != nullptr) {
|
|
109
|
+
second(info);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
void MakeWeak(internal::Address* location, void* data,
|
|
115
|
+
WeakCallbackInfo<void>::Callback weak_callback,
|
|
116
|
+
WeakCallbackType type) {
|
|
117
|
+
_v8_make_weak(*location, data, WeakCallback, weak_callback, type);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
void* ClearWeak(internal::Address* location) {
|
|
121
|
+
return _v8_clear_weak(*location);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
} // namespace api_internal
|
|
125
|
+
|
|
126
|
+
} // namespace v8
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#ifndef EMNAPI_V8_INTERNAL_H_
|
|
2
|
+
#define EMNAPI_V8_INTERNAL_H_
|
|
3
|
+
|
|
4
|
+
#include "v8.h"
|
|
5
|
+
|
|
6
|
+
namespace v8 {
|
|
7
|
+
|
|
8
|
+
namespace internal {
|
|
9
|
+
|
|
10
|
+
struct HandleScopeData final {
|
|
11
|
+
static constexpr uint32_t kSizeInBytes =
|
|
12
|
+
2 * v8::internal::kApiSystemPointerSize + 2 * v8::internal::kApiInt32Size;
|
|
13
|
+
|
|
14
|
+
Address* next;
|
|
15
|
+
Address* limit;
|
|
16
|
+
int level;
|
|
17
|
+
int sealed_level;
|
|
18
|
+
|
|
19
|
+
void Initialize() {
|
|
20
|
+
next = limit = nullptr;
|
|
21
|
+
sealed_level = level = 0;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
class Isolate {
|
|
26
|
+
private:
|
|
27
|
+
char data_[1024];
|
|
28
|
+
|
|
29
|
+
public:
|
|
30
|
+
explicit Isolate();
|
|
31
|
+
|
|
32
|
+
V8_INLINE HandleScopeData* handle_scope_data() {
|
|
33
|
+
return reinterpret_cast<HandleScopeData*>(data_ + internal::Internals::kIsolateHandleScopeDataOffset);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
#endif
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
#include "internal.h"
|
|
3
|
+
|
|
4
|
+
namespace v8 {
|
|
5
|
+
|
|
6
|
+
extern "C" {
|
|
7
|
+
V8_EXTERN internal::Address _v8_isolate_get_current_context(const Isolate* isolate);
|
|
8
|
+
V8_EXTERN internal::Address _v8_isolate_throw_exception(v8::internal::Address);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
void Context::CheckCast(v8::Data*) {}
|
|
12
|
+
|
|
13
|
+
Isolate* Context::GetIsolate() {
|
|
14
|
+
return v8::Isolate::GetCurrent();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Local<Context> Context::New(v8::Isolate*, v8::ExtensionConfiguration*, v8::MaybeLocal<v8::ObjectTemplate>, v8::MaybeLocal<v8::Value>, v8::DeserializeInternalFieldsCallback, v8::MicrotaskQueue*, v8::DeserializeContextDataCallback) {
|
|
18
|
+
return v8impl::V8LocalValueFromAddress(_v8_isolate_get_current_context(nullptr)).As<Context>();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
Isolate* Isolate::GetCurrent() {
|
|
22
|
+
static internal::Isolate current_isolate;
|
|
23
|
+
return reinterpret_cast<Isolate*>(¤t_isolate);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Local<Context> Isolate::GetCurrentContext() {
|
|
27
|
+
return v8impl::V8LocalValueFromAddress(_v8_isolate_get_current_context(this)).As<Context>();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
Local<Value> Isolate::ThrowException(Local<Value> error) {
|
|
31
|
+
return v8impl::V8LocalValueFromAddress(
|
|
32
|
+
_v8_isolate_throw_exception(v8impl::AddressFromV8LocalValue(error)));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
}
|
package/src/v8/json.cc
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
|
|
3
|
+
namespace v8 {
|
|
4
|
+
|
|
5
|
+
extern "C" {
|
|
6
|
+
V8_EXTERN internal::Address _v8_json_parse(Context* context, internal::Address json_string);
|
|
7
|
+
V8_EXTERN internal::Address _v8_json_stringify(Context* context, internal::Address json_object, internal::Address gap);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
MaybeLocal<Value> JSON::Parse(
|
|
11
|
+
Local<Context> context, Local<String> json_string) {
|
|
12
|
+
internal::Address value_address = _v8_json_parse(*context, v8impl::AddressFromV8LocalValue(json_string));
|
|
13
|
+
if (!value_address) return MaybeLocal<Value>();
|
|
14
|
+
return v8impl::V8LocalValueFromAddress(value_address);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
MaybeLocal<String> JSON::Stringify(
|
|
18
|
+
Local<Context> context, Local<Value> json_object,
|
|
19
|
+
Local<String> gap) {
|
|
20
|
+
internal::Address value_address = _v8_json_stringify(*context, v8impl::AddressFromV8LocalValue(json_object), v8impl::AddressFromV8LocalValue(gap));
|
|
21
|
+
if (!value_address) return MaybeLocal<String>();
|
|
22
|
+
return v8impl::V8LocalValueFromAddress(value_address).As<String>();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
package/src/v8/node.cc
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#include "node.h"
|
|
2
|
+
#include "v8_impl.h"
|
|
3
|
+
|
|
4
|
+
namespace node {
|
|
5
|
+
|
|
6
|
+
extern "C" {
|
|
7
|
+
V8_EXTERN v8::internal::Address _node_encode(v8::Isolate*, const void* buf, size_t len, int encoding);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
v8::Local<v8::Value> Encode(v8::Isolate* isolate,
|
|
11
|
+
const char* buf,
|
|
12
|
+
size_t len,
|
|
13
|
+
enum encoding encoding) {
|
|
14
|
+
return v8::v8impl::V8LocalValueFromAddress(
|
|
15
|
+
_node_encode(isolate, buf, len, static_cast<int>(encoding)));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
v8::Local<v8::Value> Encode(v8::Isolate* isolate,
|
|
19
|
+
const uint16_t* buf,
|
|
20
|
+
size_t len) {
|
|
21
|
+
return v8::v8impl::V8LocalValueFromAddress(_node_encode(isolate, buf, len, -1));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
package/src/v8/number.cc
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
|
|
3
|
+
namespace v8 {
|
|
4
|
+
|
|
5
|
+
extern "C" {
|
|
6
|
+
V8_EXTERN internal::Address _v8_integer_new(Isolate*, int32_t);
|
|
7
|
+
V8_EXTERN internal::Address _v8_integer_new_from_unsigned(Isolate*, uint32_t);
|
|
8
|
+
V8_EXTERN internal::Address _v8_number_new(Isolate*, double);
|
|
9
|
+
V8_EXTERN double _v8_number_value(const Number*);
|
|
10
|
+
V8_EXTERN void _v8_integer_value(const Integer*, int64_t*);
|
|
11
|
+
V8_EXTERN uint32_t _v8_uint32_value(const Uint32*);
|
|
12
|
+
V8_EXTERN int32_t _v8_int32_value(const Int32*);
|
|
13
|
+
V8_EXTERN internal::Address _v8_number_object_new(Isolate* isolate, double value);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
void Number::CheckCast(v8::Data*) {}
|
|
17
|
+
void Integer::CheckCast(v8::Data*) {}
|
|
18
|
+
void Uint32::CheckCast(v8::Data*) {}
|
|
19
|
+
void Int32::CheckCast(v8::Data*) {}
|
|
20
|
+
|
|
21
|
+
double Number::Value() const {
|
|
22
|
+
return _v8_number_value(this);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
int64_t Integer::Value() const {
|
|
26
|
+
int64_t ret = 0;
|
|
27
|
+
_v8_integer_value(this, &ret);
|
|
28
|
+
return ret;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
uint32_t Uint32::Value() const {
|
|
32
|
+
return _v8_uint32_value(this);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
int32_t Int32::Value() const {
|
|
36
|
+
return _v8_int32_value(this);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Local<Number> Number::New(Isolate* isolate, double value) {
|
|
40
|
+
internal::Address number_value = _v8_number_new(isolate, value);
|
|
41
|
+
if (!number_value) return Local<Number>();
|
|
42
|
+
return v8impl::V8LocalValueFromAddress(number_value).As<Number>();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Local<Integer> Integer::NewFromUnsigned(Isolate* isolate, uint32_t value) {
|
|
46
|
+
internal::Address number_value = _v8_integer_new_from_unsigned(isolate, value);
|
|
47
|
+
if (!number_value) return Local<Integer>();
|
|
48
|
+
return v8impl::V8LocalValueFromAddress(number_value).As<Integer>();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Local<Integer> Integer::New(Isolate* isolate, int32_t value) {
|
|
52
|
+
internal::Address number_value = _v8_integer_new(isolate, value);
|
|
53
|
+
if (!number_value) return Local<Integer>();
|
|
54
|
+
return v8impl::V8LocalValueFromAddress(number_value).As<Integer>();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Local<Value> NumberObject::New(Isolate* isolate, double value) {
|
|
58
|
+
auto n = _v8_number_object_new(isolate, value);
|
|
59
|
+
return v8impl::V8LocalValueFromAddress(n);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
package/src/v8/object.cc
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
|
|
3
|
+
namespace v8 {
|
|
4
|
+
|
|
5
|
+
extern "C" {
|
|
6
|
+
V8_EXTERN int _v8_object_set(Object* obj, Context* context, internal::Address key, internal::Address value, int* success);
|
|
7
|
+
V8_EXTERN void _v8_object_set_internal_field(Object* obj, int index, internal::Address data);
|
|
8
|
+
V8_EXTERN void _v8_object_set_aligned_pointer_in_internal_field(Object* obj, int index, void* data);
|
|
9
|
+
V8_EXTERN void* _v8_object_get_aligned_pointer_in_internal_field(Object* obj, int index);
|
|
10
|
+
V8_EXTERN internal::Address _v8_object_get_internal_field(Object* obj, int index);
|
|
11
|
+
V8_EXTERN internal::Address _v8_object_get_key(Object* obj, Context* context, internal::Address index);
|
|
12
|
+
V8_EXTERN internal::Address _v8_object_get_index(Object* obj, Context* context, uint32_t index);
|
|
13
|
+
V8_EXTERN int _v8_object_internal_field_count(const Object* obj);
|
|
14
|
+
V8_EXTERN int _v8_object_set_private(Object* obj, Context* context, internal::Address key, internal::Address value, int* success);
|
|
15
|
+
V8_EXTERN int _v8_object_has_private(Object* obj, Context* context, internal::Address key, int* has);
|
|
16
|
+
V8_EXTERN internal::Address _v8_object_get_private(Object* obj, Context* context, internal::Address key);
|
|
17
|
+
V8_EXTERN int _v8_object_delete_private(Object* obj, Context* context, internal::Address key, int* success);
|
|
18
|
+
V8_EXTERN internal::Address _v8_object_new(Isolate* isolate);
|
|
19
|
+
V8_EXTERN internal::Address _v8_private_for_api(Isolate* isolate, internal::Address name);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
void Object::CheckCast(v8::Value*) {}
|
|
23
|
+
|
|
24
|
+
MaybeLocal<Value> Object::Get(v8::Local<v8::Context> context, uint32_t index) {
|
|
25
|
+
internal::Address value_address = _v8_object_get_index(this, *context, index);
|
|
26
|
+
if (!value_address) return MaybeLocal<Value>();
|
|
27
|
+
return v8impl::V8LocalValueFromAddress(value_address).As<Value>();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
MaybeLocal<Value> Object::Get(v8::Local<v8::Context> context, v8::Local<v8::Value> key) {
|
|
31
|
+
internal::Address value_address = _v8_object_get_key(this, *context, v8impl::AddressFromV8LocalValue(key));
|
|
32
|
+
if (!value_address) return MaybeLocal<Value>();
|
|
33
|
+
return v8impl::V8LocalValueFromAddress(value_address).As<Value>();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
Maybe<bool> Object::Set(v8::Local<v8::Context> context, v8::Local<v8::Value> key, v8::Local<v8::Value> value) {
|
|
37
|
+
int success = 0;
|
|
38
|
+
int r = _v8_object_set(this, *context,
|
|
39
|
+
v8impl::AddressFromV8LocalValue(key), v8impl::AddressFromV8LocalValue(value), &success);
|
|
40
|
+
if (r != 0) return Nothing<bool>();
|
|
41
|
+
return Just<bool>(success);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
Maybe<bool> Object::SetPrivate(Local<Context> context, Local<Private> key, Local<Value> value) {
|
|
45
|
+
int success = 0;
|
|
46
|
+
int r = _v8_object_set_private(this, *context, reinterpret_cast<internal::Address>(*key), reinterpret_cast<internal::Address>(*value), &success);
|
|
47
|
+
if (r != 0) return Nothing<bool>();
|
|
48
|
+
return Just<bool>(success);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Maybe<bool> Object::HasPrivate(Local<Context> context, Local<Private> key) {
|
|
52
|
+
int has = 0;
|
|
53
|
+
int r = _v8_object_has_private(this, *context, reinterpret_cast<internal::Address>(*key), &has);
|
|
54
|
+
if (r != 0) return Nothing<bool>();
|
|
55
|
+
return Just<bool>(has != 0);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
MaybeLocal<Value> Object::GetPrivate(Local<Context> context, Local<Private> key) {
|
|
59
|
+
internal::Address value_address = _v8_object_get_private(this, *context, reinterpret_cast<internal::Address>(*key));
|
|
60
|
+
if (!value_address) return MaybeLocal<Value>();
|
|
61
|
+
return v8impl::V8LocalValueFromAddress(value_address).As<Value>();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
Maybe<bool> Object::DeletePrivate(Local<Context> context, Local<Private> key) {
|
|
65
|
+
int success = 0;
|
|
66
|
+
int r = _v8_object_delete_private(this, *context, reinterpret_cast<internal::Address>(*key), &success);
|
|
67
|
+
if (r != 0) return Nothing<bool>();
|
|
68
|
+
return Just<bool>(success);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
Local<Object> Object::New(Isolate* isolate) {
|
|
72
|
+
internal::Address v = _v8_object_new(isolate);
|
|
73
|
+
return v8impl::V8LocalValueFromAddress(v).As<Object>();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
Local<Private> Private::ForApi(Isolate* isolate, Local<String> name) {
|
|
77
|
+
internal::Address addr = _v8_private_for_api(isolate, v8impl::AddressFromV8LocalValue(name));
|
|
78
|
+
if (!addr) return Local<Private>();
|
|
79
|
+
return v8impl::V8LocalValueFromAddress(addr).As<Private>();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
void Object::SetInternalField(int index, v8::Local<v8::Data> data) {
|
|
83
|
+
_v8_object_set_internal_field(this, index, reinterpret_cast<internal::Address>(*data));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void Object::SetAlignedPointerInInternalField(int index, void* data) {
|
|
87
|
+
_v8_object_set_aligned_pointer_in_internal_field(this, index, data);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
void* Object::SlowGetAlignedPointerFromInternalField(int index) {
|
|
91
|
+
return _v8_object_get_aligned_pointer_in_internal_field(this, index);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
int Object::InternalFieldCount() const {
|
|
95
|
+
return _v8_object_internal_field_count(this);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
Local<Data> Object::SlowGetInternalField(int index) {
|
|
99
|
+
internal::Address data_value = _v8_object_get_internal_field(this, index);
|
|
100
|
+
Local<Data> data;
|
|
101
|
+
if (!data_value) return data;
|
|
102
|
+
memcpy(static_cast<void*>(&data), &data_value, sizeof(data_value));
|
|
103
|
+
return data;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
}
|
package/src/v8/script.cc
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
|
|
3
|
+
namespace v8 {
|
|
4
|
+
|
|
5
|
+
extern "C" {
|
|
6
|
+
V8_EXTERN internal::Address _v8_unbound_script_bind_to_current_context(UnboundScript*);
|
|
7
|
+
V8_EXTERN internal::Address _v8_script_run(Script* self, Context* context);
|
|
8
|
+
V8_EXTERN internal::Address _v8_script_compiler_compile_unbound_script(
|
|
9
|
+
Isolate* isolate,
|
|
10
|
+
internal::Address source_string,
|
|
11
|
+
int options,
|
|
12
|
+
int no_cache_reason);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
namespace internal {
|
|
16
|
+
|
|
17
|
+
class BackgroundDeserializeTask {};
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
void ScriptOrigin::VerifyHostDefinedOptions() const {
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
Local<Script> UnboundScript::BindToCurrentContext() {
|
|
26
|
+
Local<Script> ret;
|
|
27
|
+
internal::Address v = _v8_unbound_script_bind_to_current_context(this);
|
|
28
|
+
memcpy(static_cast<void*>(&ret), &v, sizeof(v));
|
|
29
|
+
return ret;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
MaybeLocal<Value> Script::Run(Local<Context> context) {
|
|
33
|
+
return v8impl::V8LocalValueFromAddress(_v8_script_run(this, *context));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context, Source* source, ScriptCompiler::CompileOptions options, v8::ScriptCompiler::NoCacheReason no_cache_reason) {
|
|
37
|
+
if (!source || source->source_string.IsEmpty()) return Local<Script>();
|
|
38
|
+
MaybeLocal<UnboundScript> unbound = CompileUnboundScript(
|
|
39
|
+
context->GetIsolate(), source, options, no_cache_reason);
|
|
40
|
+
if (unbound.IsEmpty()) return Local<Script>();
|
|
41
|
+
return unbound.ToLocalChecked()->BindToCurrentContext();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
MaybeLocal<UnboundScript>
|
|
45
|
+
ScriptCompiler::CompileUnboundScript(Isolate* isolate,
|
|
46
|
+
ScriptCompiler::Source* source,
|
|
47
|
+
ScriptCompiler::CompileOptions options,
|
|
48
|
+
ScriptCompiler::NoCacheReason reason) {
|
|
49
|
+
if (!source || source->source_string.IsEmpty()) return Local<UnboundScript>();
|
|
50
|
+
Local<UnboundScript> ret;
|
|
51
|
+
internal::Address v = _v8_script_compiler_compile_unbound_script(
|
|
52
|
+
isolate,
|
|
53
|
+
v8impl::AddressFromV8LocalValue(source->source_string),
|
|
54
|
+
options,
|
|
55
|
+
reason
|
|
56
|
+
);
|
|
57
|
+
memcpy(static_cast<void*>(&ret), &v, sizeof(v));
|
|
58
|
+
return ret;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
ScriptCompiler::ConsumeCodeCacheTask::~ConsumeCodeCacheTask() {
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
ScriptCompiler::CachedData::~CachedData() {
|
|
66
|
+
if (buffer_policy == BufferOwned) {
|
|
67
|
+
if (data != nullptr) {
|
|
68
|
+
delete[] data;
|
|
69
|
+
data = nullptr;
|
|
70
|
+
length = 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
}
|
package/src/v8/string.cc
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#include "v8_impl.h"
|
|
2
|
+
|
|
3
|
+
namespace v8 {
|
|
4
|
+
|
|
5
|
+
extern "C" {
|
|
6
|
+
V8_EXTERN internal::Address _v8_string_new_from_utf8(Isolate* isolate, const char* data, v8::NewStringType type, int length);
|
|
7
|
+
V8_EXTERN internal::Address _v8_string_new_from_one_byte(Isolate* isolate, const uint8_t* data, v8::NewStringType type, int length);
|
|
8
|
+
V8_EXTERN internal::Address _v8_string_new_from_two_byte(Isolate* isolate, const uint16_t* data, v8::NewStringType type, int length);
|
|
9
|
+
V8_EXTERN internal::Address _v8_string_new_external_one_byte(Isolate* isolate, const char* data, int length);
|
|
10
|
+
V8_EXTERN internal::Address _v8_string_new_external_two_byte(Isolate* isolate, const uint16_t* data, int length);
|
|
11
|
+
V8_EXTERN int _v8_string_utf8_length(const String* self, Isolate* isolate);
|
|
12
|
+
V8_EXTERN int _v8_string_length(const String* self);
|
|
13
|
+
V8_EXTERN int _v8_string_write_utf8(const String* self, Isolate* isolate, char* buffer, int length, int* nchars_ref, int options);
|
|
14
|
+
V8_EXTERN internal::Address _v8_regex_new(Context* context, internal::Address pattern, int flags);
|
|
15
|
+
V8_EXTERN internal::Address _v8_string_object_new(Isolate* isolate, internal::Address value);
|
|
16
|
+
V8_EXTERN internal::Address _v8_string_object_value_of(const StringObject* self);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
void String::CheckCast(v8::Data*) {}
|
|
20
|
+
|
|
21
|
+
MaybeLocal<String> String::NewFromUtf8(v8::Isolate* isolate, char const* data, v8::NewStringType type, int length) {
|
|
22
|
+
auto str = _v8_string_new_from_utf8(isolate, data, type, length);
|
|
23
|
+
if (!str) return MaybeLocal<String>();
|
|
24
|
+
return v8impl::V8LocalValueFromAddress(str).As<String>();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
MaybeLocal<String> String::NewFromOneByte(Isolate* isolate, const uint8_t* data, NewStringType type, int length) {
|
|
28
|
+
auto str = _v8_string_new_from_one_byte(isolate, reinterpret_cast<const uint8_t*>(data), type, length);
|
|
29
|
+
if (!str) return MaybeLocal<String>();
|
|
30
|
+
return v8impl::V8LocalValueFromAddress(str).As<String>();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
MaybeLocal<String> String::NewFromTwoByte(Isolate* isolate, const uint16_t* data, NewStringType type, int length) {
|
|
34
|
+
auto str = _v8_string_new_from_two_byte(isolate, data, type, length);
|
|
35
|
+
if (!str) return MaybeLocal<String>();
|
|
36
|
+
return v8impl::V8LocalValueFromAddress(str).As<String>();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
MaybeLocal<String> String::NewExternalOneByte(Isolate* isolate, ExternalOneByteStringResource* resource) {
|
|
40
|
+
auto str = _v8_string_new_external_one_byte(isolate, resource->data(), static_cast<int>(resource->length()));
|
|
41
|
+
if (!str) return MaybeLocal<String>();
|
|
42
|
+
return v8impl::V8LocalValueFromAddress(str).As<String>();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
MaybeLocal<String> String::NewExternalTwoByte(Isolate* isolate, ExternalStringResource* resource) {
|
|
46
|
+
auto str = _v8_string_new_external_two_byte(isolate, resource->data(), static_cast<int>(resource->length()));
|
|
47
|
+
if (!str) return MaybeLocal<String>();
|
|
48
|
+
return v8impl::V8LocalValueFromAddress(str).As<String>();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
MaybeLocal<RegExp> RegExp::New(Local<Context> context,
|
|
52
|
+
Local<String> pattern,
|
|
53
|
+
Flags flags) {
|
|
54
|
+
auto regex = _v8_regex_new(*context, v8impl::AddressFromV8LocalValue(pattern), flags);
|
|
55
|
+
if (!regex) return MaybeLocal<RegExp>();
|
|
56
|
+
return v8impl::V8LocalValueFromAddress(regex).As<RegExp>();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
Local<Value> StringObject::New(Isolate* isolate, Local<String> value) {
|
|
60
|
+
auto str = _v8_string_object_new(isolate, v8impl::AddressFromV8LocalValue(value));
|
|
61
|
+
return v8impl::V8LocalValueFromAddress(str);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
Local<String> StringObject::ValueOf() const {
|
|
65
|
+
auto str = _v8_string_object_value_of(this);
|
|
66
|
+
return v8impl::V8LocalValueFromAddress(str).As<String>();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
int String::Utf8Length(v8::Isolate* isolate) const {
|
|
70
|
+
return _v8_string_utf8_length(this, isolate);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
int String::Length() const {
|
|
74
|
+
return _v8_string_length(this);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
int String::WriteUtf8(Isolate* isolate, char* buffer, int length,
|
|
78
|
+
int* nchars_ref, int options) const {
|
|
79
|
+
return _v8_string_write_utf8(
|
|
80
|
+
this, isolate, buffer, length, nchars_ref, options);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
String::Utf8Value::Utf8Value(Isolate* isolate, Local<v8::Value> obj) {
|
|
84
|
+
if (obj.IsEmpty() || !obj->IsString()) {
|
|
85
|
+
str_ = nullptr;
|
|
86
|
+
length_ = 0;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Local<String> str = obj.As<String>();
|
|
91
|
+
length_ = str->Utf8Length(isolate);
|
|
92
|
+
str_ = new char[length_ + 1];
|
|
93
|
+
str->WriteUtf8(isolate, str_, length_ + 1);
|
|
94
|
+
str_[length_] = '\0';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
String::Utf8Value::~Utf8Value() {
|
|
98
|
+
if (str_ == nullptr) return;
|
|
99
|
+
delete[] str_;
|
|
100
|
+
str_ = nullptr;
|
|
101
|
+
length_ = 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
}
|