@@ -610,33 +610,50 @@ namespace {
610610 return luaL_error (L, " Invalid js-function reference" );
611611 }
612612
613- Napi::Env env = js_function_holder->ref ->Env ();
614- Napi::HandleScope scope (env);
615-
616- // cast lua arguments to javascript
617- int top_index = lua_gettop (L);
618-
619- std::vector<napi_value> js_args;
620- js_args.reserve (top_index - 1 );
621- for (int i = 2 ; i <= top_index; ++i) {
622- auto js_arg = ReadJsValueFromStack (L, env, i);
623- js_args.push_back (js_arg);
624- }
613+ try {
614+ Napi::Env env = js_function_holder->ref ->Env ();
615+ Napi::HandleScope scope (env);
616+
617+ // cast lua arguments to javascript
618+ int top_index = lua_gettop (L);
619+
620+ std::vector<napi_value> js_args;
621+ js_args.reserve (top_index - 1 );
622+ for (int i = 2 ; i <= top_index; ++i) {
623+ auto js_arg = ReadJsValueFromStack (L, env, i);
624+ js_args.push_back (js_arg);
625+ }
625626
626- // call js function
627- Napi::Value js_function_result = js_function_holder->ref ->Call (js_args);
627+ // call js function
628+ Napi::Value js_function_result = js_function_holder->ref ->Call (js_args);
628629
629- if (js_function_result.IsArray ()) {
630- Napi::Array js_function_results = js_function_result.As <Napi::Array>();
631- uint32_t js_function_results_length = js_function_results.Length ();
632- for (uint32_t i = 0 ; i < js_function_results_length; ++i) {
633- Napi::Value result = js_function_results.Get (i);
634- PushJsValueToStack (L, result);
630+ // return function call result to lua
631+ if (js_function_result.IsArray ()) {
632+ Napi::Array js_function_results = js_function_result.As <Napi::Array>();
633+ uint32_t js_function_results_length = js_function_results.Length ();
634+ for (uint32_t i = 0 ; i < js_function_results_length; ++i) {
635+ Napi::Value result = js_function_results.Get (i);
636+ PushJsValueToStack (L, result);
637+ }
638+ return js_function_results_length;
639+ } else {
640+ PushJsValueToStack (L, js_function_result);
641+ return 1 ;
635642 }
636- return js_function_results_length;
637- } else {
638- PushJsValueToStack (L, js_function_result);
639- return 1 ;
643+ } catch (const Napi::Error& e) {
644+ auto js_name = e.Get (" name" );
645+ std::string name;
646+ if (js_name.IsString ()) {
647+ name = js_name.As <Napi::String>().Utf8Value ();
648+ } else {
649+ name = " Error" ;
650+ }
651+ std::string msg = name + " : " + e.Message ();
652+ return luaL_error (L, msg.c_str ());
653+ } catch (const std::exception& e) {
654+ return luaL_error (L, e.what ());
655+ } catch (...) {
656+ return luaL_error (L, " Unknown error from JS function" );
640657 }
641658 }
642659
0 commit comments