Index: /trunk/processor/head.m4
===================================================================
--- /trunk/processor/head.m4	(revision 778)
+++ /trunk/processor/head.m4	(revision 779)
@@ -73,4 +73,8 @@
 	zend_uint cache_class_index;
 
+#ifndef NDEBUG
+	const zend_op_array    *active_op_array_src;
+	zend_op_array          *active_op_array_dst;
+#endif
 	const zend_op          *active_opcodes_src;
 	zend_op                *active_opcodes_dst;
Index: /trunk/processor/processor.m4
===================================================================
--- /trunk/processor/processor.m4	(revision 778)
+++ /trunk/processor/processor.m4	(revision 779)
@@ -612,5 +612,7 @@
 #endif
 			case ZEND_JMP:
+				assert(Z_OP(src->op1).jmp_addr > processor->active_opcodes_src && Z_OP(src->op1).jmp_addr - processor->active_opcodes_src < processor->active_op_array_src->last);
 				Z_OP(dst->op1).jmp_addr = processor->active_opcodes_dst + (Z_OP(src->op1).jmp_addr - processor->active_opcodes_src);
+				assert(Z_OP(dst->op1).jmp_addr > processor->active_opcodes_dst && Z_OP(dst->op1).jmp_addr - processor->active_opcodes_dst < processor->active_op_array_dst->last);
 				break;
 
@@ -622,5 +624,7 @@
 			case ZEND_JMP_SET:
 #endif
+				assert(Z_OP(src->op2).jmp_addr > processor->active_opcodes_src && Z_OP(src->op2).jmp_addr - processor->active_opcodes_src < processor->active_op_array_src->last);
 				Z_OP(dst->op2).jmp_addr = processor->active_opcodes_dst + (Z_OP(src->op2).jmp_addr - processor->active_opcodes_src);
+				assert(Z_OP(dst->op2).jmp_addr > processor->active_opcodes_dst && Z_OP(dst->op2).jmp_addr - processor->active_opcodes_dst < processor->active_op_array_dst->last);
 				break;
 
@@ -668,6 +672,31 @@
 #ifndef ZEND_ENGINE_2_4
 		if (op_array_info->oplineinfo_cnt) {
+			zend_op *opline, *end;
 			gc_opcodes = 1;
 			COPY_N_EX(last, zend_op, opcodes)
+
+			for (opline = dst->opcodes, end = opline + src->last; opline < end; ++opline) {
+				switch (opline->opcode) {
+#ifdef ZEND_GOTO
+					case ZEND_GOTO:
+#endif
+					case ZEND_JMP:
+						Z_OP(opline->op1).jmp_addr = dst->opcodes + (Z_OP(opline->op1).jmp_addr - src->opcodes);
+						break;
+
+					case ZEND_JMPZ:
+					case ZEND_JMPNZ:
+					case ZEND_JMPZ_EX:
+					case ZEND_JMPNZ_EX:
+#ifdef ZEND_JMP_SET
+					case ZEND_JMP_SET:
+#endif
+						Z_OP(opline->op2).jmp_addr = dst->opcodes + (Z_OP(opline->op2).jmp_addr - src->opcodes);
+						break;
+
+					default:
+						break;
+				}
+			}
 		}
 #endif
@@ -743,4 +772,8 @@
 
 	pushdef(`AFTER_ALLOC', `IFCOPY(`
+#ifndef NDEBUG
+		processor->active_op_array_dst = dst;
+		processor->active_op_array_src = src;
+#endif
 		processor->active_opcodes_dst = dst->opcodes;
 		processor->active_opcodes_src = src->opcodes;
