]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.0'
authorNikita Popov <nikic@php.net>
Tue, 3 May 2016 16:15:29 +0000 (18:15 +0200)
committerNikita Popov <nikic@php.net>
Tue, 3 May 2016 16:15:29 +0000 (18:15 +0200)
1  2 
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

Simple merge
index 0ed33856f557f3e9195f336b802b290e12501d66,d9d58e02ab4564cf7e52a5d41014e92365b34397..9a74e53e296b0be2d7695fb489a391bc951424ae
@@@ -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);
                        }
 -                      break;
+               } else {
-               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
++                      ZVAL_COPY_VALUE(result, value);
 +              }
 +      } else {
-                               zval_copy_ctor_func(EX_VAR(opline->result.var));
++              ZVAL_COPY_VALUE(result, value);
 +              if (IS_CV == IS_CONST) {
 +                      if (UNEXPECTED(Z_OPT_COPYABLE_P(value))) {
-               } else if (IS_CV == IS_CV) {
-                       if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value);
++                              zval_copy_ctor_func(result);
 +                      }
                }
 -              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