cgen: c2v variadic fixes

pull/13380/head
Alexander Medvednikov 2022-02-06 03:36:38 +03:00
parent cec7e91714
commit f23d2c8cf4
4 changed files with 14 additions and 11 deletions

View File

@ -34,7 +34,7 @@ const (
'shader', 'shader',
'symlink', 'symlink',
'test', 'test',
'test-all', /* runs most of the tests and other checking tools, that will be run by the CI */ 'test-all', // runs most of the tests and other checking tools, that will be run by the CI
'test-cleancode', 'test-cleancode',
'test-fmt', 'test-fmt',
'test-parser', 'test-parser',

View File

@ -154,7 +154,7 @@ fn (mut g Gen) gen_assign_stmt(node ast.AssignStmt) {
ret_styp := g.typ(val.decl.return_type) ret_styp := g.typ(val.decl.return_type)
g.write('$ret_styp (*$ident.name) (') g.write('$ret_styp (*$ident.name) (')
def_pos := g.definitions.len def_pos := g.definitions.len
g.fn_args(val.decl.params, voidptr(0)) g.fn_decl_params(val.decl.params, voidptr(0), false)
g.definitions.go_back(g.definitions.len - def_pos) g.definitions.go_back(g.definitions.len - def_pos)
g.write(') = ') g.write(') = ')
} else { } else {
@ -312,7 +312,7 @@ fn (mut g Gen) gen_assign_stmt(node ast.AssignStmt) {
ret_styp := g.typ(func.func.return_type) ret_styp := g.typ(func.func.return_type)
g.write('$ret_styp (*${g.get_ternary_name(ident.name)}) (') g.write('$ret_styp (*${g.get_ternary_name(ident.name)}) (')
def_pos := g.definitions.len def_pos := g.definitions.len
g.fn_args(func.func.params, voidptr(0)) g.fn_decl_params(func.func.params, voidptr(0), false)
g.definitions.go_back(g.definitions.len - def_pos) g.definitions.go_back(g.definitions.len - def_pos)
g.write(')') g.write(')')
} else { } else {

View File

@ -6849,7 +6849,7 @@ static inline __shared__$interface_name ${shared_fn_name}(__shared__$cctype* x)
...params[0] ...params[0]
typ: st.set_nr_muls(1) typ: st.set_nr_muls(1)
} }
fargs, _, _ := g.fn_args(params, voidptr(0)) fargs, _, _ := g.fn_decl_params(params, voidptr(0), false)
mut parameter_name := g.out.cut_last(g.out.len - params_start_pos) mut parameter_name := g.out.cut_last(g.out.len - params_start_pos)
if st.is_ptr() { if st.is_ptr() {

View File

@ -274,7 +274,7 @@ fn (mut g Gen) gen_fn_decl(node &ast.FnDecl, skip bool) {
g.write(fn_header) g.write(fn_header)
} }
arg_start_pos := g.out.len arg_start_pos := g.out.len
fargs, fargtypes, heap_promoted := g.fn_args(node.params, node.scope) fargs, fargtypes, heap_promoted := g.fn_decl_params(node.params, node.scope, node.is_variadic)
if is_closure { if is_closure {
mut s := '$cur_closure_ctx *$c.closure_ctx' mut s := '$cur_closure_ctx *$c.closure_ctx'
if node.params.len > 0 { if node.params.len > 0 {
@ -537,16 +537,15 @@ fn (mut g Gen) write_defer_stmts_when_needed() {
} }
} }
// fn decl args fn (mut g Gen) fn_decl_params(params []ast.Param, scope &ast.Scope, is_variadic bool) ([]string, []string, []bool) {
fn (mut g Gen) fn_args(args []ast.Param, scope &ast.Scope) ([]string, []string, []bool) {
mut fargs := []string{} mut fargs := []string{}
mut fargtypes := []string{} mut fargtypes := []string{}
mut heap_promoted := []bool{} mut heap_promoted := []bool{}
if args.len == 0 { if params.len == 0 {
// in C, `()` is untyped, unlike `(void)` // in C, `()` is untyped, unlike `(void)`
g.write('void') g.write('void')
} }
for i, arg in args { for i, arg in params {
mut caname := if arg.name == '_' { g.new_tmp_declaration_name() } else { c_name(arg.name) } mut caname := if arg.name == '_' { g.new_tmp_declaration_name() } else { c_name(arg.name) }
typ := g.unwrap_generic(arg.typ) typ := g.unwrap_generic(arg.typ)
arg_type_sym := g.table.sym(typ) arg_type_sym := g.table.sym(typ)
@ -556,7 +555,7 @@ fn (mut g Gen) fn_args(args []ast.Param, scope &ast.Scope) ([]string, []string,
func := info.func func := info.func
g.write('${g.typ(func.return_type)} (*$caname)(') g.write('${g.typ(func.return_type)} (*$caname)(')
g.definitions.write_string('${g.typ(func.return_type)} (*$caname)(') g.definitions.write_string('${g.typ(func.return_type)} (*$caname)(')
g.fn_args(func.params, voidptr(0)) g.fn_decl_params(func.params, voidptr(0), func.is_variadic)
g.write(')') g.write(')')
g.definitions.write_string(')') g.definitions.write_string(')')
fargs << caname fargs << caname
@ -586,11 +585,15 @@ fn (mut g Gen) fn_args(args []ast.Param, scope &ast.Scope) ([]string, []string,
fargtypes << arg_type_name fargtypes << arg_type_name
heap_promoted << heap_prom heap_promoted << heap_prom
} }
if i < args.len - 1 { if i < params.len - 1 {
g.write(', ') g.write(', ')
g.definitions.write_string(', ') g.definitions.write_string(', ')
} }
} }
if g.pref.translated && is_variadic {
g.write(', ...')
g.definitions.write_string(', ...')
}
return fargs, fargtypes, heap_promoted return fargs, fargtypes, heap_promoted
} }