Skip to content

Commit edd0cb4

Browse files
committed
Add Function::Call Napi::Value vector override
1 parent 744c8d2 commit edd0cb4

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed

napi-inl.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2287,6 +2287,11 @@ inline MaybeOrValue<Value> Function::Call(
22872287
return Call(Env().Undefined(), args);
22882288
}
22892289

2290+
inline MaybeOrValue<Value> Function::Call(
2291+
const std::vector<Value>& args) const {
2292+
return Call(Env().Undefined(), args);
2293+
}
2294+
22902295
inline MaybeOrValue<Value> Function::Call(size_t argc,
22912296
const napi_value* args) const {
22922297
return Call(Env().Undefined(), argc, args);
@@ -2302,6 +2307,27 @@ inline MaybeOrValue<Value> Function::Call(
23022307
return Call(recv, args.size(), args.data());
23032308
}
23042309

2310+
inline MaybeOrValue<Value> Function::Call(
2311+
napi_value recv, const std::vector<Value>& args) const {
2312+
const size_t argc = args.size();
2313+
const size_t stackArgsCount = 6;
2314+
napi_value stackArgs[stackArgsCount];
2315+
std::vector<napi_value> heapArgs;
2316+
napi_value* argv;
2317+
if (argc <= stackArgsCount) {
2318+
argv = stackArgs;
2319+
} else {
2320+
heapArgs.resize(argc);
2321+
argv = heapArgs.data();
2322+
}
2323+
2324+
for (size_t index = 0; index < argc; index++) {
2325+
argv[index] = static_cast<napi_value>(args[index]);
2326+
}
2327+
2328+
return Call(recv, argc, argv);
2329+
}
2330+
23052331
inline MaybeOrValue<Value> Function::Call(napi_value recv,
23062332
size_t argc,
23072333
const napi_value* args) const {

napi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,11 +1350,14 @@ namespace Napi {
13501350
MaybeOrValue<Value> Call(
13511351
const std::initializer_list<napi_value>& args) const;
13521352
MaybeOrValue<Value> Call(const std::vector<napi_value>& args) const;
1353+
MaybeOrValue<Value> Call(const std::vector<Value>& args) const;
13531354
MaybeOrValue<Value> Call(size_t argc, const napi_value* args) const;
13541355
MaybeOrValue<Value> Call(
13551356
napi_value recv, const std::initializer_list<napi_value>& args) const;
13561357
MaybeOrValue<Value> Call(napi_value recv,
13571358
const std::vector<napi_value>& args) const;
1359+
MaybeOrValue<Value> Call(napi_value recv,
1360+
const std::vector<Value>& args) const;
13581361
MaybeOrValue<Value> Call(napi_value recv,
13591362
size_t argc,
13601363
const napi_value* args) const;

test/function.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ Value CallWithVector(const CallbackInfo& info) {
6969
return MaybeUnwrap(func.Call(args));
7070
}
7171

72+
Value CallWithVectorUsingCppWrapper(const CallbackInfo& info) {
73+
Function func = info[0].As<Function>();
74+
std::vector<Value> args;
75+
args.reserve(3);
76+
args.push_back(info[1]);
77+
args.push_back(info[2]);
78+
args.push_back(info[3]);
79+
return MaybeUnwrap(func.Call(args));
80+
}
81+
7282
Value CallWithCStyleArray(const CallbackInfo& info) {
7383
Function func = info[0].As<Function>();
7484
std::vector<napi_value> args;
@@ -108,6 +118,17 @@ Value CallWithReceiverAndVector(const CallbackInfo& info) {
108118
return MaybeUnwrap(func.Call(receiver, args));
109119
}
110120

121+
Value CallWithReceiverAndVectorUsingCppWrapper(const CallbackInfo& info) {
122+
Function func = info[0].As<Function>();
123+
Value receiver = info[1];
124+
std::vector<Value> args;
125+
args.reserve(3);
126+
args.push_back(info[2]);
127+
args.push_back(info[3]);
128+
args.push_back(info[4]);
129+
return MaybeUnwrap(func.Call(receiver, args));
130+
}
131+
111132
Value CallWithInvalidReceiver(const CallbackInfo& info) {
112133
Function func = info[0].As<Function>();
113134
return MaybeUnwrapOr(func.Call(Value(), std::initializer_list<napi_value>{}),
@@ -213,11 +234,15 @@ Object InitFunction(Env env) {
213234
Function::New(env, ValueCallbackWithData, nullptr, &testData);
214235
exports["callWithArgs"] = Function::New(env, CallWithArgs);
215236
exports["callWithVector"] = Function::New(env, CallWithVector);
237+
exports["callWithVectorUsingCppWrapper"] =
238+
Function::New(env, CallWithVectorUsingCppWrapper);
216239
exports["callWithCStyleArray"] = Function::New(env, CallWithCStyleArray);
217240
exports["callWithReceiverAndCStyleArray"] =
218241
Function::New(env, CallWithReceiverAndCStyleArray);
219242
exports["callWithReceiverAndArgs"] = Function::New(env, CallWithReceiverAndArgs);
220243
exports["callWithReceiverAndVector"] = Function::New(env, CallWithReceiverAndVector);
244+
exports["callWithReceiverAndVectorUsingCppWrapper"] =
245+
Function::New(env, CallWithReceiverAndVectorUsingCppWrapper);
221246
exports["callWithInvalidReceiver"] = Function::New(env, CallWithInvalidReceiver);
222247
exports["callConstructorWithArgs"] = Function::New(env, CallConstructorWithArgs);
223248
exports["callConstructorWithVector"] = Function::New(env, CallConstructorWithVector);
@@ -246,13 +271,17 @@ Object InitFunction(Env env) {
246271
Function::New<ValueCallbackWithData>(env, nullptr, &testData);
247272
exports["callWithArgs"] = Function::New<CallWithArgs>(env);
248273
exports["callWithVector"] = Function::New<CallWithVector>(env);
274+
exports["callWithVectorUsingCppWrapper"] =
275+
Function::New<CallWithVectorUsingCppWrapper>(env);
249276
exports["callWithCStyleArray"] = Function::New<CallWithCStyleArray>(env);
250277
exports["callWithReceiverAndCStyleArray"] =
251278
Function::New<CallWithReceiverAndCStyleArray>(env);
252279
exports["callWithReceiverAndArgs"] =
253280
Function::New<CallWithReceiverAndArgs>(env);
254281
exports["callWithReceiverAndVector"] =
255282
Function::New<CallWithReceiverAndVector>(env);
283+
exports["callWithReceiverAndVectorUsingCppWrapper"] =
284+
Function::New<CallWithReceiverAndVectorUsingCppWrapper>(env);
256285
exports["callWithInvalidReceiver"] =
257286
Function::New<CallWithInvalidReceiver>(env);
258287
exports["callConstructorWithArgs"] =

test/function.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ function test(binding) {
4949
assert.strictEqual(receiver, undefined);
5050
assert.deepStrictEqual(args, [ 2, 3, 4 ]);
5151

52+
ret = 5;
53+
assert.strictEqual(binding.callWithVectorUsingCppWrapper(testFunction, 2, 3, 4), 5);
54+
assert.strictEqual(receiver, undefined);
55+
assert.deepStrictEqual(args, [ 2, 3, 4 ]);
56+
5257
ret = 6;
5358
assert.strictEqual(binding.callWithReceiverAndArgs(testFunction, obj, 3, 4, 5), 6);
5459
assert.deepStrictEqual(receiver, obj);
@@ -59,6 +64,11 @@ function test(binding) {
5964
assert.deepStrictEqual(receiver, obj);
6065
assert.deepStrictEqual(args, [ 4, 5, 6 ]);
6166

67+
ret = 7;
68+
assert.strictEqual(binding.callWithReceiverAndVectorUsingCppWrapper(testFunction, obj, 4, 5, 6), 7);
69+
assert.deepStrictEqual(receiver, obj);
70+
assert.deepStrictEqual(args, [ 4, 5, 6 ]);
71+
6272
ret = 8;
6373
assert.strictEqual(binding.callWithCStyleArray(testFunction, 5, 6, 7), ret);
6474
assert.deepStrictEqual(receiver, undefined);

0 commit comments

Comments
 (0)