]> granicus.if.org Git - php/commitdiff
fixed support for references
authorDmitry Stogov <dmitry@zend.com>
Wed, 26 Mar 2014 18:06:44 +0000 (22:06 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 26 Mar 2014 18:06:44 +0000 (22:06 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/standard/type.c

index e97646be2eb570024629f7674d772b4524b0ed39..97a32dca660be4f8a0f4cbdaa2a521559a4d5b40 100644 (file)
@@ -5119,6 +5119,9 @@ ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMP|VAR|CV, ANY)
        SAVE_OPLINE();
        expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
 
+       if (Z_ISREF_P(expr)) {
+               expr = Z_REFVAL_P(expr);
+       }
        if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
                result = instanceof_function(Z_OBJCE_P(expr), Z_CE_P(EX_VAR(opline->op2.var)) TSRMLS_CC);
        } else {
index 2ebff4738d424b7408f727132df0ad5c86292bf9..ac26665fa798845e0b7e7575a9edd344c50610d6 100644 (file)
@@ -8395,6 +8395,9 @@ static int ZEND_FASTCALL  ZEND_INSTANCEOF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
        SAVE_OPLINE();
        expr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
+       if (Z_ISREF_P(expr)) {
+               expr = Z_REFVAL_P(expr);
+       }
        if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
                result = instanceof_function(Z_OBJCE_P(expr), Z_CE_P(EX_VAR(opline->op2.var)) TSRMLS_CC);
        } else {
@@ -13665,6 +13668,9 @@ static int ZEND_FASTCALL  ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
        SAVE_OPLINE();
        expr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
+       if (Z_ISREF_P(expr)) {
+               expr = Z_REFVAL_P(expr);
+       }
        if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
                result = instanceof_function(Z_OBJCE_P(expr), Z_CE_P(EX_VAR(opline->op2.var)) TSRMLS_CC);
        } else {
@@ -30941,6 +30947,9 @@ static int ZEND_FASTCALL  ZEND_INSTANCEOF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
        SAVE_OPLINE();
        expr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 
+       if (Z_ISREF_P(expr)) {
+               expr = Z_REFVAL_P(expr);
+       }
        if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
                result = instanceof_function(Z_OBJCE_P(expr), Z_CE_P(EX_VAR(opline->op2.var)) TSRMLS_CC);
        } else {
index 182e4b97689cdd4adcdc0c4ccaab8ce051271d82..e95666e43951f456893151ec49936880d8a0ec9a 100644 (file)
@@ -224,6 +224,9 @@ static void php_is_type(INTERNAL_FUNCTION_PARAMETERS, int type)
                RETURN_FALSE;
        }
 
+       if (Z_ISREF_P(arg)) {
+               arg = Z_REFVAL_P(arg);
+       }
        if (Z_TYPE_P(arg) == type) {
                if (type == IS_OBJECT) {
                        zend_class_entry *ce;