core/vm: splice stack helper bodies into the generated switch

This commit is contained in:
jonny rhea 2026-06-18 14:11:04 -05:00
parent 12eb1f1e02
commit c52874d654
2 changed files with 301 additions and 108 deletions

View file

@ -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))

View file

@ -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 {