Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 24 additions & 11 deletions builtin/builtin.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <string.h>
#include "../include/share.h"
#include "../include/SVM_code.h"
#include "../compiler/summoner.h"

static BasicType sha3_params[] = {HEX_TYPE};
Expand All @@ -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)
Expand Down
18 changes: 16 additions & 2 deletions compiler/codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, ...)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down
4 changes: 3 additions & 1 deletion compiler/summoner.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <stdbool.h>
#include <wchar.h>
#include "../include/SVM_code.h"

typedef enum
{
Expand Down Expand Up @@ -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
Expand Down