]> granicus.if.org Git - php/commitdiff
Support isset() on temporaries
authorNikita Popov <nikic@php.net>
Sat, 31 May 2014 18:05:03 +0000 (20:05 +0200)
committerNikita Popov <nikic@php.net>
Sat, 31 May 2014 18:05:03 +0000 (20:05 +0200)
Zend/tests/varSyntax/issetOnTemp.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/varSyntax/issetOnTemp.phpt b/Zend/tests/varSyntax/issetOnTemp.phpt
new file mode 100644 (file)
index 0000000..cd7bc00
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+isset() can be used on dereferences of temporary expressions
+--FILE--
+<?php
+
+var_dump(isset([0, 1][0]));
+var_dump(isset(([0, 1] + [])[0]));
+var_dump(isset([[0, 1]][0][0]));
+var_dump(isset(([[0, 1]] + [])[0][0]));
+var_dump(isset(((object) ['a' => 'b'])->a));
+var_dump(isset(['a' => 'b']->a));
+var_dump(isset("str"->a));
+var_dump(isset((['a' => 'b'] + [])->a));
+var_dump(isset((['a' => 'b'] + [])->a->b));
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
index aaf1e494bb4ea382673a1b60a468d7883fbb4670..b1993f99a35b9aba8d999846e73d1e3367cf65cd 100644 (file)
@@ -1317,7 +1317,7 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
        ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -1473,7 +1473,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1;
@@ -4627,7 +4627,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
        ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -4731,12 +4731,12 @@ ZEND_VM_C_LABEL(str_index_prop):
 
        FREE_OP2();
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
-       FREE_OP1_IF_VAR();
+       FREE_OP1();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -4764,7 +4764,7 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|C
 
        FREE_OP2();
        ZVAL_BOOL(EX_VAR(opline->result.var), result);
