From e473f591a8a2e487c4244f1fa89c53c0f866bec7 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Mon, 3 Jan 2011 22:53:28 +0000 Subject: [PATCH] - Fixed bug #642: No line number for offsetGet and offsetSet. - Also fixes __get/__set/__isset/__unset and __call line numbers. SVN Rev: 3381 --- tests/assert_test.phpt | 2 +- tests/bug00241.phpt | 2 +- tests/bug00562.phpt | 4 +- tests/bug00642.phpt | 51 ++++++++++++++++++++++++ tests/call_user_func_array.phpt | 4 +- tests/call_user_func_array2.phpt | 4 +- tests/trace_with_magic_methods.phpt | 61 +++++++++++++++++++++++++++++ xdebug_stack.c | 5 +++ 8 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 tests/bug00642.phpt create mode 100644 tests/trace_with_magic_methods.phpt diff --git a/tests/assert_test.phpt b/tests/assert_test.phpt index 98e0e8637..afb05c460 100644 --- a/tests/assert_test.phpt +++ b/tests/assert_test.phpt @@ -49,5 +49,5 @@ TRACE START [%d-%d-%d %d:%d:%d] %w%f %w%d -> assert_options(5, 1) /%s/assert_test.php:7 %w%f %w%d -> assert_options(2, 'my_assert_handler') /%s/assert_test.php:18 %w%f %w%d -> assert(FALSE) /%s/assert_test.php:21 -%w%f %w%d -> my_assert_handler('/%s/assert_test.php', 21, '') /%s/assert_test.php:0 +%w%f %w%d -> my_assert_handler('/%s/assert_test.php', 21, '') /%s/assert_test.php:21 %w%f %w%d -> file_get_contents('/tmp/%s') /%s/assert_test.php:23 diff --git a/tests/bug00241.phpt b/tests/bug00241.phpt index 26c1d6ccd..9bb4c9f42 100644 --- a/tests/bug00241.phpt +++ b/tests/bug00241.phpt @@ -68,7 +68,7 @@ array(5) { ["file"]=> string(%d) "%sbug00241.php" ["line"]=> - int(0) + int(32) ["params"]=> array(5) { ["errno"]=> diff --git a/tests/bug00562.phpt b/tests/bug00562.phpt index da43f8ffa..1cc4a9edb 100644 --- a/tests/bug00562.phpt +++ b/tests/bug00562.phpt @@ -20,9 +20,7 @@ var_dump( xdebug_get_code_coverage() ); --EXPECTF-- array(1) { ["%sbug00562.php"]=> - array(8) { - [0]=> - int(1) + array(7) { [4]=> int(1) [6]=> diff --git a/tests/bug00642.phpt b/tests/bug00642.phpt new file mode 100644 index 000000000..8e66afa4a --- /dev/null +++ b/tests/bug00642.phpt @@ -0,0 +1,51 @@ +--TEST-- +Test for bug #642: No line number for offsetGet and offsetSet +--INI-- +xdebug.default_enable=1 +xdebug.profiler_enable=0 +xdebug.auto_trace=0 +xdebug.trace_format=0 +xdebug.collect_vars=0 +xdebug.collect_params=1 +xdebug.collect_return=0 +xdebug.collect_assignments=0 +--FILE-- +container[$offset] = $value; + } + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } +} + +$test = new Test(); +$test['test'] = 'test'; +$foo = $test['test']; +isset($test['test']); +unset($test['test']); + +xdebug_stop_trace(); +echo file_get_contents($tf); +unlink($tf); +?> +--EXPECTF-- +TRACE START [%d-%d-%d %d:%d:%d] +%w%f %w%d -> Test->offsetSet(string(4), string(4)) %sbug00642.php:22 +%w%f %w%d -> Test->offsetGet(string(4)) %sbug00642.php:23 +%w%f %w%d -> Test->offsetExists(string(4)) %sbug00642.php:24 +%w%f %w%d -> Test->offsetUnset(string(4)) %sbug00642.php:25 +%w%f %w%d -> xdebug_stop_trace() %sbug00642.php:27 +%w%f %w%d +TRACE END [%d-%d-%d %d:%d:%d] diff --git a/tests/call_user_func_array.phpt b/tests/call_user_func_array.phpt index a792e518c..36c79b7da 100644 --- a/tests/call_user_func_array.phpt +++ b/tests/call_user_func_array.phpt @@ -37,10 +37,10 @@ unlink($tf); --EXPECTF-- TRACE START [%d-%d-%d %d:%d:%d] %w%f %w%d -> call_user_func_array('debug', array (0 => 'foo', 1 => array (0 => 1, 1 => 2))) /%s/call_user_func_array.php:13 -%w%f %w%d -> debug('foo', array (0 => 1, 1 => 2)) /%s/call_user_func_array.php:0 +%w%f %w%d -> debug('foo', array (0 => 1, 1 => 2)) /%s/call_user_func_array.php:13 %w%f %w%d -> is_array(array (0 => 1, 1 => 2)) /%s/call_user_func_array.php:5 %w%f %w%d -> call_user_func_array('debug', array (0 => 'bar', 1 => 'bar')) /%s/call_user_func_array.php:16 -%w%f %w%d -> debug('bar', 'bar') /%s/call_user_func_array.php:0 +%w%f %w%d -> debug('bar', 'bar') /%s/call_user_func_array.php:16 %w%f %w%d -> is_array('bar') /%s/call_user_func_array.php:5 %w%f %w%d -> is_object('bar') /%s/call_user_func_array.php:5 %w%f %w%d -> is_resource('bar') /%s/call_user_func_array.php:5 diff --git a/tests/call_user_func_array2.phpt b/tests/call_user_func_array2.phpt index 33679fb17..cc56c8f12 100644 --- a/tests/call_user_func_array2.phpt +++ b/tests/call_user_func_array2.phpt @@ -32,10 +32,10 @@ unlink($tf); TRACE START [%d-%d-%d %d:%d:%d] %w%f %w%d -> include(/%s/call_user_func_array2.inc) /%s/call_user_func_array2.php:4 %w%f %w%d -> call_user_func_array('debug', array (0 => 'foo', 1 => array (0 => 1, 1 => 2))) /%s/call_user_func_array2.php:7 -%w%f %w%d -> debug('foo', array (0 => 1, 1 => 2)) /%s/call_user_func_array2.php:0 +%w%f %w%d -> debug('foo', array (0 => 1, 1 => 2)) /%s/call_user_func_array2.php:7 %w%f %w%d -> is_array(array (0 => 1, 1 => 2)) /%s/call_user_func_array2.inc:4 %w%f %w%d -> call_user_func_array('debug', array (0 => 'bar', 1 => 'bar')) /%s/call_user_func_array2.php:10 -%w%f %w%d -> debug('bar', 'bar') /%s/call_user_func_array2.php:0 +%w%f %w%d -> debug('bar', 'bar') /%s/call_user_func_array2.php:10 %w%f %w%d -> is_array('bar') /%s/call_user_func_array2.inc:4 %w%f %w%d -> is_object('bar') /%s/call_user_func_array2.inc:4 %w%f %w%d -> is_resource('bar') /%s/call_user_func_array2.inc:4 diff --git a/tests/trace_with_magic_methods.phpt b/tests/trace_with_magic_methods.phpt new file mode 100644 index 000000000..deb4aea22 --- /dev/null +++ b/tests/trace_with_magic_methods.phpt @@ -0,0 +1,61 @@ +--TEST-- +Test for line numbers for __get, __set, __isset, __unset and __call. +--INI-- +xdebug.default_enable=1 +xdebug.profiler_enable=0 +xdebug.auto_trace=0 +xdebug.trace_format=0 +xdebug.collect_vars=0 +xdebug.collect_params=1 +xdebug.collect_return=0 +xdebug.collect_assignments=0 +--FILE-- +container[$offset] = $value; + } + public function __isset($offset) { + return isset($this->container[$offset]); + } + public function __unset($offset) { + unset($this->container[$offset]); + } + public function __get($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + public function __call($func, $args) { + return $this->$func($args); + } + public function test($args) { + count($args); + } +} + +$test = new Test(); +$test->test = 'test'; +$foo = $test->test; +isset($test->test); +unset($test->test); +$test->test('test1', 'test2'); + +xdebug_stop_trace(); +echo file_get_contents($tf); +unlink($tf); +?> +--EXPECTF-- +TRACE START [%d-%d-%d %d:%d:%d] +%w%f %w%d -> Test->__construct() %strace_with_magic_methods.php:27 +%w%f %w%d -> Test->__set(string(4), string(4)) %strace_with_magic_methods.php:28 +%w%f %w%d -> Test->__get(string(4)) %strace_with_magic_methods.php:29 +%w%f %w%d -> Test->__isset(string(4)) %strace_with_magic_methods.php:30 +%w%f %w%d -> Test->__unset(string(4)) %strace_with_magic_methods.php:31 +%w%f %w%d -> Test->test(string(5), string(5)) %strace_with_magic_methods.php:32 +%w%f %w%d -> count(string(5)) %strace_with_magic_methods.php:23 +%w%f %w%d -> xdebug_stop_trace() %strace_with_magic_methods.php:34 +%w%f %w%d +TRACE END [%d-%d-%d %d:%d:%d] diff --git a/xdebug_stack.c b/xdebug_stack.c index 431b14603..8a6e92e50 100644 --- a/xdebug_stack.c +++ b/xdebug_stack.c @@ -858,6 +858,11 @@ function_stack_entry *xdebug_add_stack_frame(zend_execute_data *zdata, zend_op_a if (cur_opcode) { tmp->lineno = cur_opcode->lineno; } + } else if (edata->prev_execute_data && edata->prev_execute_data->opline) { + cur_opcode = edata->prev_execute_data->opline; + if (cur_opcode) { + tmp->lineno = cur_opcode->lineno; + } } if (XG(remote_enabled) || XG(collect_params) || XG(collect_vars)) {