fixed a bug in hawk::function_exists()

This commit is contained in:
hyung-hwan 2022-04-08 23:57:23 +00:00
parent f33862b3d1
commit 1636a84baa
3 changed files with 29 additions and 9 deletions

View File

@ -204,15 +204,19 @@ static int fnc_function_exists (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = (hawk_rtx_findfunwithoocstr(rtx, name.ptr) != HAWK_NULL); rx = (hawk_rtx_findfunwithoocstr(rtx, name.ptr) != HAWK_NULL);
if (!rx) if (!rx)
{ {
hawk_mod_sym_t sym; rx = (hawk_findfncwithoocs(hawk_rtx_gethawk(rtx), &name) != HAWK_NULL);
mod_data_t* md; if (!rx)
{
hawk_mod_sym_t sym;
mod_data_t* md;
md = (mod_data_t*)fi->mod->ctx; md = (mod_data_t*)fi->mod->ctx;
/* hawk_query_module_with_name() may update some shared data under /* hawk_query_module_with_name() may update some shared data under
* the hawk object. use a mutex for shared data safety */ * the hawk object. use a mutex for shared data safety */
hawk_mtx_lock (&md->mq_mtx, HAWK_NULL); hawk_mtx_lock (&md->mq_mtx, HAWK_NULL);
rx = (hawk_querymodulewithname(hawk_rtx_gethawk(rtx), &name, &sym) != HAWK_NULL); rx = (hawk_querymodulewithname(hawk_rtx_gethawk(rtx), &name, &sym) != HAWK_NULL);
hawk_mtx_unlock (&md->mq_mtx); hawk_mtx_unlock (&md->mq_mtx);
}
} }
} }
hawk_rtx_freevaloocstr (rtx, a0, name.ptr); hawk_rtx_freevaloocstr (rtx, a0, name.ptr);

View File

