mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-08 16:48:18 +00:00
Refactor fmt_value
This commit is contained in:
+120
-110
@@ -1475,7 +1475,7 @@ fmt_array :: proc(fi: ^Info, data: rawptr, n: int, elem_size: int, elem: ^reflec
|
||||
}
|
||||
}
|
||||
|
||||
fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
||||
fmt_named :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Named) {
|
||||
write_padded_number :: proc(fi: ^Info, i: i64, width: int) {
|
||||
n := width-1
|
||||
for x := i; x >= 10; x /= 10 {
|
||||
@@ -1487,31 +1487,6 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
||||
io.write_i64(fi.writer, i, 10, &fi.n)
|
||||
}
|
||||
|
||||
|
||||
if v.data == nil || v.id == nil {
|
||||
io.write_string(fi.writer, "<nil>", &fi.n)
|
||||
return
|
||||
}
|
||||
|
||||
if _user_formatters != nil && !fi.ignore_user_formatters {
|
||||
formatter := _user_formatters[v.id]
|
||||
if formatter != nil {
|
||||
fi.ignore_user_formatters = false
|
||||
if ok := formatter(fi, v, verb); !ok {
|
||||
fi.ignore_user_formatters = true
|
||||
fmt_bad_verb(fi, verb)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
fi.ignore_user_formatters = false
|
||||
|
||||
type_info := type_info_of(v.id)
|
||||
switch info in type_info.variant {
|
||||
case runtime.Type_Info_Any: // Ignore
|
||||
case runtime.Type_Info_Tuple: // Ignore
|
||||
|
||||
case runtime.Type_Info_Named:
|
||||
// Built-in Custom Formatters for core library types
|
||||
switch a in v {
|
||||
case runtime.Source_Code_Location:
|
||||
@@ -1647,6 +1622,123 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
||||
case:
|
||||
fmt_value(fi, any{v.data, info.base.id}, verb)
|
||||
}
|
||||
}
|
||||
|
||||
fmt_union :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Union, type_size: int) {
|
||||
if type_size == 0 {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
return
|
||||
}
|
||||
|
||||
if reflect.type_info_union_is_pure_maybe(info) {
|
||||
if v.data == nil {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
} else {
|
||||
id := info.variants[0].id
|
||||
fmt_arg(fi, any{v.data, id}, verb)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
tag: i64 = -1
|
||||
tag_ptr := uintptr(v.data) + info.tag_offset
|
||||
tag_any := any{rawptr(tag_ptr), info.tag_type.id}
|
||||
|
||||
switch i in tag_any {
|
||||
case u8: tag = i64(i)
|
||||
case i8: tag = i64(i)
|
||||
case u16: tag = i64(i)
|
||||
case i16: tag = i64(i)
|
||||
case u32: tag = i64(i)
|
||||
case i32: tag = i64(i)
|
||||
case u64: tag = i64(i)
|
||||
case i64: tag = i
|
||||
case: panic("Invalid union tag type")
|
||||
}
|
||||
assert(tag >= 0)
|
||||
|
||||
if v.data == nil {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
} else if info.no_nil {
|
||||
id := info.variants[tag].id
|
||||
fmt_arg(fi, any{v.data, id}, verb)
|
||||
} else if tag == 0 {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
} else {
|
||||
id := info.variants[tag-1].id
|
||||
fmt_arg(fi, any{v.data, id}, verb)
|
||||
}
|
||||
}
|
||||
|
||||
fmt_matrix :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Matrix) {
|
||||
io.write_string(fi.writer, "matrix[", &fi.n)
|
||||
defer io.write_byte(fi.writer, ']', &fi.n)
|
||||
|
||||
fi.indent += 1
|
||||
|
||||
if fi.hash {
|
||||
// Printed as it is written
|
||||
io.write_byte(fi.writer, '\n', &fi.n)
|
||||
for row in 0..<info.row_count {
|
||||
fmt_write_indent(fi)
|
||||
for col in 0..<info.column_count {
|
||||
if col > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
||||
|
||||
offset := (row + col*info.elem_stride)*info.elem_size
|
||||
|
||||
data := uintptr(v.data) + uintptr(offset)
|
||||
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb)
|
||||
}
|
||||
io.write_string(fi.writer, ",\n", &fi.n)
|
||||
}
|
||||
} else {
|
||||
// Printed in Row-Major layout to match text layout
|
||||
for row in 0..<info.row_count {
|
||||
if row > 0 { io.write_string(fi.writer, "; ", &fi.n) }
|
||||
for col in 0..<info.column_count {
|
||||
if col > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
||||
|
||||
offset := (row + col*info.elem_stride)*info.elem_size
|
||||
|
||||
data := uintptr(v.data) + uintptr(offset)
|
||||
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fi.indent -= 1
|
||||
|
||||
if fi.hash {
|
||||
fmt_write_indent(fi)
|
||||
}
|
||||
}
|
||||
|
||||
fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
||||
if v.data == nil || v.id == nil {
|
||||
io.write_string(fi.writer, "<nil>", &fi.n)
|
||||
return
|
||||
}
|
||||
|
||||
if _user_formatters != nil && !fi.ignore_user_formatters {
|
||||
formatter := _user_formatters[v.id]
|
||||
if formatter != nil {
|
||||
fi.ignore_user_formatters = false
|
||||
if ok := formatter(fi, v, verb); !ok {
|
||||
fi.ignore_user_formatters = true
|
||||
fmt_bad_verb(fi, verb)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
fi.ignore_user_formatters = false
|
||||
|
||||
type_info := type_info_of(v.id)
|
||||
switch info in type_info.variant {
|
||||
case runtime.Type_Info_Any: // Ignore
|
||||
case runtime.Type_Info_Tuple: // Ignore
|
||||
|
||||
case runtime.Type_Info_Named:
|
||||
fmt_named(fi, v, verb, info)
|
||||
|
||||
case runtime.Type_Info_Boolean: fmt_arg(fi, v, verb)
|
||||
case runtime.Type_Info_Integer: fmt_arg(fi, v, verb)
|
||||
@@ -1871,50 +1963,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
||||
fmt_struct(fi, v, verb, info, "")
|
||||
|
||||
case runtime.Type_Info_Union:
|
||||
if type_info.size == 0 {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
if reflect.type_info_union_is_pure_maybe(info) {
|
||||
if v.data == nil {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
} else {
|
||||
id := info.variants[0].id
|
||||
fmt_arg(fi, any{v.data, id}, verb)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
tag: i64 = -1
|
||||
tag_ptr := uintptr(v.data) + info.tag_offset
|
||||
tag_any := any{rawptr(tag_ptr), info.tag_type.id}
|
||||
|
||||
switch i in tag_any {
|
||||
case u8: tag = i64(i)
|
||||
case i8: tag = i64(i)
|
||||
case u16: tag = i64(i)
|
||||
case i16: tag = i64(i)
|
||||
case u32: tag = i64(i)
|
||||
case i32: tag = i64(i)
|
||||
case u64: tag = i64(i)
|
||||
case i64: tag = i
|
||||
case: panic("Invalid union tag type")
|
||||
}
|
||||
assert(tag >= 0)
|
||||
|
||||
if v.data == nil {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
} else if info.no_nil {
|
||||
id := info.variants[tag].id
|
||||
fmt_arg(fi, any{v.data, id}, verb)
|
||||
} else if tag == 0 {
|
||||
io.write_string(fi.writer, "nil", &fi.n)
|
||||
} else {
|
||||
id := info.variants[tag-1].id
|
||||
fmt_arg(fi, any{v.data, id}, verb)
|
||||
}
|
||||
fmt_union(fi, v, verb, info, type_info.size)
|
||||
|
||||
case runtime.Type_Info_Enum:
|
||||
fmt_enum(fi, v, verb)
|
||||
@@ -1967,46 +2016,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
||||
}
|
||||
|
||||
case runtime.Type_Info_Matrix:
|
||||
io.write_string(fi.writer, "matrix[", &fi.n)
|
||||
defer io.write_byte(fi.writer, ']', &fi.n)
|
||||
|
||||
fi.indent += 1
|
||||
|
||||
if fi.hash {
|
||||
// Printed as it is written
|
||||
io.write_byte(fi.writer, '\n', &fi.n)
|
||||
for row in 0..<info.row_count {
|
||||
fmt_write_indent(fi)
|
||||
for col in 0..<info.column_count {
|
||||
if col > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
||||
|
||||
offset := (row + col*info.elem_stride)*info.elem_size
|
||||
|
||||
data := uintptr(v.data) + uintptr(offset)
|
||||
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb)
|
||||
}
|
||||
io.write_string(fi.writer, ",\n", &fi.n)
|
||||
}
|
||||
} else {
|
||||
// Printed in Row-Major layout to match text layout
|
||||
for row in 0..<info.row_count {
|
||||
if row > 0 { io.write_string(fi.writer, "; ", &fi.n) }
|
||||
for col in 0..<info.column_count {
|
||||
if col > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
||||
|
||||
offset := (row + col*info.elem_stride)*info.elem_size
|
||||
|
||||
data := uintptr(v.data) + uintptr(offset)
|
||||
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fi.indent -= 1
|
||||
|
||||
if fi.hash {
|
||||
fmt_write_indent(fi)
|
||||
}
|
||||
fmt_matrix(fi, v, verb, info)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user