diff options
author | Elias Naur <mail@eliasnaur.com> | 2020-05-30 16:34:23 +0200 |
---|---|---|
committer | Elias Naur <mail@eliasnaur.com> | 2020-05-31 09:48:08 +0000 |
commit | 7dbbb5bacf4e52bc4efbd3caecdebf6ffb730783 (patch) | |
tree | bb6090928a3dba49285dc1dca025b9f09c321cba /src/cmd/fix | |
parent | f1f8f9af9a55d73dfc6603a93bee0559fdc9024d (diff) | |
download | go-7dbbb5bacf4e52bc4efbd3caecdebf6ffb730783.tar.gz go-7dbbb5bacf4e52bc4efbd3caecdebf6ffb730783.zip |
cmd/cgo,cmd/fix,misc/cgo: map the EGLConfig C type to uintptr in Go
Similarly to EGLDisplay, EGLConfig is declared as a pointer but may
contain non-pointer values.
I believe this is the root cause of https://todo.sr.ht/~eliasnaur/gio/121.
Change-Id: I412c4fbc2eef4aa028534d68bda95db98e3a365d
Reviewed-on: https://go-review.googlesource.com/c/go/+/235817
Run-TryBot: Elias Naur <mail@eliasnaur.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/cmd/fix')
-rw-r--r-- | src/cmd/fix/egltype.go | 28 | ||||
-rw-r--r-- | src/cmd/fix/egltype_test.go | 141 |
2 files changed, 100 insertions, 69 deletions
diff --git a/src/cmd/fix/egltype.go b/src/cmd/fix/egltype.go index c8c4f03e97..cb0f7a73de 100644 --- a/src/cmd/fix/egltype.go +++ b/src/cmd/fix/egltype.go @@ -9,13 +9,14 @@ import ( ) func init() { - register(eglFix) + register(eglFixDisplay) + register(eglFixConfig) } -var eglFix = fix{ +var eglFixDisplay = fix{ name: "egl", date: "2018-12-15", - f: eglfix, + f: eglfixDisp, desc: `Fixes initializers of EGLDisplay`, disabled: false, } @@ -25,8 +26,27 @@ var eglFix = fix{ // New state: // type EGLDisplay uintptr // This fix finds nils initializing these types and replaces the nils with 0s. -func eglfix(f *ast.File) bool { +func eglfixDisp(f *ast.File) bool { return typefix(f, func(s string) bool { return s == "C.EGLDisplay" }) } + +var eglFixConfig = fix{ + name: "eglconf", + date: "2020-05-30", + f: eglfixConfig, + desc: `Fixes initializers of EGLConfig`, + disabled: false, +} + +// Old state: +// type EGLConfig unsafe.Pointer +// New state: +// type EGLConfig uintptr +// This fix finds nils initializing these types and replaces the nils with 0s. +func eglfixConfig(f *ast.File) bool { + return typefix(f, func(s string) bool { + return s == "C.EGLConfig" + }) +} diff --git a/src/cmd/fix/egltype_test.go b/src/cmd/fix/egltype_test.go index 35ffe92595..9b64a7c20b 100644 --- a/src/cmd/fix/egltype_test.go +++ b/src/cmd/fix/egltype_test.go @@ -4,182 +4,193 @@ package main +import "strings" + func init() { - addTestCases(eglTests, eglfix) + addTestCases(eglTestsFor("EGLDisplay"), eglfixDisp) + addTestCases(eglTestsFor("EGLConfig"), eglfixConfig) } -var eglTests = []testCase{ - { - Name: "egl.localVariable", - In: `package main +func eglTestsFor(tname string) []testCase { + var eglTests = []testCase{ + { + Name: "egl.localVariable", + In: `package main import "C" func f() { - var x C.EGLDisplay = nil + var x C.$EGLTYPE = nil x = nil x, x = nil, nil } `, - Out: `package main + Out: `package main import "C" func f() { - var x C.EGLDisplay = 0 + var x C.$EGLTYPE = 0 x = 0 x, x = 0, 0 } `, - }, - { - Name: "egl.globalVariable", - In: `package main + }, + { + Name: "egl.globalVariable", + In: `package main import "C" -var x C.EGLDisplay = nil +var x C.$EGLTYPE = nil func f() { x = nil } `, - Out: `package main + Out: `package main import "C" -var x C.EGLDisplay = 0 +var x C.$EGLTYPE = 0 func f() { x = 0 } `, - }, - { - Name: "egl.EqualArgument", - In: `package main + }, + { + Name: "egl.EqualArgument", + In: `package main import "C" -var x C.EGLDisplay +var x C.$EGLTYPE var y = x == nil var z = x != nil `, - Out: `package main + Out: `package main import "C" -var x C.EGLDisplay +var x C.$EGLTYPE var y = x == 0 var z = x != 0 `, - }, - { - Name: "egl.StructField", - In: `package main + }, + { + Name: "egl.StructField", + In: `package main import "C" type T struct { - x C.EGLDisplay + x C.$EGLTYPE } var t = T{x: nil} `, - Out: `package main + Out: `package main import "C" type T struct { - x C.EGLDisplay + x C.$EGLTYPE } var t = T{x: 0} `, - }, - { - Name: "egl.FunctionArgument", - In: `package main + }, + { + Name: "egl.FunctionArgument", + In: `package main import "C" -func f(x C.EGLDisplay) { +func f(x C.$EGLTYPE) { } func g() { f(nil) } `, - Out: `package main + Out: `package main import "C" -func f(x C.EGLDisplay) { +func f(x C.$EGLTYPE) { } func g() { f(0) } `, - }, - { - Name: "egl.ArrayElement", - In: `package main + }, + { + Name: "egl.ArrayElement", + In: `package main import "C" -var x = [3]C.EGLDisplay{nil, nil, nil} +var x = [3]C.$EGLTYPE{nil, nil, nil} `, - Out: `package main + Out: `package main import "C" -var x = [3]C.EGLDisplay{0, 0, 0} +var x = [3]C.$EGLTYPE{0, 0, 0} `, - }, - { - Name: "egl.SliceElement", - In: `package main + }, + { + Name: "egl.SliceElement", + In: `package main import "C" -var x = []C.EGLDisplay{nil, nil, nil} +var x = []C.$EGLTYPE{nil, nil, nil} `, - Out: `package main + Out: `package main import "C" -var x = []C.EGLDisplay{0, 0, 0} +var x = []C.$EGLTYPE{0, 0, 0} `, - }, - { - Name: "egl.MapKey", - In: `package main + }, + { + Name: "egl.MapKey", + In: `package main import "C" -var x = map[C.EGLDisplay]int{nil: 0} +var x = map[C.$EGLTYPE]int{nil: 0} `, - Out: `package main + Out: `package main import "C" -var x = map[C.EGLDisplay]int{0: 0} +var x = map[C.$EGLTYPE]int{0: 0} `, - }, - { - Name: "egl.MapValue", - In: `package main + }, + { + Name: "egl.MapValue", + In: `package main import "C" -var x = map[int]C.EGLDisplay{0: nil} +var x = map[int]C.$EGLTYPE{0: nil} `, - Out: `package main + Out: `package main import "C" -var x = map[int]C.EGLDisplay{0: 0} +var x = map[int]C.$EGLTYPE{0: 0} `, - }, + }, + } + for i := range eglTests { + t := &eglTests[i] + t.In = strings.ReplaceAll(t.In, "$EGLTYPE", tname) + t.Out = strings.ReplaceAll(t.Out, "$EGLTYPE", tname) + } + return eglTests } |