fix smart convert panic

This commit is contained in:
adman
2026-04-12 23:16:36 +02:00
parent bb89730781
commit 76409d07a3
2 changed files with 22 additions and 1 deletions
+2 -1
View File
@@ -47,7 +47,8 @@ func SmartConvert(from reflect.Value, to reflect.Type) (ret reflect.Value) {
if from.IsNil() {
return reflect.Zero(to)
}
ret = SmartConvert(from.Elem(), to.Elem()).Addr()
ret = reflect.New(to.Elem())
ret.Elem().Set(SmartConvert(from.Elem(), to.Elem()))
case reflect.Slice:
l := from.Len()
ret = reflect.MakeSlice(to, l, l)
+20
View File
@@ -46,3 +46,23 @@ func TestRegisterUntilLatest(t *testing.T) {
t.Errorf("handler not called")
}
}
var TestData = []struct{ V, T, E any }{
{V: &v1_21_9.PlayToClientPacketPosition{Flags: v1_21_9.PlayToClientPositionUpdateRelatives{Val: 2}, X: 5}, T: &v1_21_8.PlayToClientPacketPosition{}},
{V: &v1_21_9.ConfigurationToClientPacketTags{}, T: &v1_21_8.ConfigurationToClientPacketTags{}},
{V: &v1_21_11.PlayToServerPacketChatMessage{Signature: &[256]byte{}}, T: &v1_21_8.PlayToServerPacketChatMessage{}},
}
func TestSmartConvert(t *testing.T) {
for _, d := range TestData {
can := proto.SmartConvertibleTo(reflect.TypeOf(d.V), reflect.TypeOf(d.T))
if !can {
t.Errorf("can't smart convert %#v to %#v", d.V, d.T)
continue
}
got := proto.SmartConvert(reflect.ValueOf(d.V), reflect.TypeOf(d.T))
if d.E != nil && !reflect.DeepEqual(got.Interface(), d.E) {
t.Errorf("got %#v, want %#v", got.Interface(), d.E)
}
}
}