diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index b8a0f9a24..f7529a51f 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -462,7 +462,6 @@ int_from_arg :: proc(args: []any, arg_index: int) -> (int, int, bool) { fmt_bad_verb :: proc(using fi: ^Fmt_Info, verb: rune) { - assert(verb != 'v'); write_string(buf, "%!"); write_rune(buf, verb); write_byte(buf, '('); @@ -1018,7 +1017,9 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) { m := (^mem.Raw_Map)(v.data); if m != nil { - assert(info.generated_struct != nil); + if info.generated_struct == nil { + return; + } entries := &m.entries; gs := runtime.type_info_base(info.generated_struct).variant.(runtime.Type_Info_Struct); ed := runtime.type_info_base(gs.types[1]).variant.(runtime.Type_Info_Dynamic_Array); diff --git a/core/runtime/core.odin b/core/runtime/core.odin index cf00a34a6..d4018b5e6 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -5,6 +5,7 @@ package runtime import "core:os" import "core:mem" +import "core:fmt" // Naming Conventions: // In general, Ada_Case for types and snake_case for values @@ -565,7 +566,7 @@ assert :: proc "contextless" (condition: bool, message := "", loc := #caller_loc } @(builtin) -panic :: proc "contextless" (message := "", loc := #caller_location) { +panic :: proc "contextless" (message: string, loc := #caller_location) { p := context.assertion_failure_proc; if p == nil { p = default_assertion_failure_proc; @@ -574,6 +575,30 @@ panic :: proc "contextless" (message := "", loc := #caller_location) { } +@(builtin) +assertf :: proc "contextless" (condition: bool, format: string, args: ..any, loc := #caller_location) -> bool { + if !condition { + p := context.assertion_failure_proc; + if p == nil { + p = default_assertion_failure_proc; + } + message := fmt.tprintf(format, ..args); + p("Runtime assertion", message, loc); + } + return condition; +} + +@(builtin) +panicf :: proc "contextless" (format: string, args: ..any, loc := #caller_location) { + p := context.assertion_failure_proc; + if p == nil { + p = default_assertion_failure_proc; + } + message := fmt.tprintf(format, ..args); + p("Panic", message, loc); +} + + // Dynamic Array