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