"Old style" enums

name and value information
`count`, `min_value`, `max_value` constants
This commit is contained in:
Ginger Bill
2017-01-08 20:24:12 +00:00
parent 659e5359b2
commit ff473e8342
9 changed files with 350 additions and 135 deletions
+6 -2
View File
@@ -25,6 +25,10 @@ Type_Info_Record :: struct #ordered {
packed: bool;
ordered: bool;
}
Type_Info_Enum_Value :: raw_union {
f: f64;
i: i64;
}
Type_Info :: union {
Named: struct #ordered {
@@ -74,7 +78,7 @@ Type_Info :: union {
Enum: struct #ordered {
base: ^Type_Info;
names: []string;
// TODO(bill): store values some how. Maybe using a raw_union
values: []Type_Info_Enum_Value;
};
}
@@ -115,7 +119,7 @@ fmuladd64 :: proc(a, b, c: f64) -> f64 #foreign "llvm.fmuladd.f64"
Allocator_Mode :: enum u8 {
ALLOC = iota,
ALLOC,
FREE,
FREE_ALL,
RESIZE,
+33 -37
View File
@@ -190,36 +190,30 @@ buffer_write_type :: proc(buf: ^Buffer, ti: ^Type_Info) {
if info.ordered { buffer_write_string(buf, "#ordered "); }
buffer_write_string(buf, "{");
for field, i : info.fields {
if i > 0 {
buffer_write_string(buf, ", ");
}
buffer_write_string(buf, field.name);
buffer_write_string(buf, ": ");
buffer_write_type(buf, field.type_info);
buffer_write_byte(buf, ';');
}
buffer_write_string(buf, "}");
case Union:
buffer_write_string(buf, "union {");
for field, i : info.fields {
if i > 0 {
buffer_write_string(buf, ", ");
}
buffer_write_string(buf, field.name);
buffer_write_string(buf, ": ");
buffer_write_type(buf, field.type_info);
buffer_write_byte(buf, ';');
}
buffer_write_string(buf, "}");
case Raw_Union:
buffer_write_string(buf, "raw_union {");
for field, i : info.fields {
if i > 0 {
buffer_write_string(buf, ", ");
}
buffer_write_string(buf, field.name);
buffer_write_string(buf, ": ");
buffer_write_type(buf, field.type_info);
buffer_write_byte(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 {
is_type_string :: proc(info: ^Type_Info) -> bool {
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) {
negative := signed && (u as i64) < 0;
u_i64 := u as i64;
negative := signed && u_i64 < 0;
if negative {
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) {
if verb != 'p' {
match verb {
case 'p', 'v':
default:
fmt_bad_verb(fi, verb);
return;
}
u := p as uint as u64;
if !fi.hash {
if !fi.hash || verb == 'v' {
buffer_write_string(fi.buf, "0x");
}
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;
match type info : v.type_info {
case Named:
if verb != 'v' {
fmt_bad_verb(fi, verb);
return;
}
a := make_any(info.base, v.data);
match type b : info.base {
case Struct:
if verb != 'v' {
fmt_bad_verb(fi, verb);
return;
}
buffer_write_string(fi.buf, info.name);
buffer_write_byte(fi.buf, '{');
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);
buffer_write_string(fi.buf, " = ");
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, '}');
default:
fmt_value(fi, a, verb);
fmt_value(fi, any{info.base, v.data}, 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 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:
// TODO(bill): Correct verbs for Maybe types?
size := mem.size_of_type_info(info.elem);
data := slice_ptr(v.data as ^byte, size+1);
if data[size] != 0 {
fmt_arg(fi, make_any(info.elem, v.data), verb);
fmt_arg(fi, any{info.elem, v.data}, verb);
} else {
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, ", ");
}
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:
@@ -686,7 +677,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
buffer_write_string(fi.buf, ", ");
}
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:
@@ -713,7 +704,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
}
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:
@@ -728,7 +719,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
buffer_write_string(fi.buf, " = ");
data := v.data as ^byte + f.offset;
ti := f.type_info;
fmt_value(fi, make_any(ti, data), 'v');
fmt_value(fi, any{ti, data as rawptr}, 'v');
}
case Union:
@@ -737,7 +728,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
buffer_write_string(fi.buf, "(raw_union)");
case Enum:
fmt_value(fi, make_any(info.base, v.data), verb);
fmt_arg(fi, any{info.base, v.data}, verb);
case Procedure:
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;
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;
}
base_arg := arg;
base_arg.type_info = type_info_base(base_arg.type_info);
match type a : base_arg {