CG(active_op_array)->line_end = zend_get_compiled_lineno(TSRMLS_C);
CG(active_op_array) = function_token->u.op_array;
-
/* Pop the switch and foreach separators */
zend_stack_del_top(&CG(switch_cond_stack));
zend_stack_del_top(&CG(foreach_copy_stack));
opline->extended_value = Z_LVAL(CG(declarables).ticks);
}
+static void zend_update_jump_target(zend_uint opnum_jump, zend_uint opnum_target TSRMLS_DC) {
+ zend_op *opline = &CG(active_op_array)->opcodes[opnum_jump];
+ switch (opline->opcode) {
+ case ZEND_JMP:
+ opline->op1.opline_num = opnum_target;
+ break;
+ case ZEND_JMPZ:
+ case ZEND_JMPNZ:
+ case ZEND_JMPZ_EX:
+ case ZEND_JMPNZ_EX:
+ opline->op2.opline_num = opnum_target;
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
+}
+
+static void zend_update_jump_target_to_next(zend_uint opnum_jump TSRMLS_DC) {
+ zend_update_jump_target(opnum_jump, get_next_op_number(CG(active_op_array)) TSRMLS_CC);
+}
+
static zend_bool zend_is_variable(zend_ast *ast) {
return ast->kind == ZEND_AST_VAR || ast->kind == ZEND_AST_DIM
|| ast->kind == ZEND_AST_PROP || ast->kind == ZEND_AST_STATIC_PROP
opline = emit_op(NULL, ZEND_JMP, NULL, NULL TSRMLS_CC);
opline->op1.opline_num = opnum_start;
- opline = &CG(active_op_array)->opcodes[opnum_jmpz];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_jmpz TSRMLS_CC);
do_end_loop(opnum_start, 0 TSRMLS_CC);
}
opline = emit_op(NULL, ZEND_JMP, NULL, NULL TSRMLS_CC);
opline->op1.opline_num = opnum_cond;
- opline = &CG(active_op_array)->opcodes[opnum_jmpz];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_jmpz TSRMLS_CC);
do_end_loop(opnum_loop, 0 TSRMLS_CC);
}
zend_uint i;
zend_uint *jmp_opnums = safe_emalloc(sizeof(zend_uint), ast->children - 1, 0);
zend_uint opnum_last_jmpz = 0;
- zend_op *opline;
for (i = 0; i < ast->children; ++i) {
zend_ast *elem_ast = ast->child[i];
}
if (cond_ast) {
- opline = &CG(active_op_array)->opcodes[opnum_last_jmpz];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_last_jmpz TSRMLS_CC);
}
}
for (i = 0; i < ast->children - 1; ++i) {
- opline = &CG(active_op_array)->opcodes[jmp_opnums[i]];
- opline->op1.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(jmp_opnums[i] TSRMLS_CC);
}
efree(jmp_opnums);
zend_ast *stmt_ast = case_ast->child[1];
if (cond_ast) {
- opline = &CG(active_op_array)->opcodes[jmpnz_opnums[i]];
- opline->op2.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(jmpnz_opnums[i] TSRMLS_CC);
} else {
- opline = &CG(active_op_array)->opcodes[opnum_default_jmp];
- opline->op1.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_default_jmp TSRMLS_CC);
}
zend_compile_stmt(stmt_ast TSRMLS_CC);
}
if (!has_default_case) {
- opline = &CG(active_op_array)->opcodes[opnum_default_jmp];
- opline->op1.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_default_jmp TSRMLS_CC);
}
do_end_loop(get_next_op_number(CG(active_op_array)), 1 TSRMLS_CC);
}
for (i = 0; i < catches_ast->children; ++i) {
- opline = &CG(active_op_array)->opcodes[jmp_opnums[i]];
- opline->op1.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(jmp_opnums[i] TSRMLS_CC);
}
if (finally_ast) {
emit_op(NULL, ZEND_FAST_RET, NULL, NULL TSRMLS_CC);
- opline = &CG(active_op_array)->opcodes[opnum_jmp];
- opline->op1.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_jmp TSRMLS_CC);
}
efree(jmp_opnums);
opline_bool = emit_op(NULL, ZEND_BOOL, &right_node, NULL TSRMLS_CC);
SET_NODE(opline_bool->result, result);
- opline_jmpz = &CG(active_op_array)->opcodes[opnum_jmpz];
- opline_jmpz->op2.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_jmpz TSRMLS_CC);
}
void zend_compile_post_incdec(znode *result, zend_ast *ast TSRMLS_DC) {
zend_ast *false_ast = ast->child[2];
znode cond_node, true_node, false_node;
- zend_op *opline_jmpz, *opline_jmp, *opline_qm_assign1, *opline_qm_assign2;
+ zend_op *opline_qm_assign1, *opline_qm_assign2;
zend_uint opnum_jmpz, opnum_jmp, opnum_qm_assign1;
if (!true_ast) {
opnum_jmp = get_next_op_number(CG(active_op_array));
emit_op(NULL, ZEND_JMP, NULL, NULL TSRMLS_CC);
- opline_jmpz = &CG(active_op_array)->opcodes[opnum_jmpz];
- opline_jmpz->op2.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_jmpz TSRMLS_CC);
zend_compile_expr(&false_node, false_ast TSRMLS_CC);
opline_qm_assign2 = emit_op(NULL, opline_qm_assign1->opcode, &false_node, NULL TSRMLS_CC);
SET_NODE(opline_qm_assign2->result, result);
- opline_jmp = &CG(active_op_array)->opcodes[opnum_jmp];
- opline_jmp->op1.opline_num = get_next_op_number(CG(active_op_array));
+ zend_update_jump_target_to_next(opnum_jmp TSRMLS_CC);
}
void zend_compile_print(znode *result, zend_ast *ast TSRMLS_DC) {