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
25 type binaryOp struct {
30 left, right, result typeDesc
33 var binaryOps = []binaryOp{
34 // disjunctions disallowed (for now?)
35 // {"||", 1, "BOOLOR", "Boolean", "Boolean", "Boolean"},
37 // and disallow this too
38 // {"&&", 2, "BOOLAND", "Boolean", "Boolean", "Boolean"},
40 {">", 3, "GREATERTHAN", "Integer", "Integer", "Boolean"},
41 {"<", 3, "LESSTHAN", "Integer", "Integer", "Boolean"},
42 {">=", 3, "GREATERTHANOREQUAL", "Integer", "Integer", "Boolean"},
43 {"<=", 3, "LESSTHANOREQUAL", "Integer", "Integer", "Boolean"},
45 {"==", 3, "EQUAL", "", "", "Boolean"},
46 {"!=", 3, "EQUAL NOT", "", "", "Boolean"},
48 {"^", 4, "XOR", "", "", ""},
49 {"|", 4, "OR", "", "", ""},
51 {"+", 4, "ADD", "Integer", "Integer", "Integer"},
52 {"-", 4, "SUB", "Integer", "Integer", "Integer"},
54 // {"&^", 5, "INVERT AND", "", "", ""},
55 {"&", 5, "AND", "", "", ""},
57 {"<<", 5, "LSHIFT", "Integer", "Integer", "Integer"},
58 {">>", 5, "RSHIFT", "Integer", "Integer", "Integer"},
60 {"%", 5, "MOD", "Integer", "Integer", "Integer"},
61 {"*", 5, "MUL", "Integer", "Integer", "Integer"},
62 {"/", 5, "DIV", "Integer", "Integer", "Integer"},
69 operand, result typeDesc
72 var unaryOps = []unaryOp{
73 {"-", "NEGATE", "Integer", "Integer"},
75 // not not allowed (for now?)
76 // {"!", "NOT", "Boolean", "Boolean"},
78 {"~", "INVERT", "", ""},