From 652ef01ca0712019218af1b9d1b3c7298d054abd Mon Sep 17 00:00:00 2001 From: Caleb Hearon Date: Mon, 17 Apr 2023 11:03:23 -0400 Subject: [PATCH] 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 --- src/CanvasRenderingContext2d.cc | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index 2da142db1..a9e6ce3d7 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -45,12 +45,29 @@ constexpr double twoPi = M_PI * 2.; pango_context_get_language(pango_layout_get_context(LAYOUT))) inline static bool checkArgs(const Napi::CallbackInfo&info, double *args, int argsNum, int offset = 0){ - Napi::Number zero = Napi::Number::New(info.Env(), 0); - int argsEnd = offset + argsNum; + Napi::Env env = info.Env(); + int argsEnd = std::min(9, offset + argsNum); bool areArgsValid = true; + napi_value argv[9]; + size_t argc = 9; + napi_get_cb_info(env, static_cast(info), &argc, argv, nullptr, nullptr); + for (int i = offset; i < argsEnd; i++) { - double val = info[i].ToNumber().UnwrapOr(zero).DoubleValue(); + napi_valuetype type; + double val = 0; + + napi_typeof(env, argv[i], &type); + if (type == napi_number) { + // fast path + napi_get_value_double(env, argv[i], &val); + } else { + napi_value num; + napi_create_double(env, 0, &num); + if (napi_coerce_to_number(env, argv[i], &num) == napi_ok) { + napi_get_value_double(env, num, &val); + } + } if (areArgsValid) { if (!std::isfinite(val)) {