Correct distinction between indirection and record level

This commit is contained in:
gingerBill
2022-06-11 15:24:35 +01:00
parent a11e17fbc3
commit bd502d16bc
+28 -15
View File
@@ -32,6 +32,7 @@ Info :: struct {
writer: io.Writer, writer: io.Writer,
arg: any, // Temporary arg: any, // Temporary
indirection_level: int,
record_level: int, record_level: int,
optional_len: Maybe(int), optional_len: Maybe(int),
@@ -952,9 +953,9 @@ fmt_string :: proc(fi: ^Info, s: string, verb: rune) {
if ol, ok := fi.optional_len.?; ok { if ol, ok := fi.optional_len.?; ok {
s = s[:min(len(s), ol)] s = s[:min(len(s), ol)]
} }
// if !fi.in_bad && fi.record_level >= 0 && verb == 'v' { if !fi.in_bad && fi.record_level > 0 && verb == 'v' {
// verb = 'q' verb = 'q'
// } }
switch verb { switch verb {
case 's', 'v': case 's', 'v':
@@ -1235,6 +1236,8 @@ fmt_write_array :: proc(fi: ^Info, array_data: rawptr, count: int, elem_size: in
if count <= 0 { if count <= 0 {
return return
} }
fi.record_level += 1
defer fi.record_level -= 1
if fi.hash { if fi.hash {
io.write_byte(fi.writer, '\n', &fi.n) io.write_byte(fi.writer, '\n', &fi.n)
@@ -1328,6 +1331,8 @@ fmt_struct :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_St
io.write_string(fi.writer, type_name, &fi.n) io.write_string(fi.writer, type_name, &fi.n)
io.write_byte(fi.writer, '[' if is_soa else '{', &fi.n) io.write_byte(fi.writer, '[' if is_soa else '{', &fi.n)
fi.record_level += 1
defer fi.record_level -= 1
hash := fi.hash; defer fi.hash = hash hash := fi.hash; defer fi.hash = hash
indent := fi.indent; defer fi.indent -= 1 indent := fi.indent; defer fi.indent -= 1
@@ -1381,6 +1386,8 @@ fmt_struct :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_St
io.write_string(fi.writer, base_type_name, &fi.n) io.write_string(fi.writer, base_type_name, &fi.n)
io.write_byte(fi.writer, '{', &fi.n) io.write_byte(fi.writer, '{', &fi.n)
defer io.write_byte(fi.writer, '}', &fi.n) defer io.write_byte(fi.writer, '}', &fi.n)
fi.record_level += 1
defer fi.record_level -= 1
for i in 0..<actual_field_count { for i in 0..<actual_field_count {
verb := 'v' verb := 'v'
@@ -1767,9 +1774,9 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
io.write_string(fi.writer, "<nil>", &fi.n) io.write_string(fi.writer, "<nil>", &fi.n)
return return
} }
if fi.record_level < 1 { if fi.indirection_level < 1 {
fi.record_level += 1 fi.indirection_level += 1
defer fi.record_level -= 1 defer fi.indirection_level -= 1
io.write_byte(fi.writer, '&') io.write_byte(fi.writer, '&')
fmt_value(fi, a, verb) fmt_value(fi, a, verb)
return return
@@ -1781,9 +1788,9 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
io.write_string(fi.writer, "<nil>", &fi.n) io.write_string(fi.writer, "<nil>", &fi.n)
return return
} }
if fi.record_level < 1 { if fi.indirection_level < 1 {
fi.record_level += 1 fi.indirection_level += 1
defer fi.record_level -= 1 defer fi.indirection_level -= 1
io.write_byte(fi.writer, '&', &fi.n) io.write_byte(fi.writer, '&', &fi.n)
fmt_value(fi, a, verb) fmt_value(fi, a, verb)
return return
@@ -1815,9 +1822,9 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
io.write_string(fi.writer, "<nil>", &fi.n) io.write_string(fi.writer, "<nil>", &fi.n)
return return
} }
if fi.record_level < 1 { if fi.indirection_level < 1 {
fi.record_level += 1 fi.indirection_level += 1
defer fi.record_level -= 1 defer fi.indirection_level -= 1
io.write_byte(fi.writer, '&', &fi.n) io.write_byte(fi.writer, '&', &fi.n)
fmt_value(fi, a, verb) fmt_value(fi, a, verb)
return return
@@ -1829,9 +1836,9 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
io.write_string(fi.writer, "<nil>", &fi.n) io.write_string(fi.writer, "<nil>", &fi.n)
return return
} }
if fi.record_level < 1 { if fi.indirection_level < 1 {
fi.record_level += 1 fi.indirection_level += 1
defer fi.record_level -= 1 defer fi.indirection_level -= 1
io.write_byte(fi.writer, '&', &fi.n) io.write_byte(fi.writer, '&', &fi.n)
fmt_value(fi, a, verb) fmt_value(fi, a, verb)
return return
@@ -1842,6 +1849,9 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
fmt_pointer(fi, ptr, verb) fmt_pointer(fi, ptr, verb)
case runtime.Type_Info_Enumerated_Array: case runtime.Type_Info_Enumerated_Array:
fi.record_level += 1
defer fi.record_level -= 1
if fi.hash { if fi.hash {
io.write_string(fi.writer, "[\n", &fi.n) io.write_string(fi.writer, "[\n", &fi.n)
defer { defer {
@@ -2004,6 +2014,9 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
len, _ := reflect.as_int(len_any) len, _ := reflect.as_int(len_any)
slice_type := reflect.type_info_base(info.slice).variant.(runtime.Type_Info_Slice) slice_type := reflect.type_info_base(info.slice).variant.(runtime.Type_Info_Slice)
fi.record_level += 1
defer fi.record_level -= 1
io.write_byte(fi.writer, '[', &fi.n) io.write_byte(fi.writer, '[', &fi.n)
defer io.write_byte(fi.writer, ']', &fi.n) defer io.write_byte(fi.writer, ']', &fi.n)