cgen: alias & map types & add map_string/map_int aliases

pull/3996/head
joe-conigliaro 2020-03-12 17:56:44 +11:00
parent dfaba54376
commit 853bb4c41e
2 changed files with 38 additions and 17 deletions

View File

@ -44,7 +44,7 @@ pub fn (g mut Gen) init() {
g.definitions.writeln(c_builtin_types) g.definitions.writeln(c_builtin_types)
g.definitions.writeln(c_headers) g.definitions.writeln(c_headers)
g.write_builtin_types() g.write_builtin_types()
g.write_array_types() g.write_typedef_types()
g.write_sorted_types() g.write_sorted_types()
g.write_multi_return_types() g.write_multi_return_types()
g.definitions.writeln('// end of definitions #endif') g.definitions.writeln('// end of definitions #endif')
@ -67,20 +67,34 @@ pub fn (g &Gen) styp(t string) string {
} }
*/ */
pub fn (g mut Gen) write_typedef_types() {
pub fn (g mut Gen) write_array_types() {
for typ in g.table.types { for typ in g.table.types {
if typ.kind == .array { match typ.kind {
styp := typ.name.replace('.', '__') .alias {
g.definitions.writeln('typedef array $styp;') parent := &g.table.types[typ.parent_idx]
} styp := typ.name.replace('.', '__')
else if typ.kind == .array_fixed { parent_styp := parent.name.replace('.', '__')
styp := typ.name.replace('.', '__') g.definitions.writeln('typedef $parent_styp $styp;')
// array_fixed_char_300 => char x[300] }
mut fixed := styp[12..] .array {
len := styp.after('_') styp := typ.name.replace('.', '__')
fixed = fixed[..fixed.len - len.len - 1] g.definitions.writeln('typedef array $styp;')
g.definitions.writeln('typedef $fixed $styp [$len];') }
.array_fixed {
styp := typ.name.replace('.', '__')
// array_fixed_char_300 => char x[300]
mut fixed := styp[12..]
len := styp.after('_')
fixed = fixed[..fixed.len - len.len - 1]
g.definitions.writeln('typedef $fixed $styp [$len];')
}
.map {
styp := typ.name.replace('.', '__')
g.definitions.writeln('typedef map $styp;')
}
else {
continue
}
} }
} }
} }

View File

@ -248,11 +248,18 @@ pub fn (t mut Table) register_builtin_type_symbols() {
kind: .map kind: .map
name: 'map' name: 'map'
}) })
// TODO: remove // TODO: remove. for v1 map compatibility
map_string_string_idx := t.find_or_register_map(string_type, string_type)
map_string_int_idx := t.find_or_register_map(string_type, int_type)
t.register_type_symbol(TypeSymbol{ t.register_type_symbol(TypeSymbol{
parent_idx: map_type_idx kind: .alias
kind: .struct_
name: 'map_string' name: 'map_string'
parent_idx: map_string_string_idx
})
t.register_type_symbol(TypeSymbol{
kind: .alias
name: 'map_int'
parent_idx: map_string_int_idx
}) })
} }