summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--it_debug.class53
1 files changed, 32 insertions, 21 deletions
diff --git a/it_debug.class b/it_debug.class
index c4bc8db..efbf7cc 100644
--- a/it_debug.class
+++ b/it_debug.class
@@ -59,16 +59,37 @@ static function echo($args)
echo self::dump($args);
}
+static function debug_backtrace($p = []) {
+ if (!is_array($p))
+ $p = array('skiplevels' => $p);
+
+ $p += array('levels' => 0, 'skiplevels'=> 0, 'skipfiles' => "###");
+
+ foreach ($p['trace'] ?: debug_backtrace(@constant('DEBUG_BACKTRACE_IGNORE_ARGS')) as $call)
+ {
+ if (!$result && it::match('it_debug\.class$', $call['file']))
+ continue;
+ if (!$result && it::match($p['skipfiles'], $call['file']))
+ continue;
+ if (!$result && $p['skiplevels']-- > 0)
+ continue;
+ $result[] = $call;
+ if (--$p['levels'] == 0)
+ break;
+ }
+ return $result;
+}
+
/**
* Get source line of grandparent calling this function
* @param $stacksoffs go up an extra $stacksoffs levels
*/
-static function srcline($stackoffs = 0)
+static function srcline($p = array())
{
- $stack = debug_backtrace(@constant('DEBUG_BACKTRACE_IGNORE_ARGS'));
- $line = $stack[1 + $stackoffs]['line'];
- $file = $stack[1 + $stackoffs]['file'];
+ $stack = self::debug_backtrace($p);
+ $line = $stack[1]['line'];
+ $file = $stack[1]['file'];
if (!isset($GLOBALS['it_debug::dump source'][$file]))
$GLOBALS['it_debug::dump source'][$file] = @it::file($file);
@@ -104,7 +125,7 @@ static function dump($args, $p = [])
{
$p += ['html' => !EDC('edplain') && (self::$force_html || $_SERVER['REMOTE_ADDR']), 'color' => true];
$htmlspecialchars = array("&" => "&amp;", '<' => "&lt;", '>' => "&gt;");
- $args = count($args) ? $args : [it_debug::backtrace(['skiplevels' => 2])];
+ $args = count($args) ? $args : [it_debug::backtrace(['skiplevels' => 1])];
if ((preg_match('/csv|txt|gif|jpg/', $_SERVER['PHP_SELF']) || preg_grep('#text/(calendar|css|javascript|json|plain|rfc822|xml)|application/#', headers_list()) || $GLOBALS['debug_edplain']) && !$GLOBALS['debug_edhtml'])
;
@@ -113,7 +134,7 @@ static function dump($args, $p = [])
else if (defined('STDOUT') && posix_isatty(STDOUT) && $p['color'])
list($blue, $noblue, $red, $nored, $ansiok) = getenv('IT_ED_BRIGHT') ? array("\033[34m", "\033[m", "\033[33m", "\033[m", 1) : array("\033[34m", "\033[m", "\033[31m", "\033[m", 1);
- $src = it_debug::srcline(1);
+ $src = it_debug::srcline();
list($dummy, $function, $paramlist) = preg_match('#\b(D|ED|EDC|EDX)\s*\((.*)#i', $src, $parts) ? $parts : array();
$paramtokens = token_get_all("<?php $paramlist");
array_shift($paramtokens);
@@ -185,7 +206,7 @@ static function dump($args, $p = [])
$r = str_repeat(" ", count(debug_backtrace(@constant('DEBUG_BACKTRACE_IGNORE_ARGS')))-3) . $r;
# not it_html::Q(); we dont wanna load it_html in ultraclassloader debugging
- $title = htmlspecialchars(it_debug::backtrace(array('skiplevels' => 2)), ENT_COMPAT, "ISO-8859-1"); # skip this func as well as ED()/EDX()
+ $title = htmlspecialchars(it_debug::backtrace(array('skiplevels' => 1)), ENT_COMPAT, "ISO-8859-1"); # skip this func as well as ED()/EDX()
if ($p['html'])
return "<pre title='$title' style='color:#c00; text-align:left; background:white; border-bottom:1px solid #ddd; z-index:9999; position:relative; line-height:1'>$r</pre>\n";
@@ -202,21 +223,11 @@ static function dump($args, $p = [])
*/
static function backtrace($p = array())
{
- if (!is_array($p))
- $p = array('skiplevels' => $p);
-
- $p += array('levels' => 0, 'skiplevels'=> 0, 'skipfiles' => "###");
-
- foreach ($p['trace'] ?: array_slice(debug_backtrace(@constant('DEBUG_BACKTRACE_IGNORE_ARGS')), $p['skiplevels']) as $call)
+ foreach (self::debug_backtrace($p) as $call)
{
- if (($fn = $call['file']) && !it::match($p['skipfiles'], $call['file']))
- {
- $fn = (it::match('auto_prepend', $fn) ? basename(dirname(dirname($fn))) . "/" : (it::match('/(cgi|bin)/', $fn) ? basename(dirname($fn)) . "/" : "")) . basename($fn);
- $result[] = $fn . ":" . $call['line'];
-
- if (--$p['levels'] == 0)
- break;
- }
+ $fn = $call['file'];
+ $fn = (it::match('auto_prepend', $fn) ? basename(dirname(dirname($fn))) . "/" : (it::match('/(cgi|bin)/', $fn) ? basename(dirname($fn)) . "/" : "")) . basename($fn);
+ $result[] = $fn . ":" . $call['line'];
}
return implode(" ", (array)$result);