mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-23 03:41:34 +00:00
Export Context Read methods
- Return errors where failable
This commit is contained in:
parent
280d526f41
commit
9a59755745
1 changed files with 23 additions and 10 deletions
|
@ -2,6 +2,7 @@ package stack
|
|||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// Context represent the current execution context of the VM.
|
||||
|
@ -95,7 +96,8 @@ func (c *Context) String() string {
|
|||
return "execution context"
|
||||
}
|
||||
|
||||
func (c *Context) readUint32() uint32 {
|
||||
// ReadUint32 reads a uint32 from the script
|
||||
func (c *Context) ReadUint32() uint32 {
|
||||
start, end := c.IP(), c.IP()+4
|
||||
if end > len(c.prog) {
|
||||
return 0
|
||||
|
@ -105,7 +107,8 @@ func (c *Context) readUint32() uint32 {
|
|||
return val
|
||||
}
|
||||
|
||||
func (c *Context) readUint16() uint16 {
|
||||
// ReadUint16 reads a uint16 from the script
|
||||
func (c *Context) ReadUint16() uint16 {
|
||||
start, end := c.IP(), c.IP()+2
|
||||
if end > len(c.prog) {
|
||||
return 0
|
||||
|
@ -115,23 +118,33 @@ func (c *Context) readUint16() uint16 {
|
|||
return val
|
||||
}
|
||||
|
||||
func (c *Context) readByte() byte {
|
||||
return c.readBytes(1)[0]
|
||||
// ReadByte reads one byte from the script
|
||||
func (c *Context) ReadByte() (byte, error) {
|
||||
byt, err := c.ReadBytes(1)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
func (c *Context) readBytes(n int) []byte {
|
||||
return byt[0], nil
|
||||
}
|
||||
|
||||
// ReadBytes will read n bytes from the context
|
||||
func (c *Context) ReadBytes(n int) ([]byte, error) {
|
||||
start, end := c.IP(), c.IP()+n
|
||||
if end > len(c.prog) {
|
||||
return nil
|
||||
return nil, errors.New("Too many bytes to read, pointer goes past end of program")
|
||||
}
|
||||
|
||||
out := make([]byte, n)
|
||||
copy(out, c.prog[start:end])
|
||||
c.ip += n
|
||||
return out
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *Context) readVarBytes() []byte {
|
||||
n := c.readByte()
|
||||
return c.readBytes(int(n))
|
||||
func (c *Context) readVarBytes() ([]byte, error) {
|
||||
n, err := c.ReadByte()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c.ReadBytes(int(n))
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue