github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/equity/compiler/builtins.go (about) 1 package compiler 2 3 type builtin struct { 4 name string 5 opcodes string 6 args []typeDesc 7 result typeDesc 8 } 9 10 var builtins = []builtin{ 11 {"sha3", "SHA3", []typeDesc{nilType}, hashType}, 12 {"sha256", "SHA256", []typeDesc{nilType}, hashType}, 13 {"size", "SIZE SWAP DROP", []typeDesc{nilType}, intType}, 14 {"abs", "ABS", []typeDesc{intType}, intType}, 15 {"min", "MIN", []typeDesc{intType, intType}, intType}, 16 {"max", "MAX", []typeDesc{intType, intType}, intType}, 17 {"checkTxSig", "TXSIGHASH SWAP CHECKSIG", []typeDesc{pubkeyType, sigType}, boolType}, 18 {"concat", "CAT", []typeDesc{nilType, nilType}, strType}, 19 {"concatpush", "CATPUSHDATA", []typeDesc{nilType, nilType}, strType}, 20 {"below", "BLOCKHEIGHT GREATERTHAN", []typeDesc{intType}, boolType}, 21 {"above", "BLOCKHEIGHT LESSTHAN", []typeDesc{intType}, boolType}, 22 {"checkTxMultiSig", "", []typeDesc{listType, listType}, boolType}, // WARNING WARNING WOOP WOOP special case 23 } 24 25 type binaryOp struct { 26 op string 27 precedence int 28 opcodes string 29 30 left, right, result typeDesc 31 } 32 33 var binaryOps = []binaryOp{ 34 {"||", 1, "BOOLOR", "Boolean", "Boolean", "Boolean"}, 35 {"&&", 2, "BOOLAND", "Boolean", "Boolean", "Boolean"}, 36 37 {">", 3, "GREATERTHAN", "Integer", "Integer", "Boolean"}, 38 {"<", 3, "LESSTHAN", "Integer", "Integer", "Boolean"}, 39 {">=", 3, "GREATERTHANOREQUAL", "Integer", "Integer", "Boolean"}, 40 {"<=", 3, "LESSTHANOREQUAL", "Integer", "Integer", "Boolean"}, 41 42 {"==", 3, "EQUAL", "", "", "Boolean"}, 43 {"!=", 3, "EQUAL NOT", "", "", "Boolean"}, 44 45 {"^", 4, "XOR", "", "", ""}, 46 {"|", 4, "OR", "", "", ""}, 47 48 {"+", 4, "ADD", "Integer", "Integer", "Integer"}, 49 {"-", 4, "SUB", "Integer", "Integer", "Integer"}, 50 51 // {"&^", 5, "INVERT AND", "", "", ""}, 52 {"&", 5, "AND", "", "", ""}, 53 54 {"<<", 5, "LSHIFT", "Integer", "Integer", "Integer"}, 55 {">>", 5, "RSHIFT", "Integer", "Integer", "Integer"}, 56 57 {"%", 5, "MOD", "Integer", "Integer", "Integer"}, 58 {"*", 5, "MUL", "Integer", "Integer", "Integer"}, 59 {"/", 5, "DIV", "Integer", "Integer", "Integer"}, 60 } 61 62 type unaryOp struct { 63 op string 64 opcodes string 65 66 operand, result typeDesc 67 } 68 69 var unaryOps = []unaryOp{ 70 {"-", "NEGATE", "Integer", "Integer"}, 71 72 {"!", "NOT", "Boolean", "Boolean"}, 73 74 {"~", "INVERT", "", ""}, 75 }