aboutsummaryrefslogtreecommitdiffstats
path: root/ethutil
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-12-17 19:57:35 +0800
committerobscuren <geffobscura@gmail.com>2014-12-17 19:57:35 +0800
commitb1c58b76a9588a90db5a773a997bb70265c378d3 (patch)
tree0d2631ec0b9324f08fcd2e82cec797fab75e9d4d /ethutil
parentef4135eabe5cb25f8972371c5681e1611ce0cde9 (diff)
downloadgo-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.go30
-rw-r--r--ethutil/rlp_test.go10
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)