Skip to content

Commit 7333492

Browse files
committed
Separate symbol type declaration generation
1 parent 2c777e9 commit 7333492

3 files changed

Lines changed: 85 additions & 17 deletions

File tree

‎golang/codegen/go/purego_template.go‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ func SetErrno(value int) {
2222
*(*int)(unsafe.Pointer(runicPtrErrno)) = value
2323
}
2424

25-
var (
26-
runicPtrErrno uintptr
27-
)
28-
2925
var (
3026
runicSymbols = [][2]any{
3127
{&Puts, "puts"},
@@ -91,6 +87,10 @@ var (
9187
}
9288
)
9389

90+
var (
91+
runicPtrErrno uintptr
92+
)
93+
9494
func runicRegisterSymbols(runicSymbolsParam [][2]any) error {
9595
for _, runicEntry := range runicSymbolsParam {
9696
runicSym, runicSymErr := purego.Dlsym(runicForeignLibrary, runicEntry[1].(string))

‎golang/codegen/purego_to.odin‎

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,21 @@ purego_generate_bindings_from_runestone :: proc(
4242
package_name := purego_generate_package_name(rn)
4343
types := purego_generate_types(rs, rn)
4444
func_sym_decls := purego_generate_function_symbol_declarations(rs, rn)
45-
type_sym_decls := purego_generate_type_symbol_declarations(rs, rn)
45+
type_sym_getters := purego_generate_type_symbol_getters(rs, rn)
46+
type_sym_setters := purego_generate_type_symbol_setters(rs, rn)
47+
type_sym_pointers := purego_generate_type_symbol_pointers(rs, rn)
4648
symbol_registrations := purego_generate_symbol_registrations(rs, rn)
4749
symbol_reg_var_name := purego_generate_symbol_registration_variable_name(
4850
rs.plats,
4951
)
52+
5053
defer if len(build_constraints) != 0 do delete(build_constraints)
5154
defer delete(package_name)
5255
defer delete(types)
5356
defer delete(func_sym_decls)
54-
defer delete(type_sym_decls)
57+
defer delete(type_sym_getters)
58+
defer delete(type_sym_setters)
59+
defer delete(type_sym_pointers)
5560
defer delete(symbol_registrations)
5661
defer delete(symbol_reg_var_name)
5762

@@ -73,9 +78,17 @@ purego_generate_bindings_from_runestone :: proc(
7378
io.write_string(wd, "\n)\n\n") or_return
7479
}
7580

76-
if len(type_sym_decls) != 0 {
77-
io.write_string(wd, type_sym_decls) or_return
78-
io.write_string(wd, "\n\n") or_return
81+
if len(type_sym_getters) != 0 {
82+
io.write_string(wd, type_sym_getters) or_return
83+
io.write_string(wd, "\n") or_return
84+
}
85+
if len(type_sym_setters) != 0 {
86+
io.write_string(wd, type_sym_setters) or_return
87+
io.write_string(wd, "\n") or_return
88+
}
89+
if len(type_sym_pointers) != 0 {
90+
io.write_string(wd, type_sym_pointers) or_return
91+
io.write_string(wd, "\n") or_return
7992
}
8093

8194
io.write_string(wd, "var (\n") or_return
@@ -221,19 +234,20 @@ purego_generate_function_symbol_declarations :: proc(
221234
strings.builder_init(&buf)
222235

223236
has_funcs: bool
237+
last_func_idx: int
224238

225-
for entry in rs.symbols.data {
239+
for entry, idx in rs.symbols.data {
226240
sym := entry.value
227241

228242
if _, is_func := sym.value.(runic.Function); is_func {
229243
has_funcs = true
230-
break
244+
last_func_idx = idx
231245
}
232246
}
233247

234248
if !has_funcs do return strings.to_string(buf)
235249

236-
for entry in rs.symbols.data {
250+
for entry, idx in rs.symbols.data {
237251
sym_name, sym := entry.key, entry.value
238252

239253
if _, is_type := sym.value.(runic.Type); is_type do continue
@@ -247,14 +261,16 @@ purego_generate_function_symbol_declarations :: proc(
247261
strings.write_rune(&buf, ' ')
248262
purego_write_symbol(&buf, sym, rn)
249263

250-
strings.write_rune(&buf, '\n')
264+
if idx != last_func_idx {
265+
strings.write_rune(&buf, '\n')
266+
}
251267
}
252268

253269
return strings.to_string(buf)
254270
}
255271

256272
@(private)
257-
purego_generate_type_symbol_declarations :: proc(
273+
purego_generate_type_symbol_getters :: proc(
258274
rs: runic.Runestone,
259275
rn: runic.To,
260276
) -> string {
@@ -293,6 +309,29 @@ purego_generate_type_symbol_declarations :: proc(
293309
strings.write_string(&buf, "))\n}\n")
294310
}
295311

312+
return strings.to_string(buf)
313+
}
314+
315+
@(private)
316+
purego_generate_type_symbol_setters :: proc(
317+
rs: runic.Runestone,
318+
rn: runic.To,
319+
) -> string {
320+
buf: strings.Builder
321+
strings.builder_init(&buf)
322+
323+
has_types: bool
324+
325+
for entry in rs.symbols.data {
326+
sym := entry.value
327+
if _, is_type := sym.value.(runic.Type); is_type {
328+
has_types = true
329+
break
330+
}
331+
}
332+
333+
if !has_types do return strings.to_string(buf)
334+
296335
for entry in rs.symbols.data {
297336
sym_name, sym := entry.key, entry.value
298337

@@ -313,6 +352,29 @@ purego_generate_type_symbol_declarations :: proc(
313352
strings.write_string(&buf, ")) = value\n}\n")
314353
}
315354

355+
return strings.to_string(buf)
356+
}
357+
358+
@(private)
359+
purego_generate_type_symbol_pointers :: proc(
360+
rs: runic.Runestone,
361+
rn: runic.To,
362+
) -> string {
363+
buf: strings.Builder
364+
strings.builder_init(&buf)
365+
366+
has_types: bool
367+
368+
for entry in rs.symbols.data {
369+
sym := entry.value
370+
if _, is_type := sym.value.(runic.Type); is_type {
371+
has_types = true
372+
break
373+
}
374+
}
375+
376+
if !has_types do return strings.to_string(buf)
377+
316378
strings.write_string(&buf, "var (\n")
317379

318380
for entry in rs.symbols.data {

‎golang/codegen/to.odin‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ generate_bindings_from_runecross :: proc(
9595
platforms_and_libraries := purego_generate_platforms_and_libraries(rc, rn)
9696
types := purego_generate_types(rs, rn)
9797
func_sym_decls := purego_generate_function_symbol_declarations(rs, rn)
98-
type_sym_decls := purego_generate_type_symbol_declarations(rs, rn)
98+
type_sym_getters := purego_generate_type_symbol_getters(rs, rn)
99+
type_sym_setters := purego_generate_type_symbol_setters(rs, rn)
100+
type_sym_pointers := purego_generate_type_symbol_pointers(rs, rn)
99101
symbol_registrations := purego_generate_symbol_registrations(rs, rn)
100102
symbol_variables := purego_generate_symbol_variables(rc)
101103

@@ -106,8 +108,12 @@ generate_bindings_from_runecross :: proc(
106108
platforms_and_libraries
107109
file_contents_replace["type LibCType int"] = types
108110
file_contents_replace["\tPuts func(string)"] = func_sym_decls
109-
file_contents_replace["func Errno() int {\n\treturn *(*int)(unsafe.Pointer(runicPtrErrno))\n}\n\nfunc SetErrno(value int) {\n\t*(*int)(unsafe.Pointer(runicPtrErrno)) = value\n}\n\nvar (\n\trunicPtrErrno uintptr\n)"] =
110-
type_sym_decls
111+
file_contents_replace["func Errno() int {\n\treturn *(*int)(unsafe.Pointer(runicPtrErrno))\n}"] =
112+
type_sym_getters
113+
file_contents_replace["func SetErrno(value int) {\n\t*(*int)(unsafe.Pointer(runicPtrErrno)) = value\n}\n"] =
114+
type_sym_setters
115+
file_contents_replace["var (\n\trunicPtrErrno uintptr\n)"] =
116+
type_sym_pointers
111117
file_contents_replace["\t\t{&Puts, \"puts\"},"] = symbol_registrations
112118
file_contents_replace["\t\trunicSymbols,"] = symbol_variables
113119

0 commit comments

Comments
 (0)