diff options
Diffstat (limited to 'src/lib/reflect/value.go')
-rw-r--r-- | src/lib/reflect/value.go | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go index f1651a28c..6fd4fe245 100644 --- a/src/lib/reflect/value.go +++ b/src/lib/reflect/value.go @@ -553,8 +553,11 @@ type ArrayValue interface { Cap() int; Elem(i int) Value; SetLen(len int); + CopyFrom(src ArrayValue, n int) } +func copyArray(dst ArrayValue, src ArrayValue, n int); + /* Run-time representation of open arrays looks like this: struct Array { @@ -600,6 +603,10 @@ func (v *openArrayValueStruct) Elem(i int) Value { return newValueAddr(v.elemtype, Addr(data_uint)); } +func (v *openArrayValueStruct) CopyFrom(src ArrayValue, n int) { + copyArray(v, src, n); +} + type fixedArrayValueStruct struct { commonValue; elemtype Type; @@ -628,6 +635,10 @@ func (v *fixedArrayValueStruct) Elem(i int) Value { return nil } +func (v *fixedArrayValueStruct) CopyFrom(src ArrayValue, n int) { + copyArray(v, src, n); +} + func arrayCreator(typ Type, addr Addr) Value { arraytype := typ.(ArrayType); if arraytype.Open() { @@ -843,7 +854,8 @@ func NewOpenArrayValue(typ ArrayType, len, cap int) ArrayValue { return newValueAddr(typ, Addr(array)); } -func CopyArray(dst ArrayValue, src ArrayValue, n int) { +// Works on both fixed and open arrays. +func copyArray(dst ArrayValue, src ArrayValue, n int) { if n == 0 { return } |