mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-21 21:09:02 +00:00
reflect: use int in StringHeader and SliceHeader on non-AVR platforms (#4156)
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build !avr
|
||||||
|
|
||||||
|
package reflect
|
||||||
|
|
||||||
|
// intw is an integer type, used in places where an int is typically required,
|
||||||
|
// except architectures where the size of an int != word size.
|
||||||
|
// See https://github.com/tinygo-org/tinygo/issues/1284.
|
||||||
|
type intw = int
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
//go:build avr
|
||||||
|
|
||||||
|
package reflect
|
||||||
|
|
||||||
|
// intw is an integer type, used in places where an int is typically required,
|
||||||
|
// except architectures where the size of an int != word size.
|
||||||
|
// See https://github.com/tinygo-org/tinygo/issues/1284.
|
||||||
|
type intw = uintptr
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
//go:build !avr
|
||||||
|
|
||||||
|
package reflect_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Verify that SliceHeader is the same size as a slice.
|
||||||
|
var _ [unsafe.Sizeof([]byte{})]byte = [unsafe.Sizeof(reflect.SliceHeader{})]byte{}
|
||||||
|
|
||||||
|
// TestSliceHeaderIntegerSize verifies that SliceHeader.Len and Cap are type int on non-AVR platforms.
|
||||||
|
// See https://github.com/tinygo-org/tinygo/issues/1284.
|
||||||
|
func TestSliceHeaderIntegerSize(t *testing.T) {
|
||||||
|
var h reflect.SliceHeader
|
||||||
|
h.Len = int(0)
|
||||||
|
h.Cap = int(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that StringHeader is the same size as a string.
|
||||||
|
var _ [unsafe.Sizeof("hello")]byte = [unsafe.Sizeof(reflect.StringHeader{})]byte{}
|
||||||
|
|
||||||
|
// TestStringHeaderIntegerSize verifies that StringHeader.Len and Cap are type int on non-AVR platforms.
|
||||||
|
// See https://github.com/tinygo-org/tinygo/issues/1284.
|
||||||
|
func TestStringHeaderIntegerSize(t *testing.T) {
|
||||||
|
var h reflect.StringHeader
|
||||||
|
h.Len = int(0)
|
||||||
|
}
|
||||||
+13
-3
@@ -1578,8 +1578,8 @@ type funcHeader struct {
|
|||||||
|
|
||||||
type SliceHeader struct {
|
type SliceHeader struct {
|
||||||
Data uintptr
|
Data uintptr
|
||||||
Len uintptr
|
Len intw
|
||||||
Cap uintptr
|
Cap intw
|
||||||
}
|
}
|
||||||
|
|
||||||
// Slice header that matches the underlying structure. Used for when we switch
|
// Slice header that matches the underlying structure. Used for when we switch
|
||||||
@@ -1592,7 +1592,7 @@ type sliceHeader struct {
|
|||||||
|
|
||||||
type StringHeader struct {
|
type StringHeader struct {
|
||||||
Data uintptr
|
Data uintptr
|
||||||
Len uintptr
|
Len intw
|
||||||
}
|
}
|
||||||
|
|
||||||
// Like sliceHeader, this type is used internally to make sure pointer and
|
// Like sliceHeader, this type is used internally to make sure pointer and
|
||||||
@@ -1602,6 +1602,16 @@ type stringHeader struct {
|
|||||||
len uintptr
|
len uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify SliceHeader and StringHeader sizes.
|
||||||
|
// See https://github.com/tinygo-org/tinygo/pull/4156
|
||||||
|
// and https://github.com/tinygo-org/tinygo/issues/1284.
|
||||||
|
var (
|
||||||
|
_ [unsafe.Sizeof([]byte{})]byte = [unsafe.Sizeof(SliceHeader{})]byte{}
|
||||||
|
_ [unsafe.Sizeof([]byte{})]byte = [unsafe.Sizeof(sliceHeader{})]byte{}
|
||||||
|
_ [unsafe.Sizeof("")]byte = [unsafe.Sizeof(StringHeader{})]byte{}
|
||||||
|
_ [unsafe.Sizeof("")]byte = [unsafe.Sizeof(stringHeader{})]byte{}
|
||||||
|
)
|
||||||
|
|
||||||
type ValueError struct {
|
type ValueError struct {
|
||||||
Method string
|
Method string
|
||||||
Kind Kind
|
Kind Kind
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func checkFilledBuffer(t *testing.T, ptr uintptr, content string) {
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
buf := *(*string)(unsafe.Pointer(&reflect.StringHeader{
|
buf := *(*string)(unsafe.Pointer(&reflect.StringHeader{
|
||||||
Data: ptr,
|
Data: ptr,
|
||||||
Len: uintptr(len(content)),
|
Len: len(content),
|
||||||
}))
|
}))
|
||||||
if buf != content {
|
if buf != content {
|
||||||
t.Errorf("expected %q, got %q", content, buf)
|
t.Errorf("expected %q, got %q", content, buf)
|
||||||
|
|||||||
Reference in New Issue
Block a user