From: Tyson Andre Date: Tue, 12 Nov 2019 00:56:20 +0000 (-0500) Subject: Optimize is_scalar($x) into a TYPE_CHECK opcode X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=937fa6d9e2f38b5e70a2a510b87ce0be4839a404;p=php Optimize is_scalar($x) into a TYPE_CHECK opcode Optimizations such as specializations for is_resource were first added in dfb4f6b38d9efedafab7d2d98b9333715561256 I don't see any mention of is_scalar (and optimizing it) in the commit history, or in prior PRs on github, or searching for is_scalar in externals.io --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 53fe9afde8..c7853b2969 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3394,6 +3394,21 @@ int zend_compile_func_typecheck(znode *result, zend_ast_list *args, uint32_t typ } /* }}} */ +static int zend_compile_func_is_scalar(znode *result, zend_ast_list *args) /* {{{ */ +{ + znode arg_node; + zend_op *opline; + + if (args->children != 1) { + return FAILURE; + } + + zend_compile_expr(&arg_node, args->child[0]); + opline = zend_emit_op_tmp(result, ZEND_TYPE_CHECK, &arg_node, NULL); + opline->extended_value = (1 << IS_FALSE | 1 << IS_TRUE | 1 << IS_DOUBLE | 1 << IS_LONG | 1 << IS_STRING); + return SUCCESS; +} + int zend_compile_func_cast(znode *result, zend_ast_list *args, uint32_t type) /* {{{ */ { znode arg_node; @@ -3912,6 +3927,8 @@ int zend_try_compile_special_func(znode *result, zend_string *lcname, zend_ast_l return zend_compile_func_typecheck(result, args, IS_OBJECT); } else if (zend_string_equals_literal(lcname, "is_resource")) { return zend_compile_func_typecheck(result, args, IS_RESOURCE); + } else if (zend_string_equals_literal(lcname, "is_scalar")) { + return zend_compile_func_is_scalar(result, args); } else if (zend_string_equals_literal(lcname, "boolval")) { return zend_compile_func_cast(result, args, _IS_BOOL); } else if (zend_string_equals_literal(lcname, "intval")) {