summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrew Lytvynov <awly@tailscale.com>2023-12-20 09:12:26 -0600
committerGitHub <noreply@github.com>2023-12-20 07:12:26 -0800
commit7a2eb22e948ba315522f855ee18bad2c2ff99e28 (patch)
treebee4c12aad4e1e74ff55ec8e7b80319beaf350ad
parent09136e59959e13e3a2437c3c451245652b1a9ee1 (diff)
downloadtailscale-7a2eb22e948ba315522f855ee18bad2c2ff99e28.tar.xz
tailscale-7a2eb22e948ba315522f855ee18bad2c2ff99e28.zip
ipn: remove use of reflect.MethodByName (#10652)
Using reflect.MethodByName disables some linked deadcode optimizations and makes our binaries much bigger. Difference before/after this commit: ``` -rwxr-xr-x 1 awly awly 30M Dec 19 15:28 tailscaled.after* -rwxr-xr-x 1 awly awly 43M Dec 19 15:27 tailscaled.before* ``` Fixes #10627 Signed-off-by: Andrew Lytvynov <awly@tailscale.com>
-rw-r--r--ipn/prefs.go18
1 files changed, 13 insertions, 5 deletions
diff --git a/ipn/prefs.go b/ipn/prefs.go
index afa8c1cd0..866de18e2 100644
--- a/ipn/prefs.go
+++ b/ipn/prefs.go
@@ -414,12 +414,20 @@ func (m *MaskedPrefs) Pretty() string {
continue
}
mpf := mpv.Field(i - 1)
- prettyFn := mf.MethodByName("Pretty")
- if !prettyFn.IsValid() {
- panic(fmt.Sprintf("MaskedPrefs field %q is missing the Pretty method", name))
+ // This would be much simpler with reflect.MethodByName("Pretty"),
+ // but using MethodByName disables some linker optimizations and
+ // makes our binaries much larger. See
+ // https://github.com/tailscale/tailscale/issues/10627#issuecomment-1861211945
+ //
+ // Instead, have this explicit switch by field name to do type
+ // assertions.
+ switch name {
+ case "AutoUpdateSet":
+ p := mf.Interface().(AutoUpdatePrefsMask).Pretty(mpf.Interface().(AutoUpdatePrefs))
+ fmt.Fprintf(&sb, "%s={%s}", strings.TrimSuffix(name, "Set"), p)
+ default:
+ panic(fmt.Sprintf("unexpected MaskedPrefs field %q", name))
}
- res := prettyFn.Call([]reflect.Value{mpf})
- fmt.Fprintf(&sb, "%s={%s}", strings.TrimSuffix(name, "Set"), res[0].String())
}
}
sb.WriteString("}")