]> granicus.if.org Git - php/commitdiff
More accurate handling of isset() and unset()
authorDmitry Stogov <dmitry@zend.com>
Fri, 22 Jan 2016 10:32:20 +0000 (13:32 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 22 Jan 2016 10:32:20 +0000 (13:32 +0300)
ext/opcache/Optimizer/zend_cfg.c

index b8121808d2fe6ea833f3e0309520b52d8426bcf4..a7122319e773da2df612dc5daf205fdd72c23515 100644 (file)
@@ -366,7 +366,12 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                                break;
                        case ZEND_UNSET_VAR:
                        case ZEND_ISSET_ISEMPTY_VAR:
-                               if (!(opline->extended_value & ZEND_QUICK_SET)) {
+                               if (((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_LOCAL) &&
+                                   !(opline->extended_value & ZEND_QUICK_SET)) {
+                                       flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
+                               } else if (((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL ||
+                                           (opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL_LOCK) &&
+                                          !op_array->function_name) {
                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
                                }
                                break;