# Nimbus # Copyright (c) 2018 Status Research & Development GmbH # Licensed under either of # * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or # http://www.apache.org/licenses/LICENSE-2.0) # * MIT license ([LICENSE-MIT](LICENSE-MIT) or # http://opensource.org/licenses/MIT) # at your option. This file may not be copied, modified, or distributed except # according to those terms. ## EVM Opcode Handlers: Swap Operations ## ==================================== ## const kludge {.intdefine.}: int = 0 breakCircularDependency {.used.} = kludge > 0 import ./oph_defs, ./oph_helpers, sequtils, strformat # ------------------------------------------------------------------------------ # Kludge BEGIN # ------------------------------------------------------------------------------ when not breakCircularDependency: import ../../stack else: # function stubs from stack.nim (to satisfy compiler logic) proc swap(stack: var Stack, position: int) = discard # ------------------------------------------------------------------------------ # Kludge END # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Private, names & settings # ------------------------------------------------------------------------------ proc fnName(n: int): string {.compileTime.} = &"swap{n}Op" proc opName(n: int): string {.compileTime.} = &"Swap{n}" proc fnInfo(n: int): string {.compileTime.} = var blurb = case n+1 of 1: "first" of 2: "second" of 3: "third" else: &"{n+1}th" &"Exchange first and {blurb} stack items" proc swapImpl(k: Vm2Ctx; n: int) = k.cpt.stack.swap(n) const inxRange = toSeq(1 .. 16) # ------------------------------------------------------------------------------ # Private, op handlers implementation # ------------------------------------------------------------------------------ genOphHandlers fnName, fnInfo, inxRange, swapImpl # ------------------------------------------------------------------------------ # Public, op exec table entries # ------------------------------------------------------------------------------ genOphList fnName, fnInfo, inxRange, "vm2OpExecSwap", opName # ------------------------------------------------------------------------------ # End # ------------------------------------------------------------------------------