remove the "open" concept from reflect and go with slices and arrays.
the two still share an interface and Kind; that's probably ok but might be worth revisiting.
R=rsc
DELTA=74 (1 added, 8 deleted, 65 changed)
OCL=23416
CL=23418
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go
index 85fb38b..8d60a8b 100644
--- a/src/lib/reflect/value.go
+++ b/src/lib/reflect/value.go
@@ -544,11 +544,12 @@
}
// -- Array
+// Slices and arrays are represented by the same interface.
type ArrayValue interface {
Kind() int;
Type() Type;
- Open() bool;
+ IsSlice() bool;
Len() int;
Cap() int;
Elem(i int) Value;
@@ -560,114 +561,114 @@
func copyArray(dst ArrayValue, src ArrayValue, n int);
/*
- Run-time representation of open arrays looks like this:
- struct Array {
+ Run-time representation of slices looks like this:
+ struct Slice {
byte* array; // actual data
uint32 nel; // number of elements
uint32 cap;
};
*/
-type runtimeArray struct {
+type runtimeSlice struct {
data Addr;
len uint32;
cap uint32;
}
-type openArrayValueStruct struct {
+type sliceValueStruct struct {
commonValue;
elemtype Type;
elemsize int;
- array *runtimeArray;
+ slice *runtimeSlice;
}
-func (v *openArrayValueStruct) Open() bool {
+func (v *sliceValueStruct) IsSlice() bool {
return true
}
-func (v *openArrayValueStruct) Len() int {
- return int(v.array.len);
+func (v *sliceValueStruct) Len() int {
+ return int(v.slice.len);
}
-func (v *openArrayValueStruct) Cap() int {
- return int(v.array.cap);
+func (v *sliceValueStruct) Cap() int {
+ return int(v.slice.cap);
}
-func (v *openArrayValueStruct) SetLen(len int) {
+func (v *sliceValueStruct) SetLen(len int) {
if len > v.Cap() {
- panicln("reflect: OpenArrayValueStruct.SetLen", len, v.Cap());
+ panicln("reflect: sliceValueStruct.SetLen", len, v.Cap());
}
- v.array.len = uint32(len);
+ v.slice.len = uint32(len);
}
-func (v *openArrayValueStruct) Set(src ArrayValue) {
- if !src.Open() {
+func (v *sliceValueStruct) Set(src ArrayValue) {
+ if !src.IsSlice() {
panic("can't set from fixed array");
}
- s := src.(*openArrayValueStruct);
+ s := src.(*sliceValueStruct);
if !equalType(v.typ, s.typ) {
- panicln("incompatible array types in ArrayValue.Set()");
+ panicln("incompatible types in ArrayValue.Set()");
}
- *v.array = *s.array;
+ *v.slice = *s.slice;
}
-func (v *openArrayValueStruct) Elem(i int) Value {
- data_uint := uintptr(v.array.data) + uintptr(i * v.elemsize);
+func (v *sliceValueStruct) Elem(i int) Value {
+ data_uint := uintptr(v.slice.data) + uintptr(i * v.elemsize);
return newValueAddr(v.elemtype, Addr(data_uint));
}
-func (v *openArrayValueStruct) CopyFrom(src ArrayValue, n int) {
+func (v *sliceValueStruct) CopyFrom(src ArrayValue, n int) {
copyArray(v, src, n);
}
-type fixedArrayValueStruct struct {
+type arrayValueStruct struct {
commonValue;
elemtype Type;
elemsize int;
len int;
}
-func (v *fixedArrayValueStruct) Open() bool {
+func (v *arrayValueStruct) IsSlice() bool {
return false
}
-func (v *fixedArrayValueStruct) Len() int {
+func (v *arrayValueStruct) Len() int {
return v.len
}
-func (v *fixedArrayValueStruct) Cap() int {
+func (v *arrayValueStruct) Cap() int {
return v.len
}
-func (v *fixedArrayValueStruct) SetLen(len int) {
+func (v *arrayValueStruct) SetLen(len int) {
}
-func (v *fixedArrayValueStruct) Set(src ArrayValue) {
+func (v *arrayValueStruct) Set(src ArrayValue) {
panicln("can't set fixed array");
}
-func (v *fixedArrayValueStruct) Elem(i int) Value {
+func (v *arrayValueStruct) Elem(i int) Value {
data_uint := uintptr(v.addr) + uintptr(i * v.elemsize);
return newValueAddr(v.elemtype, Addr(data_uint));
return nil
}
-func (v *fixedArrayValueStruct) CopyFrom(src ArrayValue, n int) {
+func (v *arrayValueStruct) CopyFrom(src ArrayValue, n int) {
copyArray(v, src, n);
}
func arrayCreator(typ Type, addr Addr) Value {
arraytype := typ.(ArrayType);
- if arraytype.Open() {
- v := new(openArrayValueStruct);
+ if arraytype.IsSlice() {
+ v := new(sliceValueStruct);
v.kind = ArrayKind;
v.addr = addr;
v.typ = typ;
v.elemtype = arraytype.Elem();
v.elemsize = v.elemtype.Size();
- v.array = addr.(*runtimeArray);
+ v.slice = addr.(*runtimeSlice);
return v;
}
- v := new(fixedArrayValueStruct);
+ v := new(arrayValueStruct);
v.kind = ArrayKind;
v.addr = addr;
v.typ = typ;
@@ -832,7 +833,7 @@
case FuncKind: // must be pointers, at least for now (TODO?)
return nil;
case ArrayKind:
- if typ.(ArrayType).Open() {
+ if typ.(ArrayType).IsSlice() {
return nil
}
}
@@ -844,20 +845,12 @@
return newValueAddr(typ, Addr(&data[0]));
}
-/*
- Run-time representation of open arrays looks like this:
- struct Array {
- byte* array; // actual data
- uint32 nel; // number of elements
- uint32 cap; // allocated number of elements
- };
-*/
-func NewOpenArrayValue(typ ArrayType, len, cap int) ArrayValue {
- if !typ.Open() {
+func NewSliceValue(typ ArrayType, len, cap int) ArrayValue {
+ if !typ.IsSlice() {
return nil
}
- array := new(runtimeArray);
+ array := new(runtimeSlice);
size := typ.Elem().Size() * cap;
if size == 0 {
size = 1;
@@ -870,7 +863,7 @@
return newValueAddr(typ, Addr(array));
}
-// Works on both fixed and open arrays.
+// Works on both slices and arrays
func copyArray(dst ArrayValue, src ArrayValue, n int) {
if n == 0 {
return