diff --git a/vm/gen/main.go b/vm/gen/main.go index 86d9ffb9..cfd80fd5 100644 --- a/vm/gen/main.go +++ b/vm/gen/main.go @@ -447,11 +447,12 @@ func (e *emitter) emitShapedBody(op opDef) { e.p("}\n") case shapePop1: - e.p("if interp.Stack.top == 0 {\n") + e.p("s := interp.Stack\n") + e.p("if s.top == 0 {\n") e.emitFlushOnError() e.p("interp.HaltUnderflow()\n") e.p("} else {\n") - e.emitBody(op) + e.p("s.top--\n") e.p("}\n") case shapeCustom: diff --git a/vm/table_gen.go b/vm/table_gen.go index 36f92e82..fbe75596 100644 --- a/vm/table_gen.go +++ b/vm/table_gen.go @@ -1098,7 +1098,8 @@ func (DefaultRunner) Run(interp *Interpreter, host Host) { } case opcode.POP: gasCounter += spec.GasBase - if interp.Stack.top == 0 { + s := interp.Stack + if s.top == 0 { if gas.remaining < gasCounter { interp.HaltOOG() return @@ -1107,9 +1108,7 @@ func (DefaultRunner) Run(interp *Interpreter, host Host) { gasCounter = 0 interp.HaltUnderflow() } else { - - interp.Stack.top-- - + s.top-- } case opcode.MLOAD: gasCounter += spec.GasVerylow @@ -3131,12 +3130,11 @@ func (r *TracingRunner) Run(interp *Interpreter, host Host) { return } gas.remaining -= spec.GasBase - if interp.Stack.top == 0 { + s := interp.Stack + if s.top == 0 { interp.HaltUnderflow() } else { - - interp.Stack.top-- - + s.top-- } case opcode.MLOAD: if gas.remaining < spec.GasVerylow {