-       FREE_OP1_IF_VAR();
+       FREE_OP1();
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
index d2b8f57d797224d5fcf5fa78a0e3a027a0824223..fd9247ffc2812b4024535a8dc7378a2160839ab3 100644 (file)
@@ -3725,6 +3725,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST TSRMLS_CC);
+
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CONST_CONST(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -3762,6 +3777,37 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
        return zend_fetch_property_address_read_helper_SPEC_CONST_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset  = opline->op2.zv;
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_FETCH_DIM_TMP_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -4271,6 +4317,146 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = opline->op2.zv;
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_CONST != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = opline->op2.zv;
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -4741,6 +4927,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op2;
+       zval *container;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR TSRMLS_CC);
+       zval_dtor(free_op2.var);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CONST_TMP(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -4779,6 +4980,38 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
        return zend_fetch_property_address_read_helper_SPEC_CONST_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+       zend_free_op free_op2;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset  = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_TMP_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+       zval_dtor(free_op2.var);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -5024,6 +5257,148 @@ static int ZEND_FASTCALL  ZEND_INIT_ARRAY_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HAN
        }
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op2;
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_TMP_VAR != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_dtor(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op2;
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_dtor(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -5607,6 +5982,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op2;
+       zval *container;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR TSRMLS_CC);
+       zval_ptr_dtor_nogc(free_op2.var);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CONST_VAR(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -5645,6 +6035,38 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA
        return zend_fetch_property_address_read_helper_SPEC_CONST_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+       zend_free_op free_op2;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset  = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+       zval_ptr_dtor_nogc(free_op2.var);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -6041,6 +6463,148 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op2;
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_VAR != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_ptr_dtor_nogc(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op2;
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_ptr_dtor_nogc(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -7152,6 +7716,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV TSRMLS_CC);
+
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CONST_CV(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -7189,6 +7768,37 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
        return zend_fetch_property_address_read_helper_SPEC_CONST_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset  = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -7486,6 +8096,146 @@ static int ZEND_FASTCALL  ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAND
        }
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_CV != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = opline->op1.zv;
+       offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -9046,6 +9796,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST TSRMLS_CC);
+
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_TMP_CONST(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -9083,6 +9848,37 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
        return zend_fetch_property_address_read_helper_SPEC_TMP_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset  = opline->op2.zv;
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_FETCH_DIM_TMP_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -9493,6 +10289,146 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = opline->op2.zv;
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_CONST != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = opline->op2.zv;
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -9930,6 +10866,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1, free_op2;
+       zval *container;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR TSRMLS_CC);
+       zval_dtor(free_op2.var);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_TMP_TMP(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -9968,6 +10919,38 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
        return zend_fetch_property_address_read_helper_SPEC_TMP_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+       zend_free_op free_op2;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset  = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_TMP_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+       zval_dtor(free_op2.var);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -10213,6 +11196,148 @@ static int ZEND_FASTCALL  ZEND_INIT_ARRAY_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDL
        }
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1, free_op2;
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_TMP_VAR != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_dtor(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1, free_op2;
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_dtor(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -10796,6 +11921,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1, free_op2;
+       zval *container;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR TSRMLS_CC);
+       zval_ptr_dtor_nogc(free_op2.var);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_TMP_VAR(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -10834,6 +11974,38 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND
        return zend_fetch_property_address_read_helper_SPEC_TMP_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+       zend_free_op free_op2;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset  = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+       zval_ptr_dtor_nogc(free_op2.var);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -11230,6 +12402,148 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1, free_op2;
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_VAR != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_ptr_dtor_nogc(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1, free_op2;
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       zval_ptr_dtor_nogc(free_op2.var);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -12209,6 +13523,21 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
        ZEND_VM_NEXT_OPCODE();
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       zend_fetch_dimension_address_read_IS(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV TSRMLS_CC);
+
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_TMP_CV(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -12246,6 +13575,37 @@ static int ZEND_FASTCALL  ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
        return zend_fetch_property_address_read_helper_SPEC_TMP_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 }
 
+static int ZEND_FASTCALL  ZEND_FETCH_OBJ_IS_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset  = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+
+       if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
+           UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
+               ZVAL_NULL(EX_VAR(opline->result.var));
+       } else {
+               zval *retval;
+
+               /* here we are sure we are dealing with an object */
+               retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1), EX_VAR(opline->result.var) TSRMLS_CC);
+
+               if (retval != EX_VAR(opline->result.var)) {
+                       ZVAL_COPY(EX_VAR(opline->result.var), retval);
+               }
+       }
+
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -12488,6 +13848,146 @@ static int ZEND_FASTCALL  ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLE
        }
 }
 
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+       int result;
+       ulong hval;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_ARRAY) {
+               HashTable *ht = Z_ARRVAL_P(container);
+               zval *value = NULL;
+               zend_string *str;
+
+isset_again:
+               switch (Z_TYPE_P(offset)) {
+                       case IS_DOUBLE:
+                               hval = zend_dval_to_lval(Z_DVAL_P(offset));
+                               goto num_index_prop;
+                       case IS_LONG:
+                               hval = Z_LVAL_P(offset);
+num_index_prop:
+                               value = zend_hash_index_find(ht, hval);
+                               break;
+                       case IS_STRING:
+                               str = Z_STR_P(offset);
+                               if (IS_CV != IS_CONST) {
+                                       ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+                               }
+str_index_prop:
+                               value = zend_hash_find_ind(ht, str);
+                               break;
+                       case IS_NULL:
+                               str = STR_EMPTY_ALLOC();
+                               goto str_index_prop;
+                               break;
+                       case IS_FALSE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_TRUE:
+                               hval = 0;
+                               goto num_index_prop;
+                       case IS_RESOURCE:
+                               hval = Z_RES_HANDLE_P(offset);
+                               goto num_index_prop;
+                       case IS_REFERENCE:
+                               offset = Z_REFVAL_P(offset);
+                               goto isset_again;
+                               break;
+                       default:
+                               zend_error(E_WARNING, "Illegal offset type in isset or empty");
+                               break;
+               }
+
+               if (opline->extended_value & ZEND_ISSET) {
+                       /* > IS_NULL means not IS_UNDEF and not IS_NULL */
+                       result = (value != NULL && Z_TYPE_P(value) > IS_NULL);
+               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+                       result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
+               }
+       } else if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_dimension) {
+                       result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check element of non-array");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+               zval tmp;
+
+               result = 0;
+               if (UNEXPECTED(Z_TYPE_P(offset) != IS_LONG)) {
+                       if (Z_TYPE_P(offset) < IS_STRING /* simple scalar types */
+                                       || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
+                                               && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
+                               ZVAL_DUP(&tmp, offset);
+                               convert_to_long(&tmp);
+                               offset = &tmp;
+                       }
+               }
+               if (Z_TYPE_P(offset) == IS_LONG) {
+                       if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) {
+                               if ((opline->extended_value & ZEND_ISSET) ||
+                                   Z_STRVAL_P(container)[offset->value.lval] != '0') {
+                                       result = 1;
+                               }
+                       }
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_free_op free_op1;
+       zval *container;
+       int result;
+       zval *offset;
+
+       SAVE_OPLINE();
+       container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+       offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+
+       if (Z_TYPE_P(container) == IS_OBJECT) {
+               if (Z_OBJ_HT_P(container)->has_property) {
+                       result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? Z_CACHE_SLOT_P(offset) : -1) TSRMLS_CC);
+               } else {
+                       zend_error(E_NOTICE, "Trying to check property of non-object");
+                       result = 0;
+               }
+               if ((opline->extended_value & ZEND_ISSET) == 0) {
+                       result = !result;
+               }
+       } else {
+               result = ((opline->extended_value & ZEND_ISSET) == 0);
+       }
+
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       zval_dtor(free_op1.var);
+       CHECK_EXCEPTION();
+       ZEND_VM_NEXT_OPCODE();
+}
+
 static int ZEND_FASTCALL  ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -42465,16 +43965,16 @@ void zend_init_opcodes_handlers(void)
        ZEND_FETCH_IS_SPEC_CV_VAR_HANDLER,
        ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLER,
        ZEND_NULL_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_CONST_CONST_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_CONST_TMP_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_CONST_VAR_HANDLER,
        ZEND_NULL_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_CONST_CV_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_TMP_CONST_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_TMP_TMP_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_TMP_VAR_HANDLER,
        ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
