napi_value RunCallback(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); NAPI_ASSERT(env, argc == 1, "Wrong number of arguments. Expects a single argument."); napi_valuetype valuetype0; NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0)); NAPI_ASSERT(env, valuetype0 == napi_function, "Wrong type of arguments. Expects a function as first argument."); napi_valuetype valuetype1; NAPI_CALL(env, napi_typeof(env, args[1], &valuetype1)); NAPI_ASSERT(env, valuetype1 == napi_undefined, "Additional arguments should be undefined."); napi_value argv[1]; const char* str = "hello world"; size_t str_len = strlen(str); NAPI_CALL(env, napi_create_string_utf8(env, str, str_len, argv)); napi_value global; NAPI_CALL(env, napi_get_global(env, &global)); napi_value cb = args[0]; NAPI_CALL(env, napi_call_function(env, global, cb, 1, argv, NULL)); return NULL; }
static void finalizer_only_callback(napi_env env, void* data, void* hint) { napi_ref js_cb_ref = data; napi_value js_cb, undefined; NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, js_cb_ref, &js_cb)); NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined)); NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, js_cb, 0, NULL, NULL)); NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, js_cb_ref)); }
napi_value RunCallbackWithRecv(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); napi_value cb = args[0]; napi_value recv = args[1]; NAPI_CALL(env, napi_call_function(env, recv, cb, 0, NULL, NULL)); return NULL; }
static napi_value NewScopeWithException(napi_env env, napi_callback_info info) { napi_handle_scope scope; size_t argc; napi_value exception_function; napi_status status; napi_value output = NULL; NAPI_CALL(env, napi_open_handle_scope(env, &scope)); NAPI_CALL(env, napi_create_object(env, &output)); argc = 1; NAPI_CALL(env, napi_get_cb_info( env, info, &argc, &exception_function, NULL, NULL)); status = napi_call_function( env, output, exception_function, 0, NULL, NULL); NAPI_ASSERT(env, status == napi_pending_exception, "Function should have thrown."); // Closing a handle scope should still work while an exception is pending. NAPI_CALL(env, napi_close_handle_scope(env, scope)); return NULL; }