From: Dmitry Stogov Date: Wed, 26 Mar 2014 18:06:44 +0000 (+0400) Subject: fixed support for references X-Git-Tag: POST_PHPNG_MERGE~412^2~222 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=de6a76d16e40b342131fb929fba7213aeb406868;p=php fixed support for references --- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e97646be2e..97a32dca66 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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 { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2ebff4738d..ac26665fa7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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 { diff --git a/ext/standard/type.c b/ext/standard/type.c index 182e4b9768..e95666e439 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -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;