github.com/gopherjs/gopherjs@v1.19.0-beta1.0.20240506212314-27071a8796e4/tests/linkname_test.go (about) 1 package tests 2 3 import ( 4 "testing" 5 6 _ "reflect" 7 _ "unsafe" 8 9 "github.com/google/go-cmp/cmp" 10 "github.com/gopherjs/gopherjs/tests/testdata/linkname/method" 11 "github.com/gopherjs/gopherjs/tests/testdata/linkname/one" 12 ) 13 14 func TestLinknames(t *testing.T) { 15 defer func() { 16 if err := recover(); err != nil { 17 t.Fatalf("one.DoAll() paniced: %s", err) 18 } 19 }() 20 want := "doing one\n" + 21 "doing two\n" + 22 "doing imported one: doing internal one: one secret\n" + 23 "doing three\n" + 24 "doing imported three: doing internal three: three secret\n" 25 got := one.DoAll() 26 27 if diff := cmp.Diff(want, got); diff != "" { 28 t.Fatalf("Callink linknamed functions returned a diff (-want,+got):\n%s", diff) 29 } 30 } 31 32 func TestLinknameMethods(t *testing.T) { 33 defer func() { 34 if err := recover(); err != nil { 35 t.Fatalf("method.TestLinkname() paniced: %s", err) 36 } 37 }() 38 method.TestLinkname(t) 39 } 40 41 type ( 42 name struct{ bytes *byte } 43 nameOff int32 44 rtype struct{} 45 ) 46 47 //go:linkname rtype_nameOff reflect.(*rtype).nameOff 48 func rtype_nameOff(r *rtype, off nameOff) name 49 50 //go:linkname newName reflect.newName 51 func newName(n, tag string, exported bool) name 52 53 //go:linkname name_name reflect.name.name 54 func name_name(name) string 55 56 //go:linkname resolveReflectName reflect.resolveReflectName 57 func resolveReflectName(n name) nameOff 58 59 func TestLinknameReflectName(t *testing.T) { 60 info := "myinfo" 61 off := resolveReflectName(newName(info, "", false)) 62 n := rtype_nameOff(nil, off) 63 if s := name_name(n); s != info { 64 t.Fatalf("to reflect.name got %q: want %q", s, info) 65 } 66 }