summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend-scanner.l1
-rw-r--r--Zend/zend_compile.h1
-rw-r--r--Zend/zend_execute_API.c5
-rw-r--r--Zend/zend_extensions.c7
-rw-r--r--Zend/zend_extensions.h9
-rw-r--r--Zend/zend_opcode.c2
6 files changed, 21 insertions, 4 deletions
diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l
index 75514fe0ae..aa50dd62e4 100644
--- a/Zend/zend-scanner.l
+++ b/Zend/zend-scanner.l
@@ -300,6 +300,7 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
source_string = &tmp;
init_op_array(op_array, INITIAL_OP_ARRAY_SIZE);
+ op_array->type = ZEND_EVAL_CODE;
save_lexical_state(&original_lex_state CLS_CC);
if (prepare_string_for_scanning(source_string CLS_CC)==FAILURE) {
destroy_op_array(op_array);
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 499178444e..f1d87bc650 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -498,6 +498,7 @@ int zendlex(znode *zendlval CLS_DC);
#define ZEND_INTERNAL_FUNCTION 1
#define ZEND_USER_FUNCTION 2
#define ZEND_OVERLOADED_FUNCTION 3
+#define ZEND_EVAL_CODE 4
#define ZEND_INTERNAL_CLASS 1
#define ZEND_USER_CLASS 2
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 4a99396a92..180462ed2d 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -435,8 +435,9 @@ void execute_new_code(CLS_D)
ELS_FETCH();
if (!EG(interactive)
- || CG(active_op_array)->backpatch_count>0) {
-
+ || CG(active_op_array)->backpatch_count>0
+ || CG(active_op_array)->function_name
+ || CG(active_op_array)->type!=ZEND_USER_FUNCTION) {
return;
}
CG(active_op_array)->start_op_number = CG(active_op_array)->last_executed_op_number;
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c
index 92eb410aa9..ea59c025d4 100644
--- a/Zend/zend_extensions.c
+++ b/Zend/zend_extensions.c
@@ -83,6 +83,13 @@ int zend_load_extension(char *path)
(ZTS_V?"is":"isn't"));
DL_UNLOAD(handle);
return FAILURE;
+ } else if (ZEND_DEBUG_V!=extension_version_info->debug) {
+ zend_printf("Cannot load %s - it %s debug information, whereas Zend %s\n",
+ new_extension->name,
+ (extension_version_info->debug?"contains":"does not contain"),
+ (ZEND_DEBUG_V?"does":"does not"));
+ DL_UNLOAD(handle);
+ return FAILURE;
}
if (new_extension->startup) {
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index cd1c3cb974..9c11942bc1 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -25,6 +25,7 @@ typedef struct {
int zend_extension_api_no;
char *required_zend_version;
unsigned char thread_safe;
+ unsigned char debug;
} zend_extension_version_info;
@@ -73,9 +74,15 @@ ZEND_API int zend_get_resource_handle();
#define ZTS_V 0
#endif
+#ifdef ZEND_DEBUG
+#define ZEND_DEBUG_V 1
+#else
+#define ZEND_DEBUG_V 0
+#endif
+
#define ZEND_EXTENSION() \
- ZEND_EXT_API zend_extension_version_info extension_version_info = { ZEND_EXTENSION_API_NO, "0.80A", ZTS_V }
+ ZEND_EXT_API zend_extension_version_info extension_version_info = { ZEND_EXTENSION_API_NO, "0.80A", ZTS_V, ZEND_DEBUG_V }
#define STANDARD_ZEND_EXTENSION_PROPERTIES NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 8af45c0064..1e113c500e 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -271,7 +271,7 @@ int pass_two(zend_op_array *op_array)
{
CLS_FETCH();
- if (op_array->type != ZEND_USER_FUNCTION) {
+ if (op_array->type!=ZEND_USER_FUNCTION && op_array->type!=ZEND_EVAL_CODE) {
return 0;
}
if (CG(extended_info)) {