From: Zeev Suraski Date: Tue, 27 Apr 1999 11:00:59 +0000 (+0000) Subject: * Fix debugger+interactive mode bug X-Git-Tag: BEFORE_PHP4_APACHE_MODULE_CHANGE~134 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2493f6801815b4459a8bfb29085e448186f521c8;p=php * Fix debugger+interactive mode bug * Recognize whether an extension is with debug information or not --- 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)) {