Skip to content

Commit 2c10b60

Browse files
committed
Try to figure out how to free arguments
1 parent 0ba8a9a commit 2c10b60

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed

Zend/zend_vm_def.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7887,6 +7887,73 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
78877887
if (!is_in_silence_live_range(EX(func)->op_array, throw_op_num)
78887888
|| !instanceof_function(zend_ce_exception, EG(exception)->ce)) {
78897889
cleanup_unfinished_calls(execute_data, throw_op_num);
7890+
} else if (UNEXPECTED(EX(call))) {
7891+
zend_execute_data *call = EX(call);
7892+
zend_op *opline = EX(func)->op_array.opcodes + throw_op_num;
7893+
bool do_exit = false;
7894+
unsigned int level = 0;
7895+
7896+
printf("Opcode %d\n", opline->opcode);
7897+
/* Decrement opline */
7898+
opline--;
7899+
7900+
do {
7901+
switch (opline->opcode) {
7902+
case ZEND_DO_FCALL:
7903+
case ZEND_DO_ICALL:
7904+
case ZEND_DO_UCALL:
7905+
case ZEND_DO_FCALL_BY_NAME:
7906+
level++;
7907+
break;
7908+
case ZEND_INIT_FCALL:
7909+
case ZEND_INIT_FCALL_BY_NAME:
7910+
case ZEND_INIT_NS_FCALL_BY_NAME:
7911+
case ZEND_INIT_DYNAMIC_CALL:
7912+
case ZEND_INIT_USER_CALL:
7913+
case ZEND_INIT_METHOD_CALL:
7914+
case ZEND_INIT_STATIC_METHOD_CALL:
7915+
case ZEND_NEW:
7916+
if (level == 0) {
7917+
ZEND_CALL_NUM_ARGS(call) = 0;
7918+
do_exit = true;
7919+
}
7920+
level--;
7921+
break;
7922+
case ZEND_SEND_VAL:
7923+
case ZEND_SEND_VAL_EX:
7924+
case ZEND_SEND_VAR:
7925+
case ZEND_SEND_VAR_EX:
7926+
case ZEND_SEND_FUNC_ARG:
7927+
case ZEND_SEND_REF:
7928+
case ZEND_SEND_VAR_NO_REF:
7929+
case ZEND_SEND_VAR_NO_REF_EX:
7930+
case ZEND_SEND_USER:
7931+
if (level == 0) {
7932+
/* For named args, the number of arguments is up to date. */
7933+
if (opline->op2_type != IS_CONST) {
7934+
ZEND_CALL_NUM_ARGS(call) = opline->op2.num;
7935+
}
7936+
do_exit = true;
7937+
}
7938+
break;
7939+
case ZEND_SEND_ARRAY:
7940+
case ZEND_SEND_UNPACK:
7941+
case ZEND_CHECK_UNDEF_ARGS:
7942+
if (level == 0) {
7943+
do_exit = true;
7944+
}
7945+
break;
7946+
}
7947+
if (!do_exit) {
7948+
opline--;
7949+
}
7950+
} while (!do_exit);
7951+
7952+
//zend_vm_stack_free_args(call);
7953+
//zend_vm_stack_free_extra_args(call);
7954+
//EX(call) = call->prev_execute_data;
7955+
//zend_vm_stack_free_call_frame(call);
7956+
//call = EX(call);
78907957
}
78917958

78927959
if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {

Zend/zend_vm_execute.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3155,6 +3155,73 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
31553155
if (!is_in_silence_live_range(EX(func)->op_array, throw_op_num)
31563156
|| !instanceof_function(zend_ce_exception, EG(exception)->ce)) {
31573157
cleanup_unfinished_calls(execute_data, throw_op_num);
3158+
} else if (UNEXPECTED(EX(call))) {
3159+
zend_execute_data *call = EX(call);
3160+
zend_op *opline = EX(func)->op_array.opcodes + throw_op_num;
3161+
bool do_exit = false;
3162+
unsigned int level = 0;
3163+
3164+
printf("Opcode %d\n", opline->opcode);
3165+
/* Decrement opline */
3166+
opline--;
3167+
3168+
do {
3169+
switch (opline->opcode) {
3170+
case ZEND_DO_FCALL:
3171+
case ZEND_DO_ICALL:
3172+
case ZEND_DO_UCALL:
3173+
case ZEND_DO_FCALL_BY_NAME:
3174+
level++;
3175+
break;
3176+
case ZEND_INIT_FCALL:
3177+
case ZEND_INIT_FCALL_BY_NAME:
3178+
case ZEND_INIT_NS_FCALL_BY_NAME:
3179+
case ZEND_INIT_DYNAMIC_CALL:
3180+
case ZEND_INIT_USER_CALL:
3181+
case ZEND_INIT_METHOD_CALL:
3182+
case ZEND_INIT_STATIC_METHOD_CALL:
3183+
case ZEND_NEW:
3184+
if (level == 0) {
3185+
ZEND_CALL_NUM_ARGS(call) = 0;
3186+
do_exit = true;
3187+
}
3188+
level--;
3189+
break;
3190+
case ZEND_SEND_VAL:
3191+
case ZEND_SEND_VAL_EX:
3192+
case ZEND_SEND_VAR:
3193+
case ZEND_SEND_VAR_EX:
3194+
case ZEND_SEND_FUNC_ARG:
3195+
case ZEND_SEND_REF:
3196+
case ZEND_SEND_VAR_NO_REF:
3197+
case ZEND_SEND_VAR_NO_REF_EX:
3198+
case ZEND_SEND_USER:
3199+
if (level == 0) {
3200+
/* For named args, the number of arguments is up to date. */
3201+
if (opline->op2_type != IS_CONST) {
3202+
ZEND_CALL_NUM_ARGS(call) = opline->op2.num;
3203+
}
3204+
do_exit = true;
3205+
}
3206+
break;
3207+
case ZEND_SEND_ARRAY:
3208+
case ZEND_SEND_UNPACK:
3209+
case ZEND_CHECK_UNDEF_ARGS:
3210+
if (level == 0) {
3211+
do_exit = true;
3212+
}
3213+
break;
3214+
}
3215+
if (!do_exit) {
3216+
opline--;
3217+
}
3218+
} while (!do_exit);
3219+
3220+
//zend_vm_stack_free_args(call);
3221+
//zend_vm_stack_free_extra_args(call);
3222+
//EX(call) = call->prev_execute_data;
3223+
//zend_vm_stack_free_call_frame(call);
3224+
//call = EX(call);
31583225
}
31593226

31603227
if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {

0 commit comments

Comments
 (0)