]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.0' into PHP-7.1
authorDmitry Stogov <dmitry@zend.com>
Mon, 28 Nov 2016 09:30:01 +0000 (12:30 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 28 Nov 2016 09:30:01 +0000 (12:30 +0300)
* PHP-7.0:
  Fixed calling generators through magic __call()

1  2 
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 6e82ddba8f9d4d5ccaa9e3f6b2f55092a847551e,fdce0f973f54568b21b7d5d4ec7aa808fc05f373..0f1d754f8cf35da8e01597b4971d70db492fb00c
@@@ -7964,18 -7927,28 +7964,15 @@@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLI
        fbc = call->func;
  
        if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
-               ZEND_ASSERT(!(fbc->common.fn_flags & ZEND_ACC_GENERATOR));
--
 -              if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
 -                      if (ret) {
 -                              zend_generator_create_zval(call, &fbc->op_array, ret);
 -                              Z_VAR_FLAGS_P(ret) = 0;
 -                      } else {
 -                              if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_CLOSURE)) {
 -                                      OBJ_RELEASE((zend_object*)fbc->op_array.prototype);
 -                              }
 -                              zend_vm_stack_free_args(call);
 -                      }
 +              if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
 +                      init_func_run_time_cache(&fbc->op_array);
 +              }
 +              i_init_func_execute_data(call, &fbc->op_array, ret);
 +              if (EXPECTED(zend_execute_ex == execute_ex)) {
 +                      ZEND_VM_ENTER();
                } else {
 -                      call->symbol_table = NULL;
 -                      i_init_func_execute_data(call, &fbc->op_array,
 -                                      ret, (fbc->common.fn_flags & ZEND_ACC_STATIC) == 0);
 -
 -                      if (EXPECTED(zend_execute_ex == execute_ex)) {
 -                              ZEND_VM_ENTER();
 -                      } else {
 -                              ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
 -                              zend_execute_ex(call);
 -                      }
 +                      ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
 +                      zend_execute_ex(call);
                }
        } else {
                zval retval;
index fc1b7f571dd35b01f4dbd84fd0e7e9f240dfc604,c97525e0f41e54686f75bb4054de792f548b345a..cb49393dd3a1086144917b91e28450fab507e22b
@@@ -1976,18 -1736,28 +1976,15 @@@ static ZEND_OPCODE_HANDLER_RET ZEND_FAS
        fbc = call->func;
  
        if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
-               ZEND_ASSERT(!(fbc->common.fn_flags & ZEND_ACC_GENERATOR));
--
 -              if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
 -                      if (ret) {
 -                              zend_generator_create_zval(call, &fbc->op_array, ret);
 -                              Z_VAR_FLAGS_P(ret) = 0;
 -                      } else {
 -                              if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_CLOSURE)) {
 -                                      OBJ_RELEASE((zend_object*)fbc->op_array.prototype);
 -                              }
 -                              zend_vm_stack_free_args(call);
 -                      }
 +              if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
 +                      init_func_run_time_cache(&fbc->op_array);
 +              }
 +              i_init_func_execute_data(call, &fbc->op_array, ret);
 +              if (EXPECTED(zend_execute_ex == execute_ex)) {
 +                      ZEND_VM_ENTER();
                } else {
 -                      call->symbol_table = NULL;
 -                      i_init_func_execute_data(call, &fbc->op_array,
 -                                      ret, (fbc->common.fn_flags & ZEND_ACC_STATIC) == 0);
 -
 -                      if (EXPECTED(zend_execute_ex == execute_ex)) {
 -                              ZEND_VM_ENTER();
 -                      } else {
 -                              ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
 -                              zend_execute_ex(call);
 -                      }
 +                      ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
 +                      zend_execute_ex(call);
                }
        } else {
                zval retval;