summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2010-03-07 02:17:11 (GMT)
committerFelipe Pena <felipe@php.net>2010-03-07 02:17:11 (GMT)
commitf867fadd22a68b2d92c621d522842b285f41e4ad (patch)
tree6b4d88bdadb6c2abfbea294ace3dfa581b38ac82 /Zend
parent4149bb3dfd9c4fa67164099959feb8b819ae81da (diff)
downloadphp-f867fadd22a68b2d92c621d522842b285f41e4ad.tar.gz
- Fixed bug #50383 (Exceptions thrown in __call / __callStatic do not include file and line in trace)
Diffstat (limited to 'Zend')
-rw-r--r--Zend/tests/bug50383.phpt130
-rw-r--r--Zend/zend_builtin_functions.c4
2 files changed, 133 insertions, 1 deletions
diff --git a/Zend/tests/bug50383.phpt b/Zend/tests/bug50383.phpt
new file mode 100644
index 0000000..2210c4b
--- /dev/null
+++ b/Zend/tests/bug50383.phpt
@@ -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
+ (
+ )
+
+ )
+
+)
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 4c96e19..0807341 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -2148,7 +2148,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) {