- Fixed bug #50383 (Exceptions thrown in __call / __callStatic do not include file and line in trace)

This commit is contained in:
Felipe Pena 2010-03-07 02:17:11 +00:00
parent 57200ba020
commit b674aa702a
2 changed files with 133 additions and 1 deletions

130
Zend/tests/bug50383.phpt Normal file
View File

@ -0,0 +1,130 @@
--TEST--
Bug #50383 (Exceptions thrown in __call / __callStatic do not include file and line in trace)
--FILE--
<?php
class myClass {
public static function __callStatic($method, $args) {
throw new Exception("Missing static method '$method'\n");
}
public function __call($method, $args) {
throw new Exception("Missing method '$method'\n");
}
}
function thrower() {
myClass::ThrowException();
}
function thrower2() {
$x = new myClass;
$x->foo();
}
try {
thrower();
} catch(Exception $e) {
print $e->getMessage();
print_r($e->getTrace());
}
try {
thrower2();
} catch (Exception $e) {
print $e->getMessage();
print_r($e->getTrace());
}
?>
--EXPECTF--
Missing static method 'ThrowException'
Array
(
[0] => Array
(
[file] => %s
[line] => 13
[function] => __callStatic
[class] => myClass
[type] => ::
[args] => Array
(
[0] => ThrowException
[1] => Array
(
)
)
)
[1] => Array
(
[file] => %s
[line] => 13
[function] => ThrowException
[class] => myClass
[type] => ::
[args] => Array
(
)
)
[2] => Array
(
[file] => %s
[line] => 21
[function] => thrower
[args] => Array
(
)
)
)
Missing method 'foo'
Array
(
[0] => Array
(
[file] => %s
[line] => 17
[function] => __call
[class] => myClass
[type] => ->
[args] => Array
(
[0] => foo
[1] => Array
(
)
)
)
[1] => Array
(
[file] => %s
[line] => 17
[function] => foo
[class] => myClass
[type] => ->
[args] => Array
(
)
)
[2] => Array
(
[file] => %s
[line] => 28
[function] => thrower2
[args] => Array
(
)
)
)

View File

@ -2236,7 +2236,9 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
while (prev) {
if (prev->function_state.function &&
prev->function_state.function->common.type != ZEND_USER_FUNCTION) {
prev->function_state.function->common.type != ZEND_USER_FUNCTION &&
!(prev->function_state.function->common.type == ZEND_INTERNAL_FUNCTION &&
(prev->function_state.function->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER))) {
break;
}
if (prev->op_array) {