From: Nikita Popov Date: Tue, 3 May 2016 16:15:29 +0000 (+0200) Subject: Merge branch 'PHP-7.0' X-Git-Tag: php-7.1.0alpha1~211 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d06431bf1b8e33338012de07b423bcfe2522caa2;p=php Merge branch 'PHP-7.0' --- d06431bf1b8e33338012de07b423bcfe2522caa2 diff --cc Zend/zend_vm_execute.h index 0ed33856f5,d9d58e02ab..9a74e53e29 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@@ -35774,36 -30246,66 +35798,37 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS { USE_OPLINE - zval *op1, *op2, *result; + zval *value; + zval *ref = NULL; - op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - op2 = EX_CONSTANT(opline->op2); - do { - int result; + SAVE_OPLINE(); + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); - if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) { - result = (Z_LVAL_P(op1) == Z_LVAL_P(op2)); - } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) { - result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2)); - } else { - break; - } - } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) { - result = (Z_DVAL_P(op1) == Z_DVAL_P(op2)); - } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) { - result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2))); - } else { - break; + if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) { + if (IS_CV == IS_VAR) { + ref = value; + } + value = Z_REFVAL_P(value); + } + if (i_zend_is_true(value)) { + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); + if (IS_CV == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { + zval_copy_ctor_func(EX_VAR(opline->result.var)); } - } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } - + } else if (IS_CV == IS_CV) { + if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); + } else if (IS_CV == IS_VAR && ref) { + zend_reference *r = Z_REF_P(ref); - if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); - } else { - break; + if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) { + efree_size(r, sizeof(zend_reference)); ++ } else if (Z_OPT_REFCOUNTED_P(value)) { ++ Z_ADDREF_P(value); } - } else { - break; } - ZEND_VM_SMART_BRANCH(result, 0); - ZVAL_BOOL(EX_VAR(opline->result.var), result); - ZEND_VM_NEXT_OPCODE(); - } while (0); - - SAVE_OPLINE(); - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) { - op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R); - } - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) { - op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R); + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } - result = EX_VAR(opline->result.var); - compare_function(result, op1, op2); - ZVAL_BOOL(result, Z_LVAL_P(result) == 0); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@@ -35812,37 -30314,66 +35837,38 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS { USE_OPLINE - zval *op1, *op2, *result; + zval *value; + zval *ref = NULL; - op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - op2 = EX_CONSTANT(opline->op2); - do { - int result; + SAVE_OPLINE(); + value = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); - if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) { - result = (Z_LVAL_P(op1) != Z_LVAL_P(op2)); - } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) { - result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2)); - } else { - break; - } - } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) { - result = (Z_DVAL_P(op1) != Z_DVAL_P(op2)); - } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) { - result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2))); - } else { - break; - } - } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) { + if (IS_CV == IS_VAR) { + ref = value; + } + value = Z_REFVAL_P(value); + } + if (Z_TYPE_P(value) > IS_NULL) { + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); + if (IS_CV == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { + zval_copy_ctor_func(EX_VAR(opline->result.var)); + } + } else if (IS_CV == IS_CV) { + if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); + } else if (IS_CV == IS_VAR && ref) { + zend_reference *r = Z_REF_P(ref); - if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); - } else { - break; + if (UNEXPECTED(--GC_REFCOUNT(r) == 0)) { + efree_size(r, sizeof(zend_reference)); ++ } else if (Z_OPT_REFCOUNTED_P(value)) { ++ Z_ADDREF_P(value); } - } else { - break; } - ZEND_VM_SMART_BRANCH(result, 0); - ZVAL_BOOL(EX_VAR(opline->result.var), result); - ZEND_VM_NEXT_OPCODE(); - } while (0); - - SAVE_OPLINE(); - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) { - op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R); - } - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) { - op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R); + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } - result = EX_VAR(opline->result.var); - compare_function(result, op1, op2); - ZVAL_BOOL(result, Z_LVAL_P(result) != 0); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@@ -35851,37 -30382,53 +35877,43 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS { USE_OPLINE - zval *op1, *op2, *result; + zval *value; ++ zval *result = EX_VAR(opline->result.var); - op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - op2 = EX_CONSTANT(opline->op2); - do { - int result; + value = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + SAVE_OPLINE(); + GET_OP1_UNDEF_CV(value, BP_VAR_R); - ZVAL_NULL(EX_VAR(opline->result.var)); ++ ZVAL_NULL(result); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + } - if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(value)) { - ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(value)); - if (IS_CV == IS_VAR) { - if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) { - if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) { - result = (Z_LVAL_P(op1) < Z_LVAL_P(op2)); - } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) { - result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2)); - } else { - break; - } - } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) { - if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) { - result = (Z_DVAL_P(op1) < Z_DVAL_P(op2)); - } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) { - result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2))); - } else { - break; ++ if (IS_CV == IS_CV) { ++ ZVAL_DEREF(value); ++ ZVAL_COPY(result, value); ++ } else if (IS_CV == IS_VAR) { ++ if (UNEXPECTED(Z_ISREF_P(value))) { ++ ZVAL_COPY_VALUE(result, Z_REFVAL_P(value)); + if (UNEXPECTED(Z_DELREF_P(value) == 0)) { + efree_size(Z_REF_P(value), sizeof(zend_reference)); ++ } else if (Z_OPT_REFCOUNTED_P(result)) { ++ Z_ADDREF_P(result); } + } else { - break; ++ ZVAL_COPY_VALUE(result, value); + } + } else { - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value); ++ ZVAL_COPY_VALUE(result, value); + if (IS_CV == IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) { - zval_copy_ctor_func(EX_VAR(opline->result.var)); ++ zval_copy_ctor_func(result); + } - } else if (IS_CV == IS_CV) { - if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); } - ZEND_VM_SMART_BRANCH(result, 0); - ZVAL_BOOL(EX_VAR(opline->result.var), result); - ZEND_VM_NEXT_OPCODE(); - } while (0); - - SAVE_OPLINE(); - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) { - op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R); - } - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) { - op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R); } - result = EX_VAR(opline->result.var); - compare_function(result, op1, op2); - ZVAL_BOOL(result, Z_LVAL_P(result) < 0); - - - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE