return field;
}
+/* Builtin Operations
+ *****************************************************************************/
+/*
+ String Operations:
+
+ * String strcreate(i8* s)
+ * void strrefinc(String s)
+ * void strrefdec(String s)
+
+*/
+
+void create_builtin(Parser* p, size_t rtmodid, char* name, char* spec)
+{
+ (void)spec;
+ Symbol* sym = symbol_new(p, rtmodid, name, SYM_PROC, 0);
+ sym->module = rtmodid;
+ sym->type = symbol_newtype(p);
+ sym->type->form = FORM_PROC;
+}
+
+SsaNode* call_builtin(Parser* p, char* name)
+{
+ size_t modid = symbol_getid(p, 0, "Runtime", SYM_MODULE);
+ size_t symid = symbol_getid(p, modid, name, SYM_PROC);
+ SsaNode* builtin = ssa_ident(p, symid);
+ return ssa_call(p, builtin);
+}
+
+SsaNode* string_create(Parser* p)
+{
+ SsaNode* expr = ssa_string(p, peek(p)->text);
+ SsaNode* call = call_builtin(p, "StringCreate");
+ ssa_call_add(p, call, expr);
+ codegen_const(p, expr);
+ return expr;
+}
+
/* Grammar Definition
*****************************************************************************/
static SsaNode* expression(Parser* p);
break;
case STRING:
- expr = ssa_string(p, peek(p)->text);
- codegen_const(p, expr);
+ expr = string_create(p);
consume(p);
break;
{
fatal("could not determine module name from path");
}
- p->mtypes = 8;
- p->types = calloc(p->mtypes, sizeof(Type*));
symbol_new(p, 0, "$", SYM_VAR, 0);
symbol_new(p, 0, "Bool", SYM_TYPE, 0)->type = &BoolType;
- p->types[p->ntypes++] = &BoolType;
symbol_new(p, 0, "Int", SYM_TYPE, 0)->type = &IntType;
- p->types[p->ntypes++] = &IntType;
symbol_new(p, 0, "Real", SYM_TYPE, 0)->type = &RealType;
- p->types[p->ntypes++] = &RealType;
symbol_new(p, 0, "String", SYM_TYPE, 0)->type = &StringType;
- p->types[p->ntypes++] = &StringType;
+ Symbol* rt = symbol_new(p, 0, "Runtime", SYM_MODULE, 0);
+ size_t rtmodid = rt - &p->syms[0];
+ create_builtin(p, rtmodid, "StringCreate", "s");
+// Symbol* sym = symbol_new(p, rtmodid, "StringCreate", SYM_PROC, 0);
+// sym->module = rtmodid;
+// sym->type = symbol_newtype(p);
+// sym->type->form = FORM_PROC;
}
static void compile_module(Parser* p, char* path, bool genmain)
{
fatal("assembler failed");
}
- remove(p->outpath);
+// remove(p->outpath);
/* compile the object file now */
char* as_cmd = strmcat("clang -static -c -o \"", obj_path, "\" \"", asm_path, "\"", 0);
char* link_cmd = strmcat("clang -static -o ", p.name, " ", 0);
for (size_t i = 0; i < p.nmods; i++)
{
+ if (!p.mods[i].path) continue;
char* object = strdup(p.mods[i].path);
object[strlen(object)-1] = 'o';
link_cmd = strmcat(link_cmd, "\"", object, "\" ", 0);