+++ /dev/null
-package compiler
-
-import "strings"
-
-var optimizations = []struct {
- before, after string
-}{
- {"0 ROLL", ""},
- {"0 PICK", "DUP"},
- {"1 ROLL", "SWAP"},
- {"1 PICK", "OVER"},
- {"2 ROLL", "ROT"},
- {"TRUE VERIFY", ""},
- {"SWAP SWAP", ""},
- {"OVER OVER", "2DUP"},
- {"SWAP OVER", "TUCK"},
- {"DROP DROP", "2DROP"},
- {"SWAP DROP", "NIP"},
- {"5 ROLL 5 ROLL", "2ROT"},
- {"3 PICK 3 PICK", "2OVER"},
- {"3 ROLL 3 ROLL", "2SWAP"},
- {"2 PICK 2 PICK 2 PICK", "3DUP"},
- {"1 ADD", "1ADD"},
- {"1 SUB", "1SUB"},
- {"EQUAL VERIFY", "EQUALVERIFY"},
- {"SWAP TXSIGHASH ROT", "TXSIGHASH SWAP"},
- {"SWAP EQUAL", "EQUAL"},
- {"SWAP EQUALVERIFY", "EQUALVERIFY"},
- {"SWAP ADD", "ADD"},
- {"SWAP BOOLAND", "BOOLAND"},
- {"SWAP BOOLOR", "BOOLOR"},
- {"SWAP MIN", "MIN"},
- {"SWAP MAX", "MAX"},
- {"DUP 2 PICK EQUAL", "2DUP EQUAL"},
- {"DUP 2 PICK EQUALVERIFY", "2DUP EQUALVERIFY"},
- {"DUP 2 PICK ADD", "2DUP ADD"},
- {"DUP 2 PICK BOOLAND", "2DUP BOOLAND"},
- {"DUP 2 PICK BOOLOR", "2DUP BOOLOR"},
- {"DUP 2 PICK MIN", "2DUP MIN"},
- {"DUP 2 PICK MAX", "2DUP MAX"},
-}
-
-func optimize(opcodes string) string {
- opcodes = " " + opcodes + " "
- looping := true
- for looping {
- looping = false
- for _, o := range optimizations {
- before := " " + o.before + " "
- var after string
- if o.after == "" {
- after = " "
- } else {
- after = " " + o.after + " "
- }
- newOpcodes := strings.Replace(opcodes, before, after, -1)
- if newOpcodes != opcodes {
- looping = true
- opcodes = newOpcodes
- }
- }
- }
- return strings.TrimSpace(opcodes)
-}