Skip to content

Commit 6567209

Browse files
committed
generate: Add CName to aid in translation to and from c
1 parent 940a277 commit 6567209

26 files changed

+113
-41
lines changed

generate/codegen/gen_function.go

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ func (f *Function) CArgs(currentModule *modules.Module) string {
5555
// log.Println("rendering function", f.Name)
5656
var args []string
5757
for _, p := range f.Parameters {
58-
args = append(args, fmt.Sprintf("%s %s", p.Type.ObjcName(), p.Name))
58+
log.Printf("rendering cfunction arg: %s %s %T", p.Name, p.Type, p.Type)
59+
args = append(args, fmt.Sprintf("%s %s", p.Type.CName(), p.Name))
5960
}
6061
return strings.Join(args, ", ")
6162
}
@@ -110,59 +111,40 @@ func (f *Function) WriteGoCallCode(currentModule *modules.Module, cw *CodeWriter
110111
cw.WriteLine("func " + funcDeclare + " {")
111112
cw.Indent()
112113

113-
var returnTypeStr string
114-
rt := typing.UnwrapAlias(f.ReturnType)
115-
switch rt.(type) {
116-
case *typing.VoidType:
117-
returnTypeStr = "objc.Void"
118-
default:
119-
returnTypeStr = f.ReturnType.GoName(currentModule, true)
120-
}
121-
callCode := fmt.Sprintf("objc.Call[%s](%s, objc.Sel(\"%s\")", returnTypeStr, f.Selector())
114+
returnTypeStr := f.GoReturn(currentModule)
115+
116+
callCode := fmt.Sprintf("C.%s(", f.GoName)
122117
var sb strings.Builder
123118
for idx, p := range f.Parameters {
124-
sb.WriteString(", ")
119+
// cast to C type
125120
switch tt := p.Type.(type) {
126-
case *typing.ClassType:
127-
sb.WriteString("objc.Ptr(" + p.GoName() + ")")
128-
case *typing.ProtocolType:
129-
pvar := fmt.Sprintf("po%d", idx)
130-
cw.WriteLineF("%s := objc.WrapAsProtocol(\"%s\", %s)", pvar, tt.Name, p.GoName())
131-
sb.WriteString(pvar)
132-
case *typing.PointerType:
133-
switch tt.Type.(type) {
134-
case *typing.ClassType: //object pointer convert to unsafe.Pointer, avoiding ffi treat it as PointerHolder
135-
sb.WriteString(fmt.Sprintf("unsafe.Pointer(%s)", p.GoName()))
136-
default:
137-
sb.WriteString(p.GoName())
138-
}
121+
case *typing.AliasType:
122+
sb.WriteString(fmt.Sprintf("C.%s(%s)", tt.CName(), p.GoName()))
139123
default:
140124
sb.WriteString(p.GoName())
141125
}
126+
if idx < len(f.Parameters)-1 {
127+
sb.WriteString(", ")
128+
}
142129
}
143130
callCode += sb.String() + ")"
144131

145-
switch rt.(type) {
146-
case *typing.VoidType:
132+
if returnTypeStr == "" {
147133
cw.WriteLine(callCode)
148-
default:
134+
} else {
149135
var resultName = "rv"
150136
cw.WriteLine(resultName + " := " + callCode)
151-
cw.WriteLine("return " + resultName)
137+
cw.WriteLineF("return %s(%s)", returnTypeStr, resultName)
152138
}
153139
cw.UnIndent()
154140
cw.WriteLine("}")
155141
}
156142

157143
func (f *Function) WriteCSignature(currentModule *modules.Module, cw *CodeWriter) {
158144
var returnTypeStr string
159-
rt := typing.UnwrapAlias(f.ReturnType)
160-
switch rt.(type) {
161-
case *typing.VoidType:
162-
returnTypeStr = "void *"
163-
default:
164-
returnTypeStr = f.ReturnType.ObjcName()
165-
}
145+
rt := f.Type.ReturnType
146+
log.Printf("rt: %T", rt)
147+
returnTypeStr = rt.CName()
166148
cw.WriteLineF("// %v %v(%v); ", returnTypeStr, f.GoName, f.CArgs(currentModule))
167149
}
168150

generate/codegen/modulewriter.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,11 @@ func (m *ModuleWriter) WriteFunctions() {
155155
cw.WriteLine(AutoGeneratedMark)
156156
cw.WriteLine("package " + m.Module.Package)
157157

158+
//TODO: determine imports from functions
158159
cw.WriteLine(`// #import <stdlib.h>
159-
// #import <stdint.h>
160-
// #import <stdbool.h>
161-
// #import <CoreGraphics/CGGeometry.h>
162-
`)
160+
// #import <stdint.h>
161+
// #import <stdbool.h>
162+
// #import <CoreGraphics/CGGeometry.h>`)
163163
for _, f := range m.Functions {
164164
f.WriteCSignature(&m.Module, cw)
165165
}

generate/generator.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,6 @@ func (db *Generator) Generate(platform string, version int, rootDir string, fram
149149
continue
150150
}
151151
mw.Structs = append(mw.Structs, fn)
152-
default:
153-
log.Printf("skipping '%s', unhandled kind: %s", s.Name, s.Kind)
154152
}
155153
}
156154
mw.WriteCode()

generate/types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ func (db *Generator) TypeFromSymbol(sym Symbol) typing.Type {
9595
Type: typ,
9696
}
9797
case "Struct":
98+
if strings.HasSuffix(sym.Name, "Ref") {
99+
return &typing.RefType{
100+
Name: sym.Name,
101+
}
102+
}
98103
return &typing.StructType{
99104
Name: sym.Name,
100105
GName: modules.TrimPrefix(sym.Name),

generate/typing/alias_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ func (a *AliasType) ObjcName() string {
3636
return a.Name
3737
}
3838

39+
func (a *AliasType) CName() string {
40+
return a.Type.CName()
41+
}
42+
3943
func (a *AliasType) DeclareModule() *modules.Module {
4044
return a.Module
4145
}

generate/typing/array_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ func (a *ArrayType) ObjcName() string {
2626
return "NSArray*"
2727
}
2828

29+
func (a *ArrayType) CName() string {
30+
return "NSArray*"
31+
}
32+
2933
func (a *ArrayType) DeclareModule() *modules.Module {
3034
return a.Type.DeclareModule()
3135
}

generate/typing/block_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ func (a *BlockType) ObjcName() string {
7575
return sb.String()
7676
}
7777

78+
func (a *BlockType) CName() string {
79+
return a.ObjcName()
80+
}
81+
7882
func (a *BlockType) DeclareModule() *modules.Module {
7983
return nil
8084
}

generate/typing/class_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ func (c *ClassType) ObjcName() string {
4343
return c.Name + "*"
4444
}
4545

46+
func (c *ClassType) CName() string {
47+
return c.Name + "*"
48+
}
49+
4650
func (c *ClassType) DeclareModule() *modules.Module {
4751
return c.Module
4852
}

generate/typing/data_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ func (d *DataType) ObjcName() string {
2323
return "NSData*"
2424
}
2525

26+
func (d *DataType) CName() string {
27+
return "NSData*"
28+
}
29+
2630
func (d *DataType) DeclareModule() *modules.Module {
2731
return nil
2832
}

generate/typing/dict_type.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ func (d *DictType) ObjcName() string {
3838
return "NSDictionary*"
3939
}
4040

41+
func (d *DictType) CName() string {
42+
return "NSDictionary*"
43+
}
44+
4145
func (d *DictType) DeclareModule() *modules.Module {
4246
return d.ValueType.DeclareModule()
4347
}

0 commit comments

Comments
 (0)