diff --git a/compiler/fn.v b/compiler/fn.v index b1d3db5c31..19ef378ab3 100644 --- a/compiler/fn.v +++ b/compiler/fn.v @@ -752,6 +752,16 @@ fn (p mut Parser) fn_call_args(f mut Fn) *Fn { p.check(.rpar) return f } + // add debug information to panic when -debug arg is passed + if p.v.pref.is_debug && f.name == 'panic' { + mod_name := p.mod.replace('_dot_', '.') + fn_name := p.cur_fn.name.replace('${p.mod}__', '') + file_path := p.file_path.replace('\\', '\\\\') // escape \ + p.cgen.resetln(p.cgen.cur_line.replace( + 'v_panic (', + '_panic_debug ($p.scanner.line_nr, tos2("$file_path"), tos2("$mod_name"), tos2("$fn_name"), ' + )) + } // Receiver - first arg for i, arg in f.args { // println('$i) arg=$arg.name') diff --git a/vlib/builtin/builtin.v b/vlib/builtin/builtin.v index 7925e7785d..d6041dcc30 100644 --- a/vlib/builtin/builtin.v +++ b/vlib/builtin/builtin.v @@ -26,6 +26,19 @@ pub fn print_backtrace() { } } +// replaces panic when -debug arg is passed +fn _panic_debug(line_no int, file, mod, fn_name, s string) { + println('================ V panic ================') + println(' module: $mod') + println(' function: ${fn_name}()') + println(' file: $file') + println(' line: ' + line_no.str()) + println(' message: $s') + println('=========================================') + print_backtrace() + C.exit(1) +} + pub fn panic(s string) { println('V panic: $s') print_backtrace()