Fixed issue with stack where it sliced of the wrong values
This commit is contained in:
parent
38ea6a6d5d
commit
59d8dc3950
|
@ -2,6 +2,7 @@ package ethchain
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/ethereum/eth-go/ethutil"
|
||||||
"math/big"
|
"math/big"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -60,6 +61,10 @@ const (
|
||||||
oBALANCE = 0x3c
|
oBALANCE = 0x3c
|
||||||
oMKTX = 0x3d
|
oMKTX = 0x3d
|
||||||
oSUICIDE = 0x3f
|
oSUICIDE = 0x3f
|
||||||
|
|
||||||
|
// TODO FIX OPCODES
|
||||||
|
oCALL = 0x40
|
||||||
|
oRETURN = 0x41
|
||||||
)
|
)
|
||||||
|
|
||||||
// Since the opcodes aren't all in order we can't use a regular slice
|
// Since the opcodes aren't all in order we can't use a regular slice
|
||||||
|
@ -114,6 +119,9 @@ var opCodeToString = map[OpCode]string{
|
||||||
oBALANCE: "BALANCE",
|
oBALANCE: "BALANCE",
|
||||||
oMKTX: "MKTX",
|
oMKTX: "MKTX",
|
||||||
oSUICIDE: "SUICIDE",
|
oSUICIDE: "SUICIDE",
|
||||||
|
|
||||||
|
oCALL: "CALL",
|
||||||
|
oRETURN: "RETURN",
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o OpCode) String() string {
|
func (o OpCode) String() string {
|
||||||
|
@ -141,35 +149,27 @@ func NewStack() *Stack {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Pop() *big.Int {
|
func (st *Stack) Pop() *big.Int {
|
||||||
s := len(st.data)
|
str := st.data[0]
|
||||||
|
st.data = st.data[1:]
|
||||||
str := st.data[s-1]
|
|
||||||
st.data = st.data[:s-1]
|
|
||||||
|
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Popn() (*big.Int, *big.Int) {
|
func (st *Stack) Popn() (*big.Int, *big.Int) {
|
||||||
s := len(st.data)
|
ints := st.data[:2]
|
||||||
|
st.data = st.data[2:]
|
||||||
ints := st.data[s-2:]
|
|
||||||
st.data = st.data[:s-2]
|
|
||||||
|
|
||||||
return ints[0], ints[1]
|
return ints[0], ints[1]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Peek() *big.Int {
|
func (st *Stack) Peek() *big.Int {
|
||||||
s := len(st.data)
|
str := st.data[0]
|
||||||
|
|
||||||
str := st.data[s-1]
|
|
||||||
|
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *Stack) Peekn() (*big.Int, *big.Int) {
|
func (st *Stack) Peekn() (*big.Int, *big.Int) {
|
||||||
s := len(st.data)
|
ints := st.data[:2]
|
||||||
|
|
||||||
ints := st.data[s-2:]
|
|
||||||
|
|
||||||
return ints[0], ints[1]
|
return ints[0], ints[1]
|
||||||
}
|
}
|
||||||
|
@ -188,3 +188,61 @@ func (st *Stack) Print() {
|
||||||
}
|
}
|
||||||
fmt.Println("#############")
|
fmt.Println("#############")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////// TODO this will eventually become the main stack once the big ints are removed from the VM
|
||||||
|
type ValueStack struct {
|
||||||
|
data []*ethutil.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewValueStack() *ValueStack {
|
||||||
|
return &ValueStack{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *ValueStack) Pop() *ethutil.Value {
|
||||||
|
s := len(st.data)
|
||||||
|
|
||||||
|
str := st.data[s-1]
|
||||||
|
st.data = st.data[:s-1]
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *ValueStack) Popn() (*ethutil.Value, *ethutil.Value) {
|
||||||
|
s := len(st.data)
|
||||||
|
|
||||||
|
ints := st.data[s-2:]
|
||||||
|
st.data = st.data[:s-2]
|
||||||
|
|
||||||
|
return ints[0], ints[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *ValueStack) Peek() *ethutil.Value {
|
||||||
|
s := len(st.data)
|
||||||
|
|
||||||
|
str := st.data[s-1]
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *ValueStack) Peekn() (*ethutil.Value, *ethutil.Value) {
|
||||||
|
s := len(st.data)
|
||||||
|
|
||||||
|
ints := st.data[s-2:]
|
||||||
|
|
||||||
|
return ints[0], ints[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *ValueStack) Push(d *ethutil.Value) {
|
||||||
|
st.data = append(st.data, d)
|
||||||
|
}
|
||||||
|
func (st *ValueStack) Print() {
|
||||||
|
fmt.Println("### STACK ###")
|
||||||
|
if len(st.data) > 0 {
|
||||||
|
for i, val := range st.data {
|
||||||
|
fmt.Printf("%-3d %v\n", i, val)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Println("-- empty --")
|
||||||
|
}
|
||||||
|
fmt.Println("#############")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue