cgen: add callconv support for fns from ptr (#14151)
parent
cde15abc0a
commit
2134fb3e3e
|
@ -314,11 +314,32 @@ fn (mut g Gen) gen_assign_stmt(node_ ast.AssignStmt) {
|
|||
}
|
||||
func := right_sym.info as ast.FnType
|
||||
ret_styp := g.typ(func.func.return_type)
|
||||
g.write('$ret_styp (*${g.get_ternary_name(ident.name)}) (')
|
||||
|
||||
mut call_conv := ''
|
||||
mut msvc_call_conv := ''
|
||||
for attr in func.func.attrs {
|
||||
match attr.name {
|
||||
'callconv' {
|
||||
if g.is_cc_msvc {
|
||||
msvc_call_conv = '__$attr.arg '
|
||||
} else {
|
||||
call_conv = '$attr.arg'
|
||||
}
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
call_conv_attribute_suffix := if call_conv.len != 0 {
|
||||
'__attribute__(($call_conv))'
|
||||
} else {
|
||||
''
|
||||
}
|
||||
|
||||
g.write('$ret_styp ($msvc_call_conv*${g.get_ternary_name(ident.name)}) (')
|
||||
def_pos := g.definitions.len
|
||||
g.fn_decl_params(func.func.params, voidptr(0), false)
|
||||
g.definitions.go_back(g.definitions.len - def_pos)
|
||||
g.write(')')
|
||||
g.write(')$call_conv_attribute_suffix')
|
||||
} else {
|
||||
if is_decl {
|
||||
if is_inside_ternary {
|
||||
|
|
Loading…
Reference in New Issue