@@ -69,14 +69,15 @@ func serializeAny(s *Serializer, t reflect.Type, p unsafe.Pointer) {
69
69
serializeMap (s , t , p )
70
70
case reflect .Pointer :
71
71
serializePointer (s , t , p )
72
+ case reflect .UnsafePointer :
73
+ serializeUnsafePointer (s , p )
72
74
case reflect .Slice :
73
75
serializeSlice (s , t , p )
74
76
case reflect .Struct :
75
77
serializeStruct (s , t , p )
76
78
case reflect .Func :
77
79
serializeFunc (s , t , p )
78
80
// Chan
79
- // UnsafePointer
80
81
default :
81
82
panic (fmt .Errorf ("reflection cannot serialize type %s" , t ))
82
83
}
@@ -129,6 +130,8 @@ func deserializeAny(d *Deserializer, t reflect.Type, p unsafe.Pointer) {
129
130
deserializeInterface (d , t , p )
130
131
case reflect .Pointer :
131
132
deserializePointer (d , t , p )
133
+ case reflect .UnsafePointer :
134
+ deserializeUnsafePointer (d , p )
132
135
case reflect .Array :
133
136
deserializeArray (d , t , p )
134
137
case reflect .Slice :
@@ -174,6 +177,9 @@ func serializePointedAt(s *Serializer, t reflect.Type, p unsafe.Pointer) {
174
177
// If this pointer does not belong to any region, write a negative
175
178
// offset to flag it is on its own, and write its data.
176
179
if ! r .valid () {
180
+ if t == nil {
181
+ panic ("cannot serialize unsafe.Pointer pointing to region of unknown size" )
182
+ }
177
183
serializeVarint (s , - 1 )
178
184
serializeAny (s , t , p )
179
185
return
@@ -359,6 +365,26 @@ func deserializePointer(d *Deserializer, t reflect.Type, p unsafe.Pointer) {
359
365
r .Elem ().Set (ep )
360
366
}
361
367
368
+ func serializeUnsafePointer (s * Serializer , p unsafe.Pointer ) {
369
+ if p == nil {
370
+ serializePointedAt (s , nil , nil )
371
+ } else {
372
+ serializePointedAt (s , nil , * (* unsafe .Pointer )(p ))
373
+ }
374
+ }
375
+
376
+ var unsafePointerType = reflect .TypeOf (unsafe .Pointer (nil ))
377
+
378
+ func deserializeUnsafePointer (d * Deserializer , p unsafe.Pointer ) {
379
+ r := reflect .NewAt (unsafePointerType , p )
380
+
381
+ ep := deserializePointedAt (d , unsafePointerType )
382
+ if ! ep .IsNil () {
383
+ up := ep .UnsafePointer ()
384
+ r .Elem ().Set (reflect .ValueOf (up ))
385
+ }
386
+ }
387
+
362
388
func serializeStruct (s * Serializer , t reflect.Type , p unsafe.Pointer ) {
363
389
serializeStructFields (s , p , t .NumField (), t .Field )
364
390
}
@@ -476,9 +502,11 @@ func deserializeInterface(d *Deserializer, t reflect.Type, p unsafe.Pointer) {
476
502
ep := deserializePointedAt (d , et )
477
503
478
504
// Store the result in the interface
505
+ r := reflect .NewAt (t , p )
479
506
if ! ep .IsNil () {
480
- r := reflect .NewAt (t , p )
481
507
r .Elem ().Set (ep .Elem ())
508
+ } else {
509
+ r .Elem ().Set (reflect .Zero (et ))
482
510
}
483
511
}
484
512
0 commit comments