You've already forked json-iterator
							
							
				mirror of
				https://github.com/json-iterator/go.git
				synced 2025-10-31 00:07:40 +02:00 
			
		
		
		
	fix #140 uintptr will no lock the address from gc
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user