Skip to content

Commit 42ea2ff

Browse files
committed
optimize checkArgs
this makes the lineTo benchmark (lineTo executes a very small number of operations, so it mostly measures the js<->C++ barrier) run about 50% faster
1 parent 542c223 commit 42ea2ff

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

src/CanvasRenderingContext2d.cc

+20-3
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,29 @@ constexpr double twoPi = M_PI * 2.;
4545
pango_context_get_language(pango_layout_get_context(LAYOUT)))
4646

4747
inline static bool checkArgs(const Napi::CallbackInfo&info, double *args, int argsNum, int offset = 0){
48-
Napi::Number zero = Napi::Number::New(info.Env(), 0);
49-
int argsEnd = offset + argsNum;
48+
Napi::Env env = info.Env();
49+
int argsEnd = std::min(9, offset + argsNum);
5050
bool areArgsValid = true;
5151

52+
napi_value argv[9];
53+
size_t argc = 9;
54+
napi_get_cb_info(env, static_cast<napi_callback_info>(info), &argc, argv, nullptr, nullptr);
55+
5256
for (int i = offset; i < argsEnd; i++) {
53-
double val = info[i].ToNumber().UnwrapOr(zero).DoubleValue();
57+
napi_valuetype type;
58+
double val = 0;
59+
60+
napi_typeof(env, argv[i], &type);
61+
if (type == napi_number) {
62+
// fast path
63+
napi_get_value_double(env, argv[i], &val);
64+
} else {
65+
napi_value num;
66+
napi_create_double(env, 0, &num);
67+
if (napi_coerce_to_number(env, argv[i], &num) == napi_ok) {
68+
napi_get_value_double(env, num, &val);
69+
}
70+
}
5471

5572
if (areArgsValid) {
5673
if (!std::isfinite(val)) {

0 commit comments

Comments
 (0)