]> Cypherpunks repositories - gostls13.git/commitdiff
change the representation of arrays in protobufs from *[]item to []item.
authorRob Pike <r@golang.org>
Fri, 23 Jan 2009 20:40:55 +0000 (12:40 -0800)
committerRob Pike <r@golang.org>
Fri, 23 Jan 2009 20:40:55 +0000 (12:40 -0800)
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

src/lib/reflect/value.go

index 6fd4fe24583a51a1ad8b7df65546e2e4e32767ce..85fb38bc2ca5871aba2f6eeec6720ca769fb9e26 100644 (file)
@@ -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));