From 7eafd75d17ed57bde0af2e8decaab17d50d09ee4 Mon Sep 17 00:00:00 2001 From: andri lim Date: Sun, 7 Apr 2019 11:35:13 +0700 Subject: [PATCH] separate tangerine whistle and spurious dragon opcode dispatcher --- nimbus/vm/interpreter_dispatch.nim | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/nimbus/vm/interpreter_dispatch.nim b/nimbus/vm/interpreter_dispatch.nim index ee5ce8469..22b87faee 100644 --- a/nimbus/vm/interpreter_dispatch.nim +++ b/nimbus/vm/interpreter_dispatch.nim @@ -184,6 +184,18 @@ proc genHomesteadJumpTable(ops: array[Op, NimNode]): array[Op, NimNode] {.compil let HomesteadOpDispatch {.compileTime.}: array[Op, NimNode] = genHomesteadJumpTable(FrontierOpDispatch) +proc genTangerineJumpTable(ops: array[Op, NimNode]): array[Op, NimNode] {.compileTime.} = + result = ops + result[SelfDestruct] = newIdentNode "selfDestructEIP150" + +let TangerineOpDispatch {.compileTime.}: array[Op, NimNode] = genTangerineJumpTable(HomesteadOpDispatch) + +proc genSpuriousJumpTable(ops: array[Op, NimNode]): array[Op, NimNode] {.compileTime.} = + result = ops + result[SelfDestruct] = newIdentNode "selfDestructEIP161" + +let SpuriousOpDispatch {.compileTime.}: array[Op, NimNode] = genSpuriousJumpTable(TangerineOpDispatch) + proc opTableToCaseStmt(opTable: array[Op, NimNode], computation: NimNode): NimNode = let instr = quote do: `computation`.instr @@ -245,19 +257,35 @@ macro genFrontierDispatch(computation: BaseComputation): untyped = macro genHomesteadDispatch(computation: BaseComputation): untyped = result = opTableToCaseStmt(HomesteadOpDispatch, computation) +macro genTangerineDispatch(computation: BaseComputation): untyped = + result = opTableToCaseStmt(TangerineOpDispatch, computation) + +macro genSpuriousDispatch(computation: BaseComputation): untyped = + result = opTableToCaseStmt(SpuriousOpDispatch, computation) + proc frontierVM(computation: BaseComputation) = genFrontierDispatch(computation) proc homesteadVM(computation: BaseComputation) = genHomesteadDispatch(computation) +proc tangerineVM(computation: BaseComputation) = + genTangerineDispatch(computation) + +proc spuriousVM(computation: BaseComputation) = + genSpuriousDispatch(computation) + proc selectVM(computation: BaseComputation, fork: Fork) = # TODO: Optimise getting fork and updating opCodeExec only when necessary case fork of FkFrontier..FkThawing: computation.frontierVM() - of FkHomestead..FkSpurious: + of FkHomestead..FkDao: computation.homesteadVM() + of FkTangerine: + computation.tangerineVM() + of FkSpurious: + computation.spuriousVM() else: raise newException(VMError, "Unknown or not implemented fork: " & $fork)