@@ -1357,21 +1357,24 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
1357
1357
case ZEND_DO_ICALL :
1358
1358
case ZEND_DO_UCALL :
1359
1359
case ZEND_DO_FCALL_BY_NAME :
1360
- if (ssa -> ops [line ].result_def == var && ZEND_FUNC_INFO ( op_array ) ) {
1360
+ if (ssa -> ops [line ].result_def == var ) {
1361
1361
zend_func_info * func_info = ZEND_FUNC_INFO (op_array );
1362
- zend_call_info * call_info = func_info -> callee_info ;
1362
+ zend_call_info * call_info ;
1363
+ if (!func_info || !func_info -> call_map ) {
1364
+ break ;
1365
+ }
1363
1366
1364
- while (call_info && call_info -> caller_call_opline != opline ) {
1365
- call_info = call_info -> next_callee ;
1367
+ call_info = func_info -> call_map [opline - op_array -> opcodes ];
1368
+ if (!call_info ) {
1369
+ break ;
1366
1370
}
1367
- if (call_info ) {
1368
- if (call_info -> callee_func -> type == ZEND_USER_FUNCTION ) {
1369
- func_info = ZEND_FUNC_INFO (& call_info -> callee_func -> op_array );
1370
- if (func_info && func_info -> return_info .has_range ) {
1371
- * tmp = func_info -> return_info .range ;
1372
- return 1 ;
1373
- }
1371
+ if (call_info -> callee_func -> type == ZEND_USER_FUNCTION ) {
1372
+ func_info = ZEND_FUNC_INFO (& call_info -> callee_func -> op_array );
1373
+ if (func_info && func_info -> return_info .has_range ) {
1374
+ * tmp = func_info -> return_info .range ;
1375
+ return 1 ;
1374
1376
}
1377
+ }
1375
1378
//TODO: we can't use type inference for internal functions at this point ???
1376
1379
#if 0
1377
1380
uint32_t type ;
@@ -1394,7 +1397,6 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
1394
1397
return 1 ;
1395
1398
}
1396
1399
#endif
1397
- }
1398
1400
}
1399
1401
break ;
1400
1402
// FIXME: support for more opcodes
@@ -3126,13 +3128,10 @@ static void zend_update_type_info(const zend_op_array *op_array,
3126
3128
zend_func_info * func_info = ZEND_FUNC_INFO (op_array );
3127
3129
zend_call_info * call_info ;
3128
3130
3129
- if (!func_info ) {
3131
+ if (!func_info || ! func_info -> call_map ) {
3130
3132
goto unknown_opcode ;
3131
3133
}
3132
- call_info = func_info -> callee_info ;
3133
- while (call_info && call_info -> caller_call_opline != opline ) {
3134
- call_info = call_info -> next_callee ;
3135
- }
3134
+ call_info = func_info -> call_map [opline - op_array -> opcodes ];
3136
3135
if (!call_info ) {
3137
3136
goto unknown_opcode ;
3138
3137
}
@@ -3554,18 +3553,14 @@ static int is_recursive_tail_call(const zend_op_array *op_array,
3554
3553
{
3555
3554
zend_func_info * info = ZEND_FUNC_INFO (op_array );
3556
3555
3557
- if (info -> ssa .ops && info -> ssa .vars &&
3556
+ if (info -> ssa .ops && info -> ssa .vars && info -> call_map &&
3558
3557
info -> ssa .ops [opline - op_array -> opcodes ].op1_use >= 0 &&
3559
3558
info -> ssa .vars [info -> ssa .ops [opline - op_array -> opcodes ].op1_use ].definition >= 0 ) {
3560
3559
3561
3560
zend_op * op = op_array -> opcodes + info -> ssa .vars [info -> ssa .ops [opline - op_array -> opcodes ].op1_use ].definition ;
3562
3561
3563
3562
if (op -> opcode == ZEND_DO_UCALL ) {
3564
- zend_call_info * call_info = info -> callee_info ;
3565
-
3566
- while (call_info && call_info -> caller_call_opline != op ) {
3567
- call_info = call_info -> next_callee ;
3568
- }
3563
+ zend_call_info * call_info = info -> call_map [op - op_array -> opcodes ];
3569
3564
if (call_info && op_array == & call_info -> callee_func -> op_array ) {
3570
3565
return 1 ;
3571
3566
}
0 commit comments