Modified: xdebug/trunk/php_xdebug.h =================================================================== --- xdebug/trunk/php_xdebug.h 2010-11-03 21:59:05 UTC (rev 3366) +++ xdebug/trunk/php_xdebug.h 2010-11-03 22:26:02 UTC (rev 3367) @@ -193,6 +193,7 @@ #endif /* used for code coverage */ + zend_bool coverage_enable; zend_bool do_code_coverage; xdebug_hash *code_coverage; zend_bool code_coverage_unused; Modified: xdebug/trunk/tests/bug00212b.phpt =================================================================== --- xdebug/trunk/tests/bug00212b.phpt 2010-11-03 21:59:05 UTC (rev 3366) +++ xdebug/trunk/tests/bug00212b.phpt 2010-11-03 22:26:02 UTC (rev 3367) @@ -16,6 +16,7 @@ xdebug.show_mem_delta=0 xdebug.trace_format=0 xdebug.extended_info=1 +xdebug.coverage_enable=1 --FILE-- +--INI-- +xdebug.coverage_enable=1 --FILE-- level = 0; xg->do_trace = 0; xg->trace_file = NULL; + xg->coverage_enable = 0; xg->do_code_coverage = 0; xg->breakpoint_count = 0; xg->ide_key = NULL; @@ -533,48 +535,52 @@ /* Overload the "exit" opcode */ XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_EXIT); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_JMP); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_JMPZ); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_JMPNZ); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_IDENTICAL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_NOT_IDENTICAL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_EQUAL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_NOT_EQUAL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_SMALLER); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_SMALLER_OR_EQUAL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_ADD_ARRAY_ELEMENT); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_RETURN); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_EXT_STMT); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_RAISE_ABSTRACT_ERROR); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SEND_VAR); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SEND_VAR_NO_REF); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SEND_VAL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_NEW); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_EXT_FCALL_BEGIN); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_CATCH); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_BOOL); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_ADD_STRING); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_INIT_ARRAY); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_DIM_R); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_R); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_W); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_FUNC_ARG); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_DIM_FUNC_ARG); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_DIM_UNSET); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_UNSET); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_CLASS); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_CONSTANT); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_CONCAT); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_ISSET_ISEMPTY_DIM_OBJ); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_PRE_INC_OBJ); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SWITCH_FREE); - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_QM_ASSIGN); + /* Overload opcodes for code coverage */ + if (XG(coverage_enable)) { + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_JMP); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_JMPZ); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_JMPNZ); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_IDENTICAL); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_NOT_IDENTICAL); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_EQUAL); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_NOT_EQUAL); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_SMALLER); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_IS_SMALLER_OR_EQUAL); + + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_ADD_ARRAY_ELEMENT); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_RETURN); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_EXT_STMT); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_RAISE_ABSTRACT_ERROR); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SEND_VAR); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SEND_VAR_NO_REF); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SEND_VAL); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_NEW); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_EXT_FCALL_BEGIN); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_CATCH); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_BOOL); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_ADD_STRING); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_INIT_ARRAY); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_DIM_R); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_R); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_W); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_FUNC_ARG); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_DIM_FUNC_ARG); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_DIM_UNSET); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_OBJ_UNSET); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_CLASS); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_FETCH_CONSTANT); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_CONCAT); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_ISSET_ISEMPTY_DIM_OBJ); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_PRE_INC_OBJ); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_SWITCH_FREE); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_QM_ASSIGN); #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION >= 6 - XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_DECLARE_LAMBDA_FUNCTION); + XDEBUG_SET_OPCODE_OVERRIDE_COMMON(ZEND_DECLARE_LAMBDA_FUNCTION); #endif + } + XDEBUG_SET_OPCODE_OVERRIDE_ASSIGN(include_or_eval, ZEND_INCLUDE_OR_EVAL); - XDEBUG_SET_OPCODE_OVERRIDE_ASSIGN(assign, ZEND_ASSIGN); XDEBUG_SET_OPCODE_OVERRIDE_ASSIGN(assign_add, ZEND_ASSIGN_ADD); XDEBUG_SET_OPCODE_OVERRIDE_ASSIGN(assign_sub, ZEND_ASSIGN_SUB); @@ -731,6 +737,7 @@ XG(no_exec) = 0; XG(level) = 0; XG(do_trace) = 0; + XG(coverage_enable) = 0; XG(do_code_coverage) = 0; XG(code_coverage) = xdebug_hash_alloc(32, xdebug_coverage_file_dtor); XG(stack) = xdebug_llist_alloc(xdebug_stack_element_dtor); @@ -878,6 +885,7 @@ XG(level) = 0; XG(do_trace) = 0; + XG(coverage_enable) = 0; XG(do_code_coverage) = 0; xdebug_hash_destroy(XG(code_coverage)); Modified: xdebug/trunk/xdebug_code_coverage.c =================================================================== --- xdebug/trunk/xdebug_code_coverage.c 2010-11-03 21:59:05 UTC (rev 3366) +++ xdebug/trunk/xdebug_code_coverage.c 2010-11-03 22:26:02 UTC (rev 3367) @@ -551,12 +551,15 @@ XG(code_coverage_unused) = (options & XDEBUG_CC_OPTION_UNUSED); XG(code_coverage_dead_code_analysis) = (options & XDEBUG_CC_OPTION_DEAD_CODE); - if (XG(extended_info)) { - RETVAL_BOOL(!XG(do_code_coverage)); + if (!XG(extended_info)) { + php_error(E_WARNING, "You can only use code coverage when you leave the setting of 'xdebug.extended_info' to the default '1'."); + RETURN_FALSE; + } else if (!XG(code_coverage)) { + php_error(E_WARNING, "Code coverage needs to be enabled in php.ini by setting 'xdebug.coverage_enable' to '1'."); + RETURN_FALSE; + } else { XG(do_code_coverage) = 1; - } else { - php_error(E_WARNING, "You can only use code coverage when you leave the setting of 'xdebug.extended_info' to the default '1'."); - RETVAL_BOOL(0); + RETURN_TRUE; } }