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  }