Hi Derick,

The attached patch must enable generators support in XDebug.

XDebug would need override zend_execute_ex (instead of zend_execute).
EG(current_execute_data) is going to be different there. You can use EG(current_execute_data)->prev_execute_data instead.

I would appreciate, if you test the patch and tell me if XDebug still has any PHP-5.5 related problems.

Thanks. Dmitry.
diff --git a/Zend/zend.c b/Zend/zend.c
index 9ab879a..e34634c 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -684,10 +684,12 @@ int zend_startup(zend_utility_functions 
*utility_functions, char **extensions TS
 /* build with dtrace support */
        zend_compile_file = dtrace_compile_file;
        zend_execute = dtrace_execute;
+       zend_execute_ex = execute_ex; /* FIXME: dtrace support for generators */
        zend_execute_internal = dtrace_execute_internal;
 #else
        zend_compile_file = compile_file;
        zend_execute = execute;
+       zend_execute_ex = execute_ex;
        zend_execute_internal = NULL;
 #endif /* HAVE_SYS_SDT_H */
        zend_compile_string = compile_string;
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 4594eba..2d7f9ed 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -51,6 +51,7 @@ typedef union _temp_variable {
 BEGIN_EXTERN_C()
 struct _zend_fcall_info;
 ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
+ZEND_API extern void (*zend_execute_ex)(zend_execute_data *execute_data 
TSRMLS_DC);
 ZEND_API extern void (*zend_execute_internal)(zend_execute_data 
*execute_data_ptr, struct _zend_fcall_info *fci, int return_value_used 
TSRMLS_DC);
 
 void init_executor(TSRMLS_D);
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 9787966..fe2f46c 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -39,6 +39,7 @@
 #endif
 
 ZEND_API void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
+ZEND_API void (*zend_execute_ex)(zend_execute_data *execute_data TSRMLS_DC);
 ZEND_API void (*zend_execute_internal)(zend_execute_data *execute_data_ptr, 
zend_fcall_info *fci, int return_value_used TSRMLS_DC);
 
 /* true globals */
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 87f0644..2826a23 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -533,7 +533,7 @@ void zend_generator_resume(zend_generator *generator 
TSRMLS_DC) /* {{{ */
 
                /* Resume execution */
                generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING;
-               execute_ex(generator->execute_data TSRMLS_CC);
+               zend_execute_ex(generator->execute_data TSRMLS_CC);
                generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING;
 
                /* Restore executor globals */
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index b06c09f..3d9b0d7 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2048,7 +2048,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                        if (RETURN_VALUE_USED(opline)) {
                                EX_T(opline->result.var).var.ptr = 
zend_generator_create_zval(EG(active_op_array) TSRMLS_CC);
                        }
-               } else if (EXPECTED(zend_execute == execute)) {
+               } else if (EXPECTED(zend_execute == execute && zend_execute_ex 
== execute_ex)) {
                        if (EXPECTED(EG(exception) == NULL)) {
                                ZEND_VM_ENTER();
                        }
@@ -3954,7 +3954,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, 
CONST|TMP|VAR|CV, ANY)
                        zend_rebuild_symbol_table(TSRMLS_C);
                }
 
-               if (EXPECTED(zend_execute == execute)) {
+               if (EXPECTED(zend_execute == execute && zend_execute_ex == 
execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
                        zend_execute(new_op_array TSRMLS_CC);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 7a2cfc8..81a6b09 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -458,7 +458,7 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
        if (EG(exception)) {
                return;
        } 
-       execute_ex(zend_create_execute_data_from_op_array(op_array, 0 
TSRMLS_CC) TSRMLS_CC);
+       zend_execute_ex(zend_create_execute_data_from_op_array(op_array, 0 
TSRMLS_CC) TSRMLS_CC);
 }
 
 static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
@@ -669,7 +669,7 @@ static int ZEND_FASTCALL 
zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
                        if (RETURN_VALUE_USED(opline)) {
                                EX_T(opline->result.var).var.ptr = 
zend_generator_create_zval(EG(active_op_array) TSRMLS_CC);
                        }
-               } else if (EXPECTED(zend_execute == execute)) {
+               } else if (EXPECTED(zend_execute == execute && zend_execute_ex 
== execute_ex)) {
                        if (EXPECTED(EG(exception) == NULL)) {
                                ZEND_VM_ENTER();
                        }
@@ -2879,7 +2879,7 @@ static int ZEND_FASTCALL  
ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA
                        zend_rebuild_symbol_table(TSRMLS_C);
                }
 
-               if (EXPECTED(zend_execute == execute)) {
+               if (EXPECTED(zend_execute == execute && zend_execute_ex == 
execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
                        zend_execute(new_op_array TSRMLS_CC);
@@ -8201,7 +8201,7 @@ static int ZEND_FASTCALL  
ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND
                        zend_rebuild_symbol_table(TSRMLS_C);
                }
 
-               if (EXPECTED(zend_execute == execute)) {
+               if (EXPECTED(zend_execute == execute && zend_execute_ex == 
execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
                        zend_execute(new_op_array TSRMLS_CC);
@@ -13539,7 +13539,7 @@ static int ZEND_FASTCALL  
ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                        zend_rebuild_symbol_table(TSRMLS_C);
                }
 
-               if (EXPECTED(zend_execute == execute)) {
+               if (EXPECTED(zend_execute == execute && zend_execute_ex == 
execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
                        zend_execute(new_op_array TSRMLS_CC);
@@ -31096,7 +31096,7 @@ static int ZEND_FASTCALL  
ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                        zend_rebuild_symbol_table(TSRMLS_C);
                }
 
-               if (EXPECTED(zend_execute == execute)) {
+               if (EXPECTED(zend_execute == execute && zend_execute_ex == 
execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
                        zend_execute(new_op_array TSRMLS_CC);
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 2a6fd71..035177a 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -109,7 +109,7 @@ ZEND_API void {%EXECUTOR_NAME%}(zend_op_array *op_array 
TSRMLS_DC)
        if (EG(exception)) {
                return;
        } 
-       {%EXECUTOR_NAME%}_ex(zend_create_execute_data_from_op_array(op_array, 0 
TSRMLS_CC) TSRMLS_CC);
+       
zend_{%EXECUTOR_NAME%}_ex(zend_create_execute_data_from_op_array(op_array, 0 
TSRMLS_CC) TSRMLS_CC);
 }
 
 {%EXTERNAL_EXECUTOR%}

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to