Index: trunk/utils.c
===================================================================
--- trunk/utils.c	(revision 785)
+++ trunk/utils.c	(revision 822)
@@ -19,8 +19,12 @@
 #endif
 
-#define OP_ZVAL_DTOR(op) do { \
-	Z_UNSET_ISREF(Z_OP_CONSTANT(op)); \
-	zval_dtor(&Z_OP_CONSTANT(op)); \
-} while(0)
+#ifdef ZEND_ENGINE_2_4
+#	define OP_ZVAL_DTOR(op) do { } while(0)
+#else
+#	define OP_ZVAL_DTOR(op) do { \
+		Z_UNSET_ISREF(Z_OP_CONSTANT(op)); \
+		zval_dtor(&Z_OP_CONSTANT(op)); \
+	} while(0)
+#endif
 xc_compile_result_t *xc_compile_result_init(xc_compile_result_t *cr, /* {{{ */
 		zend_op_array *op_array,
@@ -130,10 +134,13 @@
 }
 /* }}} */
-
 int xc_undo_pass_two(zend_op_array *op_array TSRMLS_DC) /* {{{ */
 {
 	zend_op *opline, *end;
 
-#ifndef ZEND_ENGINE_2_4
+#ifdef ZEND_ENGINE_2_4
+	if (!(op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO)) {
+		return 0;
+	}
+#else
 	if (!op_array->done_pass_two) {
 		return 0;
@@ -144,4 +151,13 @@
 	end = opline + op_array->last;
 	while (opline < end) {
+#ifdef ZEND_ENGINE_2_4
+		if (opline->op1_type == IS_CONST) {
+			opline->op1.constant = opline->op1.literal - op_array->literals;
+		}
+		if (opline->op2_type == IS_CONST) {
+			opline->op2.constant = opline->op2.literal - op_array->literals;
+		}
+#endif
+
 #ifdef ZEND_ENGINE_2_1
 		switch (opline->opcode) {
@@ -167,5 +183,7 @@
 		opline++;
 	}
-#ifndef ZEND_ENGINE_2_4
+#ifdef ZEND_ENGINE_2_4
+	op_array->fn_flags &= ~ZEND_ACC_DONE_PASS_TWO;
+#else
 	op_array->done_pass_two = 0;
 #endif
@@ -177,6 +195,13 @@
 {
 	zend_op *opline, *end;
-
-#ifndef ZEND_ENGINE_2_4
+#ifdef ZEND_ENGINE_2_4
+	zend_literal *literal = op_array->literals;
+#endif
+
+#ifdef ZEND_ENGINE_2_4
+	if ((op_array->fn_flags & ZEND_ACC_DONE_PASS_TWO)) {
+		return 0;
+	}
+#else
 	if (op_array->done_pass_two) {
 		return 0;
@@ -188,12 +213,22 @@
 	op_array->size = op_array->last;
 	*/
+#ifdef ZEND_ENGINE_2_4
+	if (literal) {
+		zend_literal *end = literal + op_array->last_literal;
+		while (literal < end) {
+			Z_SET_ISREF(literal->constant);
+			Z_SET_REFCOUNT(literal->constant, 2); /* Make sure is_ref won't be reset */
+			literal++;
+		}
+	}
+#endif
 
 	opline = op_array->opcodes;
 	end = opline + op_array->last;
 	while (opline < end) {
+#ifndef ZEND_ENGINE_2_4
 		if (Z_OP_TYPE(opline->op1) == IS_CONST) {
 			Z_SET_ISREF(Z_OP_CONSTANT(opline->op1));
 			Z_SET_REFCOUNT(Z_OP_CONSTANT(opline->op1), 2); /* Make sure is_ref won't be reset */
-
 		}
 		if (Z_OP_TYPE(opline->op2) == IS_CONST) {
@@ -201,4 +236,5 @@
 			Z_SET_REFCOUNT(Z_OP_CONSTANT(opline->op2), 2);
 		}
+#endif
 #ifdef ZEND_ENGINE_2_1
 		switch (opline->opcode) {
@@ -226,5 +262,7 @@
 	}
 
-#ifndef ZEND_ENGINE_2_4
+#ifdef ZEND_ENGINE_2_4
+	op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO;
+#else
 	op_array->done_pass_two = 1;
 #endif
