diff options
author | obscuren <geffobscura@gmail.com> | 2014-12-17 19:57:35 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-12-17 19:57:35 +0800 |
commit | b1c58b76a9588a90db5a773a997bb70265c378d3 (patch) | |
tree | 0d2631ec0b9324f08fcd2e82cec797fab75e9d4d /ethutil | |
parent | ef4135eabe5cb25f8972371c5681e1611ce0cde9 (diff) | |
download | go-tangerine-b1c58b76a9588a90db5a773a997bb70265c378d3.tar.gz go-tangerine-b1c58b76a9588a90db5a773a997bb70265c378d3.tar.zst go-tangerine-b1c58b76a9588a90db5a773a997bb70265c378d3.zip |
moved err check
Diffstat (limited to 'ethutil')
-rw-r--r-- | ethutil/rlp.go | 30 | ||||
-rw-r--r-- | ethutil/rlp_test.go | 10 |
2 files changed, 40 insertions, 0 deletions
diff --git a/ethutil/rlp.go b/ethutil/rlp.go index 1fff2b28a..157dd4dd9 100644 --- a/ethutil/rlp.go +++ b/ethutil/rlp.go @@ -2,8 +2,10 @@ package ethutil import ( "bytes" + "encoding/binary" "fmt" "math/big" + "reflect" ) type RlpEncode interface { @@ -97,6 +99,14 @@ var ( zeroRlp = big.NewInt(0x0) ) +func intlen(i int64) (length int) { + for i > 0 { + i = i >> 8 + length++ + } + return +} + func Encode(object interface{}) []byte { var buff bytes.Buffer @@ -168,6 +178,26 @@ func Encode(object interface{}) []byte { } WriteSliceHeader(len(b.Bytes())) buff.Write(b.Bytes()) + default: + // This is how it should have been from the start + // needs refactoring (@fjl) + v := reflect.ValueOf(t) + switch v.Kind() { + case reflect.Slice: + var b bytes.Buffer + for i := 0; i < v.Len(); i++ { + b.Write(Encode(v.Index(i).Interface())) + } + + blen := b.Len() + if blen < 56 { + buff.WriteByte(byte(blen) + 0xc0) + } else { + buff.WriteByte(byte(intlen(int64(blen))) + 0xf7) + binary.Write(&buff, binary.BigEndian, int64(blen)) + } + buff.ReadFrom(&b) + } } } else { // Empty list for nil diff --git a/ethutil/rlp_test.go b/ethutil/rlp_test.go index 90057ab42..ff98d3269 100644 --- a/ethutil/rlp_test.go +++ b/ethutil/rlp_test.go @@ -7,6 +7,16 @@ import ( "testing" ) +func TestNonInterfaceSlice(t *testing.T) { + vala := []string{"value1", "value2", "value3"} + valb := []interface{}{"value1", "value2", "value3"} + resa := Encode(vala) + resb := Encode(valb) + if !bytes.Equal(resa, resb) { + t.Errorf("expected []string & []interface{} to be equal") + } +} + func TestRlpValueEncoding(t *testing.T) { val := EmptyValue() val.AppendList().Append(1).Append(2).Append(3) |