Sfoglia il codice sorgente

fix #140 uintptr will no lock the address from gc

Tao Wen 8 anni fa
parent
commit
945d1aaa19
2 ha cambiato i file con 7 aggiunte e 5 eliminazioni
  1. 1 1
      feature_reflect_map.go
  2. 6 4
      feature_reflect_slice.go

+ 1 - 1
feature_reflect_map.go

@@ -48,7 +48,7 @@ func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
 	}
 	iter.ReadMapCB(func(iter *Iterator, keyStr string) bool {
 		elem := reflect.New(decoder.elemType)
-		decoder.elemDecoder.Decode(unsafe.Pointer(elem.Pointer()), iter)
+		decoder.elemDecoder.Decode(extractInterface(elem.Interface()).word, iter)
 		// to put into map, we have to use reflection
 		keyType := decoder.keyType
 		// TODO: remove this from loop

+ 6 - 4
feature_reflect_slice.go

@@ -118,8 +118,9 @@ func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Typ
 			}
 		}
 	}
-	newVal := reflect.MakeSlice(sliceType, newLen, newCap)
-	dst := unsafe.Pointer(newVal.Pointer())
+	newVal := reflect.MakeSlice(sliceType, newLen, newCap).Interface()
+	newValPtr := extractInterface(newVal).word
+	dst := (*sliceHeader)(newValPtr).Data
 	// copy old array into new array
 	originalBytesCount := slice.Len * int(elementType.Size())
 	srcSliceHeader := (unsafe.Pointer)(&sliceHeader{slice.Data, originalBytesCount, originalBytesCount})
@@ -134,8 +135,9 @@ func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) {
 	if expectedCap <= slice.Cap {
 		return
 	}
-	newVal := reflect.MakeSlice(sliceType, 0, expectedCap)
-	dst := unsafe.Pointer(newVal.Pointer())
+	newVal := reflect.MakeSlice(sliceType, 0, expectedCap).Interface()
+	newValPtr := extractInterface(newVal).word
+	dst := (*sliceHeader)(newValPtr).Data
 	slice.Data = dst
 	slice.Cap = expectedCap
 }