@ -2006,6 +2006,7 @@ static int fnc_wtermsig (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
return 0; return 0;
} }
#if defined(WCOREDUMP)
static int fnc_wcoredump (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) static int fnc_wcoredump (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
hawk_int_t wstatus; hawk_int_t wstatus;
@ -2014,6 +2015,7 @@ static int fnc_wcoredump (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rv)); hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rv));
return 0; return 0;
} }
#endif
static int fnc_kill (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) static int fnc_kill (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
@ -5833,7 +5835,9 @@ static hawk_mod_fnc_tab_t fnctab[] =
{ {
/* keep this table sorted for binary search in query(). */ /* keep this table sorted for binary search in query(). */
#if defined(WCOREDUMP)
{ HAWK_T("WCOREDUMP"), { { 1, 1, HAWK_NULL }, fnc_wcoredump, 0 } }, { HAWK_T("WCOREDUMP"), { { 1, 1, HAWK_NULL }, fnc_wcoredump, 0 } },
#endif
{ HAWK_T("WEXITSTATUS"), { { 1, 1, HAWK_NULL }, fnc_wexitstatus, 0 } }, { HAWK_T("WEXITSTATUS"), { { 1, 1, HAWK_NULL }, fnc_wexitstatus, 0 } },
{ HAWK_T("WIFEXITED"), { { 1, 1, HAWK_NULL }, fnc_wifexited, 0 } }, { HAWK_T("WIFEXITED"), { { 1, 1, HAWK_NULL }, fnc_wifexited, 0 } },
{ HAWK_T("WIFSIGNALED"), { { 1, 1, HAWK_NULL }, fnc_wifsignaled, 0 } }, { HAWK_T("WIFSIGNALED"), { { 1, 1, HAWK_NULL }, fnc_wifsignaled, 0 } },
@ -6129,17 +6133,23 @@ static hawk_mod_int_tab_t inttab[] =
{ HAWK_T("STRFTIME_UTC"), { STRFTIME_UTC } }, { HAWK_T("STRFTIME_UTC"), { STRFTIME_UTC } },
#if defined(VDISCARD)
{ HAWK_T("TC_CC_VDISCARD"), { VDISCARD } }, { HAWK_T("TC_CC_VDISCARD"), { VDISCARD } },
#endif
{ HAWK_T("TC_CC_VEOF"), { VEOF } }, { HAWK_T("TC_CC_VEOF"), { VEOF } },
{ HAWK_T("TC_CC_VEOL"), { VEOL } }, { HAWK_T("TC_CC_VEOL"), { VEOL } },
{ HAWK_T("TC_CC_VEOL2"), { VEOL2 } }, { HAWK_T("TC_CC_VEOL2"), { VEOL2 } },
{ HAWK_T("TC_CC_VERASE"), { VERASE } }, { HAWK_T("TC_CC_VERASE"), { VERASE } },
{ HAWK_T("TC_CC_VINTR"), { VINTR } }, { HAWK_T("TC_CC_VINTR"), { VINTR } },
{ HAWK_T("TC_CC_VKILL"), { VKILL } }, { HAWK_T("TC_CC_VKILL"), { VKILL } },
#if defined(VLNEXT)
{ HAWK_T("TC_CC_VLNEXT"), { VLNEXT } }, { HAWK_T("TC_CC_VLNEXT"), { VLNEXT } },
#endif
{ HAWK_T("TC_CC_VMIN"), { VMIN } }, { HAWK_T("TC_CC_VMIN"), { VMIN } },
{ HAWK_T("TC_CC_VQUIT"), { VQUIT } }, { HAWK_T("TC_CC_VQUIT"), { VQUIT } },
{ HAWK_T("TC_CC_VREPINT"), { VREPRINT } }, #if defined(VREPRINT)
{ HAWK_T("TC_CC_VREPRINT"), { VREPRINT } },
#endif
{ HAWK_T("TC_CC_VSTART"), { VSTART } }, { HAWK_T("TC_CC_VSTART"), { VSTART } },
{ HAWK_T("TC_CC_VSTOP"), { VSTOP } }, { HAWK_T("TC_CC_VSTOP"), { VSTOP } },
{ HAWK_T("TC_CC_VSUSP"), { VSUSP } }, { HAWK_T("TC_CC_VSUSP"), { VSUSP } },
@ -6147,7 +6157,9 @@ static hawk_mod_int_tab_t inttab[] =
{ HAWK_T("TC_CC_VSWTC"), { VSWTC } }, /* hard to define with an alternative value when it's not available */ { HAWK_T("TC_CC_VSWTC"), { VSWTC } }, /* hard to define with an alternative value when it's not available */
#endif #endif
{ HAWK_T("TC_CC_VTIME"), { VTIME } }, { HAWK_T("TC_CC_VTIME"), { VTIME } },
#if defined(VWERASE)
{ HAWK_T("TC_CC_VWERASE"), { VWERASE } }, { HAWK_T("TC_CC_VWERASE"), { VWERASE } },
#endif
{ HAWK_T("TC_CFLAG_B0"), { B0 } }, { HAWK_T("TC_CFLAG_B0"), { B0 } },
{ HAWK_T("TC_CFLAG_B110"), { B110 } }, { HAWK_T("TC_CFLAG_B110"), { B110 } },
@ -6193,7 +6205,9 @@ static hawk_mod_int_tab_t inttab[] =
{ HAWK_T("TC_IFLAG_IGNBRK"), { IGNBRK } }, { HAWK_T("TC_IFLAG_IGNBRK"), { IGNBRK } },
{ HAWK_T("TC_IFLAG_IGNCR"), { IGNCR } }, { HAWK_T("TC_IFLAG_IGNCR"), { IGNCR } },
{ HAWK_T("TC_IFLAG_IGNPAR"), { IGNPAR } }, { HAWK_T("TC_IFLAG_IGNPAR"), { IGNPAR } },
#if defined(IMAXBEL)
{ HAWK_T("TC_IFLAG_IMAXBEL"),{ IMAXBEL } }, { HAWK_T("TC_IFLAG_IMAXBEL"),{ IMAXBEL } },
#endif
{ HAWK_T("TC_IFLAG_INLCR"), { INLCR } }, { HAWK_T("TC_IFLAG_INLCR"), { INLCR } },
{ HAWK_T("TC_IFLAG_INPCK"), { INPCK } }, { HAWK_T("TC_IFLAG_INPCK"), { INPCK } },
{ HAWK_T("TC_IFLAG_ISTRIP"), { ISTRIP } }, { HAWK_T("TC_IFLAG_ISTRIP"), { ISTRIP } },

View File

@ -11,6 +11,8 @@ function run_test_001 ()
tap_ensure (hawk::function_exists(1.69), 0, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (hawk::function_exists(1.69), 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::function_exists("111"), 0, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (hawk::function_exists("111"), 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::function_exists(@b"111"), 0, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (hawk::function_exists(@b"111"), 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::function_exists("length"), 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::function_exists(@b"length"), 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::call(@b"length", "hawk"), 4, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (hawk::call(@b"length", "hawk"), 4, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::call("length", @b"hawk"), 4, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (hawk::call("length", @b"hawk"), 4, @SCRIPTNAME, @SCRIPTLINE);