neo-go/pkg/vm/stack
decentralisedkev c1b6738bdb
VM: Add basic vm (#166)
* VM:Add abstract stack item

* VM: Add stackItems; Array, Boolean, Int and ByteArray

* VM: Add tests for stack item

* VM: first pass at Random Access Stack object

* VM: Add Sub, Mul, Mod LSH, RSH

* VM: moved test helper functions into separate file

* VM: removed helper functions from stack_test.go

* Add conversions for bytearray and Int stack items

* Add instructions file for vm

* - Add guide to stack readme
- Add testReadInt64

* Add Builder

* Refactor Int, Boolean, ByteArray conversion

* Add Context stack Item

* Add Invocation stack - convenience RAS

* rename testhelper to test_helper

* Move opcode file

* - Add `Add` OpCode
- Add Opcode Function map

* - Add test for math `Add` opcode
- basic opcode execution

* Add popTwoIntegers convenience func

* Add `SUB` Opcode

* Export Context Read methods
- Return errors where failable

* - Add `Op` to handleOP func signature
- Add PushNBytes OPcode

* remove error on NewBoolean
- Expose underlying with Getter on Boolean StackItem
- Add Equals method for ByteArray

* Make Next() method on Context failable, refactor peekContext and Peek

* Add ExecuteOp, Step and Run methods on the VM

* Add Equal Opcode

* Add THROWIFNOT Opcode

* Add RET Opcode

* Refactor PushNBytes Opcode

* refactor Add, Sub to return VMSTATE
add popTwoByteArrays helper function

* Add basic tests for vm

* clarify vm states

* Add astack

* [VM]

Pass ResultStack to the opcode handlers

* [VM]

refactor handlers to have rstack as argument

* [Stack]

- Change RemoveCurrentContext for PopCurrentContext
- Add CopTo method to stack

* [VM]

Add Result stack Len check in simple run test

* [VM] fix typo

* [Peer/Stall]

Change seconds to milliseconds in test
2019-03-18 21:40:21 +00:00
..
array.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
boolean.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
builder.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
bytearray.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
context.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
instruction.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
Int.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
int_test.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
invocationstack.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
Readme.md VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
stack.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
stack_test.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
stackitem.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
stackitem_test.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00
test_helper.go VM: Add basic vm (#166) 2019-03-18 21:40:21 +00:00

VM - Stack

  • How do i implement a new StackItem?

Answer: You add it's type to the Item interface, then you implement the default return method on the abstract stack item, this should be the behaviour of the stack item, if it is not the new type. Then you embed the abstract item in the new struct and override the method.

For example, If I wanted to add a new type called HashMap

type Item interface{ HashMap()(*HashMap, error) }

func (a *abstractItem) HashMap() (*HashMap, error) { return nil, errors.New(This stack item is not a hashmap) }

type HashMap struct { *abstractItem // Variables needed for hashmap }

func (h *HashMap) HashMap()(*HashMap, error) { // logic to override default behaviour }