Skip to content

Commit 74d9437

Browse files
authored
test: nannew (#179)
1 parent 50fb596 commit 74d9437

File tree

15 files changed

+689
-0
lines changed

15 files changed

+689
-0
lines changed

packages/emnapi/src/v8/array.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ namespace v8 {
44

55
extern "C" {
66
V8_EXTERN internal::Address _v8_array_new(Isolate* isolate, int length);
7+
V8_EXTERN uint32_t _v8_array_length(const Array* array);
78
}
89

910
Local<Array> Array::New(Isolate* isolate, int length) {
1011
auto n = _v8_array_new(isolate, length);
1112
return v8impl::V8LocalValueFromAddress(n).As<Array>();
1213
}
1314

15+
uint32_t Array::Length() const {
16+
return _v8_array_length(this);
17+
}
18+
1419
}

packages/emnapi/src/v8/array.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,12 @@
55
export function _v8_array_new (context: Ptr, value: int): Ptr {
66
return emnapiCtx.napiValueFromJsValue(Array(value))
77
}
8+
9+
/**
10+
* @__deps $emnapiCtx
11+
* @__sig ip
12+
*/
13+
export function _v8_array_length (array: Ptr): int {
14+
const arr = emnapiCtx.jsValueFromNapiValue(array) as any[]
15+
return arr.length
16+
}

packages/emnapi/src/v8/boolean.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace v8 {
44

55
extern "C" {
66
V8_EXTERN bool _v8_boolean_value(const Boolean*);
7+
V8_EXTERN int _v8_boolean_object_value_of(const BooleanObject*);
78
V8_EXTERN internal::Address _v8_boolean_object_new(Isolate* isolate, int value);
89
}
910

@@ -18,4 +19,8 @@ Local<Value> BooleanObject::New(Isolate* isolate, bool value) {
1819
return v8impl::V8LocalValueFromAddress(n);
1920
}
2021

22+
bool BooleanObject::ValueOf() const {
23+
return static_cast<bool>(_v8_boolean_object_value_of(this));
24+
}
25+
2126
}

packages/emnapi/src/v8/boolean.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,12 @@ export function _v8_boolean_object_new (isolate: Ptr, value: number): Ptr {
1515
// eslint-disable-next-line no-new-wrappers
1616
return emnapiCtx.napiValueFromJsValue(new Boolean(value))
1717
}
18+
19+
/**
20+
* @__deps $emnapiCtx
21+
* @__sig ip
22+
*/
23+
export function _v8_boolean_object_value_of (self: Ptr): number {
24+
const boolObj = emnapiCtx.jsValueFromNapiValue(self)
25+
return boolObj.valueOf() ? 1 : 0
26+
}

packages/emnapi/src/v8/function.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ extern "C" {
66
V8_EXTERN void _v8_function_set_name(Function* func, internal::Address name);
77
V8_EXTERN internal::Address _v8_function_new_instance(
88
const Function* func, Context* context, int argc, internal::Address* argv);
9+
V8_EXTERN internal::Address _v8_function_call(
10+
Function* func, Context* context, internal::Address recv, int argc,
11+
internal::Address* argv);
912
}
1013

1114
void Function::CheckCast(v8::Value*) {}
@@ -20,4 +23,13 @@ MaybeLocal<Object> Function::NewInstance(
2023
_v8_function_new_instance(this, *context, argc, reinterpret_cast<internal::Address*>(argv))).As<Object>();
2124
}
2225

26+
MaybeLocal<Value> Function::Call(Local<Context> context,
27+
Local<Value> recv, int argc,
28+
Local<Value> argv[]) {
29+
internal::Address result = _v8_function_call(
30+
this, *context, v8impl::AddressFromV8LocalValue(recv), argc,
31+
reinterpret_cast<internal::Address*>(argv));
32+
return v8impl::V8LocalValueFromAddress(result);
33+
}
34+
2335
}

