diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index e3499aa941..c81fd7c855 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -22,6 +22,9 @@ pub mut: is_fmt bool used_fns map[string]bool // filled in by the checker, when pref.skip_unused = true; used_consts map[string]bool // filled in by the checker, when pref.skip_unused = true; + panic_handler FnPanicHandler = default_table_panic_handler + panic_userdata voidptr = voidptr(0) // can be used to pass arbitrary data to panic_handler; + panic_npanics int } [unsafe] @@ -42,6 +45,18 @@ pub fn (t &Table) free() { } } +pub type FnPanicHandler = fn (&Table, string) + +fn default_table_panic_handler(t &Table, message string) { + panic(message) +} + +pub fn (t &Table) panic(message string) { + mut mt := unsafe { &Table(t) } + mt.panic_npanics++ + t.panic_handler(t, message) +} + pub struct Fn { pub: params []Param @@ -209,7 +224,7 @@ pub fn (mut t TypeSymbol) register_method(new_fn Fn) int { pub fn (t &Table) register_aggregate_method(mut sym TypeSymbol, name string) ?Fn { if sym.kind != .aggregate { - panic('Unexpected type symbol: $sym.kind') + t.panic('Unexpected type symbol: $sym.kind') } agg_info := sym.info as Aggregate // an aggregate always has at least 2 types @@ -263,7 +278,7 @@ pub fn (t &Table) type_find_method(s &TypeSymbol, name string) ?Fn { fn (t &Table) register_aggregate_field(mut sym TypeSymbol, name string) ?StructField { if sym.kind != .aggregate { - panic('Unexpected type symbol: $sym.kind') + t.panic('Unexpected type symbol: $sym.kind') } mut agg_info := sym.info as Aggregate // an aggregate always has at least 2 types @@ -424,7 +439,7 @@ pub fn (t &Table) get_type_symbol(typ Type) &TypeSymbol { return unsafe { &t.type_symbols[idx] } } // this should never happen - panic('get_type_symbol: invalid type (typ=$typ idx=$idx). Compiler bug. This should never happen. Please create a GitHub issue. + t.panic('get_type_symbol: invalid type (typ=$typ idx=$idx). Compiler bug. This should never happen. Please create a GitHub issue. ') } @@ -441,7 +456,7 @@ pub fn (t &Table) get_final_type_symbol(typ Type) &TypeSymbol { return unsafe { &t.type_symbols[idx] } } // this should never happen - panic('get_final_type_symbol: invalid type (typ=$typ idx=$idx). Compiler bug. This should never happen. Please create a GitHub issue.') + t.panic('get_final_type_symbol: invalid type (typ=$typ idx=$idx). Compiler bug. This should never happen. Please create a GitHub issue.') } [inline] @@ -956,7 +971,7 @@ pub fn (mut t Table) bitsize_to_type(bit_size int) Type { } else { if bit_size % 8 != 0 { // there is no way to do `i2131(32)` so this should never be reached - panic('compiler bug: bitsizes must be multiples of 8') + t.panic('compiler bug: bitsizes must be multiples of 8') } return new_type(t.find_or_register_array_fixed(byte_type, bit_size / 8)) }