]> granicus.if.org Git - php/commitdiff
Merge branch 'typed_returns' of github.com:morrisonlevi/php-src into test
authorDmitry Stogov <dmitry@zend.com>
Wed, 28 Jan 2015 03:56:19 +0000 (06:56 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 28 Jan 2015 03:56:19 +0000 (06:56 +0300)
* 'typed_returns' of github.com:morrisonlevi/php-src:
  Implement return types

1  2 
Zend/zend_closures.c
Zend/zend_compile.c
Zend/zend_opcode.c

index d50b42c0a26af4d720a4ca03d9f6e81bffe100ac,18b5c929c9a584b6de0705c09b33ad8b53d4ed34..023e741360ac995fa0713c2b68ce6c72134b63ba
@@@ -359,7 -359,7 +359,9 @@@ static HashTable *zend_closure_get_debu
                        zend_hash_str_update(closure->debug_info, "this", sizeof("this")-1, &closure->this_ptr);
                }
  
-               if (arg_info) {
 -              if (arg_info && closure->func.common.num_args) {
++              if (arg_info &&
++                  (closure->func.common.num_args ||
++                   (closure->func.common.fn_flags & ZEND_ACC_VARIADIC))) {
                        uint32_t i, num_args, required = closure->func.common.required_num_args;
  
                        array_init(&val);
index e3b15e0f49e09cc980811def656d8e000740540c,64399881014df1e404f5c52f222896100656e0ac..7476d475dea61bf12e400e1cf81b8485f63fc7d7
@@@ -3144,6 -3151,9 +3151,12 @@@ void zend_compile_return(zend_ast *ast
                opline->op1.var = CG(context).fast_call_var;
        }
  
+       if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+               zend_emit_return_type_check(&expr_node, CG(active_op_array)->arg_info - 1);
++              if (expr_node.op_type == IS_CONST) {
++                      zval_copy_ctor(&expr_node.u.constant);
++              }
+       }
        opline = zend_emit_op(NULL, by_ref ? ZEND_RETURN_BY_REF : ZEND_RETURN,
                &expr_node, NULL);
  
index aa2abb2f6bf10bb768f09530a22d9801b60a28b0,3fc3b13767ad154dd5f5a6e9b47dab1ce914ab92..a6d041f131209ddd4c4570634a7340c2dad0eca6
@@@ -367,18 -367,19 +367,26 @@@ ZEND_API void destroy_op_array(zend_op_
                zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_dtor_handler, op_array);
        }
        if (op_array->arg_info) {
-               uint32_t num_args = op_array->num_args;
+               int32_t num_args = op_array->num_args;
 -              int32_t i = op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE ? -1 : 0;
++              zend_arg_info *arg_info = op_array->arg_info;
++              int32_t i;
  
++              if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
++                      arg_info--;
++                      num_args++;
++              }
                if (op_array->fn_flags & ZEND_ACC_VARIADIC) {
                        num_args++;
                }
-               for (i = 0; i < num_args; i++) {
 -              for ( ; i < num_args; i++) {
--                      zend_string_release(op_array->arg_info[i].name);
--                      if (op_array->arg_info[i].class_name) {
--                              zend_string_release(op_array->arg_info[i].class_name);
++              for (i = 0 ; i < num_args; i++) {
++                      if (arg_info[i].name) {
++                              zend_string_release(arg_info[i].name);
++                      }
++                      if (arg_info[i].class_name) {
++                              zend_string_release(arg_info[i].class_name);
                        }
                }
--              efree(op_array->arg_info);
++              efree(arg_info);
        }
  }