packages/emnapi/src/v8/function.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export function _v8_function_set_name (fn: Ptr, name: Ptr): void {
1818
* @__sig ppppp
1919
*/
2020
export function _v8_function_new_instance (fn: Ptr, ctx: Ptr, argc: number, argv: Ptr): Ptr {
21+
if (emnapiCtx.isolate.hasPendingException()) return 1
2122
const Ctor = emnapiCtx.jsValueFromNapiValue(fn)
2223
from64('argv')
2324

@@ -48,3 +49,30 @@ export function _v8_function_new_instance (fn: Ptr, ctx: Ptr, argc: number, argv
4849

4950
return emnapiCtx.napiValueFromJsValue(ret)
5051
}
52+
53+
/**
54+
* @__deps $emnapiCtx
55+
* @__sig ppppip
56+
*/
57+
export function _v8_function_call (fn: Ptr, ctx: Ptr, recv: Ptr, argc: number, argv: Ptr): Ptr {
58+
if (emnapiCtx.isolate.hasPendingException()) return 1
59+
const func = emnapiCtx.jsValueFromNapiValue(fn)
60+
const thisArg = emnapiCtx.jsValueFromNapiValue(recv)
61+
from64('argv')
62+
63+
let i: number
64+
let ret: any
65+
try {
66+
const argList = Array(argc)
67+
for (i = 0; i < argc; i++) {
68+
const argVal = makeGetValue('argv', 'i * ' + POINTER_SIZE, '*')
69+
argList[i] = emnapiCtx.jsValueFromNapiValue(argVal)!
70+
}
71+
ret = func.apply(thisArg, argList)
72+
} catch (err) {
73+
emnapiCtx.isolate.throwException(err)
74+
return 1
75+
}
76+
77+
return emnapiCtx.napiValueFromJsValue(ret)
78+
}

packages/emnapi/src/v8/isolate.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ Isolate* Context::GetIsolate() {
1414
return v8::Isolate::GetCurrent();
1515
}
1616

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+
1721
Isolate* Isolate::GetCurrent() {
1822
static internal::Isolate current_isolate;
1923
return reinterpret_cast<Isolate*>(&current_isolate);

packages/emnapi/src/v8/string.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ extern "C" {
1111
V8_EXTERN int _v8_string_write_utf8(const String* self, Isolate* isolate, char* buffer, int length, int* nchars_ref, int options);
1212
V8_EXTERN internal::Address _v8_regex_new(Context* context, internal::Address pattern, int flags);
1313
V8_EXTERN internal::Address _v8_string_object_new(Isolate* isolate, internal::Address value);
14+
V8_EXTERN internal::Address _v8_string_object_value_of(const StringObject* self);
1415
}
1516

1617
void String::CheckCast(v8::Data*) {}
@@ -46,6 +47,11 @@ Local<Value> StringObject::New(Isolate* isolate, Local<String> value) {
4647
return v8impl::V8LocalValueFromAddress(str);
4748
}
4849

50+
Local<String> StringObject::ValueOf() const {
51+
auto str = _v8_string_object_value_of(this);
52+
return v8impl::V8LocalValueFromAddress(str).As<String>();
53+
}
54+
4955
int String::Utf8Length(v8::Isolate* isolate) const {
5056
return _v8_string_utf8_length(this, isolate);
5157
}

packages/emnapi/src/v8/string.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ export function _v8_string_object_new (isolate: Ptr, value: Ptr): Ptr {
2121
return emnapiCtx.napiValueFromJsValue(new String(emnapiCtx.jsValueFromNapiValue(value)))
2222
}
2323

24+
/**
25+
* @__deps $emnapiCtx
26+
* @__sig pp
27+
*/
28+
export function _v8_string_object_value_of (self: Ptr): Ptr {
29+
const strObj = emnapiCtx.jsValueFromNapiValue(self)
30+
return emnapiCtx.napiValueFromJsValue(strObj.valueOf())
31+
}
32+
2433
/**
2534
* @__deps $emnapiCtx
2635
* @__deps $emnapiString

packages/emnapi/src/v8/template.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ extern "C" {
3535
SideEffectType getter_side_effect_type,
3636
SideEffectType setter_side_effect_type
3737
);
38+
V8_EXTERN internal::Address _v8_function_new(
39+
Context* context,
40+
internal::Address (*callback)(internal::Address info, v8::FunctionCallback cb),
41+
v8::FunctionCallback cb,
42+
internal::Address data,
43+
int length,
44+
int behavior,
45+
int side_effect_type);
3846
}
3947

4048
namespace {
@@ -211,4 +219,16 @@ void ObjectTemplate::SetInternalFieldCount(int value) {
211219
_v8_object_template_set_internal_field_count(this, value);
212220
}
213221

222+
MaybeLocal<Function> Function::New(
223+
Local<Context> context, FunctionCallback callback,
224+
Local<Value> data, int length,
225+
ConstructorBehavior behavior,
226+
SideEffectType side_effect_type) {
227+
internal::Address func_value = _v8_function_new(
228+
*context, CallbackWrap, callback, reinterpret_cast<internal::Address>(*data),
229+
length, static_cast<int>(behavior), static_cast<int>(side_effect_type));
230+
if (!func_value) return MaybeLocal<Function>();
231+
return v8impl::V8LocalValueFromAddress(func_value).As<Function>();
232+
}
233+
214234
}

0 commit comments

Comments
 (0)