From 81cbf183af34e11732ae5a77da43b9456c2afcd3 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 7 May 2020 11:45:24 +0300 Subject: [PATCH 1/7] vm: implement storage slots --- pkg/vm/slot.go | 29 +++++++++++++++++++++++++++++ pkg/vm/slot_test.go | 21 +++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 pkg/vm/slot.go create mode 100644 pkg/vm/slot_test.go diff --git a/pkg/vm/slot.go b/pkg/vm/slot.go new file mode 100644 index 000000000..e5a3d928d --- /dev/null +++ b/pkg/vm/slot.go @@ -0,0 +1,29 @@ +package vm + +// Slot is a fixed-size slice of stack items. +type Slot struct { + storage []StackItem +} + +// newSlot returns new slot of n items. +func newSlot(n int) *Slot { + return &Slot{ + storage: make([]StackItem, n), + } +} + +// Set sets i-th storage slot. +func (s *Slot) Set(i int, item StackItem) { + s.storage[i] = item +} + +// Get returns item contained in i-th slot. +func (s *Slot) Get(i int) StackItem { + if item := s.storage[i]; item != nil { + return item + } + return NullItem{} +} + +// Size returns slot size. +func (s *Slot) Size() int { return len(s.storage) } diff --git a/pkg/vm/slot_test.go b/pkg/vm/slot_test.go new file mode 100644 index 000000000..49684e73a --- /dev/null +++ b/pkg/vm/slot_test.go @@ -0,0 +1,21 @@ +package vm + +import ( + "math/big" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSlot_Get(t *testing.T) { + s := newSlot(3) + require.NotNil(t, s) + require.Equal(t, 3, s.Size()) + + // NullItem is the default + item := s.Get(2) + require.Equal(t, NullItem{}, item) + + s.Set(1, NewBigIntegerItem(big.NewInt(42))) + require.Equal(t, NewBigIntegerItem(big.NewInt(42)), s.Get(1)) +} From af2abedd86c761058509a1c43fda3af54735e174 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 12 May 2020 16:05:10 +0300 Subject: [PATCH 2/7] vm: implement reference counter It is convenient to have all reference-counting logic in a separate struct. --- pkg/vm/ref_counter.go | 62 ++++++++++++++++++++++++++++++++++++++ pkg/vm/ref_counter_test.go | 32 ++++++++++++++++++++ pkg/vm/stack.go | 58 +++-------------------------------- pkg/vm/vm.go | 35 ++++++++++----------- pkg/vm/vm_test.go | 4 +-- 5 files changed, 116 insertions(+), 75 deletions(-) create mode 100644 pkg/vm/ref_counter.go create mode 100644 pkg/vm/ref_counter_test.go diff --git a/pkg/vm/ref_counter.go b/pkg/vm/ref_counter.go new file mode 100644 index 000000000..c89f07983 --- /dev/null +++ b/pkg/vm/ref_counter.go @@ -0,0 +1,62 @@ +package vm + +// refCounter represents reference counter for the VM. +type refCounter struct { + items map[StackItem]int + size int +} + +func newRefCounter() *refCounter { + return &refCounter{ + items: make(map[StackItem]int), + } +} + +// Add adds an item to the reference counter. +func (r *refCounter) Add(item StackItem) { + r.size++ + + switch item.(type) { + case *ArrayItem, *StructItem, *MapItem: + if r.items[item]++; r.items[item] > 1 { + return + } + + switch t := item.(type) { + case *ArrayItem, *StructItem: + for _, it := range item.Value().([]StackItem) { + r.Add(it) + } + case *MapItem: + for i := range t.value { + r.Add(t.value[i].Value) + } + } + } +} + +// Remove removes item from the reference counter. +func (r *refCounter) Remove(item StackItem) { + r.size-- + + switch item.(type) { + case *ArrayItem, *StructItem, *MapItem: + if r.items[item] > 1 { + r.items[item]-- + return + } + + delete(r.items, item) + + switch t := item.(type) { + case *ArrayItem, *StructItem: + for _, it := range item.Value().([]StackItem) { + r.Remove(it) + } + case *MapItem: + for i := range t.value { + r.Remove(t.value[i].Value) + } + } + } +} diff --git a/pkg/vm/ref_counter_test.go b/pkg/vm/ref_counter_test.go new file mode 100644 index 000000000..731a5c46a --- /dev/null +++ b/pkg/vm/ref_counter_test.go @@ -0,0 +1,32 @@ +package vm + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestRefCounter_Add(t *testing.T) { + r := newRefCounter() + + require.Equal(t, 0, r.size) + + r.Add(NullItem{}) + require.Equal(t, 1, r.size) + + r.Add(NullItem{}) + require.Equal(t, 2, r.size) // count scalar items twice + + arr := NewArrayItem([]StackItem{NewByteArrayItem([]byte{1}), NewBoolItem(false)}) + r.Add(arr) + require.Equal(t, 5, r.size) // array + 2 elements + + r.Add(arr) + require.Equal(t, 6, r.size) // count only array + + r.Remove(arr) + require.Equal(t, 5, r.size) + + r.Remove(arr) + require.Equal(t, 2, r.size) +} diff --git a/pkg/vm/stack.go b/pkg/vm/stack.go index e65bcada2..19e9e9e8f 100644 --- a/pkg/vm/stack.go +++ b/pkg/vm/stack.go @@ -125,9 +125,7 @@ type Stack struct { top Element name string len int - - itemCount map[StackItem]int - size *int + refs *refCounter } // NewStack returns a new stack name by the given name. @@ -138,8 +136,7 @@ func NewStack(n string) *Stack { s.top.next = &s.top s.top.prev = &s.top s.len = 0 - s.itemCount = make(map[StackItem]int) - s.size = new(int) + s.refs = newRefCounter() return s } @@ -171,58 +168,11 @@ func (s *Stack) insert(e, at *Element) *Element { e.stack = s s.len++ - s.updateSizeAdd(e.value) + s.refs.Add(e.value) return e } -func (s *Stack) updateSizeAdd(item StackItem) { - *s.size++ - - switch item.(type) { - case *ArrayItem, *StructItem, *MapItem: - if s.itemCount[item]++; s.itemCount[item] > 1 { - return - } - - switch t := item.(type) { - case *ArrayItem, *StructItem: - for _, it := range item.Value().([]StackItem) { - s.updateSizeAdd(it) - } - case *MapItem: - for i := range t.value { - s.updateSizeAdd(t.value[i].Value) - } - } - } -} - -func (s *Stack) updateSizeRemove(item StackItem) { - *s.size-- - - switch item.(type) { - case *ArrayItem, *StructItem, *MapItem: - if s.itemCount[item] > 1 { - s.itemCount[item]-- - return - } - - delete(s.itemCount, item) - - switch t := item.(type) { - case *ArrayItem, *StructItem: - for _, it := range item.Value().([]StackItem) { - s.updateSizeRemove(it) - } - case *MapItem: - for i := range t.value { - s.updateSizeRemove(t.value[i].Value) - } - } - } -} - // InsertAt inserts the given item (n) deep on the stack. // Be very careful using it and _always_ check both e and n before invocation // as it will silently do wrong things otherwise. @@ -300,7 +250,7 @@ func (s *Stack) Remove(e *Element) *Element { e.stack = nil s.len-- - s.updateSizeRemove(e.value) + s.refs.Remove(e.value) return e } diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 694ae147c..c96de3977 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -78,8 +78,7 @@ type VM struct { // Hash to verify in CHECKSIG/CHECKMULTISIG. checkhash []byte - itemCount map[StackItem]int - size int + refs *refCounter gasConsumed util.Fixed8 gasLimit util.Fixed8 @@ -94,9 +93,8 @@ func New() *VM { getInterop: make([]InteropGetterFunc, 0, 3), // 3 functions is typical for our default usage. state: haltState, istack: NewStack("invocation"), - - itemCount: make(map[StackItem]int), - keys: make(map[string]*keys.PublicKey), + refs: newRefCounter(), + keys: make(map[string]*keys.PublicKey), } vm.estack = vm.newItemStack("evaluation") @@ -108,8 +106,7 @@ func New() *VM { func (v *VM) newItemStack(n string) *Stack { s := NewStack(n) - s.size = &v.size - s.itemCount = v.itemCount + s.refs = v.refs return s } @@ -499,7 +496,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro if errRecover := recover(); errRecover != nil { v.state = faultState err = newError(ctx.ip, op, errRecover) - } else if v.size > MaxStackSize { + } else if v.refs.size > MaxStackSize { v.state = faultState err = newError(ctx.ip, op, "stack is too big") } @@ -955,7 +952,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro panic("APPEND: not of underlying type Array") } - v.estack.updateSizeAdd(val) + v.refs.Add(val) case opcode.PACK: n := int(v.estack.Pop().BigInt().Int64()) @@ -1024,17 +1021,17 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro if index < 0 || index >= len(arr) { panic("SETITEM: invalid index") } - v.estack.updateSizeRemove(arr[index]) + v.refs.Remove(arr[index]) arr[index] = item - v.estack.updateSizeAdd(arr[index]) + v.refs.Add(arr[index]) case *MapItem: if t.Has(key.value) { - v.estack.updateSizeRemove(item) + v.refs.Remove(item) } else if len(t.value) >= MaxArraySize { panic("too big map") } t.Add(key.value, item) - v.estack.updateSizeAdd(item) + v.refs.Add(item) default: panic(fmt.Sprintf("SETITEM: invalid item type %s", t)) @@ -1059,7 +1056,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro if k < 0 || k >= len(a) { panic("REMOVE: invalid index") } - v.estack.updateSizeRemove(a[k]) + v.refs.Remove(a[k]) a = append(a[:k], a[k+1:]...) t.value = a case *StructItem: @@ -1068,14 +1065,14 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro if k < 0 || k >= len(a) { panic("REMOVE: invalid index") } - v.estack.updateSizeRemove(a[k]) + v.refs.Remove(a[k]) a = append(a[:k], a[k+1:]...) t.value = a case *MapItem: index := t.Index(key.Item()) // NEO 2.0 doesn't error on missing key. if index >= 0 { - v.estack.updateSizeRemove(t.value[index].Value) + v.refs.Remove(t.value[index].Value) t.Drop(index) } default: @@ -1087,17 +1084,17 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro switch t := elem.value.(type) { case *ArrayItem: for _, item := range t.value { - v.estack.updateSizeRemove(item) + v.refs.Remove(item) } t.value = t.value[:0] case *StructItem: for _, item := range t.value { - v.estack.updateSizeRemove(item) + v.refs.Remove(item) } t.value = t.value[:0] case *MapItem: for i := range t.value { - v.estack.updateSizeRemove(t.value[i].Value) + v.refs.Remove(t.value[i].Value) } t.value = t.value[:0] default: diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 5a313bfa5..262e77cc5 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -423,7 +423,7 @@ func TestStackLimit(t *testing.T) { vm := load(makeProgram(prog...)) for i := range expected { require.NoError(t, vm.Step()) - require.Equal(t, expected[i].size, vm.size) + require.Equal(t, expected[i].size, vm.refs.size) } } @@ -1980,7 +1980,7 @@ func testCLEARITEMS(t *testing.T, item StackItem) { v.estack.PushVal(item) runVM(t, v) require.Equal(t, 2, v.estack.Len()) - require.EqualValues(t, 2, v.size) // empty collection + it's size + require.EqualValues(t, 2, v.refs.size) // empty collection + it's size require.EqualValues(t, 0, v.estack.Pop().BigInt().Int64()) } From 2cec088f08e9d985976382cd72891e6a0d01a1a8 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Fri, 8 May 2020 15:34:32 +0300 Subject: [PATCH 3/7] vm: add reference counter to slots --- pkg/vm/slot.go | 16 +++++++++++++++- pkg/vm/slot_test.go | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/pkg/vm/slot.go b/pkg/vm/slot.go index e5a3d928d..279cb3f39 100644 --- a/pkg/vm/slot.go +++ b/pkg/vm/slot.go @@ -3,18 +3,32 @@ package vm // Slot is a fixed-size slice of stack items. type Slot struct { storage []StackItem + refs *refCounter } // newSlot returns new slot of n items. -func newSlot(n int) *Slot { +func newSlot(n int, refs *refCounter) *Slot { return &Slot{ storage: make([]StackItem, n), + refs: refs, } } +func (v *VM) newSlot(n int) *Slot { + return newSlot(n, v.refs) +} + // Set sets i-th storage slot. func (s *Slot) Set(i int, item StackItem) { + if s.storage[i] == item { + return + } + old := s.storage[i] s.storage[i] = item + if old != nil { + s.refs.Remove(old) + } + s.refs.Add(item) } // Get returns item contained in i-th slot. diff --git a/pkg/vm/slot_test.go b/pkg/vm/slot_test.go index 49684e73a..65781b7af 100644 --- a/pkg/vm/slot_test.go +++ b/pkg/vm/slot_test.go @@ -8,7 +8,7 @@ import ( ) func TestSlot_Get(t *testing.T) { - s := newSlot(3) + s := newSlot(3, newRefCounter()) require.NotNil(t, s) require.Equal(t, 3, s.Size()) From a6271f6bf2f39e145150e9faee5599af8214e643 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 7 May 2020 15:42:13 +0300 Subject: [PATCH 4/7] vm: reorder splice opcodes --- pkg/vm/opcode/opcode.go | 8 ++++---- pkg/vm/opcode/opcode_string.go | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pkg/vm/opcode/opcode.go b/pkg/vm/opcode/opcode.go index b6641747f..87fe98a53 100644 --- a/pkg/vm/opcode/opcode.go +++ b/pkg/vm/opcode/opcode.go @@ -99,10 +99,10 @@ const ( FROMALTSTACK Opcode = 0x6C // Splice - CAT Opcode = 0x7E - SUBSTR Opcode = 0x7F - LEFT Opcode = 0x80 - RIGHT Opcode = 0x81 + CAT Opcode = 0x8B + SUBSTR Opcode = 0x8C + LEFT Opcode = 0x8D + RIGHT Opcode = 0x8E // Bitwise logic INVERT Opcode = 0x90 diff --git a/pkg/vm/opcode/opcode_string.go b/pkg/vm/opcode/opcode_string.go index ad726d7e0..747556a7f 100644 --- a/pkg/vm/opcode/opcode_string.go +++ b/pkg/vm/opcode/opcode_string.go @@ -85,10 +85,10 @@ func _() { _ = x[DUPFROMALTSTACK-106] _ = x[TOALTSTACK-107] _ = x[FROMALTSTACK-108] - _ = x[CAT-126] - _ = x[SUBSTR-127] - _ = x[LEFT-128] - _ = x[RIGHT-129] + _ = x[CAT-139] + _ = x[SUBSTR-140] + _ = x[LEFT-141] + _ = x[RIGHT-142] _ = x[INVERT-144] _ = x[AND-145] _ = x[OR-146] @@ -220,10 +220,10 @@ var _Opcode_map = map[Opcode]string{ 106: _Opcode_name[414:429], 107: _Opcode_name[429:439], 108: _Opcode_name[439:451], - 126: _Opcode_name[451:454], - 127: _Opcode_name[454:460], - 128: _Opcode_name[460:464], - 129: _Opcode_name[464:469], + 139: _Opcode_name[451:454], + 140: _Opcode_name[454:460], + 141: _Opcode_name[460:464], + 142: _Opcode_name[464:469], 144: _Opcode_name[469:475], 145: _Opcode_name[475:478], 146: _Opcode_name[478:480], From 0cb6dc47e41fb245e08cc6febf3e0430023ca79c Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 7 May 2020 11:54:35 +0300 Subject: [PATCH 5/7] vm: implement slot-related opcodes 1. Slot is a new mechanism for storing variables during execution which is more convenient than alt.stack. This commit implements support for slot opcodes in both vm and compiler. 2. Remove old alt.stack opcodes. 3. Do not process globals at the start of every function, but instead load them single time at main. --- pkg/compiler/analysis.go | 21 +++ pkg/compiler/codegen.go | 199 ++++++++++++------- pkg/compiler/debug.go | 8 + pkg/compiler/func_scope.go | 48 +++-- pkg/rpc/server/server_test.go | 6 +- pkg/rpc/server/testdata/test_contract.avm | Bin 858 -> 704 bytes pkg/rpc/server/testdata/testblocks.acc | Bin 113896 -> 113742 bytes pkg/vm/context.go | 8 +- pkg/vm/opcode/opcode.go | 55 +++++- pkg/vm/opcode/opcode_string.go | 220 +++++++++++++++------- pkg/vm/vm.go | 86 ++++++++- pkg/vm/vm_test.go | 93 ++++++--- 12 files changed, 552 insertions(+), 192 deletions(-) diff --git a/pkg/compiler/analysis.go b/pkg/compiler/analysis.go index fc2c36067..c2382cfd9 100644 --- a/pkg/compiler/analysis.go +++ b/pkg/compiler/analysis.go @@ -1,11 +1,14 @@ package compiler import ( + "errors" "fmt" "go/ast" "go/constant" "go/types" + "github.com/nspcc-dev/neo-go/pkg/vm/emit" + "github.com/nspcc-dev/neo-go/pkg/vm/opcode" "golang.org/x/tools/go/loader" ) @@ -47,6 +50,24 @@ func typeAndValueForField(fld *types.Var) (types.TypeAndValue, error) { return types.TypeAndValue{}, nil } +// newGlobal creates new global variable. +func (c *codegen) newGlobal(name string) { + c.globals[name] = len(c.globals) +} + +// traverseGlobals visits and initializes global variables. +func (c *codegen) traverseGlobals(f ast.Node) { + n := countGlobals(f) + if n != 0 { + if n > 255 { + c.prog.BinWriter.Err = errors.New("too many global variables") + return + } + emit.Instruction(c.prog.BinWriter, opcode.INITSSLOT, []byte{byte(n)}) + } + c.convertGlobals(f) +} + // countGlobals counts the global variables in the program to add // them with the stack size of the function. func countGlobals(f ast.Node) (i int64) { diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index 709747e57..7d2f6e86e 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -43,6 +43,8 @@ type codegen struct { // Current funcScope being converted. scope *funcScope + globals map[string]int + // A mapping from label's names to their ids. labels map[labelWithType]uint16 // A list of nested label names together with evaluation stack depth. @@ -82,6 +84,14 @@ type labelWithStackSize struct { sz int } +type varType int + +const ( + varGlobal varType = iota + varLocal + varArgument +) + // newLabel creates a new label to jump to func (c *codegen) newLabel() (l uint16) { li := len(c.l) @@ -147,34 +157,6 @@ func (c *codegen) convertBasicType(t types.TypeAndValue, typ *types.Basic) { } } -func (c *codegen) emitLoadLocal(name string) { - pos := c.scope.loadLocal(name) - if pos < 0 { - c.prog.Err = fmt.Errorf("cannot load local variable with position: %d", pos) - return - } - c.emitLoadLocalPos(pos) -} - -func (c *codegen) emitLoadLocalPos(pos int) { - emit.Opcode(c.prog.BinWriter, opcode.DUPFROMALTSTACK) - emit.Int(c.prog.BinWriter, int64(pos)) - emit.Opcode(c.prog.BinWriter, opcode.PICKITEM) -} - -func (c *codegen) emitStoreLocal(pos int) { - emit.Opcode(c.prog.BinWriter, opcode.DUPFROMALTSTACK) - - if pos < 0 { - c.prog.Err = fmt.Errorf("invalid position to store local: %d", pos) - return - } - - emit.Int(c.prog.BinWriter, int64(pos)) - emit.Opcode(c.prog.BinWriter, opcode.ROT) - emit.Opcode(c.prog.BinWriter, opcode.SETITEM) -} - func (c *codegen) emitLoadField(i int) { emit.Int(c.prog.BinWriter, int64(i)) emit.Opcode(c.prog.BinWriter, opcode.PICKITEM) @@ -186,6 +168,81 @@ func (c *codegen) emitStoreStructField(i int) { emit.Opcode(c.prog.BinWriter, opcode.SETITEM) } +// getVarIndex returns variable type and position in corresponding slot, +// according to current scope. +func (c *codegen) getVarIndex(name string) (varType, int) { + if c.scope != nil { + if i, ok := c.scope.arguments[name]; ok { + return varArgument, i + } else if i, ok := c.scope.locals[name]; ok { + return varLocal, i + } + } + if i, ok := c.globals[name]; ok { + return varGlobal, i + } + + return varLocal, c.scope.newVariable(varLocal, name) +} + +func getBaseOpcode(t varType) (opcode.Opcode, opcode.Opcode) { + switch t { + case varGlobal: + return opcode.LDSFLD0, opcode.STSFLD0 + case varLocal: + return opcode.LDLOC0, opcode.STLOC0 + case varArgument: + return opcode.LDARG0, opcode.STARG0 + default: + panic("invalid type") + } +} + +// emitLoadVar loads specified variable to the evaluation stack. +func (c *codegen) emitLoadVar(name string) { + t, i := c.getVarIndex(name) + base, _ := getBaseOpcode(t) + if i < 7 { + emit.Opcode(c.prog.BinWriter, base+opcode.Opcode(i)) + } else { + emit.Instruction(c.prog.BinWriter, base+7, []byte{byte(i)}) + } +} + +// emitStoreVar stores top value from the evaluation stack in the specified variable. +func (c *codegen) emitStoreVar(name string) { + t, i := c.getVarIndex(name) + _, base := getBaseOpcode(t) + if i < 7 { + emit.Opcode(c.prog.BinWriter, base+opcode.Opcode(i)) + } else { + emit.Instruction(c.prog.BinWriter, base+7, []byte{byte(i)}) + } +} + +func (c *codegen) emitDefault(n ast.Expr) { + tv, ok := c.typeInfo.Types[n] + if !ok { + c.prog.Err = errors.New("invalid type") + return + } + if t, ok := tv.Type.(*types.Basic); ok { + info := t.Info() + switch { + case info&types.IsInteger != 0: + emit.Int(c.prog.BinWriter, 0) + case info&types.IsString != 0: + emit.Bytes(c.prog.BinWriter, []byte{}) + case info&types.IsBoolean != 0: + emit.Bool(c.prog.BinWriter, false) + default: + emit.Opcode(c.prog.BinWriter, opcode.PUSHNULL) + } + return + } + emit.Opcode(c.prog.BinWriter, opcode.PUSHNULL) +} + // convertGlobals traverses the AST and only converts global declarations. // If we call this in convertFuncDecl then it will load all global variables // into the scope of the function. @@ -231,9 +288,17 @@ func (c *codegen) convertFuncDecl(file ast.Node, decl *ast.FuncDecl) { // All globals copied into the scope of the function need to be added // to the stack size of the function. - emit.Int(c.prog.BinWriter, f.stackSize()+countGlobals(file)) - emit.Opcode(c.prog.BinWriter, opcode.NEWARRAY) - emit.Opcode(c.prog.BinWriter, opcode.TOALTSTACK) + sizeLoc := f.countLocals() + if sizeLoc > 255 { + c.prog.Err = errors.New("maximum of 255 local variables is allowed") + } + sizeArg := f.countArgs() + if sizeArg > 255 { + c.prog.Err = errors.New("maximum of 255 local variables is allowed") + } + if sizeLoc != 0 || sizeArg != 0 { + emit.Instruction(c.prog.BinWriter, opcode.INITSLOT, []byte{byte(sizeLoc), byte(sizeArg)}) + } // We need to handle methods, which in Go, is just syntactic sugar. // The method receiver will be passed in as first argument. @@ -250,23 +315,18 @@ func (c *codegen) convertFuncDecl(file ast.Node, decl *ast.FuncDecl) { c.prog.Err = fmt.Errorf("method receives for non-struct types is not yet supported") return } - l := c.scope.newLocal(ident.Name) - c.emitStoreLocal(l) + // only create an argument here, it will be stored via INITSLOT + c.scope.newVariable(varArgument, ident.Name) } } // Load the arguments in scope. for _, arg := range decl.Type.Params.List { for _, id := range arg.Names { - l := c.scope.newLocal(id.Name) - c.emitStoreLocal(l) + // only create an argument here, it will be stored via INITSLOT + c.scope.newVariable(varArgument, id.Name) } } - // Load in all the global variables in to the scope of the function. - // This is not necessary for syscalls. - if !isSyscall(f) { - c.convertGlobals(file) - } ast.Walk(c, decl.Body) @@ -275,8 +335,6 @@ func (c *codegen) convertFuncDecl(file ast.Node, decl *ast.FuncDecl) { // This can be the case with void and named-return functions. if !lastStmtIsReturn(decl) { c.saveSequencePoint(decl.Body) - emit.Opcode(c.prog.BinWriter, opcode.FROMALTSTACK) - emit.Opcode(c.prog.BinWriter, opcode.DROP) emit.Opcode(c.prog.BinWriter, opcode.RET) } @@ -305,25 +363,32 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { switch t := spec.(type) { case *ast.ValueSpec: for _, id := range t.Names { - c.scope.newLocal(id.Name) + if c.scope == nil { + // it is a global declaration + c.newGlobal(id.Name) + } else { + c.scope.newLocal(id.Name) + } c.registerDebugVariable(id.Name, t.Type) } if len(t.Values) != 0 { for i, val := range t.Values { ast.Walk(c, val) - l := c.scope.loadLocal(t.Names[i].Name) - c.emitStoreLocal(l) + c.emitStoreVar(t.Names[i].Name) } } else if c.isCompoundArrayType(t.Type) { emit.Opcode(c.prog.BinWriter, opcode.PUSH0) emit.Opcode(c.prog.BinWriter, opcode.NEWARRAY) - l := c.scope.loadLocal(t.Names[0].Name) - c.emitStoreLocal(l) + c.emitStoreVar(t.Names[0].Name) } else if n, ok := c.isStructType(t.Type); ok { emit.Int(c.prog.BinWriter, int64(n)) emit.Opcode(c.prog.BinWriter, opcode.NEWSTRUCT) - l := c.scope.loadLocal(t.Names[0].Name) - c.emitStoreLocal(l) + c.emitStoreVar(t.Names[0].Name) + } else { + for _, id := range t.Names { + c.emitDefault(t.Type) + c.emitStoreVar(id.Name) + } } } } @@ -337,11 +402,10 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { case *ast.Ident: switch n.Tok { case token.ADD_ASSIGN, token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN, token.REM_ASSIGN: - c.emitLoadLocal(t.Name) + c.emitLoadVar(t.Name) ast.Walk(c, n.Rhs[0]) // can only add assign to 1 expr on the RHS c.convertToken(n.Tok) - l := c.scope.loadLocal(t.Name) - c.emitStoreLocal(l) + c.emitStoreVar(t.Name) case token.DEFINE: if !multiRet { c.registerDebugVariable(t.Name, n.Rhs[i]) @@ -355,8 +419,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { if t.Name == "_" { emit.Opcode(c.prog.BinWriter, opcode.DROP) } else { - l := c.scope.loadLocal(t.Name) - c.emitStoreLocal(l) + c.emitStoreVar(t.Name) } } @@ -366,7 +429,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { ast.Walk(c, n.Rhs[i]) typ := c.typeInfo.ObjectOf(expr).Type().Underlying() if strct, ok := typ.(*types.Struct); ok { - c.emitLoadLocal(expr.Name) // load the struct + c.emitLoadVar(expr.Name) // load the struct i := indexOfStruct(strct, t.Sel.Name) // get the index of the field c.emitStoreStructField(i) // store the field } @@ -380,7 +443,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { case *ast.IndexExpr: ast.Walk(c, n.Rhs[i]) name := t.X.(*ast.Ident).Name - c.emitLoadLocal(name) + c.emitLoadVar(name) switch ind := t.Index.(type) { case *ast.BasicLit: indexStr := ind.Value @@ -391,7 +454,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { } c.emitStoreStructField(index) case *ast.Ident: - c.emitLoadLocal(ind.Name) + c.emitLoadVar(ind.Name) emit.Opcode(c.prog.BinWriter, opcode.ROT) emit.Opcode(c.prog.BinWriter, opcode.SETITEM) default: @@ -404,7 +467,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { case *ast.SliceExpr: name := n.X.(*ast.Ident).Name - c.emitLoadLocal(name) + c.emitLoadVar(name) if n.Low != nil { ast.Walk(c, n.Low) @@ -442,7 +505,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { for i := len(results.List) - 1; i >= 0; i-- { names := results.List[i].Names for j := len(names) - 1; j >= 0; j-- { - c.emitLoadLocal(names[j].Name) + c.emitLoadVar(names[j].Name) } } } @@ -454,8 +517,6 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { } c.saveSequencePoint(n) - emit.Opcode(c.prog.BinWriter, opcode.FROMALTSTACK) - emit.Opcode(c.prog.BinWriter, opcode.DROP) // Cleanup the stack. emit.Opcode(c.prog.BinWriter, opcode.RET) return nil @@ -557,7 +618,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { } else if tv := c.typeInfo.Types[n]; tv.Value != nil { c.emitLoadConst(tv) } else { - c.emitLoadLocal(n.Name) + c.emitLoadVar(n.Name) } return nil @@ -723,7 +784,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { c.convertBuiltin(n) case name != "": // Function was not found thus is can be only an invocation of func-typed variable. - c.emitLoadLocal(name) + c.emitLoadVar(name) emit.Opcode(c.prog.BinWriter, opcode.CALLA) case isSyscall(f): c.convertSyscall(n, f.selector.Name, f.name) @@ -738,7 +799,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { case *ast.Ident: typ := c.typeInfo.ObjectOf(t).Type().Underlying() if strct, ok := typ.(*types.Struct); ok { - c.emitLoadLocal(t.Name) // load the struct + c.emitLoadVar(t.Name) // load the struct i := indexOfStruct(strct, n.Sel.Name) c.emitLoadField(i) // load the field } @@ -777,8 +838,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { // for i := 0; i < 10; i++ {} // Where the post stmt is ( i++ ) if ident, ok := n.X.(*ast.Ident); ok { - pos := c.scope.loadLocal(ident.Name) - c.emitStoreLocal(pos) + c.emitStoreVar(ident.Name) } return nil @@ -913,9 +973,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { if n.Key != nil { emit.Opcode(c.prog.BinWriter, opcode.DUP) - - pos := c.scope.loadLocal(n.Key.(*ast.Ident).Name) - c.emitStoreLocal(pos) + c.emitStoreVar(n.Key.(*ast.Ident).Name) } ast.Walk(c, n.Body) @@ -1315,6 +1373,8 @@ func (c *codegen) compile(info *buildInfo, pkg *loader.PackageInfo) error { } } + c.traverseGlobals(mainFile) + // convert the entry point first. c.convertFuncDecl(mainFile, main) @@ -1354,6 +1414,7 @@ func newCodegen(info *buildInfo, pkg *loader.PackageInfo) *codegen { l: []int{}, funcs: map[string]*funcScope{}, lambda: map[string]*funcScope{}, + globals: map[string]int{}, labels: map[labelWithType]uint16{}, typeInfo: &pkg.Info, diff --git a/pkg/compiler/debug.go b/pkg/compiler/debug.go index 0d607eaae..29af3f425 100644 --- a/pkg/compiler/debug.go +++ b/pkg/compiler/debug.go @@ -115,6 +115,10 @@ type Event struct { } func (c *codegen) saveSequencePoint(n ast.Node) { + if c.scope == nil { + // do not save globals for now + return + } fset := c.buildInfo.program.Fset start := fset.Position(n.Pos()) end := fset.Position(n.End()) @@ -143,6 +147,10 @@ func (c *codegen) emitDebugInfo() *DebugInfo { } func (c *codegen) registerDebugVariable(name string, expr ast.Expr) { + if c.scope == nil { + // do not save globals for now + return + } typ := c.scTypeFromExpr(expr) c.scope.variables = append(c.scope.variables, name+","+typ) } diff --git a/pkg/compiler/func_scope.go b/pkg/compiler/func_scope.go index d3f3810fc..d9e81916d 100644 --- a/pkg/compiler/func_scope.go +++ b/pkg/compiler/func_scope.go @@ -27,7 +27,8 @@ type funcScope struct { variables []string // Local variables - locals map[string]int + locals map[string]int + arguments map[string]int // voidCalls are basically functions that return their value // into nothing. The stack has their return value but there @@ -51,6 +52,7 @@ func newFuncScope(decl *ast.FuncDecl, label uint16) *funcScope { decl: decl, label: label, locals: map[string]int{}, + arguments: map[string]int{}, voidCalls: map[*ast.CallExpr]bool{}, variables: []string{}, i: -1, @@ -84,7 +86,7 @@ func (c *funcScope) analyzeVoidCalls(node ast.Node) bool { return true } -func (c *funcScope) stackSize() int64 { +func (c *funcScope) countLocals() int { size := 0 ast.Inspect(c.decl, func(n ast.Node) bool { switch n := n.(type) { @@ -110,28 +112,38 @@ func (c *funcScope) stackSize() int64 { } return true }) + return size +} - numArgs := len(c.decl.Type.Params.List) - // Also take care of struct methods recv: e.g. (t Token).Foo(). +func (c *funcScope) countArgs() int { + n := c.decl.Type.Params.NumFields() if c.decl.Recv != nil { - numArgs += len(c.decl.Recv.List) + n += c.decl.Recv.NumFields() } + return n +} + +func (c *funcScope) stackSize() int64 { + size := c.countLocals() + numArgs := c.countArgs() return int64(size + numArgs + len(c.voidCalls)) } +// newVariable creates a new local variable or argument in the scope of the function. +func (c *funcScope) newVariable(t varType, name string) int { + c.i++ + switch t { + case varLocal: + c.locals[name] = c.i + case varArgument: + c.arguments[name] = c.i + default: + panic("invalid type") + } + return c.i +} + // newLocal creates a new local variable into the scope of the function. func (c *funcScope) newLocal(name string) int { - c.i++ - c.locals[name] = c.i - return c.i -} - -// loadLocal loads the position of a local variable inside the scope of the function. -func (c *funcScope) loadLocal(name string) int { - i, ok := c.locals[name] - if !ok { - // should emit a compiler warning. - return c.newLocal(name) - } - return i + return c.newVariable(varLocal, name) } diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index e038a584c..4bac91ab6 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -48,18 +48,18 @@ type rpcTestCase struct { check func(t *testing.T, e *executor, result interface{}) } -const testContractHash = "a4bea0d56fad00a972135d54b381516205d78484" +const testContractHash = "33f3421677fab7f620bd70582f468b4a18df1e5d" var rpcTestCases = map[string][]rpcTestCase{ "getapplicationlog": { { name: "positive", - params: `["c296c0929350d051b9b40cace54db5a3eac4b730a8851e958795d44918f23c08"]`, + params: `["3f1579e797fedb83b66a85fe21d427a119d0e25ef662582e56393fd0d70e4691"]`, result: func(e *executor) interface{} { return &result.ApplicationLog{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.ApplicationLog) require.True(t, ok) - expectedTxHash, err := util.Uint256DecodeStringLE("c296c0929350d051b9b40cace54db5a3eac4b730a8851e958795d44918f23c08") + expectedTxHash, err := util.Uint256DecodeStringLE("3f1579e797fedb83b66a85fe21d427a119d0e25ef662582e56393fd0d70e4691") require.NoError(t, err) assert.Equal(t, expectedTxHash, res.TxHash) assert.Equal(t, 1, len(res.Executions)) diff --git a/pkg/rpc/server/testdata/test_contract.avm b/pkg/rpc/server/testdata/test_contract.avm index 4afd3f630d0d5dfa4f342cb9d7bb6ca8bf1ede32..ed72f09df1f796e52c0b64ff121a8c13cbca7181 100755 GIT binary patch literal 704 zcmZ`%zfaph6m~z{Y5Sr4q8W}<+Hnx?ge?#JDKO)H7>);u@o1GoR(y|Fygv1c_+>w!(d1tNoNG9h^Z zO-b=;&dIjs*cS>ng3!klk+gu#5^Ov68wJ!EqG18sWf0W+*@!sykwP}ooQ^oDs)4os z@Wip7DyT6+1TjB+7Zq@HzdhMqI{vM7en4A>!8T@>h~S`$f*=Xg)Ev66{`NO4uXWvZ z;_<1w|MG)w32;|$OqK?CvXd`Q%Ha%Y5KE&lDd3(AEX|N=8C7a8O0}JZ8jKQ7;e(>m zyGy1h&r3>YNfG=JLVGSq>k1x}>066*M0v)<>NvC-XR33ZT*2d#(8esyq6qsqWTG2o zELinGW`3LMG39!-(U>i&7~CLVr$)@UQDJvJP)5!=)t!_#Af#3g)G@>IUf#;j(jxiz q^y^PxO&jVQM9drHzj8p6(UpQ~d*)(VJ_!>fFlTCeukCfI;5oNVA;@L` literal 858 zcmaJI)sR9Etng(f8v(~CbOKc1f>e;`#=mkPBz zi#IC%1D#lqx-nQ0NL~0HNFBNNd(S<-%CpNiOzVxA-W#hMULx|8dU@NU zoHMOrdUarYaaPveTQ-zkb$P$YOR}RViZ*cGwXQa7)&Ow>nUW3yr~lFUX}daicRSZh ziqci@IyQhBxBtVyeOtTD@h&U211`DR1-7~N@C)(TI&}> zj@Y@xRhNZz+%b zHue29$TEH4JpbNbwO#E;8~Wm!Mz!xeczU#EGZO+^i~xX{i?CcM(8={3+j66Xj*31YA(Z7PkJt@Ka*&Fy$_y#1s0;u87knTOod5s; diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index ea5e93376eec6226cb4b23ec976cb9624aa81009..16577dde5d13aba4d07033954f1b37be6fedb8dd 100644 GIT binary patch literal 113742 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 literal 113896 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

