diff --git a/core/vm/gen/main.go b/core/vm/gen/main.go index 7cdf4b6eb7..a555cd7300 100644 --- a/core/vm/gen/main.go +++ b/core/vm/gen/main.go @@ -196,7 +196,36 @@ func (g *generator) inlineBody(handler string) string { } out.WriteString(line + "\n") } - return out.String() + return expandStackHelpers(out.String()) +} + +// The compiler shrinks its inlining budget into very large functions, and +// execUntraced is far past the size threshold. The cheap stack helpers +// (pop1, len, peek, drop, back) still inline there, but get and the +// pop1Peek1 family turn into real calls, which a snailtracer profile put at +// over a tenth of the run. The generator splices those helper bodies in +// textually wherever they appear in statement position, verbatim from +// stack.go. +var ( + pop1Peek1Re = regexp.MustCompile(`(?m)^(\s*)(\w+), (\w+) := scope\.Stack\.pop1Peek1\(\)$`) + pop2Peek1Re = regexp.MustCompile(`(?m)^(\s*)(\w+), (\w+), (\w+) := scope\.Stack\.pop2Peek1\(\)$`) + pop2Re = regexp.MustCompile(`(?m)^(\s*)(\w+), (\w+) := scope\.Stack\.pop2\(\)$`) + getAssignRe = regexp.MustCompile(`(?m)^(\s*)(\w+) := scope\.Stack\.get\(\)$`) + getCallRe = regexp.MustCompile(`(?m)^(\s*)scope\.Stack\.get\(\)\.(\w+)\((.*)\)$`) +) + +func expandStackHelpers(src string) string { + src = pop1Peek1Re.ReplaceAllString(src, + "${1}stack.inner.top--\n${1}stack.size--\n${1}$2 := &stack.inner.data[stack.inner.top]\n${1}$3 := &stack.inner.data[stack.inner.top-1]") + src = pop2Peek1Re.ReplaceAllString(src, + "${1}stack.inner.top -= 2\n${1}stack.size -= 2\n${1}$2 := &stack.inner.data[stack.inner.top+1]\n${1}$3 := &stack.inner.data[stack.inner.top]\n${1}$4 := &stack.inner.data[stack.inner.top-1]") + src = pop2Re.ReplaceAllString(src, + "${1}stack.inner.top -= 2\n${1}stack.size -= 2\n${1}$2 := &stack.inner.data[stack.inner.top+1]\n${1}$3 := &stack.inner.data[stack.inner.top]") + src = getAssignRe.ReplaceAllString(src, + "${1}$2 := &stack.inner.data[stack.inner.top]\n${1}stack.inner.top++\n${1}stack.size++") + src = getCallRe.ReplaceAllString(src, + "${1}stack.inner.data[stack.inner.top].$2($3)\n${1}stack.inner.top++\n${1}stack.size++") + return src } // --------------------------------------------------------------------------- @@ -322,12 +351,21 @@ func (g *generator) emitWork(code byte) { switch { case code >= 0x62 && code <= 0x7f: // PUSH3-PUSH32: inline makePush(n,n) g.emitPushFixed(int(code) - 0x5f) - case code >= 0x80 && code <= 0x8f: // DUP1-DUP16: inline makeDup(n) + case code >= 0x80 && code <= 0x8f: // DUP1-DUP16: the dup body, emitted raw g.p(` - scope.Stack.dup(%d) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-%d] + stack.size++ + stack.inner.top++ pc++ continue mainLoop `, int(code)-0x7f) + case code >= 0x90 && code <= 0x9f: // SWAP1-SWAP16: the swap body, emitted raw + n := int(code) - 0x8f + g.p(` + stack.inner.data[stack.bottom+stack.size-%d], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-%d] + pc++ + continue mainLoop + `, n+1, n+1) default: g.p("%s", g.inlineBody(inlineHandler[code])) } @@ -339,7 +377,9 @@ func (g *generator) emitPushFixed(n int) { codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+%d) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := %d - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) diff --git a/core/vm/interp_gen.go b/core/vm/interp_gen.go index 799545f1f5..4dae39b7ef 100644 --- a/core/vm/interp_gen.go +++ b/core/vm/interp_gen.go @@ -50,7 +50,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Add(x, y) pc++ continue mainLoop @@ -63,7 +66,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 5 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Mul(x, y) pc++ continue mainLoop @@ -76,7 +82,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Sub(x, y) pc++ continue mainLoop @@ -89,7 +98,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 5 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Div(x, y) pc++ continue mainLoop @@ -102,7 +114,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 5 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.SDiv(x, y) pc++ continue mainLoop @@ -115,7 +130,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 5 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Mod(x, y) pc++ continue mainLoop @@ -128,7 +146,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 5 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.SMod(x, y) pc++ continue mainLoop @@ -141,7 +162,11 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 8 - x, y, z := scope.Stack.pop2Peek1() + stack.inner.top -= 2 + stack.size -= 2 + x := &stack.inner.data[stack.inner.top+1] + y := &stack.inner.data[stack.inner.top] + z := &stack.inner.data[stack.inner.top-1] z.AddMod(x, y, z) pc++ continue mainLoop @@ -154,7 +179,11 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 8 - x, y, z := scope.Stack.pop2Peek1() + stack.inner.top -= 2 + stack.size -= 2 + x := &stack.inner.data[stack.inner.top+1] + y := &stack.inner.data[stack.inner.top] + z := &stack.inner.data[stack.inner.top-1] z.MulMod(x, y, z) pc++ continue mainLoop @@ -167,7 +196,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 5 - back, num := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + back := &stack.inner.data[stack.inner.top] + num := &stack.inner.data[stack.inner.top-1] num.ExtendSign(num, back) pc++ continue mainLoop @@ -180,7 +212,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] if x.Lt(y) { y.SetOne() } else { @@ -197,7 +232,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] if x.Gt(y) { y.SetOne() } else { @@ -214,7 +252,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] if x.Slt(y) { y.SetOne() } else { @@ -231,7 +272,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] if x.Sgt(y) { y.SetOne() } else { @@ -248,7 +292,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] if x.Eq(y) { y.SetOne() } else { @@ -282,7 +329,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.And(x, y) pc++ continue mainLoop @@ -295,7 +345,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Or(x, y) pc++ continue mainLoop @@ -308,7 +361,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - x, y := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + x := &stack.inner.data[stack.inner.top] + y := &stack.inner.data[stack.inner.top-1] y.Xor(x, y) pc++ continue mainLoop @@ -334,7 +390,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - th, val := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + th := &stack.inner.data[stack.inner.top] + val := &stack.inner.data[stack.inner.top-1] val.Byte(th) pc++ continue mainLoop @@ -348,7 +407,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - shift, value := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + shift := &stack.inner.data[stack.inner.top] + value := &stack.inner.data[stack.inner.top-1] if shift.LtUint64(256) { value.Lsh(value, uint(shift.Uint64())) } else { @@ -369,7 +431,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - shift, value := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + shift := &stack.inner.data[stack.inner.top] + value := &stack.inner.data[stack.inner.top-1] if shift.LtUint64(256) { value.Rsh(value, uint(shift.Uint64())) } else { @@ -390,7 +455,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - shift, value := scope.Stack.pop1Peek1() + stack.inner.top-- + stack.size-- + shift := &stack.inner.data[stack.inner.top] + value := &stack.inner.data[stack.inner.top-1] if shift.GtUint64(256) { if value.Sign() >= 0 { value.Clear() @@ -615,7 +683,10 @@ mainLoop: res, err = nil, errStopToken break mainLoop } - pos, cond := scope.Stack.pop2() + stack.inner.top -= 2 + stack.size -= 2 + pos := &stack.inner.data[stack.inner.top+1] + cond := &stack.inner.data[stack.inner.top] if !cond.IsZero() { if !scope.Contract.validJumpdest(pos) { res, err = nil, ErrInvalidJump @@ -634,7 +705,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 2 - scope.Stack.get().SetUint64(pc) + stack.inner.data[stack.inner.top].SetUint64(pc) + stack.inner.top++ + stack.size++ pc++ continue mainLoop @@ -646,7 +719,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 2 - scope.Stack.get().SetUint64(uint64(scope.Memory.Len())) + stack.inner.data[stack.inner.top].SetUint64(uint64(scope.Memory.Len())) + stack.inner.top++ + stack.size++ pc++ continue mainLoop @@ -667,7 +742,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 2 - scope.Stack.get().Clear() + stack.inner.data[stack.inner.top].Clear() + stack.inner.top++ + stack.size++ pc++ continue mainLoop @@ -753,7 +830,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+3) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 3 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -780,7 +859,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+4) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 4 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -807,7 +888,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+5) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 5 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -834,7 +917,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+6) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 6 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -861,7 +946,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+7) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 7 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -888,7 +975,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+8) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 8 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -915,7 +1004,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+9) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 9 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -942,7 +1033,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+10) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 10 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -969,7 +1062,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+11) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 11 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -996,7 +1091,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+12) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 12 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1023,7 +1120,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+13) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 13 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1050,7 +1149,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+14) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 14 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1077,7 +1178,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+15) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 15 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1104,7 +1207,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+16) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 16 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1131,7 +1236,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+17) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 17 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1158,7 +1265,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+18) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 18 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1185,7 +1294,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+19) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 19 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1212,7 +1323,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+20) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 20 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1239,7 +1352,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+21) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 21 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1266,7 +1381,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+22) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 22 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1293,7 +1410,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+23) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 23 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1320,7 +1439,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+24) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 24 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1347,7 +1468,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+25) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 25 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1374,7 +1497,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+26) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 26 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1401,7 +1526,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+27) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 27 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1428,7 +1555,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+28) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 28 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1455,7 +1584,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+29) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 29 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1482,7 +1613,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+30) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 30 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1509,7 +1642,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+31) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 31 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1536,7 +1671,9 @@ mainLoop: codeLen := len(scope.Contract.Code) start := min(codeLen, int(pc+1)) end := min(codeLen, start+32) - a := scope.Stack.get() + a := &stack.inner.data[stack.inner.top] + stack.inner.top++ + stack.size++ a.SetBytes(scope.Contract.Code[start:end]) if missing := 32 - (end - start); missing > 0 { a.Lsh(a, uint(8*missing)) @@ -1554,7 +1691,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(1) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-1] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP2: @@ -1567,7 +1706,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(2) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-2] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP3: @@ -1580,7 +1721,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(3) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-3] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP4: @@ -1593,7 +1736,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(4) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-4] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP5: @@ -1606,7 +1751,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(5) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-5] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP6: @@ -1619,7 +1766,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(6) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-6] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP7: @@ -1632,7 +1781,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(7) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-7] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP8: @@ -1645,7 +1796,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(8) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-8] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP9: @@ -1658,7 +1811,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(9) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-9] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP10: @@ -1671,7 +1826,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(10) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-10] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP11: @@ -1684,7 +1841,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(11) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-11] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP12: @@ -1697,7 +1856,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(12) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-12] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP13: @@ -1710,7 +1871,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(13) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-13] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP14: @@ -1723,7 +1886,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(14) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-14] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP15: @@ -1736,7 +1901,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(15) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-15] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case DUP16: @@ -1749,7 +1916,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.dup(16) + stack.inner.data[stack.bottom+stack.size] = stack.inner.data[stack.bottom+stack.size-16] + stack.size++ + stack.inner.top++ pc++ continue mainLoop case SWAP1: @@ -1760,10 +1929,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap1() + stack.inner.data[stack.bottom+stack.size-2], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-2] pc++ continue mainLoop - case SWAP2: if sLen := stack.len(); sLen < 3 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 3} @@ -1772,10 +1940,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap2() + stack.inner.data[stack.bottom+stack.size-3], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-3] pc++ continue mainLoop - case SWAP3: if sLen := stack.len(); sLen < 4 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 4} @@ -1784,10 +1951,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap3() + stack.inner.data[stack.bottom+stack.size-4], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-4] pc++ continue mainLoop - case SWAP4: if sLen := stack.len(); sLen < 5 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 5} @@ -1796,10 +1962,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap4() + stack.inner.data[stack.bottom+stack.size-5], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-5] pc++ continue mainLoop - case SWAP5: if sLen := stack.len(); sLen < 6 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 6} @@ -1808,10 +1973,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap5() + stack.inner.data[stack.bottom+stack.size-6], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-6] pc++ continue mainLoop - case SWAP6: if sLen := stack.len(); sLen < 7 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 7} @@ -1820,10 +1984,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap6() + stack.inner.data[stack.bottom+stack.size-7], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-7] pc++ continue mainLoop - case SWAP7: if sLen := stack.len(); sLen < 8 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 8} @@ -1832,10 +1995,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap7() + stack.inner.data[stack.bottom+stack.size-8], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-8] pc++ continue mainLoop - case SWAP8: if sLen := stack.len(); sLen < 9 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 9} @@ -1844,10 +2006,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap8() + stack.inner.data[stack.bottom+stack.size-9], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-9] pc++ continue mainLoop - case SWAP9: if sLen := stack.len(); sLen < 10 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 10} @@ -1856,10 +2017,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap9() + stack.inner.data[stack.bottom+stack.size-10], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-10] pc++ continue mainLoop - case SWAP10: if sLen := stack.len(); sLen < 11 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 11} @@ -1868,10 +2028,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap10() + stack.inner.data[stack.bottom+stack.size-11], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-11] pc++ continue mainLoop - case SWAP11: if sLen := stack.len(); sLen < 12 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 12} @@ -1880,10 +2039,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap11() + stack.inner.data[stack.bottom+stack.size-12], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-12] pc++ continue mainLoop - case SWAP12: if sLen := stack.len(); sLen < 13 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 13} @@ -1892,10 +2050,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap12() + stack.inner.data[stack.bottom+stack.size-13], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-13] pc++ continue mainLoop - case SWAP13: if sLen := stack.len(); sLen < 14 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 14} @@ -1904,10 +2061,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap13() + stack.inner.data[stack.bottom+stack.size-14], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-14] pc++ continue mainLoop - case SWAP14: if sLen := stack.len(); sLen < 15 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 15} @@ -1916,10 +2072,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap14() + stack.inner.data[stack.bottom+stack.size-15], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-15] pc++ continue mainLoop - case SWAP15: if sLen := stack.len(); sLen < 16 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 16} @@ -1928,10 +2083,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap15() + stack.inner.data[stack.bottom+stack.size-16], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-16] pc++ continue mainLoop - case SWAP16: if sLen := stack.len(); sLen < 17 { return nil, &ErrStackUnderflow{stackLen: sLen, required: 17} @@ -1940,10 +2094,9 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 3 - scope.Stack.swap16() + stack.inner.data[stack.bottom+stack.size-17], stack.inner.data[stack.bottom+stack.size-1] = stack.inner.data[stack.bottom+stack.size-1], stack.inner.data[stack.bottom+stack.size-17] pc++ continue mainLoop - default: operation := table[op] if sLen := stack.len(); sLen < operation.minStack {