diff --git a/engine/api.c b/engine/api.c index d69bc74..cfc02b8 100644 --- a/engine/api.c +++ b/engine/api.c @@ -1937,6 +1937,13 @@ int ph7_value_is_callable(ph7_value *pVal) { rc = PH7_VmIsCallable(pVal->pVm, pVal, FALSE); return rc; } +/* + * [CAPIREF: ph7_value_is_callback()] + * Please refer to the official documentation for function purpose and expected parameters. + */ +int ph7_value_is_callback(ph7_value *pVal) { + return (pVal->iFlags & MEMOBJ_CALL) ? TRUE : FALSE; +} /* * [CAPIREF: ph7_value_is_scalar()] * Please refer to the official documentation for function purpose and expected parameters. @@ -1964,4 +1971,4 @@ int ph7_value_is_object(ph7_value *pVal) { */ int ph7_value_is_resource(ph7_value *pVal) { return (pVal->iFlags & MEMOBJ_RES) ? TRUE : FALSE; -} \ No newline at end of file +} diff --git a/engine/builtin.c b/engine/builtin.c index 8eefeef..aaaf233 100644 --- a/engine/builtin.c +++ b/engine/builtin.c @@ -39,6 +39,23 @@ static int PH7_builtin_is_bool(ph7_context *pCtx, int nArg, ph7_value **apArg) { ph7_result_bool(pCtx, res); return PH7_OK; } +/* + * bool is_callback($var) + * Finds out whether a variable is a callback. + * Parameters + * $var: The variable being evaluated. + * Return + * TRUE if var is a callback. False otherwise. + */ +static int PH7_builtin_is_callback(ph7_context *pCtx, int nArg, ph7_value **apArg) { + int res = 0; /* Assume false by default */ + if(nArg > 0) { + res = ph7_value_is_callback(apArg[0]); + } + /* Query result */ + ph7_result_bool(pCtx, res); + return PH7_OK; +} /* * bool is_char($var) * Finds out whether a variable is a character. @@ -7388,6 +7405,7 @@ static const ph7_builtin_func aBuiltInFunc[] = { /* Variable handling functions */ { "is_array", PH7_builtin_is_array }, { "is_bool", PH7_builtin_is_bool }, + { "is_callback", PH7_builtin_is_callback }, { "is_char", PH7_builtin_is_char }, { "is_float", PH7_builtin_is_float }, { "is_int", PH7_builtin_is_int }, diff --git a/engine/vm.c b/engine/vm.c index ef1e3f8..c1e62d6 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -5739,16 +5739,10 @@ PH7_PRIVATE int PH7_VmIsCallable(ph7_vm *pVm, ph7_value *pValue, int CallInvoke) * Parameters * $name * The callback function to check - * $syntax_only - * If set to TRUE the function only verifies that name might be a function or method. - * It will only reject simple variables that are not strings, or an array that does - * not have a valid structure to be used as a callback. The valid ones are supposed - * to have only 2 entries, the first of which is an object or a string, and the second - * a string. * Return * TRUE if name is callable, FALSE otherwise. */ -static int vm_builtin_is_callback(ph7_context *pCtx, int nArg, ph7_value **apArg) { +static int vm_builtin_is_callable(ph7_context *pCtx, int nArg, ph7_value **apArg) { ph7_vm *pVm; int res; if(nArg < 1) { @@ -5759,7 +5753,7 @@ static int vm_builtin_is_callback(ph7_context *pCtx, int nArg, ph7_value **apArg /* Point to the target VM */ pVm = pCtx->pVm; /* Perform the requested operation */ - res = PH7_VmIsCallable(pVm, apArg[0], TRUE); + res = PH7_VmIsCallable(pVm, apArg[0], FALSE); ph7_result_bool(pCtx, res); return SXRET_OK; } @@ -10459,7 +10453,7 @@ static int vm_builtin_utf8_decode(ph7_context *pCtx, int nArg, ph7_value **apArg /* Table of built-in VM functions. */ static const ph7_builtin_func aVmFunc[] = { { "function_exists", vm_builtin_func_exists }, - { "is_callback", vm_builtin_is_callback }, + { "is_callable", vm_builtin_is_callable }, { "get_defined_functions", vm_builtin_get_defined_func }, { "register_autoload_handler", vm_builtin_register_autoload_handler }, { "register_shutdown_function", vm_builtin_register_shutdown_function }, diff --git a/include/ph7.h b/include/ph7.h index 9be80cc..eca2302 100644 --- a/include/ph7.h +++ b/include/ph7.h @@ -641,6 +641,7 @@ PH7_APIEXPORT int ph7_value_is_float(ph7_value *pVal); PH7_APIEXPORT int ph7_value_is_bool(ph7_value *pVal); PH7_APIEXPORT int ph7_value_is_string(ph7_value *pVal); PH7_APIEXPORT int ph7_value_is_callback(ph7_value *pVal); +PH7_APIEXPORT int ph7_value_is_callable(ph7_value *pVal); PH7_APIEXPORT int ph7_value_is_array(ph7_value *pVal); PH7_APIEXPORT int ph7_value_is_object(ph7_value *pVal); PH7_APIEXPORT int ph7_value_is_resource(ph7_value *pVal);