-qu>GS+`~OP~}Q>0E|Ue2r@)RyPl{uRbVP8xsDy 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 diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 4c610ee9e..08c439ac4 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -34,6 +34,9 @@ type Context struct { // Alt stack pointer. astack *Stack + local *Slot + arguments *Slot + // Script hash of the prog. scriptHash util.Uint160 @@ -107,8 +110,11 @@ func (c *Context) Next() (opcode.Opcode, []byte, error) { } case opcode.JMP, opcode.JMPIF, opcode.JMPIFNOT, opcode.JMPEQ, opcode.JMPNE, opcode.JMPGT, opcode.JMPGE, opcode.JMPLT, opcode.JMPLE, - opcode.CALL, opcode.ISTYPE, opcode.CONVERT, opcode.NEWARRAYT: + opcode.CALL, opcode.ISTYPE, opcode.CONVERT, opcode.NEWARRAYT, + opcode.INITSSLOT, opcode.LDSFLD, opcode.STSFLD, opcode.LDARG, opcode.STARG, opcode.LDLOC, opcode.STLOC: numtoread = 1 + case opcode.INITSLOT: + numtoread = 2 case opcode.JMPL, opcode.JMPIFL, opcode.JMPIFNOTL, opcode.JMPEQL, opcode.JMPNEL, opcode.JMPGTL, opcode.JMPGEL, opcode.JMPLTL, opcode.JMPLEL, opcode.CALLL, opcode.SYSCALL, opcode.PUSHA: diff --git a/pkg/vm/opcode/opcode.go b/pkg/vm/opcode/opcode.go index 87fe98a53..026e1b01e 100644 --- a/pkg/vm/opcode/opcode.go +++ b/pkg/vm/opcode/opcode.go @@ -93,10 +93,57 @@ const ( REVERSE4 Opcode = 0x54 REVERSEN Opcode = 0x55 - // Old stack opcodes - DUPFROMALTSTACK Opcode = 0x6A - TOALTSTACK Opcode = 0x6B - FROMALTSTACK Opcode = 0x6C + // Slots + INITSSLOT Opcode = 0x56 + INITSLOT Opcode = 0x57 + LDSFLD0 Opcode = 0x58 + LDSFLD1 Opcode = 0x59 + LDSFLD2 Opcode = 0x5A + LDSFLD3 Opcode = 0x5B + LDSFLD4 Opcode = 0x5C + LDSFLD5 Opcode = 0x5D + LDSFLD6 Opcode = 0x5E + LDSFLD Opcode = 0x5F + STSFLD0 Opcode = 0x60 + STSFLD1 Opcode = 0x61 + STSFLD2 Opcode = 0x62 + STSFLD3 Opcode = 0x63 + STSFLD4 Opcode = 0x64 + STSFLD5 Opcode = 0x65 + STSFLD6 Opcode = 0x66 + STSFLD Opcode = 0x67 + LDLOC0 Opcode = 0x68 + LDLOC1 Opcode = 0x69 + LDLOC2 Opcode = 0x6A + LDLOC3 Opcode = 0x6B + LDLOC4 Opcode = 0x6C + LDLOC5 Opcode = 0x6D + LDLOC6 Opcode = 0x6E + LDLOC Opcode = 0x6F + STLOC0 Opcode = 0x70 + STLOC1 Opcode = 0x71 + STLOC2 Opcode = 0x72 + STLOC3 Opcode = 0x73 + STLOC4 Opcode = 0x74 + STLOC5 Opcode = 0x75 + STLOC6 Opcode = 0x76 + STLOC Opcode = 0x77 + LDARG0 Opcode = 0x78 + LDARG1 Opcode = 0x79 + LDARG2 Opcode = 0x7A + LDARG3 Opcode = 0x7B + LDARG4 Opcode = 0x7C + LDARG5 Opcode = 0x7D + LDARG6 Opcode = 0x7E + LDARG Opcode = 0x7F + STARG0 Opcode = 0x80 + STARG1 Opcode = 0x81 + STARG2 Opcode = 0x82 + STARG3 Opcode = 0x83 + STARG4 Opcode = 0x84 + STARG5 Opcode = 0x85 + STARG6 Opcode = 0x86 + STARG Opcode = 0x87 // Splice CAT Opcode = 0x8B diff --git a/pkg/vm/opcode/opcode_string.go b/pkg/vm/opcode/opcode_string.go index 747556a7f..74852c03e 100644 --- a/pkg/vm/opcode/opcode_string.go +++ b/pkg/vm/opcode/opcode_string.go @@ -82,9 +82,56 @@ func _() { _ = x[REVERSE3-83] _ = x[REVERSE4-84] _ = x[REVERSEN-85] - _ = x[DUPFROMALTSTACK-106] - _ = x[TOALTSTACK-107] - _ = x[FROMALTSTACK-108] + _ = x[INITSSLOT-86] + _ = x[INITSLOT-87] + _ = x[LDSFLD0-88] + _ = x[LDSFLD1-89] + _ = x[LDSFLD2-90] + _ = x[LDSFLD3-91] + _ = x[LDSFLD4-92] + _ = x[LDSFLD5-93] + _ = x[LDSFLD6-94] + _ = x[LDSFLD-95] + _ = x[STSFLD0-96] + _ = x[STSFLD1-97] + _ = x[STSFLD2-98] + _ = x[STSFLD3-99] + _ = x[STSFLD4-100] + _ = x[STSFLD5-101] + _ = x[STSFLD6-102] + _ = x[STSFLD-103] + _ = x[LDLOC0-104] + _ = x[LDLOC1-105] + _ = x[LDLOC2-106] + _ = x[LDLOC3-107] + _ = x[LDLOC4-108] + _ = x[LDLOC5-109] + _ = x[LDLOC6-110] + _ = x[LDLOC-111] + _ = x[STLOC0-112] + _ = x[STLOC1-113] + _ = x[STLOC2-114] + _ = x[STLOC3-115] + _ = x[STLOC4-116] + _ = x[STLOC5-117] + _ = x[STLOC6-118] + _ = x[STLOC-119] + _ = x[LDARG0-120] + _ = x[LDARG1-121] + _ = x[LDARG2-122] + _ = x[LDARG3-123] + _ = x[LDARG4-124] + _ = x[LDARG5-125] + _ = x[LDARG6-126] + _ = x[LDARG-127] + _ = x[STARG0-128] + _ = x[STARG1-129] + _ = x[STARG2-130] + _ = x[STARG3-131] + _ = x[STARG4-132] + _ = x[STARG5-133] + _ = x[STARG6-134] + _ = x[STARG-135] _ = x[CAT-139] _ = x[SUBSTR-140] _ = x[LEFT-141] @@ -143,7 +190,7 @@ func _() { _ = x[CONVERT-219] } -const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHAPUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16NOPJMPJMPLJMPIFJMPIFLJMPIFNOTJMPIFNOTLJMPEQJMPEQLJMPNEJMPNELJMPGTJMPGTLJMPGEJMPGELJMPLTJMPLTLJMPLEJMPLELCALLCALLLCALLAABORTASSERTTHROWRETSYSCALLDEPTHDROPNIPXDROPCLEARDUPOVERPICKTUCKSWAPOLDPUSH1ROLLREVERSE3REVERSE4REVERSENDUPFROMALTSTACKTOALTSTACKFROMALTSTACKCATSUBSTRLEFTRIGHTINVERTANDORXOREQUALNOTEQUALSIGNABSNEGATEINCDECADDSUBMULDIVMODSHLSHRNOTBOOLANDBOOLORNZNUMEQUALNUMNOTEQUALLTLTEGTGTEMINMAXWITHINPACKUNPACKNEWARRAY0NEWARRAYNEWARRAYTNEWSTRUCT0NEWSTRUCTNEWMAPSIZEHASKEYKEYSVALUESPICKITEMAPPENDSETITEMREVERSEITEMSREMOVECLEARITEMSISNULLISTYPECONVERT" +const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHAPUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16NOPJMPJMPLJMPIFJMPIFLJMPIFNOTJMPIFNOTLJMPEQJMPEQLJMPNEJMPNELJMPGTJMPGTLJMPGEJMPGELJMPLTJMPLTLJMPLEJMPLELCALLCALLLCALLAABORTASSERTTHROWRETSYSCALLDEPTHDROPNIPXDROPCLEARDUPOVERPICKTUCKSWAPOLDPUSH1ROLLREVERSE3REVERSE4REVERSENINITSSLOTINITSLOTLDSFLD0LDSFLD1LDSFLD2LDSFLD3LDSFLD4LDSFLD5LDSFLD6LDSFLDSTSFLD0STSFLD1STSFLD2STSFLD3STSFLD4STSFLD5STSFLD6STSFLDLDLOC0LDLOC1LDLOC2LDLOC3LDLOC4LDLOC5LDLOC6LDLOCSTLOC0STLOC1STLOC2STLOC3STLOC4STLOC5STLOC6STLOCLDARG0LDARG1LDARG2LDARG3LDARG4LDARG5LDARG6LDARGSTARG0STARG1STARG2STARG3STARG4STARG5STARG6STARGCATSUBSTRLEFTRIGHTINVERTANDORXOREQUALNOTEQUALSIGNABSNEGATEINCDECADDSUBMULDIVMODSHLSHRNOTBOOLANDBOOLORNZNUMEQUALNUMNOTEQUALLTLTEGTGTEMINMAXWITHINPACKUNPACKNEWARRAY0NEWARRAYNEWARRAYTNEWSTRUCT0NEWSTRUCTNEWMAPSIZEHASKEYKEYSVALUESPICKITEMAPPENDSETITEMREVERSEITEMSREMOVECLEARITEMSISNULLISTYPECONVERT" var _Opcode_map = map[Opcode]string{ 0: _Opcode_name[0:8], @@ -217,65 +264,112 @@ var _Opcode_map = map[Opcode]string{ 83: _Opcode_name[390:398], 84: _Opcode_name[398:406], 85: _Opcode_name[406:414], - 106: _Opcode_name[414:429], - 107: _Opcode_name[429:439], - 108: _Opcode_name[439:451], - 139: _Opcode_name[451:454], - 140: _Opcode_name[454:460], - 141: _Opcode_name[460:464], - 142: _Opcode_name[464:469], - 144: _Opcode_name[469:475], - 145: _Opcode_name[475:478], - 146: _Opcode_name[478:480], - 147: _Opcode_name[480:483], - 151: _Opcode_name[483:488], - 152: _Opcode_name[488:496], - 153: _Opcode_name[496:500], - 154: _Opcode_name[500:503], - 155: _Opcode_name[503:509], - 156: _Opcode_name[509:512], - 157: _Opcode_name[512:515], - 158: _Opcode_name[515:518], - 159: _Opcode_name[518:521], - 160: _Opcode_name[521:524], - 161: _Opcode_name[524:527], - 162: _Opcode_name[527:530], - 168: _Opcode_name[530:533], - 169: _Opcode_name[533:536], - 170: _Opcode_name[536:539], - 171: _Opcode_name[539:546], - 172: _Opcode_name[546:552], - 177: _Opcode_name[552:554], - 179: _Opcode_name[554:562], - 180: _Opcode_name[562:573], - 181: _Opcode_name[573:575], - 182: _Opcode_name[575:578], - 183: _Opcode_name[578:580], - 184: _Opcode_name[580:583], - 185: _Opcode_name[583:586], - 186: _Opcode_name[586:589], - 187: _Opcode_name[589:595], - 192: _Opcode_name[595:599], - 193: _Opcode_name[599:605], - 194: _Opcode_name[605:614], - 195: _Opcode_name[614:622], - 196: _Opcode_name[622:631], - 197: _Opcode_name[631:641], - 198: _Opcode_name[641:650], - 200: _Opcode_name[650:656], - 202: _Opcode_name[656:660], - 203: _Opcode_name[660:666], - 204: _Opcode_name[666:670], - 205: _Opcode_name[670:676], - 206: _Opcode_name[676:684], - 207: _Opcode_name[684:690], - 208: _Opcode_name[690:697], - 209: _Opcode_name[697:709], - 210: _Opcode_name[709:715], - 211: _Opcode_name[715:725], - 216: _Opcode_name[725:731], - 217: _Opcode_name[731:737], - 219: _Opcode_name[737:744], + 86: _Opcode_name[414:423], + 87: _Opcode_name[423:431], + 88: _Opcode_name[431:438], + 89: _Opcode_name[438:445], + 90: _Opcode_name[445:452], + 91: _Opcode_name[452:459], + 92: _Opcode_name[459:466], + 93: _Opcode_name[466:473], + 94: _Opcode_name[473:480], + 95: _Opcode_name[480:486], + 96: _Opcode_name[486:493], + 97: _Opcode_name[493:500], + 98: _Opcode_name[500:507], + 99: _Opcode_name[507:514], + 100: _Opcode_name[514:521], + 101: _Opcode_name[521:528], + 102: _Opcode_name[528:535], + 103: _Opcode_name[535:541], + 104: _Opcode_name[541:547], + 105: _Opcode_name[547:553], + 106: _Opcode_name[553:559], + 107: _Opcode_name[559:565], + 108: _Opcode_name[565:571], + 109: _Opcode_name[571:577], + 110: _Opcode_name[577:583], + 111: _Opcode_name[583:588], + 112: _Opcode_name[588:594], + 113: _Opcode_name[594:600], + 114: _Opcode_name[600:606], + 115: _Opcode_name[606:612], + 116: _Opcode_name[612:618], + 117: _Opcode_name[618:624], + 118: _Opcode_name[624:630], + 119: _Opcode_name[630:635], + 120: _Opcode_name[635:641], + 121: _Opcode_name[641:647], + 122: _Opcode_name[647:653], + 123: _Opcode_name[653:659], + 124: _Opcode_name[659:665], + 125: _Opcode_name[665:671], + 126: _Opcode_name[671:677], + 127: _Opcode_name[677:682], + 128: _Opcode_name[682:688], + 129: _Opcode_name[688:694], + 130: _Opcode_name[694:700], + 131: _Opcode_name[700:706], + 132: _Opcode_name[706:712], + 133: _Opcode_name[712:718], + 134: _Opcode_name[718:724], + 135: _Opcode_name[724:729], + 139: _Opcode_name[729:732], + 140: _Opcode_name[732:738], + 141: _Opcode_name[738:742], + 142: _Opcode_name[742:747], + 144: _Opcode_name[747:753], + 145: _Opcode_name[753:756], + 146: _Opcode_name[756:758], + 147: _Opcode_name[758:761], + 151: _Opcode_name[761:766], + 152: _Opcode_name[766:774], + 153: _Opcode_name[774:778], + 154: _Opcode_name[778:781], + 155: _Opcode_name[781:787], + 156: _Opcode_name[787:790], + 157: _Opcode_name[790:793], + 158: _Opcode_name[793:796], + 159: _Opcode_name[796:799], + 160: _Opcode_name[799:802], + 161: _Opcode_name[802:805], + 162: _Opcode_name[805:808], + 168: _Opcode_name[808:811], + 169: _Opcode_name[811:814], + 170: _Opcode_name[814:817], + 171: _Opcode_name[817:824], + 172: _Opcode_name[824:830], + 177: _Opcode_name[830:832], + 179: _Opcode_name[832:840], + 180: _Opcode_name[840:851], + 181: _Opcode_name[851:853], + 182: _Opcode_name[853:856], + 183: _Opcode_name[856:858], + 184: _Opcode_name[858:861], + 185: _Opcode_name[861:864], + 186: _Opcode_name[864:867], + 187: _Opcode_name[867:873], + 192: _Opcode_name[873:877], + 193: _Opcode_name[877:883], + 194: _Opcode_name[883:892], + 195: _Opcode_name[892:900], + 196: _Opcode_name[900:909], + 197: _Opcode_name[909:919], + 198: _Opcode_name[919:928], + 200: _Opcode_name[928:934], + 202: _Opcode_name[934:938], + 203: _Opcode_name[938:944], + 204: _Opcode_name[944:948], + 205: _Opcode_name[948:954], + 206: _Opcode_name[954:962], + 207: _Opcode_name[962:968], + 208: _Opcode_name[968:975], + 209: _Opcode_name[975:987], + 210: _Opcode_name[987:993], + 211: _Opcode_name[993:1003], + 216: _Opcode_name[1003:1009], + 217: _Opcode_name[1009:1015], + 219: _Opcode_name[1015:1022], } func (i Opcode) String() string { diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index c96de3977..07ca81046 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -75,6 +75,8 @@ type VM struct { estack *Stack // execution stack. astack *Stack // alt stack. + static *Slot + // Hash to verify in CHECKSIG/CHECKMULTISIG. checkhash []byte @@ -557,15 +559,80 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro } v.estack.PushVal(result) - // Stack operations. - case opcode.TOALTSTACK: - v.astack.Push(v.estack.Pop()) + case opcode.INITSSLOT: + if v.static != nil { + panic("already initialized") + } + if parameter[0] == 0 { + panic("zero argument") + } + v.static = v.newSlot(int(parameter[0])) - case opcode.FROMALTSTACK: - v.estack.Push(v.astack.Pop()) + case opcode.INITSLOT: + if ctx.local != nil || ctx.arguments != nil { + panic("already initialized") + } + if parameter[0] == 0 && parameter[1] == 0 { + panic("zero argument") + } + if parameter[0] > 0 { + ctx.local = v.newSlot(int(parameter[0])) + } + if parameter[1] > 0 { + sz := int(parameter[1]) + ctx.arguments = v.newSlot(sz) + for i := 0; i < sz; i++ { + ctx.arguments.Set(i, v.estack.Pop().Item()) + } + } - case opcode.DUPFROMALTSTACK: - v.estack.Push(v.astack.Dup(0)) + case opcode.LDSFLD0, opcode.LDSFLD1, opcode.LDSFLD2, opcode.LDSFLD3, opcode.LDSFLD4, opcode.LDSFLD5, opcode.LDSFLD6: + item := v.static.Get(int(op - opcode.LDSFLD0)) + v.estack.PushVal(item) + + case opcode.LDSFLD: + item := v.static.Get(int(parameter[0])) + v.estack.PushVal(item) + + case opcode.STSFLD0, opcode.STSFLD1, opcode.STSFLD2, opcode.STSFLD3, opcode.STSFLD4, opcode.STSFLD5, opcode.STSFLD6: + item := v.estack.Pop().Item() + v.static.Set(int(op-opcode.STSFLD0), item) + + case opcode.STSFLD: + item := v.estack.Pop().Item() + v.static.Set(int(parameter[0]), item) + + case opcode.LDLOC0, opcode.LDLOC1, opcode.LDLOC2, opcode.LDLOC3, opcode.LDLOC4, opcode.LDLOC5, opcode.LDLOC6: + item := ctx.local.Get(int(op - opcode.LDLOC0)) + v.estack.PushVal(item) + + case opcode.LDLOC: + item := ctx.local.Get(int(parameter[0])) + v.estack.PushVal(item) + + case opcode.STLOC0, opcode.STLOC1, opcode.STLOC2, opcode.STLOC3, opcode.STLOC4, opcode.STLOC5, opcode.STLOC6: + item := v.estack.Pop().Item() + ctx.local.Set(int(op-opcode.STLOC0), item) + + case opcode.STLOC: + item := v.estack.Pop().Item() + ctx.local.Set(int(parameter[0]), item) + + case opcode.LDARG0, opcode.LDARG1, opcode.LDARG2, opcode.LDARG3, opcode.LDARG4, opcode.LDARG5, opcode.LDARG6: + item := ctx.arguments.Get(int(op - opcode.LDARG0)) + v.estack.PushVal(item) + + case opcode.LDARG: + item := ctx.arguments.Get(int(parameter[0])) + v.estack.PushVal(item) + + case opcode.STARG0, opcode.STARG1, opcode.STARG2, opcode.STARG3, opcode.STARG4, opcode.STARG5, opcode.STARG6: + item := v.estack.Pop().Item() + ctx.arguments.Set(int(op-opcode.STARG0), item) + + case opcode.STARG: + item := v.estack.Pop().Item() + ctx.arguments.Set(int(parameter[0]), item) case opcode.CAT: b := v.estack.Pop().Bytes() @@ -1134,8 +1201,9 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro case opcode.CALL, opcode.CALLL: v.checkInvocationStackSize() - newCtx := ctx.Copy() + newCtx.local = nil + newCtx.arguments = nil newCtx.rvcount = -1 v.istack.PushVal(newCtx) @@ -1149,6 +1217,8 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro } newCtx := ctx.Copy() + newCtx.local = nil + newCtx.arguments = nil newCtx.rvcount = -1 v.istack.PushVal(newCtx) v.jumpIf(newCtx, ptr.pos, true) diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 262e77cc5..a8d08c23d 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -370,10 +370,12 @@ func appendBigStruct(size uint16) []opcode.Opcode { } return append(prog, + opcode.INITSSLOT, 1, opcode.PUSHINT16, opcode.Opcode(size), opcode.Opcode(size>>8), // LE opcode.PACK, opcode.NEWSTRUCT, + opcode.STSFLD0, opcode.LDSFLD0, opcode.DUP, - opcode.PUSH0, opcode.NEWARRAY, opcode.TOALTSTACK, opcode.DUPFROMALTSTACK, + opcode.PUSH0, opcode.NEWARRAY, opcode.SWAP, opcode.APPEND, opcode.RET) } @@ -397,17 +399,17 @@ func TestStackLimit(t *testing.T) { }{ {opcode.PUSH2, 1}, {opcode.NEWARRAY, 3}, // array + 2 items - {opcode.TOALTSTACK, 3}, - {opcode.DUPFROMALTSTACK, 4}, + {opcode.STSFLD0, 3}, + {opcode.LDSFLD0, 4}, {opcode.NEWSTRUCT, 6}, // all items are copied {opcode.NEWMAP, 7}, {opcode.DUP, 8}, {opcode.PUSH2, 9}, - {opcode.DUPFROMALTSTACK, 10}, + {opcode.LDSFLD0, 10}, {opcode.SETITEM, 8}, // -3 items and 1 new element in map {opcode.DUP, 9}, {opcode.PUSH2, 10}, - {opcode.DUPFROMALTSTACK, 11}, + {opcode.LDSFLD0, 11}, {opcode.SETITEM, 8}, // -3 items and no new elements in map {opcode.DUP, 9}, {opcode.PUSH2, 10}, @@ -415,15 +417,18 @@ func TestStackLimit(t *testing.T) { {opcode.DROP, 6}, // DROP map with no elements } - prog := make([]opcode.Opcode, len(expected)) + prog := make([]opcode.Opcode, len(expected)+2) + prog[0] = opcode.INITSSLOT + prog[1] = 1 for i := range expected { - prog[i] = expected[i].inst + prog[i+2] = expected[i].inst } vm := load(makeProgram(prog...)) + require.NoError(t, vm.Step(), "failed to initialize static slot") for i := range expected { require.NoError(t, vm.Step()) - require.Equal(t, expected[i].size, vm.refs.size) + require.Equal(t, expected[i].size, vm.refs.size, "i: %d", i) } } @@ -477,18 +482,18 @@ func TestPushData4BigN(t *testing.T) { } func getEnumeratorProg(n int, isIter bool) (prog []byte) { - prog = append(prog, byte(opcode.TOALTSTACK)) + prog = []byte{byte(opcode.INITSSLOT), 1, byte(opcode.STSFLD0)} for i := 0; i < n; i++ { - prog = append(prog, byte(opcode.DUPFROMALTSTACK)) + prog = append(prog, byte(opcode.LDSFLD0)) prog = append(prog, getSyscallProg("Neo.Enumerator.Next")...) - prog = append(prog, byte(opcode.DUPFROMALTSTACK)) + prog = append(prog, byte(opcode.LDSFLD0)) prog = append(prog, getSyscallProg("Neo.Enumerator.Value")...) if isIter { - prog = append(prog, byte(opcode.DUPFROMALTSTACK)) + prog = append(prog, byte(opcode.LDSFLD0)) prog = append(prog, getSyscallProg("Neo.Iterator.Key")...) } } - prog = append(prog, byte(opcode.DUPFROMALTSTACK)) + prog = append(prog, byte(opcode.LDSFLD0)) prog = append(prog, getSyscallProg("Neo.Enumerator.Next")...) return @@ -583,7 +588,6 @@ func TestIteratorConcat(t *testing.T) { func TestIteratorKeys(t *testing.T) { prog := getSyscallProg("Neo.Iterator.Create") prog = append(prog, getSyscallProg("Neo.Iterator.Keys")...) - prog = append(prog, byte(opcode.TOALTSTACK), byte(opcode.DUPFROMALTSTACK)) prog = append(prog, getEnumeratorProg(2, false)...) v := load(prog) @@ -604,7 +608,6 @@ func TestIteratorKeys(t *testing.T) { func TestIteratorValues(t *testing.T) { prog := getSyscallProg("Neo.Iterator.Create") prog = append(prog, getSyscallProg("Neo.Iterator.Values")...) - prog = append(prog, byte(opcode.TOALTSTACK), byte(opcode.DUPFROMALTSTACK)) prog = append(prog, getEnumeratorProg(2, false)...) v := load(prog) @@ -716,11 +719,11 @@ func TestSerializeArrayBad(t *testing.T) { } func TestSerializeDupInteger(t *testing.T) { - prog := []byte{ - byte(opcode.PUSH0), byte(opcode.NEWARRAY), - byte(opcode.DUP), byte(opcode.PUSH2), byte(opcode.DUP), byte(opcode.TOALTSTACK), byte(opcode.APPEND), - byte(opcode.DUP), byte(opcode.FROMALTSTACK), byte(opcode.APPEND), - } + prog := makeProgram( + opcode.PUSH0, opcode.NEWARRAY, opcode.INITSSLOT, 1, + opcode.DUP, opcode.PUSH2, opcode.DUP, opcode.STSFLD0, opcode.APPEND, + opcode.DUP, opcode.LDSFLD0, opcode.APPEND, + ) vm := load(append(prog, getSerializeProg()...)) runVM(t, vm) @@ -801,9 +804,10 @@ func TestSerializeInterop(t *testing.T) { func callNTimes(n uint16) []byte { return makeProgram( opcode.PUSHINT16, opcode.Opcode(n), opcode.Opcode(n>>8), // little-endian - opcode.TOALTSTACK, opcode.DUPFROMALTSTACK, + opcode.INITSSLOT, 1, + opcode.STSFLD0, opcode.LDSFLD0, opcode.JMPIF, 0x3, opcode.RET, - opcode.FROMALTSTACK, opcode.DEC, + opcode.LDSFLD0, opcode.DEC, opcode.CALL, 0xF9) // -7 -> JMP to TOALTSTACK) } @@ -1171,9 +1175,10 @@ func testNEWARRAYIssue437(t *testing.T, i1, i2 opcode.Opcode, appended bool) { prog := makeProgram( opcode.PUSH2, i1, opcode.DUP, opcode.PUSH3, opcode.APPEND, - opcode.TOALTSTACK, opcode.DUPFROMALTSTACK, i2, + opcode.INITSSLOT, 1, + opcode.STSFLD0, opcode.LDSFLD0, i2, opcode.DUP, opcode.PUSH4, opcode.APPEND, - opcode.FROMALTSTACK, opcode.PUSH5, opcode.APPEND) + opcode.LDSFLD0, opcode.PUSH5, opcode.APPEND) vm := load(prog) vm.Run() @@ -1233,8 +1238,8 @@ func TestAPPEND(t *testing.T) { } func TestAPPENDCloneStruct(t *testing.T) { - prog := makeProgram(opcode.DUP, opcode.PUSH0, opcode.NEWSTRUCT, opcode.TOALTSTACK, - opcode.DUPFROMALTSTACK, opcode.APPEND, opcode.FROMALTSTACK, opcode.PUSH1, opcode.APPEND) + prog := makeProgram(opcode.DUP, opcode.PUSH0, opcode.NEWSTRUCT, opcode.INITSSLOT, 1, opcode.STSFLD0, + opcode.LDSFLD0, opcode.APPEND, opcode.LDSFLD0, opcode.PUSH1, opcode.APPEND) arr := []StackItem{&StructItem{[]StackItem{}}} runWithArgs(t, prog, NewArrayItem(arr), NewArrayItem(nil)) } @@ -2361,6 +2366,42 @@ func TestBitAndNumericOpcodes(t *testing.T) { } } +func TestSLOTOpcodes(t *testing.T) { + t.Run("Fail", func(t *testing.T) { + t.Run("EmptyStatic", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 0), nil)) + t.Run("EmptyLocal", getTestFuncForVM(makeProgram(opcode.INITSLOT, 0, 0), nil)) + t.Run("NotEnoughArguments", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 0, 2), nil, 1)) + t.Run("DoubleStatic", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 1, opcode.INITSSLOT, 1), nil)) + t.Run("DoubleLocal", getTestFuncForVM(makeProgram(opcode.INITSLOT, 1, 0, opcode.INITSLOT, 1, 0), nil)) + t.Run("DoubleArgument", getTestFuncForVM(makeProgram(opcode.INITSLOT, 0, 1, opcode.INITSLOT, 0, 1), nil, 1, 2)) + t.Run("LoadBigStatic", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 2, opcode.LDSFLD2), nil)) + t.Run("LoadBigLocal", getTestFuncForVM(makeProgram(opcode.INITSLOT, 2, 2, opcode.LDLOC2), nil, 1, 2)) + t.Run("LoadBigArgument", getTestFuncForVM(makeProgram(opcode.INITSLOT, 2, 2, opcode.LDARG2), nil, 1, 2)) + t.Run("StoreBigStatic", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 2, opcode.STSFLD2), nil, 0)) + t.Run("StoreBigLocal", getTestFuncForVM(makeProgram(opcode.INITSLOT, 2, 2, opcode.STLOC2), nil, 0, 1, 2)) + t.Run("StoreBigArgument", getTestFuncForVM(makeProgram(opcode.INITSLOT, 2, 2, opcode.STARG2), nil, 0, 1, 2)) + }) + + t.Run("Default", func(t *testing.T) { + t.Run("DefaultStatic", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 2, opcode.LDSFLD1), NullItem{})) + t.Run("DefaultLocal", getTestFuncForVM(makeProgram(opcode.INITSLOT, 2, 0, opcode.LDLOC1), NullItem{})) + t.Run("DefaultArgument", getTestFuncForVM(makeProgram(opcode.INITSLOT, 0, 2, opcode.LDARG1), 2, 2, 1)) + }) + + t.Run("Set/Get", func(t *testing.T) { + t.Run("FailCrossLoads", func(t *testing.T) { + t.Run("Static/Local", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 2, opcode.LDLOC1), nil)) + t.Run("Static/Argument", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 2, opcode.LDARG1), nil)) + t.Run("Local/Argument", getTestFuncForVM(makeProgram(opcode.INITSLOT, 0, 2, opcode.LDLOC1), nil)) + t.Run("Argument/Local", getTestFuncForVM(makeProgram(opcode.INITSLOT, 2, 0, opcode.LDARG1), nil)) + }) + + t.Run("Static", getTestFuncForVM(makeProgram(opcode.INITSSLOT, 8, opcode.STSFLD, 7, opcode.LDSFLD, 7), 42, 42)) + t.Run("Local", getTestFuncForVM(makeProgram(opcode.INITSLOT, 8, 0, opcode.STLOC, 7, opcode.LDLOC, 7), 42, 42)) + t.Run("Argument", getTestFuncForVM(makeProgram(opcode.INITSLOT, 0, 2, opcode.STARG, 1, opcode.LDARG, 1), 42, 42, 1, 2)) + }) +} + func makeProgram(opcodes ...opcode.Opcode) []byte { prog := make([]byte, len(opcodes)+1) // RET for i := 0; i < len(opcodes); i++ { From e21015233be634d6feb1a66df7983913f908a505 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Fri, 8 May 2020 16:10:33 +0300 Subject: [PATCH 6/7] compiler: implement shadowing of global variables Before introducing slots it was hard to change global variables preserving changes across multiple function calls. This commit implements such possibility. Closes #638. --- pkg/compiler/codegen.go | 3 +++ pkg/compiler/global_test.go | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 pkg/compiler/global_test.go diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index 7d2f6e86e..ca1766d97 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -410,6 +410,9 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { if !multiRet { c.registerDebugVariable(t.Name, n.Rhs[i]) } + if t.Name != "_" { + c.scope.newLocal(t.Name) + } fallthrough default: if i == 0 || !multiRet { diff --git a/pkg/compiler/global_test.go b/pkg/compiler/global_test.go new file mode 100644 index 000000000..ede29b849 --- /dev/null +++ b/pkg/compiler/global_test.go @@ -0,0 +1,21 @@ +package compiler_test + +import ( + "math/big" + "testing" +) + +func TestChangeGlobal(t *testing.T) { + src := `package foo + var a int + func Main() int { + setLocal() + set42() + setLocal() + return a + } + func set42() { a = 42 } + func setLocal() { a := 10; _ = a }` + + eval(t, src, big.NewInt(42)) +} From 89b5e92b830e3dd65c2f6284428893089669c940 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 12 May 2020 16:22:46 +0300 Subject: [PATCH 7/7] compiler: add tests for function literal Add test forgotten in #934. --- pkg/compiler/lambda_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 pkg/compiler/lambda_test.go diff --git a/pkg/compiler/lambda_test.go b/pkg/compiler/lambda_test.go new file mode 100644 index 000000000..d9ab32613 --- /dev/null +++ b/pkg/compiler/lambda_test.go @@ -0,0 +1,15 @@ +package compiler_test + +import ( + "math/big" + "testing" +) + +func TestFuncLiteral(t *testing.T) { + src := `package foo + func Main() int { + inc := func(x int) int { return x + 1 } + return inc(1) + inc(2) + }` + eval(t, src, big.NewInt(5)) +}