]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.2'
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 16 Dec 2017 16:10:09 +0000 (17:10 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Sat, 16 Dec 2017 16:10:09 +0000 (17:10 +0100)
1  2 
Zend/zend_inheritance.c

index 00d0a9ac33746c46fd8c8844dc66ef37d65117ed,383df1a0f9d8549b713c9b98e648ec5e214cf29b..ef83622ba8632d733acdc624937fb827b7a408a8
@@@ -1594,32 -1565,23 +1594,44 @@@ static void zend_do_traits_property_bin
                                        zend_hash_del(&ce->properties_info, prop_name);
                                        flags |= ZEND_ACC_CHANGED;
                                } else {
 +                                      not_compatible = 1;
 +                                      
                                        if ((coliding_prop->flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))
                                                == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) {
 -                                              /* flags are identical, now the value needs to be checked */
 +                                              /* the flags are identical, thus, the properties may be compatible */
-                                               zval op1, op2;
+                                               zval *op1, *op2;
++                                              zval op1_tmp, op2_tmp;
 +
                                                if (flags & ZEND_ACC_STATIC) {
-                                                       ZVAL_COPY_OR_DUP(&op1, &ce->default_static_members_table[coliding_prop->offset]);
-                                                       ZVAL_COPY_OR_DUP(&op2, &ce->traits[i]->default_static_members_table[property_info->offset]);
+                                                       op1 = &ce->default_static_members_table[coliding_prop->offset];
+                                                       op2 = &ce->traits[i]->default_static_members_table[property_info->offset];
+                                                       ZVAL_DEREF(op1);
+                                                       ZVAL_DEREF(op2);
                                                } else {
-                                                       ZVAL_COPY_OR_DUP(&op1, &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)]);
-                                                       ZVAL_COPY_OR_DUP(&op2, &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]);
+                                                       op1 = &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)];
+                                                       op2 = &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)];
                                                }
-                                               if (UNEXPECTED(Z_TYPE(op1) == IS_CONSTANT_AST)) {
-                                                       zval_update_constant_ex(&op1, ce);
 +
 +                                              /* if any of the values is a constant, we try to resolve it */
-                                               if (UNEXPECTED(Z_TYPE(op2) == IS_CONSTANT_AST)) {
-                                                       zval_update_constant_ex(&op2, ce);
++                                              if (UNEXPECTED(Z_TYPE_P(op1) == IS_CONSTANT_AST)) {
++                                                      ZVAL_COPY_OR_DUP(&op1_tmp, op1);
++                                                      zval_update_constant_ex(&op1_tmp, ce);
++                                                      op1 = &op1_tmp;
 +                                              }
-                                               not_compatible = fast_is_not_identical_function(&op1, &op2);
-                                               zval_ptr_dtor_nogc(&op1);
-                                               zval_ptr_dtor_nogc(&op2);
++                                              if (UNEXPECTED(Z_TYPE_P(op2) == IS_CONSTANT_AST)) {
++                                                      ZVAL_COPY_OR_DUP(&op2_tmp, op2);
++                                                      zval_update_constant_ex(&op2_tmp, ce);
++                                                      op2 = &op2_tmp;
 +                                              }
 +
 -                                      } else {
 -                                              /* the flags are not identical, thus, we assume properties are not compatible */
 -                                              not_compatible = 1;
+                                               not_compatible = fast_is_not_identical_function(op1, op2);
++
++                                              if (op1 == &op1_tmp) {
++                                                      zval_ptr_dtor_nogc(&op1_tmp);
++                                              }
++                                              if (op2 == &op2_tmp) {
++                                                      zval_ptr_dtor_nogc(&op2_tmp);
++                                              }
                                        }
  
                                        if (not_compatible) {