case AST_OP_MOD:
*result = left % right;
break;
+ case AST_OP_UNMINUS:
+ *result = -left;
+ break;
default:
return FALSE;
}
static sbIrExpr *expr_op(hIrChunk ck, sbAstOp op, sbIrExpr *left, sbIrExpr *right) {
if (left->type == IR_E_VALUE && left->value.type == IT_INTEGER
- && right->type == IR_E_VALUE && right->value.type == IT_INTEGER) {
+ && (!right || (right->type == IR_E_VALUE && right->value.type == IT_INTEGER))) {
/* Try constant folding */
hInteger result;
- flag folded = int_constant_fold(op, left->value.integer, right->value.integer, &result);
+ flag folded = int_constant_fold(op, left->value.integer, right ? right->value.integer : 0, &result);
if (folded) {
return new_expr(ck, &(sbIrExpr) {
.type = IR_E_VALUE,
static sbIrExpr *expr_param(hIrChunk ck, sbIrExpr *value) {
return new_expr(ck, &(sbIrExpr) {
.type = IR_E_PARAM,
- .param.this = value,
+ .list.this = value,
});
}
sbIrExpr **place_here = ¶m;
while (param_ast != NO_NODE) {
*place_here = expr_param(ck, compile_ast_expr(ck, param_ast->seq.left));
- place_here = &(*place_here)->param.next;
+ place_here = &(*place_here)->list.next;
param_ast = param_ast->seq.right;
}
return expr_call(ck, called, param);
debug(" with params ");
sbIrExpr *param = e->call.param;
while (param) {
- print_expr(param->param.this);
+ print_expr(param->list.this);
debug(",");
- param = param->param.next;
+ param = param->list.next;
}
break;
default:
--- /dev/null
+#include "data/list.h"
+
+#include "gc/gcinfo.h"
+
+#define LIST_PER_BLOCK 256
+
+/* TODO etc etc */
+sbPool g_list_pool;
+
+typedef struct sbList {
+ GCINFO gc;
+ u64 handle;
+ sbBuffer items;
+} sbList;
+
+sbList *get_list_by_handle(hList handle);
+
+void sbList_sys_init() {
+ sbPool_initialize(&g_list_pool, sizeof(sbList), LIST_PER_BLOCK);
+}
+
+void sbList_sys_deinit() {
+ //sbPool_deinitialize(&g_list_pool);
+}
+
+hList sbList_new(usize capacity) {
+ usize index;
+ sbList *l = sbPool_alloc(&g_list_pool, &index);
+ sbBuffer_initialize(&l->items, capacity * sizeof(hV));
+ return index;
+}
+
+void sbList_append(hList list, hV *item) {
+ sbList *l = get_list_by_handle(list);
+ sbV_retain(item);
+ sbBuffer_append(&l->items, item, sizeof(hV));
+}
+
+hV *sbList_get_value(hList list, usize *length) {
+ sbList *l = get_list_by_handle(list);
+ if (length) *length = l->items.size / sizeof(hV);
+ return (hV*)l->items.data;
+}
+
+hV sbList_index(hList list, usize index) {
+ sbList *l = get_list_by_handle(list);
+ hV *item = &((hV*)l->items.data)[index];
+ sbV_retain(item);
+ return *item;
+}
+
+/* --- */
+
+sbList *get_list_by_handle(hList handle) {
+ return sbPool_get_entry(&g_list_pool, handle);
+}
#include "vm/exec.h"
int main(int argc, char **argv) {
- if (argc >= 2) {
- sbString_sys_init();
- sbHash_sys_init();
- sbSymbol_sys_init();
-
- sbParser pr;
- sbParser_initialize(&pr);
-
- const char *filename;
- flag debugmode = FALSE;
- if (argc == 3 && sbstrncmp(argv[1], "-D", 2) == 0) {
- filename = argv[2];
- debugmode = TRUE;
- } else if (argc == 2) {
- filename = argv[1];
- } else {
- printf("usage: %s [-D] <filename>\n", argv[0]);
- printf("usage: -D = bytecode debugger\n");
- return 0;
- }
-
- sbAst parse_result = sbParser_parse_file(&pr, filename);
-
- if (parse_result == NULL) {
- fprintf(stderr, "fatal error: Could not open script '%s'\n", filename);
- return -2;
- } else if (parse_result->type == AST_ERROR) {
- fprintf(stderr, "fatal error: Could not run '%s' due to syntax errors.\n", filename);
- return -1;
- }
-
- /* syntax is valid, now try to compile */
-
- sbIrProgram ir = {0};
-
- sbIrProgram_initialize(&ir, 32768);
-
- sbIrProgram_compile_ast(&ir, parse_result);
-
- /* free AST, don't need it anymore */
- sbParser_deinitialize(&pr);
-
- if (ir.error_count > 0) {
- fprintf(stderr, "Could not run '%s' due to errors.\n", filename);
- return -3;
- } else {
- // print out program
- sbIrProgram_print(&ir);
- }
-
- sbVmProgram pm;
- sbVmProgram_initialize(&pm, 65536);
-
- sbEmit_compile_program(&pm, &ir);
-
- sbIrProgram_deinitialize(&ir);
-
- sbVm vm = {0};
- sbVm_initialize(&vm, 1048576, 1048576, debugmode);
-
- sbVm_execute(&vm, &pm);
-
- printf("Stack result: ");
- for (u8 *p = vm.stack; p < vm.sp; p++) {
- printf("%02X ", *p);
- }
- printf("\n");
-
- sbVmProgram_deinitialize(&pm);
- sbVm_deinitialize(&vm);
- sbSymbol_sys_deinit();
- sbHash_sys_deinit();
- sbString_sys_deinit();
+ if (argc >= 2) {
+ const char *filename;
+ flag debugmode = FALSE;
+ if (argc == 3 && sbstrncmp(argv[1], "-D", 2) == 0) {
+ filename = argv[2];
+ debugmode = TRUE;
+ } else if (argc == 2) {
+ filename = argv[1];
} else {
- fprintf(stderr, "please provide a file as input\n");
+ printf("usage: %s [-D] <filename>\n", argv[0]);
+ printf("usage: -D = bytecode debugger\n");
+ return 0;
}
+
+ data_sys_init();
+
+ sbParser pr;
+ sbParser_initialize(&pr);
+
+ sbAst parse_result = sbParser_parse_file(&pr, filename);
+
+ if (parse_result == NULL) {
+ fprintf(stderr, "fatal error: Could not open script '%s'\n", filename);
+ return -2;
+ } else if (parse_result->type == AST_ERROR) {
+ fprintf(stderr, "fatal error: Could not run '%s' due to syntax errors.\n", filename);
+ return -1;
+ }
+
+ /* syntax is valid, now try to compile */
+
+ sbIrProgram ir = {0};
+
+ sbIrProgram_initialize(&ir, 32768);
+
+ sbIrProgram_compile_ast(&ir, parse_result);
+
+ /* free AST, don't need it anymore */
+ sbParser_deinitialize(&pr);
+
+ if (ir.error_count > 0) {
+ fprintf(stderr, "Could not run '%s' due to errors.\n", filename);
+ return -3;
+ } else {
+ // print out program
+ sbIrProgram_print(&ir);
+ }
+
+ sbVmProgram pm;
+ sbVmProgram_initialize(&pm, 65536);
+
+ sbEmit_compile_program(&pm, &ir);
+
+ sbIrProgram_deinitialize(&ir);
+
+ sbVm vm = {0};
+ sbVm_initialize(&vm, 1048576, 1048576, debugmode);
+
+ sbVm_execute(&vm, &pm);
+
+ printf("Stack result: ");
+ for (u8 *p = vm.stack; p < vm.sp; p++) {
+ printf("%02X ", *p);
+ }
+ printf("\n");
+
+ sbVmProgram_deinitialize(&pm);
+ sbVm_deinitialize(&vm);
+ data_sys_deinit();
+ } else {
+ fprintf(stderr, "please provide a file as input\n");
+ }
}