+       ZEND_FETCH_DIM_IS_SPEC_TMP_CV_HANDLER,
        ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER,
        ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER,
        ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER,
@@ -42490,16 +43990,16 @@ void zend_init_opcodes_handlers(void)
        ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER,
        ZEND_NULL_HANDLER,
        ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_CONST_TMP_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_CONST_VAR_HANDLER,
        ZEND_NULL_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_TMP_CONST_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_TMP_TMP_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_TMP_VAR_HANDLER,
        ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
+       ZEND_FETCH_OBJ_IS_SPEC_TMP_CV_HANDLER,
        ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER,
        ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER,
        ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER,
@@ -43090,16 +44590,16 @@ void zend_init_opcodes_handlers(void)
        ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER,
        ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER,
        ZEND_NULL_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMP_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_VAR_HANDLER,
        ZEND_NULL_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CONST_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_TMP_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_VAR_HANDLER,
        ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
+       ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CV_HANDLER,
        ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER,
        ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER,
        ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER,
@@ -43915,16 +45415,16 @@ void zend_init_opcodes_handlers(void)
        ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER,
        ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER,
        ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMP_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_VAR_HANDLER,
        ZEND_NULL_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CONST_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_TMP_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_VAR_HANDLER,
        ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
-       ZEND_NULL_HANDLER,
+       ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CV_HANDLER,
        ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER,
        ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER,
        ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER,