forked from TrueCloudLab/neoneo-go
vm: drop duplicating stackItem structure, build JSON from Parameters
smartcontract.Parameter has everything needed now.
This commit is contained in:
parent
9b4fd99fbc
commit
56e37ad6ba
4 changed files with 20 additions and 50 deletions
|
@ -172,7 +172,10 @@ func (c *Context) Dup() StackItem {
|
||||||
|
|
||||||
// ToContractParameter implements StackItem interface.
|
// ToContractParameter implements StackItem interface.
|
||||||
func (c *Context) ToContractParameter(map[StackItem]bool) smartcontract.Parameter {
|
func (c *Context) ToContractParameter(map[StackItem]bool) smartcontract.Parameter {
|
||||||
panic("Not implemented")
|
return smartcontract.Parameter{
|
||||||
|
Type: smartcontract.StringType,
|
||||||
|
Value: c.String(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Context) atBreakPoint() bool {
|
func (c *Context) atBreakPoint() bool {
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
package vm
|
|
||||||
|
|
||||||
import "encoding/json"
|
|
||||||
|
|
||||||
// StackOutput holds information about the stack, used for pretty printing
|
|
||||||
// the stack.
|
|
||||||
type stackItem struct {
|
|
||||||
Value interface{} `json:"value"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func appendToItems(items *[]stackItem, val StackItem, seen map[StackItem]bool) {
|
|
||||||
if arr, ok := val.Value().([]StackItem); ok {
|
|
||||||
if seen[val] {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
seen[val] = true
|
|
||||||
intItems := make([]stackItem, 0, len(arr))
|
|
||||||
for _, v := range arr {
|
|
||||||
appendToItems(&intItems, v, seen)
|
|
||||||
}
|
|
||||||
*items = append(*items, stackItem{
|
|
||||||
Value: intItems,
|
|
||||||
Type: val.String(),
|
|
||||||
})
|
|
||||||
|
|
||||||
} else {
|
|
||||||
*items = append(*items, stackItem{
|
|
||||||
Value: val,
|
|
||||||
Type: val.String(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func stackToArray(s *Stack) []stackItem {
|
|
||||||
items := make([]stackItem, 0, s.Len())
|
|
||||||
seen := make(map[StackItem]bool)
|
|
||||||
s.IterBack(func(e *Element) {
|
|
||||||
appendToItems(&items, e.value, seen)
|
|
||||||
})
|
|
||||||
return items
|
|
||||||
}
|
|
||||||
|
|
||||||
func buildStackOutput(s *Stack) string {
|
|
||||||
b, _ := json.MarshalIndent(stackToArray(s), "", " ")
|
|
||||||
return string(b)
|
|
||||||
}
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/CityOfZion/neo-go/pkg/smartcontract"
|
||||||
"github.com/CityOfZion/neo-go/pkg/vm/emit"
|
"github.com/CityOfZion/neo-go/pkg/vm/emit"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -469,7 +470,18 @@ func (s *Stack) popSigElements() ([][]byte, error) {
|
||||||
return elems, nil
|
return elems, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToContractParameters converts Stack to slice of smartcontract.Parameter.
|
||||||
|
func (s *Stack) ToContractParameters() []smartcontract.Parameter {
|
||||||
|
items := make([]smartcontract.Parameter, 0, s.Len())
|
||||||
|
s.IterBack(func(e *Element) {
|
||||||
|
// Each item is independent.
|
||||||
|
seen := make(map[StackItem]bool)
|
||||||
|
items = append(items, e.value.ToContractParameter(seen))
|
||||||
|
})
|
||||||
|
return items
|
||||||
|
}
|
||||||
|
|
||||||
// MarshalJSON implements JSON marshalling interface.
|
// MarshalJSON implements JSON marshalling interface.
|
||||||
func (s *Stack) MarshalJSON() ([]byte, error) {
|
func (s *Stack) MarshalJSON() ([]byte, error) {
|
||||||
return json.Marshal(stackToArray(s))
|
return json.Marshal(s.ToContractParameters())
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vm
|
||||||
import (
|
import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
@ -301,7 +302,8 @@ func (v *VM) Stack(n string) string {
|
||||||
if n == "estack" {
|
if n == "estack" {
|
||||||
s = v.estack
|
s = v.estack
|
||||||
}
|
}
|
||||||
return buildStackOutput(s)
|
b, _ := json.MarshalIndent(s.ToContractParameters(), "", " ")
|
||||||
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
// State returns string representation of the state for the VM.
|
// State returns string representation of the state for the VM.
|
||||||
|
|
Loading…
Reference in a new issue