diff --git a/builtin/builtin.c b/builtin/builtin.c index 2e66ffb..b0cb579 100644 --- a/builtin/builtin.c +++ b/builtin/builtin.c @@ -1,5 +1,6 @@ #include #include "../include/share.h" +#include "../include/SVM_code.h" #include "../compiler/summoner.h" static BasicType sha3_params[] = {HEX_TYPE}; @@ -14,18 +15,30 @@ static BasicType above_params[] = {INT_TYPE, BOOLEAN_TYPE}; static BasicType lock_params[] = {AMOUNT_TYPE, ASSET_TYPE, HEX_TYPE, HEX_TYPE}; static BasicType verify_params[] = {BOOLEAN_TYPE}; +static SVM_Opcode sha3_ops[] = {OP_SHA3}; +static SVM_Opcode sha256_ops[] = {OP_SHA256}; +static SVM_Opcode abs_ops[] = {OP_ABS}; +static SVM_Opcode min_ops[] = {OP_MIN}; +static SVM_Opcode max_ops[] = {OP_MAX}; +static SVM_Opcode check_tx_sig_ops[] = {OP_TXSIGHASH, OP_SWAP, OP_CHECKSIG}; +static SVM_Opcode check_msg_sig_ops[] = {OP_CHECKSIG}; +static SVM_Opcode below_ops[] = {OP_BLOCKHEIGHT, OP_GREATERTHAN}; +static SVM_Opcode above_ops[] = {OP_BLOCKHEIGHT, OP_LESSTHAN}; +static SVM_Opcode lock_ops[] = {OP_CHECKOUTPUT, OP_VERIFY}; +static SVM_Opcode verify_ops[] = {OP_VERIFY}; + BuiltinFun builtin_func_list[] = { - {"sha3", sha3_params, ARRAY_SIZE(sha3_params), HASH_TYPE, "SHA3"}, - {"sha256", sha256_params, ARRAY_SIZE(sha256_params), HASH_TYPE, "SHA256"}, - {"abs", abs_params, ARRAY_SIZE(abs_params), INT_TYPE, "ABS"}, - {"min", min_params, ARRAY_SIZE(min_params), INT_TYPE, "MIN"}, - {"max", max_params, ARRAY_SIZE(max_params), INT_TYPE, "MAX"}, - {"check_tx_sig", check_tx_sig_params, ARRAY_SIZE(check_tx_sig_params), BOOLEAN_TYPE, "TXSIGHASH SWAP CHECKSIG"}, - {"check_msg_sig", check_msg_sig_params, ARRAY_SIZE(check_msg_sig_params), BOOLEAN_TYPE, "CHECKSIG"}, - {"below", below_params, ARRAY_SIZE(below_params), BOOLEAN_TYPE, "BLOCKHEIGHT GREATERTHAN"}, - {"above", above_params, ARRAY_SIZE(above_params), BOOLEAN_TYPE, "BLOCKHEIGHT LESSTHAN"}, - {"lock", lock_params, ARRAY_SIZE(lock_params), VOID_TYPE, ""}, - {"verify", verify_params, ARRAY_SIZE(verify_params), VOID_TYPE, "VERIFY"}, + {"sha3", sha3_params, ARRAY_SIZE(sha3_params), HASH_TYPE, sha3_ops, ARRAY_SIZE(sha3_ops)}, + {"sha256", sha256_params, ARRAY_SIZE(sha256_params), HASH_TYPE, sha256_ops, ARRAY_SIZE(sha256_ops)}, + {"abs", abs_params, ARRAY_SIZE(abs_params), INT_TYPE, abs_ops, ARRAY_SIZE(abs_ops)}, + {"min", min_params, ARRAY_SIZE(min_params), INT_TYPE, min_ops, ARRAY_SIZE(min_ops)}, + {"max", max_params, ARRAY_SIZE(max_params), INT_TYPE, max_ops, ARRAY_SIZE(max_ops)}, + {"check_tx_sig", check_tx_sig_params, ARRAY_SIZE(check_tx_sig_params), BOOLEAN_TYPE, check_tx_sig_ops, ARRAY_SIZE(check_tx_sig_ops)}, + {"check_msg_sig", check_msg_sig_params, ARRAY_SIZE(check_msg_sig_params), BOOLEAN_TYPE, check_msg_sig_ops, ARRAY_SIZE(check_msg_sig_ops)}, + {"below", below_params, ARRAY_SIZE(below_params), BOOLEAN_TYPE, below_ops, ARRAY_SIZE(below_ops)}, + {"above", above_params, ARRAY_SIZE(above_params), BOOLEAN_TYPE, above_ops, ARRAY_SIZE(above_ops)}, + {"lock", lock_params, ARRAY_SIZE(lock_params), VOID_TYPE, lock_ops, ARRAY_SIZE(lock_ops)}, + {"verify", verify_params, ARRAY_SIZE(verify_params), VOID_TYPE, verify_ops, ARRAY_SIZE(verify_ops)}, }; BuiltinFun *search_builtin_function(char *name) diff --git a/compiler/codegen.c b/compiler/codegen.c index f399e2a..9c87478 100644 --- a/compiler/codegen.c +++ b/compiler/codegen.c @@ -126,6 +126,14 @@ add_global_variable(Compiler *compiler, SVM_Executable *exe) } // TODO: derive type: FUNCTION_DERIVE/ARRAY_DERIVE } +static void +generate_builtin_code(OpcodeBuf *ob, SVM_Opcode *ops, int op_cnt) +{ + for(int i = 0; i< op_cnt; i++) { + ob->code[ob->size] = ops[i]; + ob->size++; + } +} static void generate_code(OpcodeBuf *ob, SVM_Opcode code, ...) @@ -331,6 +339,7 @@ generate_initializer(SVM_Executable *exe, Block *current_block, Declaration *decl_stmt, OpcodeBuf *ob) { + generate_pop_to_identifier(decl_stmt, ob); } static void @@ -385,6 +394,9 @@ generate_identifier_expression(SVM_Executable *exe, Block *block, break; case STRUCT_DEFINITION: break; + case IDENTIFIER_EXPRESSION: + generate_pop_to_lvalue(exe, block, expr, ob); + break; default: printf("bad default. kind..%d", expr->kind); exit(1); @@ -409,8 +421,10 @@ generate_function_call_expression(SVM_Executable *exe, Block *block, FuncCallExpression *fce = expr->u.func_call_expression; generate_push_argument(exe, block, fce->argument_list, ob); generate_expression(exe, block, fce->argument_list->expr, ob); - // which op for func call? - // generate_code(ob, code); + + BuiltinFun *builtin_fun = expr->u.func_call_expression + ->function->u.identifier->u.builtin_func; + generate_builtin_code(ob, builtin_fun->op_codes, builtin_fun->ops_count); } static void diff --git a/compiler/summoner.h b/compiler/summoner.h index 9945ee1..2c0cd89 100644 --- a/compiler/summoner.h +++ b/compiler/summoner.h @@ -3,6 +3,7 @@ #include #include +#include "../include/SVM_code.h" typedef enum { @@ -100,7 +101,8 @@ typedef struct BuiltinFun BasicType *parameters; int parameter_count; BasicType return_type; - const char *op_codes; + SVM_Opcode *op_codes; + int ops_count; } BuiltinFun; typedef struct IdentifierExpression