]> granicus.if.org Git - php/commitdiff
RC inference fixes
authorNikita Popov <nikic@php.net>
Thu, 17 Nov 2016 00:07:18 +0000 (01:07 +0100)
committerNikita Popov <nikic@php.net>
Thu, 17 Nov 2016 12:47:36 +0000 (13:47 +0100)
ext/opcache/Optimizer/zend_func_info.c
ext/opcache/Optimizer/zend_inference.c

index c00964d9bd1ed820f8572c486af6d5aa00c39b56..60954e0c19d1c19da99ff31c6f6cbde6ade72946 100644 (file)
@@ -824,7 +824,7 @@ static const func_info_t func_infos[] = {
        F1("array_flip",                   MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING),
        F1("array_change_key_case",        MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_rand",                   UNKNOWN_INFO),
-       F1("array_unique",                 MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
+       FN("array_unique",                 MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_intersect",              MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_intersect_key",          MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_intersect_ukey",         MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
@@ -833,7 +833,7 @@ static const func_info_t func_infos[] = {
        F1("array_uintersect_assoc",       MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_intersect_uassoc",       MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_uintersect_uassoc",      MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
-       F1("array_diff",                   MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
+       FN("array_diff",                   MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_diff_key",               MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_diff_ukey",              MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_udiff",                  MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
index 4c41e2196b1f93eeb5d97aa732ee1dc5bcaa837f..d0e5d84e895daef58b3e2d6fee2d8048753bbbd1 100644 (file)
@@ -2524,10 +2524,10 @@ static void zend_update_type_info(const zend_op_array *op_array,
                                                tmp |= (t1 & MAY_BE_RC1) | MAY_BE_RCN;
                                        } else if ((opline->extended_value == IS_ARRAY ||
                                                    opline->extended_value == IS_OBJECT) &&
-                                                  (tmp & (MAY_BE_ARRAY|MAY_BE_OBJECT))) {
+                                                  (t1 & (MAY_BE_ARRAY|MAY_BE_OBJECT))) {
                                                        tmp |= MAY_BE_RC1 | MAY_BE_RCN;
                                        } else if (opline->extended_value == IS_STRING &&
-                                                  (t1 & MAY_BE_STRING)) {
+                                                  (t1 & (MAY_BE_STRING|MAY_BE_OBJECT))) {
                                                tmp |= MAY_BE_RC1 | MAY_BE_RCN;
                                        } else {
                                                tmp |= MAY_BE_RC1;