Skip to content

Commit dd9b5c8

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Handle NULL caller_call_opline
2 parents 0afdf19 + 34f1266 commit dd9b5c8

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
@@ -295,8 +295,10 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_op
295295
while (call_info) {
296296
call_info->caller_init_opline -=
297297
shiftlist[call_info->caller_init_opline - op_array->opcodes];
298-
call_info->caller_call_opline -=
299-
shiftlist[call_info->caller_call_opline - op_array->opcodes];
298+
if (call_info->caller_call_opline) {
299+
call_info->caller_call_opline -=
300+
shiftlist[call_info->caller_call_opline - op_array->opcodes];
301+
}
300302
call_info = call_info->next_callee;
301303
}
302304
}
@@ -393,7 +395,8 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa)
393395
zend_call_info *call_info = func_info->callee_info;
394396

395397
do {
396-
if (call_info->caller_call_opline->opcode == ZEND_DO_ICALL
398+
if (call_info->caller_call_opline
399+
&& call_info->caller_call_opline->opcode == ZEND_DO_ICALL
397400
&& call_info->callee_func
398401
&& ZSTR_LEN(call_info->callee_func->common.function_name) == sizeof("in_array")-1
399402
&& 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
@@ -1288,7 +1288,8 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
12881288
}
12891289

12901290
call = ctx->call_map[opline - ctx->scdf.op_array->opcodes];
1291-
if (IS_TOP(op1) || !call || call->caller_call_opline->opcode != ZEND_DO_ICALL) {
1291+
if (IS_TOP(op1) || !call || !call->caller_call_opline
1292+
|| call->caller_call_opline->opcode != ZEND_DO_ICALL) {
12921293
return;
12931294
}
12941295

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
}
@@ -286,7 +290,9 @@ zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, z
286290
for (call = info->callee_info; call; call = call->next_callee) {
287291
int i;
288292
map[call->caller_init_opline - op_array->opcodes] = call;
289-
map[call->caller_call_opline - op_array->opcodes] = call;
293+
if (call->caller_call_opline) {
294+
map[call->caller_call_opline - op_array->opcodes] = call;
295+
}
290296
for (i = 0; i < call->num_args; i++) {
291297
if (call->arg_info[i].opline) {
292298
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
@@ -4355,7 +4355,7 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
43554355
memset(worklist, 0, sizeof(zend_ulong) * worklist_len);
43564356
call_info = info->callee_info;
43574357
while (call_info) {
4358-
if (call_info->recursive &&
4358+
if (call_info->recursive && call_info->caller_call_opline &&
43594359
info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result_def >= 0) {
43604360
zend_bitset_incl(worklist, info->ssa.ops[call_info->caller_call_opline - op_array->opcodes].result_def);
43614361
}

0 commit comments

Comments
 (0)