builtin: call C.tcc_backtrace() directly in the panic() fns

pull/7298/head^2
Delyan Angelov 2020-12-12 22:59:06 +02:00
parent 9e3339e2e8
commit ecfd124390
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
1 changed files with 19 additions and 16 deletions

View File

@ -37,6 +37,9 @@ pub fn print_backtrace() {
} }
// panic_debug - private function that V uses for panics, -cg/-g is passed // panic_debug - private function that V uses for panics, -cg/-g is passed
// recent versions of tcc print nicer backtraces automatically
// NB: the duplication here is because tcc_backtrace should be called directly
// inside the panic functions.
fn panic_debug(line_no int, file string, mod string, fn_name string, s string) { fn panic_debug(line_no int, file string, mod string, fn_name string, s string) {
// NB: the order here is important for a stabler test output // NB: the order here is important for a stabler test output
// module is less likely to change than function, etc... // module is less likely to change than function, etc...
@ -52,9 +55,15 @@ fn panic_debug(line_no int, file string, mod string, fn_name string, s string) {
$if exit_after_panic_message ? { $if exit_after_panic_message ? {
C.exit(1) C.exit(1)
} }
if !should_use_native_backtraces() { $if tinyc {
print_backtrace_skipping_top_frames(1) $if panics_break_into_debugger ? {
break_if_debugger_attached()
} $else {
C.tcc_backtrace('Backtrace')
} }
C.exit(1)
}
print_backtrace_skipping_top_frames(1)
$if panics_break_into_debugger ? { $if panics_break_into_debugger ? {
break_if_debugger_attached() break_if_debugger_attached()
} }
@ -68,27 +77,21 @@ pub fn panic(s string) {
$if exit_after_panic_message ? { $if exit_after_panic_message ? {
C.exit(1) C.exit(1)
} }
if !should_use_native_backtraces() { $if tinyc {
print_backtrace_skipping_top_frames(1) $if panics_break_into_debugger ? {
break_if_debugger_attached()
} $else {
C.tcc_backtrace('Backtrace')
} }
C.exit(1)
}
print_backtrace_skipping_top_frames(1)
$if panics_break_into_debugger ? { $if panics_break_into_debugger ? {
break_if_debugger_attached() break_if_debugger_attached()
} }
C.exit(1) C.exit(1)
} }
fn should_use_native_backtraces() bool {
mut res := false
$if panics_break_into_debugger ? {
$if tinyc {
// recent versions of tcc print nicer backtraces automatically
res = true
}
}
return res
}
// eprintln prints a message with a line end, to stderr. Both stderr and stdout are flushed. // eprintln prints a message with a line end, to stderr. Both stderr and stdout are flushed.
pub fn eprintln(s string) { pub fn eprintln(s string) {
// eprintln is used in panics, so it should not fail at all // eprintln is used in panics, so it should not fail at all