cgen: multi return structs + other fixes
parent
cd8a5d1f2e
commit
136aa763a3
|
@ -36,14 +36,25 @@ pub fn new_builder(pref &pref.Preferences) Builder {
|
|||
}
|
||||
|
||||
pub fn (b mut Builder) gen_c(v_files []string) string {
|
||||
t0 := time.ticks()
|
||||
b.parsed_files = parser.parse_files(v_files, b.table)
|
||||
b.parse_imports()
|
||||
t1 := time.ticks()
|
||||
parse_time := t1 - t0
|
||||
println('PARSE: ${parse_time}ms')
|
||||
//
|
||||
b.checker.check_files(b.parsed_files)
|
||||
t2 := time.ticks()
|
||||
check_time := t2 - t1
|
||||
println('CHECK: ${check_time}ms')
|
||||
if b.checker.nr_errors > 0 {
|
||||
exit(1)
|
||||
}
|
||||
// println('starting cgen...')
|
||||
res := gen.cgen(b.parsed_files, b.table)
|
||||
t3 := time.ticks()
|
||||
gen_time := t3 - t2
|
||||
println('C GEN: ${gen_time}ms')
|
||||
println('cgen done')
|
||||
// println(res)
|
||||
return res
|
||||
|
|
|
@ -38,6 +38,28 @@ pub fn (g mut Gen) init() {
|
|||
g.definitions.writeln('#include <inttypes.h>') // int64_t etc
|
||||
g.definitions.writeln(c_builtin_types)
|
||||
g.definitions.writeln(c_headers)
|
||||
// Multi return structs
|
||||
// TODO move to a method
|
||||
g.definitions.writeln('// multi return structs')
|
||||
for typ in g.table.types {
|
||||
// sym := g.table.get_type_symbol(typ)
|
||||
if typ.kind != .multi_return {
|
||||
continue
|
||||
}
|
||||
name := typ.name.replace('.', '__')
|
||||
info := typ.info as table.MultiReturn
|
||||
g.definitions.writeln('typedef struct {')
|
||||
// TODO copy pasta StructDecl
|
||||
// for field in struct_info.fields {
|
||||
for i, mr_typ in info.types {
|
||||
field_type_sym := g.table.get_type_symbol(mr_typ)
|
||||
type_name := field_type_sym.name.replace('.', '__')
|
||||
g.definitions.writeln('\t$type_name arg_${i+1};')
|
||||
}
|
||||
g.definitions.writeln('} $name;\n')
|
||||
// g.typedefs.writeln('typedef struct $name $name;')
|
||||
}
|
||||
g.definitions.writeln('// end of definitions #endif')
|
||||
}
|
||||
|
||||
pub fn (g &Gen) save() {}
|
||||
|
@ -136,7 +158,7 @@ fn (g mut Gen) stmt(node ast.Stmt) {
|
|||
}
|
||||
}
|
||||
ast.FnDecl {
|
||||
if it.is_c {
|
||||
if it.is_c || it.name == 'malloc' {
|
||||
return
|
||||
}
|
||||
g.reset_tmp_count()
|
||||
|
@ -147,21 +169,31 @@ fn (g mut Gen) stmt(node ast.Stmt) {
|
|||
}
|
||||
else {
|
||||
type_sym := g.table.get_type_symbol(it.typ)
|
||||
mut name := it.name.replace('.', '__')
|
||||
mut name := it.name
|
||||
if it.is_method {
|
||||
name = g.table.get_type_symbol(it.receiver.typ).name + '_' + name
|
||||
}
|
||||
g.write('$type_sym.name ${name}(')
|
||||
g.definitions.write('$type_sym.name ${name}(')
|
||||
name = name.replace('.', '__')
|
||||
// type_name := g.table.type_to_str(it.typ)
|
||||
type_name := type_sym.name.replace('.', '__') // g.table.type_to_str(it.typ)
|
||||
g.write('$type_name ${name}(')
|
||||
g.definitions.write('$type_name ${name}(')
|
||||
}
|
||||
no_names := it.args.len > 0 && it.args[0].name == 'arg_1'
|
||||
for i, arg in it.args {
|
||||
arg_type_sym := g.table.get_type_symbol(arg.typ)
|
||||
mut arg_type_name := arg_type_sym.name
|
||||
mut arg_type_name := arg_type_sym.name.replace('.', '__')
|
||||
if i == it.args.len - 1 && it.is_variadic {
|
||||
arg_type_name = 'variadic_$arg_type_sym.name'
|
||||
}
|
||||
g.write(arg_type_name + ' ' + arg.name)
|
||||
g.definitions.write(arg_type_name + ' ' + arg.name)
|
||||
if no_names {
|
||||
g.write(arg_type_name)
|
||||
g.definitions.write(arg_type_name)
|
||||
}
|
||||
else {
|
||||
g.write(arg_type_name + ' ' + arg.name)
|
||||
g.definitions.write(arg_type_name + ' ' + arg.name)
|
||||
}
|
||||
if i < it.args.len - 1 {
|
||||
g.write(', ')
|
||||
g.definitions.write(', ')
|
||||
|
@ -239,13 +271,13 @@ fn (g mut Gen) stmt(node ast.Stmt) {
|
|||
g.writeln(';')
|
||||
}
|
||||
ast.StructDecl {
|
||||
name := it.name.replace('.', '__')
|
||||
g.writeln('typedef struct {')
|
||||
for field in it.fields {
|
||||
field_type_sym := g.table.get_type_symbol(field.typ)
|
||||
g.writeln('\t$field_type_sym.name $field.name;')
|
||||
}
|
||||
g.writeln('} $it.name;')
|
||||
name := it.name.replace('.', '__')
|
||||
g.writeln('} $name;')
|
||||
g.typedefs.writeln('typedef struct $name $name;')
|
||||
}
|
||||
ast.TypeDecl {
|
||||
|
|
Loading…
Reference in New Issue