com php-src: More type inference fixes: ext/opcache/Optimizer/z end_func_info.c ext/opcache/Optimizer/zend_inference .c

From: Date: Thu, 16 Jun 2016 12:25:48 +0000
Subject: com php-src: More type inference fixes: ext/opcache/Optimizer/z end_func_info.c ext/opcache/Optimizer/zend_inference .c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-92407@lists.php.net to get a copy of this message
Commit: 811dfba4bffec404312a0104b2057e6e11d867b9 Author: Nikita Popov <nikic@php.net> Thu, 16 Jun 2016 11:24:20 +0200 Parents: d7d5136c232cb8af232b45a07b98ff737860e455 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=811dfba4bffec404312a0104b2057e6e11d867b9 Log: More type inference fixes Changed paths: M ext/opcache/Optimizer/zend_func_info.c M ext/opcache/Optimizer/zend_inference.c

diff --git a/ext/opcache/Optimizer/zend_func_info.c b/ext/opcache/Optimizer/zend_func_info.c index a684a16..9a1a9e2 100644 --- a/ext/opcache/Optimizer/zend_func_info.c +++ b/ext/opcache/Optimizer/zend_func_info.c @@ -229,7 +229,7 @@ static const func_info_t func_infos[] = { FC("strncmp", zend_lb_ssn_info), FC("strcasecmp", zend_l_ss_info), FC("strncasecmp", zend_lb_ssn_info), - F1("each", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), + F1("each", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_KEY_ANY), F1("error_reporting", MAY_BE_NULL | MAY_BE_LONG), F1("define", MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_NULL), // TODO: inline FC("defined", zend_b_s_info), // TODO: inline @@ -251,8 +251,8 @@ static const func_info_t func_infos[] = { F1("get_included_files", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), F1("trigger_error", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("user_error", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), - F1("set_error_handler", MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_OBJECT | MAY_BE_OBJECT), - I1("restore_error_handler", MAY_BE_TRUE), + F1("set_error_handler", MAY_BE_NULL | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_OBJECT | MAY_BE_OBJECT), + I1("restore_error_handler", MAY_BE_NULL | MAY_BE_TRUE), F1("get_declared_traits", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), F1("get_declared_classes", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), F1("get_declared_interfaces", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), @@ -330,7 +330,7 @@ static const func_info_t func_infos[] = { F1("stristr", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("strrchr", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("str_shuffle", MAY_BE_NULL | MAY_BE_STRING), - F1("str_word_count", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("str_word_count", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), F1("str_split", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), F1("strpbrk", MAY_BE_FALSE | MAY_BE_STRING), F1("substr_compare", MAY_BE_FALSE | MAY_BE_LONG), @@ -382,9 +382,9 @@ static const func_info_t func_infos[] = { F1("vsprintf", MAY_BE_FALSE | MAY_BE_STRING), F1("fprintf", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), F1("vfprintf", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), - F1("sscanf", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY), - F1("fscanf", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY), - F1("parse_url", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_LONG), + F1("sscanf", MAY_BE_NULL | MAY_BE_LONG | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY), + F1("fscanf", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY), + F1("parse_url", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_LONG), F1("urlencode", MAY_BE_NULL | MAY_BE_STRING), F1("urldecode", MAY_BE_NULL | MAY_BE_STRING), F1("rawurlencode", MAY_BE_NULL | MAY_BE_STRING), @@ -491,11 +491,11 @@ static const func_info_t func_infos[] = { #endif F1("ip2long", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), F1("long2ip", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), - F1("getenv", MAY_BE_FALSE | MAY_BE_STRING), + F1("getenv", MAY_BE_FALSE | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), #ifdef HAVE_PUTENV F1("putenv", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), #endif - F1("getopt", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), + F1("getopt", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), #ifdef HAVE_GETLOADAVG F1("sys_getloadavg", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_DOUBLE), #endif @@ -539,12 +539,12 @@ static const func_info_t func_infos[] = { F1("register_shutdown_function", MAY_BE_NULL | MAY_BE_FALSE), F1("register_tick_function", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("unregister_tick_function", MAY_BE_NULL), - F1("highlight_file", MAY_BE_FALSE | MAY_BE_STRING), + F1("highlight_file", MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_STRING), F1("show_source", MAY_BE_FALSE | MAY_BE_STRING), - F1("highlight_string", MAY_BE_FALSE | MAY_BE_STRING), + F1("highlight_string", MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_STRING), F1("php_strip_whitespace", MAY_BE_FALSE | MAY_BE_STRING), F1("ini_get", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), - F1("ini_get_all", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), + F1("ini_get_all", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), F1("ini_set", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("ini_alter", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("ini_restore", MAY_BE_NULL), @@ -561,8 +561,8 @@ static const func_info_t func_infos[] = { F1("connection_aborted", MAY_BE_LONG), F1("connection_status", MAY_BE_LONG), F1("ignore_user_abort", MAY_BE_NULL | MAY_BE_LONG), - F1("parse_ini_file", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), - F1("parse_ini_string", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), + F1("parse_ini_file", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), + F1("parse_ini_string", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), #if ZEND_DEBUG F1("config_get_hash", MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY), #endif @@ -636,7 +636,7 @@ static const func_info_t func_infos[] = { F1("file_put_contents", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), F1("stream_select", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), F1("stream_context_create", MAY_BE_FALSE | MAY_BE_RESOURCE), - F1("stream_context_set_params", MAY_BE_FALSE | MAY_BE_RESOURCE), + F1("stream_context_set_params", MAY_BE_FALSE | MAY_BE_TRUE), F1("stream_context_get_params", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY), F1("stream_context_set_option", MAY_BE_FALSE | MAY_BE_TRUE), F1("stream_context_get_options", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY), @@ -661,7 +661,7 @@ static const func_info_t func_infos[] = { F1("stream_copy_to_stream", MAY_BE_FALSE | MAY_BE_LONG), F1("stream_get_contents", MAY_BE_FALSE | MAY_BE_STRING), F1("stream_supports_lock", MAY_BE_FALSE | MAY_BE_TRUE), - F1("fgetcsv", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING), + F1("fgetcsv", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING), F1("fputcsv", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), F1("flock", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("get_meta_tags", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING), @@ -672,7 +672,7 @@ static const func_info_t func_infos[] = { F1("set_socket_blocking", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("stream_set_blocking", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("socket_set_blocking", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), - F1("stream_get_meta_data", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY), + F1("stream_get_meta_data", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY), F1("stream_get_line", MAY_BE_FALSE | MAY_BE_STRING), F1("stream_wrapper_register", MAY_BE_FALSE | MAY_BE_TRUE), F1("stream_register_wrapper", MAY_BE_FALSE | MAY_BE_TRUE), @@ -708,21 +708,21 @@ static const func_info_t func_infos[] = { #endif F1("getcwd", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("rewinddir", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), - F1("readdir", MAY_BE_FALSE | MAY_BE_STRING), + F1("readdir", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("dir", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_OBJECT), F1("scandir", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), #ifdef HAVE_GLOB F1("glob", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING), #endif - F1("fileatime", MAY_BE_NULL | MAY_BE_LONG), - F1("filectime", MAY_BE_NULL | MAY_BE_LONG), - F1("filegroup", MAY_BE_NULL | MAY_BE_LONG), - F1("fileinode", MAY_BE_NULL | MAY_BE_LONG), - F1("filemtime", MAY_BE_NULL | MAY_BE_LONG), - F1("fileowner", MAY_BE_NULL | MAY_BE_LONG), - F1("fileperms", MAY_BE_NULL | MAY_BE_LONG), - F1("filesize", MAY_BE_NULL | MAY_BE_LONG), - F1("filetype", MAY_BE_NULL | MAY_BE_STRING), + F1("fileatime", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("filectime", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("filegroup", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("fileinode", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("filemtime", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("fileowner", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("fileperms", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("filesize", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG), + F1("filetype", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING), F1("file_exists", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("is_writable", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("is_writeable", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), @@ -731,8 +731,8 @@ static const func_info_t func_infos[] = { F1("is_file", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("is_dir", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("is_link", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), - F1("stat", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING), - F1("lstat", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING), + F1("stat", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING), + F1("lstat", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING), #ifndef NETWARE F1("chown", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("chgrp", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), @@ -848,7 +848,7 @@ static const func_info_t func_infos[] = { F1("array_filter", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), F1("array_map", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), F1("array_chunk", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), - F1("array_combine", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), + F1("array_combine", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY), F1("array_key_exists", MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE), F1("pos", UNKNOWN_INFO), F1("sizeof", MAY_BE_NULL | MAY_BE_LONG), @@ -904,7 +904,7 @@ static const func_info_t func_infos[] = { F1("date_date_set", MAY_BE_FALSE | MAY_BE_OBJECT), F1("date_isodate_set", MAY_BE_FALSE | MAY_BE_OBJECT), F1("date_timestamp_set", MAY_BE_FALSE | MAY_BE_OBJECT), - F1("date_timestamp_get", MAY_BE_FALSE | MAY_BE_OBJECT), + F1("date_timestamp_get", MAY_BE_FALSE | MAY_BE_LONG), F1("timezone_open", MAY_BE_FALSE | MAY_BE_OBJECT), F1("timezone_name_get", MAY_BE_FALSE | MAY_BE_STRING), F1("timezone_name_from_abbr", MAY_BE_FALSE | MAY_BE_STRING), diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 04bf483..ee14e49 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2596,8 +2596,15 @@ static void zend_update_type_info(const zend_op_array *op_array, tmp |= MAY_BE_LONG; } } else { + if (t1 & MAY_BE_ERROR) { + tmp |= MAY_BE_NULL; + } if (t1 & (MAY_BE_UNDEF | MAY_BE_NULL)) { - tmp |= MAY_BE_LONG; + if (opline->opcode == ZEND_PRE_INC) { + tmp |= MAY_BE_LONG; + } else { + tmp |= MAY_BE_NULL; + } } if (t1 & MAY_BE_LONG) { tmp |= MAY_BE_LONG | MAY_BE_DOUBLE; @@ -2647,8 +2654,15 @@ static void zend_update_type_info(const zend_op_array *op_array, tmp |= MAY_BE_LONG; } } else { + if (t1 & MAY_BE_ERROR) { + tmp |= MAY_BE_NULL; + } if (t1 & (MAY_BE_UNDEF | MAY_BE_NULL)) { - tmp |= MAY_BE_LONG; + if (opline->opcode == ZEND_POST_INC) { + tmp |= MAY_BE_LONG; + } else { + tmp |= MAY_BE_NULL; + } } if (t1 & MAY_BE_LONG) { tmp |= MAY_BE_LONG | MAY_BE_DOUBLE; @@ -2923,6 +2937,8 @@ static void zend_update_type_info(const zend_op_array *op_array, } case ZEND_DECLARE_CLASS: case ZEND_DECLARE_INHERITED_CLASS: + case ZEND_DECLARE_ANON_CLASS: + case ZEND_DECLARE_ANON_INHERITED_CLASS: UPDATE_SSA_TYPE(MAY_BE_CLASS, ssa_ops[i].result_def); if ((ce = zend_hash_find_ptr(&script->class_table, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op1, ssa->rt_constants)))) != NULL) { UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_ops[i].result_def);
« previous php.cvs (#92407) next »