detached 86a6933

GIR: Decompose setters and getters for `[]string` and scalar types

Signed-off-by: Felicitas Pojtinger <felicitas@pojtinger.com>
commit
86a69338578b70dc63b2a1c3121b87db4eb47eed
author
Felicitas Pojtinger · · 2025-10-31 05:26 UTC
committer
Jeroen Wijenbergh · · 2025-12-01 16:10 UTC
parent
9aaf3ff
signature
unsigned
4 files · +83 -85
M gen.go +4 -0
@@ -38,6 +38,10 @@ func main() {
3838 "convcd": util.ConvertArgsCommaDeref,
3939 "convd": util.ConvertArgsDeref,
4040 "convcbne": util.ConvertCallbackArgsNoErr,
41+ "propsset": util.PropertyScalarSet,
42+ "propsget": util.PropertyScalarGet,
43+ "propvset": util.PropertyVectorSet,
44+ "propvget": util.PropertyVectorGet,
4145 }).ParseFiles("templates/go")
4246 if err != nil {
4347 panic(err)
@@ -38,6 +38,10 @@ func main() {
38 "convcd": util.ConvertArgsCommaDeref,38 "convcd": util.ConvertArgsCommaDeref,
39 "convd": util.ConvertArgsDeref,39 "convd": util.ConvertArgsDeref,
40 "convcbne": util.ConvertCallbackArgsNoErr,40 "convcbne": util.ConvertCallbackArgsNoErr,
41+ "propsset": util.PropertyScalarSet,
42+ "propsget": util.PropertyScalarGet,
43+ "propvset": util.PropertyVectorSet,
44+ "propvget": util.PropertyVectorGet,
41 }).ParseFiles("templates/go")45 }).ParseFiles("templates/go")
42 if err != nil {46 if err != nil {
43 panic(err)47 panic(err)
M internal/gir/util/util.go +66 -0
@@ -213,3 +213,69 @@ func ConstructorName(name string, outer string) string {
213213 // the default is just a concatenation if the constructor doesn't start with New
214214 return outer + cname
215215 }
216+
217+// PropertyScalarSet returns the code for setting a scalar property value
218+func PropertyScalarSet(notGObject bool, gvalueType, setMethod string) string {
219+ prefix := ""
220+ if notGObject {
221+ prefix = "gobject."
222+ }
223+ return prefix + gvalueType + ")\n\tv." + setMethod + "(value"
224+}
225+
226+// PropertyScalarGet returns the code for getting a scalar property value
227+func PropertyScalarGet(getMethod string) string {
228+ return "v." + getMethod + "()"
229+}
230+
231+// PropertyVectorSet returns the code for setting a vector property value
232+func PropertyVectorSet(notGLib bool) string {
233+ prefix := ""
234+ if notGLib {
235+ prefix = "glib."
236+ }
237+
238+ return prefix + `StrvGetType())
239+
240+ cStrBytes := make([][]byte, len(value))
241+ cStrings := make([]uintptr, len(value)+1)
242+ for i, s := range value {
243+ cStrBytes[i] = make([]byte, len(s)+1)
244+ copy(cStrBytes[i], s)
245+ cStrBytes[i][len(s)] = 0
246+ cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0]))
247+ }
248+ cStrings[len(value)] = 0
249+
250+ v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0])))`
251+}
252+
253+// PropertyVectorGet returns the code for getting a vector property value
254+func PropertyVectorGet() string {
255+ return `cStrvPtr := v.GetBoxed()
256+ if cStrvPtr == 0 {
257+ return nil
258+ }
259+
260+ var result []string
261+ ptr := cStrvPtr
262+ for {
263+ strPtr := *(*uintptr)(unsafe.Pointer(ptr))
264+ if strPtr == 0 {
265+ break
266+ }
267+
268+ var length int
269+ for i := 0; ; i++ {
270+ if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 {
271+ length = i
272+ break
273+ }
274+ }
275+
276+ bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length)
277+ result = append(result, string(bytes))
278+ ptr += unsafe.Sizeof(uintptr(0))
279+ }
280+ return result`
281+}
@@ -213,3 +213,69 @@ func ConstructorName(name string, outer string) string {
213 // the default is just a concatenation if the constructor doesn't start with New213 // the default is just a concatenation if the constructor doesn't start with New
214 return outer + cname214 return outer + cname
215 }215 }
216+
217+// PropertyScalarSet returns the code for setting a scalar property value
218+func PropertyScalarSet(notGObject bool, gvalueType, setMethod string) string {
219+ prefix := ""
220+ if notGObject {
221+ prefix = "gobject."
222+ }
223+ return prefix + gvalueType + ")\n\tv." + setMethod + "(value"
224+}
225+
226+// PropertyScalarGet returns the code for getting a scalar property value
227+func PropertyScalarGet(getMethod string) string {
228+ return "v." + getMethod + "()"
229+}
230+
231+// PropertyVectorSet returns the code for setting a vector property value
232+func PropertyVectorSet(notGLib bool) string {
233+ prefix := ""
234+ if notGLib {
235+ prefix = "glib."
236+ }
237+
238+ return prefix + `StrvGetType())
239+
240+ cStrBytes := make([][]byte, len(value))
241+ cStrings := make([]uintptr, len(value)+1)
242+ for i, s := range value {
243+ cStrBytes[i] = make([]byte, len(s)+1)
244+ copy(cStrBytes[i], s)
245+ cStrBytes[i][len(s)] = 0
246+ cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0]))
247+ }
248+ cStrings[len(value)] = 0
249+
250+ v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0])))`
251+}
252+
253+// PropertyVectorGet returns the code for getting a vector property value
254+func PropertyVectorGet() string {
255+ return `cStrvPtr := v.GetBoxed()
256+ if cStrvPtr == 0 {
257+ return nil
258+ }
259+
260+ var result []string
261+ ptr := cStrvPtr
262+ for {
263+ strPtr := *(*uintptr)(unsafe.Pointer(ptr))
264+ if strPtr == 0 {
265+ break
266+ }
267+
268+ var length int
269+ for i := 0; ; i++ {
270+ if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 {
271+ length = i
272+ break
273+ }
274+ }
275+
276+ bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length)
277+ result = append(result, string(bytes))
278+ ptr += unsafe.Sizeof(uintptr(0))
279+ }
280+ return result`
281+}
M pkg/gir/util/util.go +9 -5
@@ -3,10 +3,14 @@ package util
33 import "github.com/jwijenbergh/puregotk/internal/gir/util"
44
55 var (
6- ConvertArgs = util.ConvertArgs
7- ConvertArgsComma = util.ConvertArgsComma
8- ConvertCallbackArgs = util.ConvertCallbackArgs
9- ConvertArgsCommaDeref = util.ConvertArgsCommaDeref
10- ConvertArgsDeref = util.ConvertArgsDeref
6+ ConvertArgs = util.ConvertArgs
7+ ConvertArgsComma = util.ConvertArgsComma
8+ ConvertCallbackArgs = util.ConvertCallbackArgs
9+ ConvertArgsCommaDeref = util.ConvertArgsCommaDeref
10+ ConvertArgsDeref = util.ConvertArgsDeref
1111 ConvertCallbackArgsNoErr = util.ConvertCallbackArgsNoErr
12+ PropertyScalarSet = util.PropertyScalarSet
13+ PropertyScalarGet = util.PropertyScalarGet
14+ PropertyVectorSet = util.PropertyVectorSet
15+ PropertyVectorGet = util.PropertyVectorGet
1216 )
@@ -3,10 +3,14 @@ package util
3 import "github.com/jwijenbergh/puregotk/internal/gir/util"3 import "github.com/jwijenbergh/puregotk/internal/gir/util"
4 4
5 var (5 var (
6- ConvertArgs = util.ConvertArgs6+ ConvertArgs = util.ConvertArgs
7- ConvertArgsComma = util.ConvertArgsComma7+ ConvertArgsComma = util.ConvertArgsComma
8- ConvertCallbackArgs = util.ConvertCallbackArgs8+ ConvertCallbackArgs = util.ConvertCallbackArgs
9- ConvertArgsCommaDeref = util.ConvertArgsCommaDeref9+ ConvertArgsCommaDeref = util.ConvertArgsCommaDeref
10- ConvertArgsDeref = util.ConvertArgsDeref10+ ConvertArgsDeref = util.ConvertArgsDeref
11 ConvertCallbackArgsNoErr = util.ConvertCallbackArgsNoErr11 ConvertCallbackArgsNoErr = util.ConvertCallbackArgsNoErr
12+ PropertyScalarSet = util.PropertyScalarSet
13+ PropertyScalarGet = util.PropertyScalarGet
14+ PropertyVectorSet = util.PropertyVectorSet
15+ PropertyVectorGet = util.PropertyVectorGet
12 )16 )
M templates/go +4 -80
@@ -172,20 +172,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}}
172172 obj := {{if $NotGObject}}gobject.{{end}}Object{}
173173 obj.Ptr = x.GoPointer()
174174 var v {{if $NotGObject}}gobject.{{end}}Value
175- {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType())
176-
177- cStrBytes := make([][]byte, len(value))
178- cStrings := make([]uintptr, len(value)+1)
179- for i, s := range value {
180- cStrBytes[i] = make([]byte, len(s)+1)
181- copy(cStrBytes[i], s)
182- cStrBytes[i][len(s)] = 0
183- cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0]))
184- }
185- cStrings[len(value)] = 0
186-
187- v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}})
188- v.{{.SetMethod}}(value){{end}}
175+ {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}}
189176 obj.SetProperty("{{.CName}}", &v)
190177 }
191178 {{end}}
@@ -198,32 +185,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}}
198185 obj.Ptr = x.GoPointer()
199186 var v {{if $NotGObject}}gobject.{{end}}Value
200187 obj.GetProperty("{{.CName}}", &v)
201- {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed()
202- if cStrvPtr == 0 {
203- return nil
204- }
205-
206- var result []string
207- ptr := cStrvPtr
208- for {
209- strPtr := *(*uintptr)(unsafe.Pointer(ptr))
210- if strPtr == 0 {
211- break
212- }
213-
214- var length int
215- for i := 0; ; i++ {
216- if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 {
217- length = i
218- break
219- }
220- }
221-
222- bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length)
223- result = append(result, string(bytes))
224- ptr += unsafe.Sizeof(uintptr(0))
225- }
226- return result{{else}}return v.{{.GetMethod}}(){{end}}
188+ {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}}
227189 }
228190 {{end}}
229191 {{end}}
@@ -346,20 +308,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) {
346308 {{if .Doc}}{{.Doc}}
347309 {{end}}func (x *{{$outer.Name}}) SetProperty{{.Name}}(value {{.GoType}}) {
348310 var v {{if $NotGObject}}gobject.{{end}}Value
349- {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType())
350-
351- cStrBytes := make([][]byte, len(value))
352- cStrings := make([]uintptr, len(value)+1)
353- for i, s := range value {
354- cStrBytes[i] = make([]byte, len(s)+1)
355- copy(cStrBytes[i], s)
356- cStrBytes[i][len(s)] = 0
357- cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0]))
358- }
359- cStrings[len(value)] = 0
360-
361- v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}})
362- v.{{.SetMethod}}(value){{end}}
311+ {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}}
363312 x.SetProperty("{{.CName}}", &v)
364313 }
365314 {{end}}
@@ -370,32 +319,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) {
370319 {{end}}func (x *{{$outer.Name}}) GetProperty{{.Name}}() {{.GoType}} {
371320 var v {{if $NotGObject}}gobject.{{end}}Value
372321 x.GetProperty("{{.CName}}", &v)
373- {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed()
374- if cStrvPtr == 0 {
375- return nil
376- }
377-
378- var result []string
379- ptr := cStrvPtr
380- for {
381- strPtr := *(*uintptr)(unsafe.Pointer(ptr))
382- if strPtr == 0 {
383- break
384- }
385-
386- var length int
387- for i := 0; ; i++ {
388- if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 {
389- length = i
390- break
391- }
392- }
393-
394- bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length)
395- result = append(result, string(bytes))
396- ptr += unsafe.Sizeof(uintptr(0))
397- }
398- return result{{else}}return v.{{.GetMethod}}(){{end}}
322+ {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}}
399323 }
400324 {{end}}
401325 {{end}}
@@ -172,20 +172,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}}
172 obj := {{if $NotGObject}}gobject.{{end}}Object{}172 obj := {{if $NotGObject}}gobject.{{end}}Object{}
173 obj.Ptr = x.GoPointer()173 obj.Ptr = x.GoPointer()
174 var v {{if $NotGObject}}gobject.{{end}}Value174 var v {{if $NotGObject}}gobject.{{end}}Value
175- {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType())175+ {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}}
176-
177- cStrBytes := make([][]byte, len(value))
178- cStrings := make([]uintptr, len(value)+1)
179- for i, s := range value {
180- cStrBytes[i] = make([]byte, len(s)+1)
181- copy(cStrBytes[i], s)
182- cStrBytes[i][len(s)] = 0
183- cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0]))
184- }
185- cStrings[len(value)] = 0
186-
187- v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}})
188- v.{{.SetMethod}}(value){{end}}
189 obj.SetProperty("{{.CName}}", &v)176 obj.SetProperty("{{.CName}}", &v)
190 }177 }
191 {{end}}178 {{end}}
@@ -198,32 +185,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}}
198 obj.Ptr = x.GoPointer()185 obj.Ptr = x.GoPointer()
199 var v {{if $NotGObject}}gobject.{{end}}Value186 var v {{if $NotGObject}}gobject.{{end}}Value
200 obj.GetProperty("{{.CName}}", &v)187 obj.GetProperty("{{.CName}}", &v)
201- {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed()188+ {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}}
202- if cStrvPtr == 0 {
203- return nil
204- }
205-
206- var result []string
207- ptr := cStrvPtr
208- for {
209- strPtr := *(*uintptr)(unsafe.Pointer(ptr))
210- if strPtr == 0 {
211- break
212- }
213-
214- var length int
215- for i := 0; ; i++ {
216- if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 {
217- length = i
218- break
219- }
220- }
221-
222- bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length)
223- result = append(result, string(bytes))
224- ptr += unsafe.Sizeof(uintptr(0))
225- }
226- return result{{else}}return v.{{.GetMethod}}(){{end}}
227 }189 }
228 {{end}}190 {{end}}
229 {{end}}191 {{end}}
@@ -346,20 +308,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) {
346 {{if .Doc}}{{.Doc}}308 {{if .Doc}}{{.Doc}}
347 {{end}}func (x *{{$outer.Name}}) SetProperty{{.Name}}(value {{.GoType}}) {309 {{end}}func (x *{{$outer.Name}}) SetProperty{{.Name}}(value {{.GoType}}) {
348 var v {{if $NotGObject}}gobject.{{end}}Value310 var v {{if $NotGObject}}gobject.{{end}}Value
349- {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType())311+ {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}}
350-
351- cStrBytes := make([][]byte, len(value))
352- cStrings := make([]uintptr, len(value)+1)
353- for i, s := range value {
354- cStrBytes[i] = make([]byte, len(s)+1)
355- copy(cStrBytes[i], s)
356- cStrBytes[i][len(s)] = 0
357- cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0]))
358- }
359- cStrings[len(value)] = 0
360-
361- v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}})
362- v.{{.SetMethod}}(value){{end}}
363 x.SetProperty("{{.CName}}", &v)312 x.SetProperty("{{.CName}}", &v)
364 }313 }
365 {{end}}314 {{end}}
@@ -370,32 +319,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) {
370 {{end}}func (x *{{$outer.Name}}) GetProperty{{.Name}}() {{.GoType}} {319 {{end}}func (x *{{$outer.Name}}) GetProperty{{.Name}}() {{.GoType}} {
371 var v {{if $NotGObject}}gobject.{{end}}Value320 var v {{if $NotGObject}}gobject.{{end}}Value
372 x.GetProperty("{{.CName}}", &v)321 x.GetProperty("{{.CName}}", &v)
373- {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed()322+ {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}}
374- if cStrvPtr == 0 {
375- return nil
376- }
377-
378- var result []string
379- ptr := cStrvPtr
380- for {
381- strPtr := *(*uintptr)(unsafe.Pointer(ptr))
382- if strPtr == 0 {
383- break
384- }
385-
386- var length int
387- for i := 0; ; i++ {
388- if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 {
389- length = i
390- break
391- }
392- }
393-
394- bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length)
395- result = append(result, string(bytes))
396- ptr += unsafe.Sizeof(uintptr(0))
397- }
398- return result{{else}}return v.{{.GetMethod}}(){{end}}
399 }323 }
400 {{end}}324 {{end}}
401 {{end}}325 {{end}}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 102

↑↓ moveenter openesc close