@@ -1614,8 +1614,12 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1614
1614
v ++ ;
1615
1615
}
1616
1616
if (return_value_info .type != 0 ) {
1617
- if ((p + 1 )-> op == ZEND_JIT_TRACE_VM ) {
1618
- const zend_op * opline = (p + 1 )-> opline - 1 ;
1617
+ zend_jit_trace_rec * q = p + 1 ;
1618
+ while (q -> op == ZEND_JIT_TRACE_INIT_CALL ) {
1619
+ q ++ ;
1620
+ }
1621
+ if (q -> op == ZEND_JIT_TRACE_VM ) {
1622
+ const zend_op * opline = q -> opline - 1 ;
1619
1623
if (opline -> result_type != IS_UNUSED ) {
1620
1624
ssa_var_info [
1621
1625
p -> first_ssa_var +
@@ -2429,7 +2433,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2429
2433
const zend_op_array * op_array ;
2430
2434
zend_ssa * ssa , * op_array_ssa ;
2431
2435
zend_jit_trace_rec * p ;
2432
- int call_level = -1 ; // TODO: proper support for inlined functions ???
2433
2436
zend_jit_op_array_trace_extension * jit_extension ;
2434
2437
int num_op_arrays = 0 ;
2435
2438
zend_jit_trace_info * t ;
@@ -2671,8 +2674,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2671
2674
p ++ ;
2672
2675
}
2673
2676
2674
- #if 0
2675
- // TODO: call level calculation doesn't work for traces ???
2676
2677
switch (opline -> opcode ) {
2677
2678
case ZEND_INIT_FCALL :
2678
2679
case ZEND_INIT_FCALL_BY_NAME :
@@ -2682,9 +2683,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2682
2683
case ZEND_INIT_STATIC_METHOD_CALL :
2683
2684
case ZEND_INIT_USER_CALL :
2684
2685
case ZEND_NEW :
2685
- call_level ++ ;
2686
+ frame -> call_level ++ ;
2686
2687
}
2687
- #endif
2688
2688
2689
2689
if (zend_jit_level >= ZEND_JIT_LEVEL_INLINE ) {
2690
2690
switch (opline -> opcode ) {
@@ -3043,7 +3043,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3043
3043
case ZEND_INIT_FCALL :
3044
3044
case ZEND_INIT_FCALL_BY_NAME :
3045
3045
case ZEND_INIT_NS_FCALL_BY_NAME :
3046
- if (!zend_jit_init_fcall (& dasm_state , opline , op_array_ssa -> cfg .map ? op_array_ssa -> cfg .map [opline - op_array -> opcodes ] : -1 , op_array , op_array_ssa , call_level , p + 1 )) {
3046
+ if (!zend_jit_init_fcall (& dasm_state , opline , op_array_ssa -> cfg .map ? op_array_ssa -> cfg .map [opline - op_array -> opcodes ] : -1 , op_array , op_array_ssa , frame -> call_level , p + 1 )) {
3047
3047
goto jit_failure ;
3048
3048
}
3049
3049
goto done ;
@@ -3128,7 +3128,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3128
3128
case ZEND_DO_ICALL :
3129
3129
case ZEND_DO_FCALL_BY_NAME :
3130
3130
case ZEND_DO_FCALL :
3131
- if (!zend_jit_do_fcall (& dasm_state , opline , op_array , op_array_ssa , call_level , -1 , p + 1 )) {
3131
+ if (!zend_jit_do_fcall (& dasm_state , opline , op_array , op_array_ssa , frame -> call_level , -1 , p + 1 )) {
3132
3132
goto jit_failure ;
3133
3133
}
3134
3134
goto done ;
@@ -3608,16 +3608,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3608
3608
}
3609
3609
3610
3610
done :
3611
- #if 0
3612
- // TODO: call level calculation doesn't work for traces ???
3613
3611
switch (opline -> opcode ) {
3614
3612
case ZEND_DO_FCALL :
3615
3613
case ZEND_DO_ICALL :
3616
3614
case ZEND_DO_UCALL :
3617
3615
case ZEND_DO_FCALL_BY_NAME :
3618
- call_level -- ;
3616
+ frame -> call_level -- ;
3619
3617
}
3620
- #endif
3621
3618
3622
3619
if (ra ) {
3623
3620
zend_jit_trace_clenup_stack (stack , opline , ssa_op , ssa , ra );
@@ -3946,6 +3943,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3946
3943
if (!skip_guard && !zend_jit_init_fcall_guard (& dasm_state , NULL , p -> func )) {
3947
3944
goto jit_failure ;
3948
3945
}
3946
+ frame -> call_level ++ ;
3949
3947
}
3950
3948
} else if (p -> op == ZEND_JIT_TRACE_DO_ICALL ) {
3951
3949
call = frame -> call ;
0 commit comments