Skip to content

Commit dcbdcf8

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Handle NULL caller_call_opline
2 parents 3b26a38 + dd9b5c8 commit dcbdcf8

File tree

4 files changed

+16
-6
lines changed

4 files changed

+16
-6
lines changed

ext/opcache/Optimizer/dfa_pass.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,10 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_op
267267
while (call_info) {
268268
call_info->caller_init_opline -=
269269
shiftlist[call_info->caller_init_opline - op_array->opcodes];
270-
call_info->caller_call_opline -=
271-
shiftlist[call_info->caller_call_opline - op_array->opcodes];
270+
if (call_info->caller_call_opline) {
271+
call_info->caller_call_opline -=
272+
shiftlist[call_info->caller_call_opline - op_array->opcodes];
273+
}
272274
call_info = call_info->next_callee;
273275
}
274276
}
@@ -367,7 +369,8 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
367369
zend_call_info *call_info = func_info->callee_info;
368370

369371
do {
370-
if (call_info->caller_call_opline->opcode == ZEND_DO_ICALL
372+
if (call_info->caller_call_opline
373+
&& call_info->caller_call_opline->opcode == ZEND_DO_ICALL
371374
&& call_info->callee_func
372375
&& ZSTR_LEN(call_info->callee_func->common.function_name) == sizeof("in_array")-1
373376
&& memcmp(ZSTR_VAL(call_info->callee_func->common.function_name), "in_array", sizeof("in_array")-1) == 0

ext/opcache/Optimizer/sccp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,8 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
12771277
}
12781278

12791279
call = ctx->call_map[opline - ctx->scdf.op_array->opcodes];
1280-
if (IS_TOP(op1) || !call || call->caller_call_opline->opcode != ZEND_DO_ICALL) {
1280+
if (IS_TOP(op1) || !call || !call->caller_call_opline
1281+
|| call->caller_call_opline->opcode != ZEND_DO_ICALL) {
12811282
return;
12821283
}
12831284

ext/opcache/Optimizer/zend_call_graph.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_f
177177
call_info->num_args = -1;
178178
}
179179
break;
180+
case ZEND_EXIT:
181+
/* In this case the DO_CALL opcode may have been dropped
182+
* and caller_call_opline will be NULL. */
183+
break;
180184
}
181185
opline++;
182186
}
@@ -291,7 +295,9 @@ zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, c
291295
for (call = info->callee_info; call; call = call->next_callee) {
292296
int i;
293297
map[call->caller_init_opline - op_array->opcodes] = call;
294-
map[call->caller_call_opline - op_array->opcodes] = call;
298+
if (call->caller_call_opline) {
299+
map[call->caller_call_opline - op_array->opcodes] = call;
300+
}
295301
for (i = 0; i < call->num_args; i++) {
296302
if (call->arg_info[i].opline) {
297303
map[call->arg_info[i].opline - op_array->opcodes] = call;

ext/opcache/Optimizer/zend_inference.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4207,7 +4207,7 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
42074207
memset(worklist, 0, sizeof(zend_ulong) * worklist_len);
42084208
call_info = info->callee_info;
42094209
while (call_info) {
4210-
if (call_info->recursive &&
4210+
if (call_info->recursive && call_info->caller_call_opline &&
42114211
info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result_def >= 0) {
42124212
zend_bitset_incl(worklist, info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result_def);
42134213
}

0 commit comments

Comments
 (0)