cgen: add gen_free_for_type_array/map() (#11530)
parent
f5efa93570
commit
8501217a4e
|
@ -14,11 +14,6 @@ fn (mut g Gen) gen_free_method_for_type(typ ast.Type) string {
|
||||||
sym = g.table.get_type_symbol(sym.info.parent_type)
|
sym = g.table.get_type_symbol(sym.info.parent_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if sym.kind == .map {
|
|
||||||
return 'map_free'
|
|
||||||
} else if sym.kind == .array {
|
|
||||||
return 'array_free'
|
|
||||||
}
|
|
||||||
|
|
||||||
if sym.has_method('free') {
|
if sym.has_method('free') {
|
||||||
return fn_name
|
return fn_name
|
||||||
|
@ -27,6 +22,12 @@ fn (mut g Gen) gen_free_method_for_type(typ ast.Type) string {
|
||||||
ast.Struct {
|
ast.Struct {
|
||||||
g.gen_free_for_struct(sym.info, styp, fn_name)
|
g.gen_free_for_struct(sym.info, styp, fn_name)
|
||||||
}
|
}
|
||||||
|
ast.Array {
|
||||||
|
g.gen_free_for_array(sym.info, styp, fn_name)
|
||||||
|
}
|
||||||
|
ast.Map {
|
||||||
|
g.gen_free_for_map(sym.info, styp, fn_name)
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
println(g.table.type_str(typ))
|
println(g.table.type_str(typ))
|
||||||
verror("could not generate free method '$fn_name' for type '$styp'")
|
verror("could not generate free method '$fn_name' for type '$styp'")
|
||||||
|
@ -37,7 +38,7 @@ fn (mut g Gen) gen_free_method_for_type(typ ast.Type) string {
|
||||||
|
|
||||||
fn (mut g Gen) gen_free_for_struct(info ast.Struct, styp string, fn_name string) {
|
fn (mut g Gen) gen_free_for_struct(info ast.Struct, styp string, fn_name string) {
|
||||||
g.type_definitions.writeln('void ${fn_name}($styp* it); // auto')
|
g.type_definitions.writeln('void ${fn_name}($styp* it); // auto')
|
||||||
mut fn_builder := strings.new_builder(512)
|
mut fn_builder := strings.new_builder(128)
|
||||||
defer {
|
defer {
|
||||||
g.auto_fn_definitions << fn_builder.str()
|
g.auto_fn_definitions << fn_builder.str()
|
||||||
}
|
}
|
||||||
|
@ -59,6 +60,43 @@ fn (mut g Gen) gen_free_for_struct(info ast.Struct, styp string, fn_name string)
|
||||||
fn_builder.writeln('}')
|
fn_builder.writeln('}')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (mut g Gen) gen_free_for_array(info ast.Array, styp string, fn_name string) {
|
||||||
|
g.type_definitions.writeln('void ${fn_name}($styp* it); // auto')
|
||||||
|
mut fn_builder := strings.new_builder(128)
|
||||||
|
defer {
|
||||||
|
g.auto_fn_definitions << fn_builder.str()
|
||||||
|
}
|
||||||
|
fn_builder.writeln('void ${fn_name}($styp* it) {')
|
||||||
|
|
||||||
|
sym := g.table.get_type_symbol(g.unwrap_generic(info.elem_type))
|
||||||
|
if sym.kind in [.string, .array, .map, .struct_] {
|
||||||
|
fn_builder.writeln('\tfor (int i = 0; i < it->len; i++) {')
|
||||||
|
|
||||||
|
mut elem_styp := g.typ(info.elem_type).replace('*', '')
|
||||||
|
elem_styp_fn_name := if sym.has_method('free') {
|
||||||
|
'${elem_styp}_free'
|
||||||
|
} else {
|
||||||
|
g.gen_free_method_for_type(info.elem_type)
|
||||||
|
}
|
||||||
|
fn_builder.writeln('\t\t${elem_styp_fn_name}(&((($elem_styp*)it->data)[i]));')
|
||||||
|
fn_builder.writeln('\t}')
|
||||||
|
}
|
||||||
|
fn_builder.writeln('\tarray_free(it);')
|
||||||
|
fn_builder.writeln('}')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut g Gen) gen_free_for_map(info ast.Map, styp string, fn_name string) {
|
||||||
|
g.type_definitions.writeln('void ${fn_name}($styp* it); // auto')
|
||||||
|
mut fn_builder := strings.new_builder(128)
|
||||||
|
defer {
|
||||||
|
g.auto_fn_definitions << fn_builder.str()
|
||||||
|
}
|
||||||
|
fn_builder.writeln('void ${fn_name}($styp* it) {')
|
||||||
|
|
||||||
|
fn_builder.writeln('\tmap_free(it);')
|
||||||
|
fn_builder.writeln('}')
|
||||||
|
}
|
||||||
|
|
||||||
[inline]
|
[inline]
|
||||||
fn styp_to_free_fn_name(styp string) string {
|
fn styp_to_free_fn_name(styp string) string {
|
||||||
return styp.replace_each(['*', '', '.', '__', ' ', '__']) + '_free'
|
return styp.replace_each(['*', '', '.', '__', ' ', '__']) + '_free'
|
||||||
|
|
|
@ -2,7 +2,7 @@ struct Info {
|
||||||
name string
|
name string
|
||||||
notes []string
|
notes []string
|
||||||
maps map[int]int
|
maps map[int]int
|
||||||
info SubInfo
|
info []SubInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SubInfo {
|
struct SubInfo {
|
||||||
|
|
Loading…
Reference in New Issue