]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 8 Oct 2019 15:34:25 +0000 (17:34 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 8 Oct 2019 15:34:25 +0000 (17:34 +0200)
1  2 
Zend/zend_compile.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b169093de5a4050a55befc912e67ba84c0710e10,ce37710dd09e90a7e9cfee863ed1cda940af7ceb..57ec93231037076edc9aa157027b21c5edb53090
@@@ -5482,18 -5413,80 +5478,24 @@@ void zend_compile_params(zend_ast *ast
                                zend_error_noreturn(E_COMPILE_ERROR, "void cannot be used as a parameter type");
                        }
  
 -                      if (type_ast->kind == ZEND_AST_TYPE) {
 -                              if (ZEND_TYPE_CODE(arg_info->type) == IS_ARRAY) {
 -                                      if (default_ast && !has_null_default
 -                                              && Z_TYPE(default_node.u.constant) != IS_ARRAY
 -                                              && Z_TYPE(default_node.u.constant) != IS_CONSTANT_AST
 -                                      ) {
 -                                              zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                      "with array type can only be an array or NULL");
 -                                      }
 -                              } else if (ZEND_TYPE_CODE(arg_info->type) == IS_CALLABLE && default_ast) {
 -                                      if (!has_null_default && Z_TYPE(default_node.u.constant) != IS_CONSTANT_AST) {
 -                                              zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                      "with callable type can only be NULL");
 -                                      }
 -                              }
 -                      } else {
 -                              if (default_ast && !has_null_default && Z_TYPE(default_node.u.constant) != IS_CONSTANT_AST) {
 -                                      if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
 -                                              zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                      "with a class type can only be NULL");
 -                                      } else switch (ZEND_TYPE_CODE(arg_info->type)) {
 -                                              case IS_DOUBLE:
 -                                                      if (Z_TYPE(default_node.u.constant) != IS_DOUBLE && Z_TYPE(default_node.u.constant) != IS_LONG) {
 -                                                              zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                                      "with a float type can only be float, integer, or NULL");
 -                                                      }
 -                                                      convert_to_double(&default_node.u.constant);
 -                                                      break;
 -
 -                                              case IS_ITERABLE:
 -                                                      if (Z_TYPE(default_node.u.constant) != IS_ARRAY) {
 -                                                              zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                                      "with iterable type can only be an array or NULL");
 -                                                      }
 -                                                      break;
 -
 -                                              case IS_OBJECT:
 -                                                      zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                              "with an object type can only be NULL");
 -                                                      break;
 -
 -                                              default:
 -                                                      if (!ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(arg_info->type), Z_TYPE(default_node.u.constant))) {
 -                                                              zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
 -                                                                      "with a %s type can only be %s or NULL",
 -                                                                      zend_get_type_by_const(ZEND_TYPE_CODE(arg_info->type)), zend_get_type_by_const(ZEND_TYPE_CODE(arg_info->type)));
 -                                                      }
 -                                                      break;
 -                                      }
 -                              }
 +                      if (default_type > IS_NULL && default_type != IS_CONSTANT_AST
 +                                      && !zend_is_valid_default_value(arg_info->type, &default_node.u.constant)) {
 +                              zend_string *type_str = zend_type_to_string(arg_info->type);
 +                              zend_error_noreturn(E_COMPILE_ERROR,
 +                                      "Cannot use %s as default value for parameter $%s of type %s",
 +                                      zend_get_type_by_const(default_type),
 +                                      ZSTR_VAL(name), ZSTR_VAL(type_str));
                        }
+               }
  
+               opline = zend_emit_op(NULL, opcode, NULL, &default_node);
+               SET_NODE(opline->result, &var_node);
+               opline->op1.num = i + 1;
+               if (type_ast) {
                        /* Allocate cache slot to speed-up run-time class resolution */
-                       if (is_class) {
 -                      if (opline->opcode == ZEND_RECV_INIT) {
 -                              if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
 -                                      opline->extended_value = zend_alloc_cache_slot();
 -                              }
 -                      } else {
 -                              if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
 -                                      opline->op2.num = op_array->cache_size;
 -                                      op_array->cache_size += sizeof(void*);
 -                              } else {
 -                                      opline->op2.num = -1;
 -                              }
 -                      }
 -              } else {
 -                      if (opline->opcode != ZEND_RECV_INIT) {
 -                              opline->op2.num = -1;
++                      if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
 +                              opline->extended_value = zend_alloc_cache_slot();
                        }
                }
        }
index b1927d280cf8502e9405685844a7e84ecd9f3040,0c1ab106b3e7b4bce5873c683be11d10f7625b79..b2ea3fefd58c1a535e2ccc2f68bcad702fcd306f
@@@ -5117,12 -5252,15 +5118,13 @@@ ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT
                } else {
                        ZVAL_COPY(param, default_value);
                }
-       }
-       if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
-               SAVE_OPLINE();
-               if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
-                       HANDLE_EXCEPTION();
+       } else {
+ ZEND_VM_C_LABEL(recv_init_check_type):
+               if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
 -                      zval *default_value = RT_CONSTANT(opline, opline->op2);
 -
+                       SAVE_OPLINE();
 -                      if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)))) {
++                      if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
+                               HANDLE_EXCEPTION();
+                       }
                }
        }
  
index 3e01ae36b39642c263f4f8c0c6da1aadbf73a914,f1b46fbd97d007e39ff73a193e335b9d923feeb3..ffd3ede5814a7e4414111e803594ab266272dfca
@@@ -2973,12 -3055,15 +2974,13 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_
                } else {
                        ZVAL_COPY(param, default_value);
                }
-       }
-       if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
-               SAVE_OPLINE();
-               if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
-                       HANDLE_EXCEPTION();
+       } else {
+ recv_init_check_type:
+               if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
 -                      zval *default_value = RT_CONSTANT(opline, opline->op2);
 -
+                       SAVE_OPLINE();
 -                      if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, default_value, CACHE_ADDR(opline->extended_value)))) {
++                      if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
+                               HANDLE_EXCEPTION();
+                       }
                }
        }