|
@@ -346,237 +346,247 @@ write_type :: proc{
|
|
}
|
|
}
|
|
|
|
|
|
write_type_builder :: proc(buf: ^strings.Builder, ti: ^Type_Info) -> int {
|
|
write_type_builder :: proc(buf: ^strings.Builder, ti: ^Type_Info) -> int {
|
|
- return write_type_writer(strings.to_writer(buf), ti)
|
|
|
|
|
|
+ n, _ := write_type_writer(strings.to_writer(buf), ti)
|
|
|
|
+ return n
|
|
}
|
|
}
|
|
-write_type_writer :: proc(w: io.Writer, ti: ^Type_Info) -> (n: int) {
|
|
|
|
- using strings
|
|
|
|
|
|
+write_type_writer :: proc(w: io.Writer, ti: ^Type_Info) -> (n: int, err: io.Error) {
|
|
if ti == nil {
|
|
if ti == nil {
|
|
- return write_string(w, "nil")
|
|
|
|
|
|
+ return io.write_string(w, "nil")
|
|
}
|
|
}
|
|
|
|
|
|
- _n1 :: proc(err: io.Error) -> int { return 1 if err == nil else 0 }
|
|
|
|
- _n2 :: proc(n: int, _: io.Error) -> int { return n }
|
|
|
|
|
|
+ _n1 :: proc(err: io.Error, n: ^int) -> io.Error {
|
|
|
|
+ n^ += 1 if err == nil else 0
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ _n2 :: io.n_wrapper
|
|
_n :: proc{_n1, _n2}
|
|
_n :: proc{_n1, _n2}
|
|
|
|
|
|
switch info in ti.variant {
|
|
switch info in ti.variant {
|
|
case Type_Info_Named:
|
|
case Type_Info_Named:
|
|
- return write_string(w, info.name)
|
|
|
|
|
|
+ return io.write_string(w, info.name)
|
|
case Type_Info_Integer:
|
|
case Type_Info_Integer:
|
|
switch ti.id {
|
|
switch ti.id {
|
|
- case int: return write_string(w, "int")
|
|
|
|
- case uint: return write_string(w, "uint")
|
|
|
|
- case uintptr: return write_string(w, "uintptr")
|
|
|
|
|
|
+ case int: return io.write_string(w, "int")
|
|
|
|
+ case uint: return io.write_string(w, "uint")
|
|
|
|
+ case uintptr: return io.write_string(w, "uintptr")
|
|
case:
|
|
case:
|
|
- n += _n(io.write_byte(w, 'i' if info.signed else 'u'))
|
|
|
|
- n += _n(io.write_i64(w, i64(8*ti.size), 10))
|
|
|
|
|
|
+ _n(io.write_byte(w, 'i' if info.signed else 'u'), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
|
|
switch info.endianness {
|
|
switch info.endianness {
|
|
case .Platform: // Okay
|
|
case .Platform: // Okay
|
|
- case .Little: n += write_string(w, "le")
|
|
|
|
- case .Big: n += write_string(w, "be")
|
|
|
|
|
|
+ case .Little: _n(io.write_string(w, "le"), &n) or_return
|
|
|
|
+ case .Big: _n(io.write_string(w, "be"), &n) or_return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
case Type_Info_Rune:
|
|
case Type_Info_Rune:
|
|
- n += _n(io.write_string(w, "rune"))
|
|
|
|
|
|
+ _n(io.write_string(w, "rune"), &n) or_return
|
|
case Type_Info_Float:
|
|
case Type_Info_Float:
|
|
- n += _n(io.write_byte(w, 'f'))
|
|
|
|
- n += _n(io.write_i64(w, i64(8*ti.size), 10))
|
|
|
|
|
|
+ _n(io.write_byte(w, 'f'), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
|
|
switch info.endianness {
|
|
switch info.endianness {
|
|
case .Platform: // Okay
|
|
case .Platform: // Okay
|
|
- case .Little: n += write_string(w, "le")
|
|
|
|
- case .Big: n += write_string(w, "be")
|
|
|
|
|
|
+ case .Little: _n(io.write_string(w, "le"), &n) or_return
|
|
|
|
+ case .Big: _n(io.write_string(w, "be"), &n) or_return
|
|
}
|
|
}
|
|
case Type_Info_Complex:
|
|
case Type_Info_Complex:
|
|
- n += _n(io.write_string(w, "complex"))
|
|
|
|
- n += _n(io.write_i64(w, i64(8*ti.size), 10))
|
|
|
|
|
|
+ _n(io.write_string(w, "complex"), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
|
|
case Type_Info_Quaternion:
|
|
case Type_Info_Quaternion:
|
|
- n += _n(io.write_string(w, "quaternion"))
|
|
|
|
- n += _n(io.write_i64(w, i64(8*ti.size), 10))
|
|
|
|
|
|
+ _n(io.write_string(w, "quaternion"), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
|
|
case Type_Info_String:
|
|
case Type_Info_String:
|
|
if info.is_cstring {
|
|
if info.is_cstring {
|
|
- n += write_string(w, "cstring")
|
|
|
|
|
|
+ _n(io.write_string(w, "cstring"), &n) or_return
|
|
} else {
|
|
} else {
|
|
- n += write_string(w, "string")
|
|
|
|
|
|
+ _n(io.write_string(w, "string"), &n) or_return
|
|
}
|
|
}
|
|
case Type_Info_Boolean:
|
|
case Type_Info_Boolean:
|
|
switch ti.id {
|
|
switch ti.id {
|
|
- case bool: n += write_string(w, "bool")
|
|
|
|
|
|
+ case bool: _n(io.write_string(w, "bool"), &n) or_return
|
|
case:
|
|
case:
|
|
- n += _n(io.write_byte(w, 'b'))
|
|
|
|
- n += _n(io.write_i64(w, i64(8*ti.size), 10))
|
|
|
|
|
|
+ _n(io.write_byte(w, 'b'), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
|
|
}
|
|
}
|
|
case Type_Info_Any:
|
|
case Type_Info_Any:
|
|
- n += write_string(w, "any")
|
|
|
|
|
|
+ _n(io.write_string(w, "any"), &n) or_return
|
|
|
|
|
|
case Type_Info_Type_Id:
|
|
case Type_Info_Type_Id:
|
|
- n += write_string(w, "typeid")
|
|
|
|
|
|
+ _n(io.write_string(w, "typeid"), &n) or_return
|
|
|
|
|
|
case Type_Info_Pointer:
|
|
case Type_Info_Pointer:
|
|
if info.elem == nil {
|
|
if info.elem == nil {
|
|
- write_string(w, "rawptr")
|
|
|
|
|
|
+ return io.write_string(w, "rawptr")
|
|
} else {
|
|
} else {
|
|
- write_string(w, "^")
|
|
|
|
- write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "^"), &n) or_return
|
|
|
|
+ return write_type(w, info.elem)
|
|
}
|
|
}
|
|
case Type_Info_Multi_Pointer:
|
|
case Type_Info_Multi_Pointer:
|
|
- write_string(w, "[^]")
|
|
|
|
- write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "[^]"), &n) or_return
|
|
|
|
+ return write_type(w, info.elem)
|
|
case Type_Info_Procedure:
|
|
case Type_Info_Procedure:
|
|
- n += write_string(w, "proc")
|
|
|
|
|
|
+ _n(io.write_string(w, "proc"), &n) or_return
|
|
if info.params == nil {
|
|
if info.params == nil {
|
|
- n += write_string(w, "()")
|
|
|
|
|
|
+ _n(io.write_string(w, "()"), &n) or_return
|
|
} else {
|
|
} else {
|
|
t := info.params.variant.(Type_Info_Tuple)
|
|
t := info.params.variant.(Type_Info_Tuple)
|
|
- n += write_string(w, "(")
|
|
|
|
|
|
+ _n(io.write_string(w, "("), &n) or_return
|
|
for t, i in t.types {
|
|
for t, i in t.types {
|
|
if i > 0 {
|
|
if i > 0 {
|
|
- n += write_string(w, ", ")
|
|
|
|
|
|
+ _n(io.write_string(w, ", "), &n) or_return
|
|
}
|
|
}
|
|
- n += write_type(w, t)
|
|
|
|
|
|
+ _n(write_type(w, t), &n) or_return
|
|
}
|
|
}
|
|
- n += write_string(w, ")")
|
|
|
|
|
|
+ _n(io.write_string(w, ")"), &n) or_return
|
|
}
|
|
}
|
|
if info.results != nil {
|
|
if info.results != nil {
|
|
- n += write_string(w, " -> ")
|
|
|
|
- n += write_type(w, info.results)
|
|
|
|
|
|
+ _n(io.write_string(w, " -> "), &n) or_return
|
|
|
|
+ _n(write_type(w, info.results), &n) or_return
|
|
}
|
|
}
|
|
case Type_Info_Tuple:
|
|
case Type_Info_Tuple:
|
|
count := len(info.names)
|
|
count := len(info.names)
|
|
- if count != 1 { n += write_string(w, "(") }
|
|
|
|
|
|
+ if count != 1 {
|
|
|
|
+ _n(io.write_string(w, "("), &n) or_return
|
|
|
|
+ }
|
|
for name, i in info.names {
|
|
for name, i in info.names {
|
|
- if i > 0 { n += write_string(w, ", ") }
|
|
|
|
|
|
+ if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
|
|
|
|
|
|
t := info.types[i]
|
|
t := info.types[i]
|
|
|
|
|
|
if len(name) > 0 {
|
|
if len(name) > 0 {
|
|
- n += write_string(w, name)
|
|
|
|
- n += write_string(w, ": ")
|
|
|
|
|
|
+ _n(io.write_string(w, name), &n) or_return
|
|
|
|
+ _n(io.write_string(w, ": "), &n) or_return
|
|
}
|
|
}
|
|
- n += write_type(w, t)
|
|
|
|
|
|
+ _n(write_type(w, t), &n) or_return
|
|
|
|
+ }
|
|
|
|
+ if count != 1 {
|
|
|
|
+ _n(io.write_string(w, ")"), &n) or_return
|
|
}
|
|
}
|
|
- if count != 1 { n += write_string(w, ")") }
|
|
|
|
|
|
|
|
case Type_Info_Array:
|
|
case Type_Info_Array:
|
|
- n += _n(io.write_string(w, "["))
|
|
|
|
- n += _n(io.write_i64(w, i64(info.count), 10))
|
|
|
|
- n += _n(io.write_string(w, "]"))
|
|
|
|
- n += write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "["), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(info.count), 10), &n) or_return
|
|
|
|
+ _n(io.write_string(w, "]"), &n) or_return
|
|
|
|
+ _n(write_type(w, info.elem), &n) or_return
|
|
|
|
|
|
case Type_Info_Enumerated_Array:
|
|
case Type_Info_Enumerated_Array:
|
|
- n += write_string(w, "[")
|
|
|
|
- n += write_type(w, info.index)
|
|
|
|
- n += write_string(w, "]")
|
|
|
|
- n += write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "["), &n) or_return
|
|
|
|
+ _n(write_type(w, info.index), &n) or_return
|
|
|
|
+ _n(io.write_string(w, "]"), &n) or_return
|
|
|
|
+ _n(write_type(w, info.elem), &n) or_return
|
|
|
|
|
|
case Type_Info_Dynamic_Array:
|
|
case Type_Info_Dynamic_Array:
|
|
- n += _n(io.write_string(w, "[dynamic]"))
|
|
|
|
- n += write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "[dynamic]"), &n) or_return
|
|
|
|
+ _n(write_type(w, info.elem), &n) or_return
|
|
case Type_Info_Slice:
|
|
case Type_Info_Slice:
|
|
- n += _n(io.write_string(w, "[]"))
|
|
|
|
- n += write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "[]"), &n) or_return
|
|
|
|
+ _n(write_type(w, info.elem), &n) or_return
|
|
|
|
|
|
case Type_Info_Map:
|
|
case Type_Info_Map:
|
|
- n += _n(io.write_string(w, "map["))
|
|
|
|
- n += write_type(w, info.key)
|
|
|
|
- n += _n(io.write_byte(w, ']'))
|
|
|
|
- n += write_type(w, info.value)
|
|
|
|
|
|
+ _n(io.write_string(w, "map["), &n) or_return
|
|
|
|
+ _n(write_type(w, info.key), &n) or_return
|
|
|
|
+ _n(io.write_byte(w, ']'), &n) or_return
|
|
|
|
+ _n(write_type(w, info.value), &n) or_return
|
|
|
|
|
|
case Type_Info_Struct:
|
|
case Type_Info_Struct:
|
|
switch info.soa_kind {
|
|
switch info.soa_kind {
|
|
case .None: // Ignore
|
|
case .None: // Ignore
|
|
case .Fixed:
|
|
case .Fixed:
|
|
- n += _n(io.write_string(w, "#soa["))
|
|
|
|
- n += _n(io.write_i64(w, i64(info.soa_len)))
|
|
|
|
- n += _n(io.write_byte(w, ']'))
|
|
|
|
- n += write_type(w, info.soa_base_type)
|
|
|
|
|
|
+ _n(io.write_string(w, "#soa["), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(info.soa_len)), &n) or_return
|
|
|
|
+ _n(io.write_byte(w, ']'), &n) or_return
|
|
|
|
+ _n(write_type(w, info.soa_base_type), &n) or_return
|
|
return
|
|
return
|
|
case .Slice:
|
|
case .Slice:
|
|
- n += _n(io.write_string(w, "#soa[]"))
|
|
|
|
- n += write_type(w, info.soa_base_type)
|
|
|
|
|
|
+ _n(io.write_string(w, "#soa[]"), &n) or_return
|
|
|
|
+ _n(write_type(w, info.soa_base_type), &n) or_return
|
|
return
|
|
return
|
|
case .Dynamic:
|
|
case .Dynamic:
|
|
- n += _n(io.write_string(w, "#soa[dynamic]"))
|
|
|
|
- n += write_type(w, info.soa_base_type)
|
|
|
|
|
|
+ _n(io.write_string(w, "#soa[dynamic]"), &n) or_return
|
|
|
|
+ _n(write_type(w, info.soa_base_type), &n) or_return
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- n += write_string(w, "struct ")
|
|
|
|
- if info.is_packed { n += write_string(w, "#packed ") }
|
|
|
|
- if info.is_raw_union { n += write_string(w, "#raw_union ") }
|
|
|
|
|
|
+ _n(io.write_string(w, "struct "), &n) or_return
|
|
|
|
+ if info.is_packed { _n(io.write_string(w, "#packed "), &n) or_return }
|
|
|
|
+ if info.is_raw_union { _n(io.write_string(w, "#raw_union "), &n) or_return }
|
|
if info.custom_align {
|
|
if info.custom_align {
|
|
- n += _n(io.write_string(w, "#align "))
|
|
|
|
- n += _n(io.write_i64(w, i64(ti.align), 10))
|
|
|
|
- n += _n(io.write_byte(w, ' '))
|
|
|
|
|
|
+ _n(io.write_string(w, "#align "), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(ti.align), 10), &n) or_return
|
|
|
|
+ _n(io.write_byte(w, ' '), &n) or_return
|
|
}
|
|
}
|
|
- n += _n(io.write_byte(w, '{'))
|
|
|
|
|
|
+ _n(io.write_byte(w, '{'), &n) or_return
|
|
for name, i in info.names {
|
|
for name, i in info.names {
|
|
- if i > 0 { n += write_string(w, ", ") }
|
|
|
|
- n += _n(io.write_string(w, name))
|
|
|
|
- n += _n(io.write_string(w, ": "))
|
|
|
|
- n += write_type(w, info.types[i])
|
|
|
|
|
|
+ if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
|
|
|
|
+ _n(io.write_string(w, name), &n) or_return
|
|
|
|
+ _n(io.write_string(w, ": "), &n) or_return
|
|
|
|
+ _n(write_type(w, info.types[i]), &n) or_return
|
|
}
|
|
}
|
|
- n += _n(io.write_byte(w, '}'))
|
|
|
|
|
|
+ _n(io.write_byte(w, '}'), &n) or_return
|
|
|
|
|
|
case Type_Info_Union:
|
|
case Type_Info_Union:
|
|
- n += write_string(w, "union ")
|
|
|
|
|
|
+ _n(io.write_string(w, "union "), &n) or_return
|
|
|
|
+ if info.maybe {
|
|
|
|
+ _n(io.write_string(w, "#maybe "), &n) or_return
|
|
|
|
+ }
|
|
if info.custom_align {
|
|
if info.custom_align {
|
|
- n += write_string(w, "#align ")
|
|
|
|
- n += _n(io.write_i64(w, i64(ti.align), 10))
|
|
|
|
- n += _n(io.write_byte(w, ' '))
|
|
|
|
|
|
+ _n(io.write_string(w, "#align "), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(ti.align), 10), &n) or_return
|
|
|
|
+ _n(io.write_byte(w, ' '), &n) or_return
|
|
}
|
|
}
|
|
- n += _n(io.write_byte(w, '{'))
|
|
|
|
|
|
+ _n(io.write_byte(w, '{'), &n) or_return
|
|
for variant, i in info.variants {
|
|
for variant, i in info.variants {
|
|
- if i > 0 { n += write_string(w, ", ") }
|
|
|
|
- n += write_type(w, variant)
|
|
|
|
|
|
+ if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
|
|
|
|
+ _n(write_type(w, variant), &n) or_return
|
|
}
|
|
}
|
|
- n += _n(io.write_byte(w, '}'))
|
|
|
|
|
|
+ _n(io.write_byte(w, '}'), &n) or_return
|
|
|
|
|
|
case Type_Info_Enum:
|
|
case Type_Info_Enum:
|
|
- n += write_string(w, "enum ")
|
|
|
|
- n += write_type(w, info.base)
|
|
|
|
- n += write_string(w, " {")
|
|
|
|
|
|
+ _n(io.write_string(w, "enum "), &n) or_return
|
|
|
|
+ _n(write_type(w, info.base), &n) or_return
|
|
|
|
+ _n(io.write_string(w, " {"), &n) or_return
|
|
for name, i in info.names {
|
|
for name, i in info.names {
|
|
- if i > 0 { n += write_string(w, ", ") }
|
|
|
|
- n += write_string(w, name)
|
|
|
|
|
|
+ if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
|
|
|
|
+ _n(io.write_string(w, name), &n) or_return
|
|
}
|
|
}
|
|
- n += _n(io.write_byte(w, '}'))
|
|
|
|
|
|
+ _n(io.write_byte(w, '}'), &n) or_return
|
|
|
|
|
|
case Type_Info_Bit_Set:
|
|
case Type_Info_Bit_Set:
|
|
- n += write_string(w, "bit_set[")
|
|
|
|
|
|
+ _n(io.write_string(w, "bit_set["), &n) or_return
|
|
switch {
|
|
switch {
|
|
case is_enum(info.elem):
|
|
case is_enum(info.elem):
|
|
- n += write_type(w, info.elem)
|
|
|
|
|
|
+ _n(write_type(w, info.elem), &n) or_return
|
|
case is_rune(info.elem):
|
|
case is_rune(info.elem):
|
|
- n += write_encoded_rune(w, rune(info.lower))
|
|
|
|
- n += write_string(w, "..")
|
|
|
|
- n += write_encoded_rune(w, rune(info.upper))
|
|
|
|
|
|
+ _n(io.write_encoded_rune(w, rune(info.lower)), &n) or_return
|
|
|
|
+ _n(io.write_string(w, ".."), &n) or_return
|
|
|
|
+ _n(io.write_encoded_rune(w, rune(info.upper)), &n) or_return
|
|
case:
|
|
case:
|
|
- n += _n(io.write_i64(w, info.lower, 10))
|
|
|
|
- n += write_string(w, "..")
|
|
|
|
- n += _n(io.write_i64(w, info.upper, 10))
|
|
|
|
|
|
+ _n(io.write_i64(w, info.lower, 10), &n) or_return
|
|
|
|
+ _n(io.write_string(w, ".."), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, info.upper, 10), &n) or_return
|
|
}
|
|
}
|
|
if info.underlying != nil {
|
|
if info.underlying != nil {
|
|
- n += write_string(w, "; ")
|
|
|
|
- n += write_type(w, info.underlying)
|
|
|
|
|
|
+ _n(io.write_string(w, "; "), &n) or_return
|
|
|
|
+ _n(write_type(w, info.underlying), &n) or_return
|
|
}
|
|
}
|
|
- n += _n(io.write_byte(w, ']'))
|
|
|
|
|
|
+ _n(io.write_byte(w, ']'), &n) or_return
|
|
|
|
|
|
case Type_Info_Simd_Vector:
|
|
case Type_Info_Simd_Vector:
|
|
- n += write_string(w, "#simd[")
|
|
|
|
- n += _n(io.write_i64(w, i64(info.count)))
|
|
|
|
- n += _n(io.write_byte(w, ']'))
|
|
|
|
- n += write_type(w, info.elem)
|
|
|
|
|
|
+ _n(io.write_string(w, "#simd["), &n) or_return
|
|
|
|
+ _n(io.write_i64(w, i64(info.count)), &n) or_return
|
|
|
|
+ _n(io.write_byte(w, ']'), &n) or_return
|
|
|
|
+ _n(write_type(w, info.elem), &n) or_return
|
|
|
|
|
|
case Type_Info_Relative_Pointer:
|
|
case Type_Info_Relative_Pointer:
|
|
- n += write_string(w, "#relative(")
|
|
|
|
- n += write_type(w, info.base_integer)
|
|
|
|
- n += write_string(w, ") ")
|
|
|
|
- n += write_type(w, info.pointer)
|
|
|
|
|
|
+ _n(io.write_string(w, "#relative("), &n) or_return
|
|
|
|
+ _n(write_type(w, info.base_integer), &n) or_return
|
|
|
|
+ _n(io.write_string(w, ") "), &n) or_return
|
|
|
|
+ _n(write_type(w, info.pointer), &n) or_return
|
|
|
|
|
|
case Type_Info_Relative_Slice:
|
|
case Type_Info_Relative_Slice:
|
|
- n += write_string(w, "#relative(")
|
|
|
|
- n += write_type(w, info.base_integer)
|
|
|
|
- n += write_string(w, ") ")
|
|
|
|
- n += write_type(w, info.slice)
|
|
|
|
|
|
+ _n(io.write_string(w, "#relative("), &n) or_return
|
|
|
|
+ _n(write_type(w, info.base_integer), &n) or_return
|
|
|
|
+ _n(io.write_string(w, ") "), &n) or_return
|
|
|
|
+ _n(write_type(w, info.slice), &n) or_return
|
|
}
|
|
}
|
|
|
|
|
|
return
|
|
return
|