From 36b253872fab62e76bb4e58d7816307337c055a0 Mon Sep 17 00:00:00 2001 From: Anthony De Meulemeester Date: Fri, 26 Oct 2018 21:16:06 +0200 Subject: [PATCH] WIP Imported from CityOfZion/neo-storm (cbfc89972e977fa808e9f68c9ad5c6c18bef291d). --- pkg/vm/compiler/codegen.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg/vm/compiler/codegen.go b/pkg/vm/compiler/codegen.go index 0071bf131..8a1ceb622 100644 --- a/pkg/vm/compiler/codegen.go +++ b/pkg/vm/compiler/codegen.go @@ -430,10 +430,29 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { if !isBuiltin { if numArgs == 2 { emitOpcode(c.prog, vm.SWAP) - } - if numArgs == 3 { + } else if numArgs == 3 { emitInt(c.prog, 2) emitOpcode(c.prog, vm.XSWAP) + } else { + half := int(numArgs / 2) + + for i := 0; i < half; i++ { + to := numArgs - 1 - i + + emitInt(c.prog, int64(to)) + emitOpcode(c.prog, vm.PICK) + + emitInt(c.prog, int64(i+1)) + emitOpcode(c.prog, vm.PICK) + + emitInt(c.prog, int64(to+2)) + emitOpcode(c.prog, vm.XSWAP) + emitOpcode(c.prog, vm.DROP) + + emitInt(c.prog, int64(i+1)) + emitOpcode(c.prog, vm.XSWAP) + emitOpcode(c.prog, vm.DROP) + } } }