Commit 1b3299ed authored by Rob Pike's avatar Rob Pike

change the representation of arrays in protobufs from *[]item to []item.

for simplicity of user's code, optional arrays of bytes also don't have a pointer.
requires adding a "Set()" method to arrays in reflect.
still to do: protocol compilers, google/net/rpc.

R=rsc
DELTA=227  (36 added, 95 deleted, 96 changed)
OCL=23387
CL=23389
parent 9e3b0f44
......@@ -553,6 +553,7 @@ type ArrayValue interface {
Cap() int;
Elem(i int) Value;
SetLen(len int);
Set(src ArrayValue);
CopyFrom(src ArrayValue, n int)
}
......@@ -598,6 +599,17 @@ func (v *openArrayValueStruct) SetLen(len int) {
v.array.len = uint32(len);
}
func (v *openArrayValueStruct) Set(src ArrayValue) {
if !src.Open() {
panic("can't set from fixed array");
}
s := src.(*openArrayValueStruct);
if !equalType(v.typ, s.typ) {
panicln("incompatible array types in ArrayValue.Set()");
}
*v.array = *s.array;
}
func (v *openArrayValueStruct) Elem(i int) Value {
data_uint := uintptr(v.array.data) + uintptr(i * v.elemsize);
return newValueAddr(v.elemtype, Addr(data_uint));
......@@ -629,6 +641,10 @@ func (v *fixedArrayValueStruct) Cap() int {
func (v *fixedArrayValueStruct) SetLen(len int) {
}
func (v *fixedArrayValueStruct) Set(src ArrayValue) {
panicln("can't set fixed array");
}
func (v *fixedArrayValueStruct) Elem(i int) Value {
data_uint := uintptr(v.addr) + uintptr(i * v.elemsize);
return newValueAddr(v.elemtype, Addr(data_uint));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment