@@ -7981,6 +7981,73 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
7981
7981
if (!is_in_silence_live_range (EX (func )-> op_array , throw_op_num )
7982
7982
|| !instanceof_function (zend_ce_exception , EG (exception )-> ce )) {
7983
7983
cleanup_unfinished_calls (execute_data , throw_op_num );
7984
+ } else if (UNEXPECTED (EX (call ))) {
7985
+ zend_execute_data * call = EX (call );
7986
+ zend_op * opline = EX (func )-> op_array .opcodes + throw_op_num ;
7987
+ bool do_exit = false;
7988
+ unsigned int level = 0 ;
7989
+
7990
+ printf ("Opcode %d\n" , opline -> opcode );
7991
+ /* Decrement opline */
7992
+ opline -- ;
7993
+
7994
+ do {
7995
+ switch (opline -> opcode ) {
7996
+ case ZEND_DO_FCALL :
7997
+ case ZEND_DO_ICALL :
7998
+ case ZEND_DO_UCALL :
7999
+ case ZEND_DO_FCALL_BY_NAME :
8000
+ level ++ ;
8001
+ break ;
8002
+ case ZEND_INIT_FCALL :
8003
+ case ZEND_INIT_FCALL_BY_NAME :
8004
+ case ZEND_INIT_NS_FCALL_BY_NAME :
8005
+ case ZEND_INIT_DYNAMIC_CALL :
8006
+ case ZEND_INIT_USER_CALL :
8007
+ case ZEND_INIT_METHOD_CALL :
8008
+ case ZEND_INIT_STATIC_METHOD_CALL :
8009
+ case ZEND_NEW :
8010
+ if (level == 0 ) {
8011
+ ZEND_CALL_NUM_ARGS (call ) = 0 ;
8012
+ do_exit = true;
8013
+ }
8014
+ level -- ;
8015
+ break ;
8016
+ case ZEND_SEND_VAL :
8017
+ case ZEND_SEND_VAL_EX :
8018
+ case ZEND_SEND_VAR :
8019
+ case ZEND_SEND_VAR_EX :
8020
+ case ZEND_SEND_FUNC_ARG :
8021
+ case ZEND_SEND_REF :
8022
+ case ZEND_SEND_VAR_NO_REF :
8023
+ case ZEND_SEND_VAR_NO_REF_EX :
8024
+ case ZEND_SEND_USER :
8025
+ if (level == 0 ) {
8026
+ /* For named args, the number of arguments is up to date. */
8027
+ if (opline -> op2_type != IS_CONST ) {
8028
+ ZEND_CALL_NUM_ARGS (call ) = opline -> op2 .num ;
8029
+ }
8030
+ do_exit = true;
8031
+ }
8032
+ break ;
8033
+ case ZEND_SEND_ARRAY :
8034
+ case ZEND_SEND_UNPACK :
8035
+ case ZEND_CHECK_UNDEF_ARGS :
8036
+ if (level == 0 ) {
8037
+ do_exit = true;
8038
+ }
8039
+ break ;
8040
+ }
8041
+ if (!do_exit ) {
8042
+ opline -- ;
8043
+ }
8044
+ } while (!do_exit );
8045
+
8046
+ //zend_vm_stack_free_args(call);
8047
+ //zend_vm_stack_free_extra_args(call);
8048
+ //EX(call) = call->prev_execute_data;
8049
+ //zend_vm_stack_free_call_frame(call);
8050
+ //call = EX(call);
7984
8051
}
7985
8052
7986
8053
if (throw_op -> result_type & (IS_VAR | IS_TMP_VAR )) {
0 commit comments