forked from cerc-io/plugeth
fixed tests
This commit is contained in:
parent
d7ab716eea
commit
cf45b939a0
@ -302,12 +302,17 @@ func (self *Trie) mknode(value *common.Value) Node {
|
|||||||
case 2:
|
case 2:
|
||||||
// A value node may consists of 2 bytes.
|
// A value node may consists of 2 bytes.
|
||||||
if value.Get(0).Len() != 0 {
|
if value.Get(0).Len() != 0 {
|
||||||
return NewShortNode(self, CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
|
key := CompactDecode(string(value.Get(0).Bytes()))
|
||||||
|
if key[len(key)-1] == 16 {
|
||||||
|
return NewShortNode(self, key, &ValueNode{self, value.Get(1).Bytes()})
|
||||||
|
} else {
|
||||||
|
return NewShortNode(self, key, self.mknode(value.Get(1)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case 17:
|
case 17:
|
||||||
if len(value.Bytes()) != 17 {
|
if len(value.Bytes()) != 17 {
|
||||||
fnode := NewFullNode(self)
|
fnode := NewFullNode(self)
|
||||||
for i := 0; i < l; i++ {
|
for i := 0; i < 16; i++ {
|
||||||
fnode.set(byte(i), self.mknode(value.Get(i)))
|
fnode.set(byte(i), self.mknode(value.Get(i)))
|
||||||
}
|
}
|
||||||
return fnode
|
return fnode
|
||||||
|
@ -119,9 +119,9 @@ func toValue(val *big.Int) interface{} {
|
|||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCode(code []byte, start, size uint64) []byte {
|
func getData(data []byte, start, size uint64) []byte {
|
||||||
x := uint64(math.Min(float64(start), float64(len(code))))
|
x := uint64(math.Min(float64(start), float64(len(data))))
|
||||||
y := uint64(math.Min(float64(x+size), float64(len(code))))
|
y := uint64(math.Min(float64(x+size), float64(len(data))))
|
||||||
|
|
||||||
return common.RightPadBytes(code[x:y], int(size))
|
return common.RightPadBytes(data[x:y], int(size))
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ func (c *Context) GetRangeValue(x, size uint64) []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Context) GetCode(x, size uint64) []byte {
|
func (c *Context) GetCode(x, size uint64) []byte {
|
||||||
return getCode(c.Code, x, size)
|
return getData(c.Code, x, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Context) Return(ret []byte) []byte {
|
func (c *Context) Return(ret []byte) []byte {
|
||||||
|
17
vm/vm.go
17
vm/vm.go
@ -443,24 +443,15 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
|
|||||||
self.Printf(" => %d", l)
|
self.Printf(" => %d", l)
|
||||||
case CALLDATACOPY:
|
case CALLDATACOPY:
|
||||||
var (
|
var (
|
||||||
size = uint64(len(callData))
|
|
||||||
mOff = stack.pop().Uint64()
|
mOff = stack.pop().Uint64()
|
||||||
cOff = stack.pop().Uint64()
|
cOff = stack.pop().Uint64()
|
||||||
l = stack.pop().Uint64()
|
l = stack.pop().Uint64()
|
||||||
)
|
)
|
||||||
|
data := getData(callData, cOff, l)
|
||||||
|
|
||||||
if cOff > size {
|
mem.Set(mOff, l, data)
|
||||||
cOff = 0
|
|
||||||
l = 0
|
|
||||||
} else if cOff+l > size {
|
|
||||||
l = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
code := callData[cOff : cOff+l]
|
self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, data)
|
||||||
|
|
||||||
mem.Set(mOff, l, code)
|
|
||||||
|
|
||||||
self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, callData[cOff:cOff+l])
|
|
||||||
case CODESIZE, EXTCODESIZE:
|
case CODESIZE, EXTCODESIZE:
|
||||||
var code []byte
|
var code []byte
|
||||||
if op == EXTCODESIZE {
|
if op == EXTCODESIZE {
|
||||||
@ -487,7 +478,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
|
|||||||
cOff = stack.pop().Uint64()
|
cOff = stack.pop().Uint64()
|
||||||
l = stack.pop().Uint64()
|
l = stack.pop().Uint64()
|
||||||
)
|
)
|
||||||
codeCopy := getCode(code, cOff, l)
|
codeCopy := getData(code, cOff, l)
|
||||||
|
|
||||||
mem.Set(mOff, l, codeCopy)
|
mem.Set(mOff, l, codeCopy)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user