]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/gc/reflect.go
[dev.boringcrypto] all: merge master into dev.boringcrypto
[gostls13.git] / src / cmd / compile / internal / gc / reflect.go
index 7a93ece8b90365f74dd9318168ddf54091d120f5..d492f17f89ba91ac5e87f2e97b802bff18c448fb 100644 (file)
@@ -1328,6 +1328,33 @@ func dtypesym(t *types.Type) *obj.LSym {
        // for security, only the exported fields.
        case TSTRUCT:
                fields := t.Fields().Slice()
+
+               // omitFieldForAwfulBoringCryptoKludge reports whether
+               // the field t should be omitted from the reflect data.
+               // In the crypto/... packages we omit an unexported field
+               // named "boring", to keep from breaking client code that
+               // expects rsa.PublicKey etc to have only public fields.
+               // As the name suggests, this is an awful kludge, but it is
+               // limited to the dev.boringcrypto branch and avoids
+               // much more invasive effects elsewhere.
+               omitFieldForAwfulBoringCryptoKludge := func(t *types.Field) bool {
+                       if t.Sym == nil || t.Sym.Name != "boring" || t.Sym.Pkg == nil {
+                               return false
+                       }
+                       path := t.Sym.Pkg.Path
+                       if t.Sym.Pkg == localpkg {
+                               path = myimportpath
+                       }
+                       return strings.HasPrefix(path, "crypto/")
+               }
+               newFields := fields[:0:0]
+               for _, t1 := range fields {
+                       if !omitFieldForAwfulBoringCryptoKludge(t1) {
+                               newFields = append(newFields, t1)
+                       }
+               }
+               fields = newFields
+
                for _, t1 := range fields {
                        dtypesym(t1.Type)
                }