|
@@ -190,36 +190,30 @@ buffer_write_type :: proc(buf: ^Buffer, ti: ^Type_Info) {
|
|
if info.ordered { buffer_write_string(buf, "#ordered "); }
|
|
if info.ordered { buffer_write_string(buf, "#ordered "); }
|
|
buffer_write_string(buf, "{");
|
|
buffer_write_string(buf, "{");
|
|
for field, i : info.fields {
|
|
for field, i : info.fields {
|
|
- if i > 0 {
|
|
|
|
- buffer_write_string(buf, ", ");
|
|
|
|
- }
|
|
|
|
buffer_write_string(buf, field.name);
|
|
buffer_write_string(buf, field.name);
|
|
buffer_write_string(buf, ": ");
|
|
buffer_write_string(buf, ": ");
|
|
buffer_write_type(buf, field.type_info);
|
|
buffer_write_type(buf, field.type_info);
|
|
|
|
+ buffer_write_byte(buf, ';');
|
|
}
|
|
}
|
|
buffer_write_string(buf, "}");
|
|
buffer_write_string(buf, "}");
|
|
|
|
|
|
case Union:
|
|
case Union:
|
|
buffer_write_string(buf, "union {");
|
|
buffer_write_string(buf, "union {");
|
|
for field, i : info.fields {
|
|
for field, i : info.fields {
|
|
- if i > 0 {
|
|
|
|
- buffer_write_string(buf, ", ");
|
|
|
|
- }
|
|
|
|
buffer_write_string(buf, field.name);
|
|
buffer_write_string(buf, field.name);
|
|
buffer_write_string(buf, ": ");
|
|
buffer_write_string(buf, ": ");
|
|
buffer_write_type(buf, field.type_info);
|
|
buffer_write_type(buf, field.type_info);
|
|
|
|
+ buffer_write_byte(buf, ';');
|
|
}
|
|
}
|
|
buffer_write_string(buf, "}");
|
|
buffer_write_string(buf, "}");
|
|
|
|
|
|
case Raw_Union:
|
|
case Raw_Union:
|
|
buffer_write_string(buf, "raw_union {");
|
|
buffer_write_string(buf, "raw_union {");
|
|
for field, i : info.fields {
|
|
for field, i : info.fields {
|
|
- if i > 0 {
|
|
|
|
- buffer_write_string(buf, ", ");
|
|
|
|
- }
|
|
|
|
buffer_write_string(buf, field.name);
|
|
buffer_write_string(buf, field.name);
|
|
buffer_write_string(buf, ": ");
|
|
buffer_write_string(buf, ": ");
|
|
buffer_write_type(buf, field.type_info);
|
|
buffer_write_type(buf, field.type_info);
|
|
|
|
+ buffer_write_byte(buf, ';');
|
|
}
|
|
}
|
|
buffer_write_string(buf, "}");
|
|
buffer_write_string(buf, "}");
|
|
|
|
|
|
@@ -232,14 +226,6 @@ buffer_write_type :: proc(buf: ^Buffer, ti: ^Type_Info) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-make_any :: proc(type_info: ^Type_Info, data: rawptr) -> any {
|
|
|
|
- a: any;
|
|
|
|
- a.type_info = type_info;
|
|
|
|
- a.data = data;
|
|
|
|
- return a;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
bprint :: proc(buf: ^Buffer, args: ...any) -> int {
|
|
bprint :: proc(buf: ^Buffer, args: ...any) -> int {
|
|
is_type_string :: proc(info: ^Type_Info) -> bool {
|
|
is_type_string :: proc(info: ^Type_Info) -> bool {
|
|
using Type_Info;
|
|
using Type_Info;
|
|
@@ -411,7 +397,8 @@ fmt_write_padding :: proc(fi: ^Fmt_Info, width: int) {
|
|
}
|
|
}
|
|
|
|
|
|
fmt_integer :: proc(fi: ^Fmt_Info, u: u64, base: int, signed: bool, digits: string) {
|
|
fmt_integer :: proc(fi: ^Fmt_Info, u: u64, base: int, signed: bool, digits: string) {
|
|
- negative := signed && (u as i64) < 0;
|
|
|
|
|
|
+ u_i64 := u as i64;
|
|
|
|
+ negative := signed && u_i64 < 0;
|
|
if negative {
|
|
if negative {
|
|
u = -u;
|
|
u = -u;
|
|
}
|
|
}
|
|
@@ -591,12 +578,14 @@ fmt_string :: proc(fi: ^Fmt_Info, s: string, verb: rune) {
|
|
}
|
|
}
|
|
|
|
|
|
fmt_pointer :: proc(fi: ^Fmt_Info, p: rawptr, verb: rune) {
|
|
fmt_pointer :: proc(fi: ^Fmt_Info, p: rawptr, verb: rune) {
|
|
- if verb != 'p' {
|
|
|
|
|
|
+ match verb {
|
|
|
|
+ case 'p', 'v':
|
|
|
|
+ default:
|
|
fmt_bad_verb(fi, verb);
|
|
fmt_bad_verb(fi, verb);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
u := p as uint as u64;
|
|
u := p as uint as u64;
|
|
- if !fi.hash {
|
|
|
|
|
|
+ if !fi.hash || verb == 'v' {
|
|
buffer_write_string(fi.buf, "0x");
|
|
buffer_write_string(fi.buf, "0x");
|
|
}
|
|
}
|
|
fmt_integer(fi, u, 16, false, __DIGITS_UPPER);
|
|
fmt_integer(fi, u, 16, false, __DIGITS_UPPER);
|
|
@@ -612,14 +601,12 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
using Type_Info;
|
|
using Type_Info;
|
|
match type info : v.type_info {
|
|
match type info : v.type_info {
|
|
case Named:
|
|
case Named:
|
|
- if verb != 'v' {
|
|
|
|
- fmt_bad_verb(fi, verb);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- a := make_any(info.base, v.data);
|
|
|
|
match type b : info.base {
|
|
match type b : info.base {
|
|
case Struct:
|
|
case Struct:
|
|
|
|
+ if verb != 'v' {
|
|
|
|
+ fmt_bad_verb(fi, verb);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
buffer_write_string(fi.buf, info.name);
|
|
buffer_write_string(fi.buf, info.name);
|
|
buffer_write_byte(fi.buf, '{');
|
|
buffer_write_byte(fi.buf, '{');
|
|
for f, i : b.fields {
|
|
for f, i : b.fields {
|
|
@@ -630,12 +617,12 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
// bprint_any(fi.buf, f.offset);
|
|
// bprint_any(fi.buf, f.offset);
|
|
buffer_write_string(fi.buf, " = ");
|
|
buffer_write_string(fi.buf, " = ");
|
|
data := v.data as ^byte + f.offset;
|
|
data := v.data as ^byte + f.offset;
|
|
- fmt_arg(fi, make_any(f.type_info, data), 'v');
|
|
|
|
|
|
+ fmt_arg(fi, any{f.type_info, data as rawptr}, 'v');
|
|
}
|
|
}
|
|
buffer_write_byte(fi.buf, '}');
|
|
buffer_write_byte(fi.buf, '}');
|
|
|
|
|
|
default:
|
|
default:
|
|
- fmt_value(fi, a, verb);
|
|
|
|
|
|
+ fmt_value(fi, any{info.base, v.data}, verb);
|
|
}
|
|
}
|
|
|
|
|
|
case Boolean: fmt_arg(fi, v, verb);
|
|
case Boolean: fmt_arg(fi, v, verb);
|
|
@@ -644,14 +631,18 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
case String: fmt_arg(fi, v, verb);
|
|
case String: fmt_arg(fi, v, verb);
|
|
|
|
|
|
case Pointer:
|
|
case Pointer:
|
|
- fmt_pointer(fi, (v.data as ^rawptr)^, verb);
|
|
|
|
|
|
+ if v.type_info == type_info(^Type_Info) {
|
|
|
|
+ buffer_write_type(fi.buf, (v.data as ^^Type_Info)^);
|
|
|
|
+ } else {
|
|
|
|
+ fmt_pointer(fi, (v.data as ^rawptr)^, verb);
|
|
|
|
+ }
|
|
|
|
|
|
case Maybe:
|
|
case Maybe:
|
|
// TODO(bill): Correct verbs for Maybe types?
|
|
// TODO(bill): Correct verbs for Maybe types?
|
|
size := mem.size_of_type_info(info.elem);
|
|
size := mem.size_of_type_info(info.elem);
|
|
data := slice_ptr(v.data as ^byte, size+1);
|
|
data := slice_ptr(v.data as ^byte, size+1);
|
|
if data[size] != 0 {
|
|
if data[size] != 0 {
|
|
- fmt_arg(fi, make_any(info.elem, v.data), verb);
|
|
|
|
|
|
+ fmt_arg(fi, any{info.elem, v.data}, verb);
|
|
} else {
|
|
} else {
|
|
buffer_write_string(fi.buf, "nil");
|
|
buffer_write_string(fi.buf, "nil");
|
|
}
|
|
}
|
|
@@ -669,7 +660,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
buffer_write_string(fi.buf, ", ");
|
|
buffer_write_string(fi.buf, ", ");
|
|
}
|
|
}
|
|
data := v.data as ^byte + i*info.elem_size;
|
|
data := v.data as ^byte + i*info.elem_size;
|
|
- fmt_arg(fi, make_any(info.elem, data), 'v');
|
|
|
|
|
|
+ fmt_arg(fi, any{info.elem, data as rawptr}, 'v');
|
|
}
|
|
}
|
|
|
|
|
|
case Slice:
|
|
case Slice:
|
|
@@ -686,7 +677,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
buffer_write_string(fi.buf, ", ");
|
|
buffer_write_string(fi.buf, ", ");
|
|
}
|
|
}
|
|
data := slice.data + i*info.elem_size;
|
|
data := slice.data + i*info.elem_size;
|
|
- fmt_arg(fi, make_any(info.elem, data), 'v');
|
|
|
|
|
|
+ fmt_arg(fi, any{info.elem, data as rawptr}, 'v');
|
|
}
|
|
}
|
|
|
|
|
|
case Vector:
|
|
case Vector:
|
|
@@ -713,7 +704,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
}
|
|
}
|
|
|
|
|
|
data := v.data as ^byte + i*info.elem_size;
|
|
data := v.data as ^byte + i*info.elem_size;
|
|
- fmt_value(fi, make_any(info.elem, data), 'v');
|
|
|
|
|
|
+ fmt_value(fi, any{info.elem, data as rawptr}, 'v');
|
|
}
|
|
}
|
|
|
|
|
|
case Struct:
|
|
case Struct:
|
|
@@ -728,7 +719,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
buffer_write_string(fi.buf, " = ");
|
|
buffer_write_string(fi.buf, " = ");
|
|
data := v.data as ^byte + f.offset;
|
|
data := v.data as ^byte + f.offset;
|
|
ti := f.type_info;
|
|
ti := f.type_info;
|
|
- fmt_value(fi, make_any(ti, data), 'v');
|
|
|
|
|
|
+ fmt_value(fi, any{ti, data as rawptr}, 'v');
|
|
}
|
|
}
|
|
|
|
|
|
case Union:
|
|
case Union:
|
|
@@ -737,7 +728,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
|
|
buffer_write_string(fi.buf, "(raw_union)");
|
|
buffer_write_string(fi.buf, "(raw_union)");
|
|
|
|
|
|
case Enum:
|
|
case Enum:
|
|
- fmt_value(fi, make_any(info.base, v.data), verb);
|
|
|
|
|
|
+ fmt_arg(fi, any{info.base, v.data}, verb);
|
|
|
|
|
|
case Procedure:
|
|
case Procedure:
|
|
buffer_write_type(fi.buf, v.type_info);
|
|
buffer_write_type(fi.buf, v.type_info);
|
|
@@ -753,11 +744,16 @@ fmt_arg :: proc(fi: ^Fmt_Info, arg: any, verb: rune) {
|
|
}
|
|
}
|
|
fi.arg = arg;
|
|
fi.arg = arg;
|
|
|
|
|
|
- if verb == 'T' { // Type Info
|
|
|
|
- buffer_write_type(fi.buf, arg.type_info);
|
|
|
|
|
|
+ if verb == 'T' {
|
|
|
|
+ ti := arg.type_info;
|
|
|
|
+ if ti == type_info(^Type_Info) {
|
|
|
|
+ ti = (arg.data as ^^Type_Info)^;
|
|
|
|
+ }
|
|
|
|
+ buffer_write_type(fi.buf, ti);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
base_arg := arg;
|
|
base_arg := arg;
|
|
base_arg.type_info = type_info_base(base_arg.type_info);
|
|
base_arg.type_info = type_info_base(base_arg.type_info);
|
|
match type a : base_arg {
|
|
match type a : base_arg {
|