Improving multimedia, trying to add a single c library mode
This commit is contained in:
@@ -63,7 +63,7 @@ get_ctype_name_for_type(Ast_Type *type){
|
||||
switch(type->kind){
|
||||
case TYPE_VOID: return "void";
|
||||
case TYPE_BOOL: return "bool";
|
||||
case TYPE_STRING: return "String";
|
||||
case TYPE_STRING: return "CORE_String";
|
||||
case TYPE_CHAR: return "char";
|
||||
case TYPE_F32: return "float";
|
||||
case TYPE_F64: return "double";
|
||||
@@ -224,7 +224,7 @@ gen_value(Token *pos, Value a){
|
||||
}break;
|
||||
case TYPE_STRING:{
|
||||
int length = 0;
|
||||
gen("(String){(uint8_t *)\"");
|
||||
gen("(CORE_String){(uint8_t *)\"");
|
||||
for(int i = 0; i < a.intern_val.len; i++){
|
||||
if(a.intern_val.str[i] == '\n'){length += 2; gen("\\n");}
|
||||
else if(a.intern_val.str[i] == '\r'){length += 2; gen("\\r");}
|
||||
@@ -789,10 +789,10 @@ compile_to_c_code(){
|
||||
#define CORE_AssertMessage(x,...) CORE_Assert(x)
|
||||
#define CORE_BufferSize(x) (sizeof(x)/sizeof((x)[0]))
|
||||
|
||||
typedef struct String{
|
||||
typedef struct CORE_String{
|
||||
uint8_t *str;
|
||||
int64_t len;
|
||||
}String;
|
||||
}CORE_String;
|
||||
|
||||
static void
|
||||
CORE_MemoryCopy(void *dst, void *src, size_t size){
|
||||
@@ -873,55 +873,59 @@ CORE_MemoryCopy(void *dst, void *src, size_t size){
|
||||
compiler_error(0, "Entry point is not defined! Try main or WinMain");
|
||||
}
|
||||
|
||||
// Generate language.core
|
||||
for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){
|
||||
Ast_Decl *it = get(&pctx->ordered_decls, i);
|
||||
genln("");
|
||||
gen_ast(it);
|
||||
}
|
||||
|
||||
// Generate type info
|
||||
genln("int64_t type_infos_len = %d;", length(&pctx->all_types));
|
||||
genln("Type_Info *type_infos = (Type_Info[]){");
|
||||
global_indent++;
|
||||
Iter(&pctx->all_types){
|
||||
Ast_Type *t = it.item[0];
|
||||
genln("{/*%Q*/.kind = %d, .size = %d, .align = %d, .is_unsigned = %s, .type = %d, ", typestring(t),
|
||||
(S32)t->kind, (S32)t->size, (S32)t->align, t->is_unsigned ? "true" : "false", t->type_id);
|
||||
switch(t->kind){
|
||||
case TYPE_POINTER:
|
||||
case TYPE_SLICE: {
|
||||
gen(".base_type = %d", t->base->type_id);
|
||||
} break;
|
||||
case TYPE_ARRAY: {
|
||||
gen(".base_type = %d, ", t->base->type_id);
|
||||
gen(".array_size = %d", t->arr.size);
|
||||
}break;
|
||||
case TYPE_LAMBDA: {
|
||||
gen(".lambda_return = %d, ", t->func.ret->type_id);
|
||||
gen(".lambda_argument_count = %d, ", t->func.args.len);
|
||||
gen(".lambda_arguments = (Type_Info[%d]){", t->func.args.len);
|
||||
For_Named(t->func.args, arg){
|
||||
gen("{.type = %d}, ", arg->type_id);
|
||||
}
|
||||
gen("}");
|
||||
} break;
|
||||
case TYPE_STRUCT:{
|
||||
gen(".struct_member_count = %d, ", t->agg.members.len);
|
||||
gen(".struct_members = (Type_Info_Struct_Member[]){");
|
||||
For_Named(t->agg.members, m){
|
||||
gen("{.name = (String){(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
|
||||
|
||||
}
|
||||
gen("}");
|
||||
}break;
|
||||
default: {}
|
||||
// invalid_default_case;
|
||||
if(emit_type_info){
|
||||
// Generate language.core
|
||||
for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){
|
||||
Ast_Decl *it = get(&pctx->ordered_decls, i);
|
||||
genln("");
|
||||
gen_ast(it);
|
||||
}
|
||||
gen("},");
|
||||
|
||||
// Generate type info
|
||||
genln("int64_t type_infos_len = %d;", length(&pctx->all_types));
|
||||
genln("Type_Info *type_infos = (Type_Info[]){");
|
||||
global_indent++;
|
||||
Iter(&pctx->all_types){
|
||||
Ast_Type *t = it.item[0];
|
||||
genln("{/*%Q*/.kind = %d, .size = %d, .align = %d, .is_unsigned = %s, .type = %d, ", typestring(t),
|
||||
(S32)t->kind, (S32)t->size, (S32)t->align, t->is_unsigned ? "true" : "false", t->type_id);
|
||||
switch(t->kind){
|
||||
case TYPE_POINTER:
|
||||
case TYPE_SLICE: {
|
||||
gen(".base_type = %d", t->base->type_id);
|
||||
} break;
|
||||
case TYPE_ARRAY: {
|
||||
gen(".base_type = %d, ", t->base->type_id);
|
||||
gen(".array_size = %d", t->arr.size);
|
||||
}break;
|
||||
case TYPE_LAMBDA: {
|
||||
gen(".lambda_return = %d, ", t->func.ret->type_id);
|
||||
gen(".lambda_argument_count = %d, ", t->func.args.len);
|
||||
gen(".lambda_arguments = (Type_Info[%d]){", t->func.args.len);
|
||||
For_Named(t->func.args, arg){
|
||||
gen("{.type = %d}, ", arg->type_id);
|
||||
}
|
||||
gen("}");
|
||||
} break;
|
||||
case TYPE_STRUCT:{
|
||||
gen(".struct_member_count = %d, ", t->agg.members.len);
|
||||
gen(".struct_members = (Type_Info_Struct_Member[]){");
|
||||
For_Named(t->agg.members, m){
|
||||
gen("{.name = (CORE_String){(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
|
||||
|
||||
}
|
||||
gen("}");
|
||||
}break;
|
||||
default: {}
|
||||
// invalid_default_case;
|
||||
}
|
||||
gen("},");
|
||||
}
|
||||
global_indent--;
|
||||
gen("};");
|
||||
|
||||
}
|
||||
global_indent--;
|
||||
gen("};");
|
||||
|
||||
// Generate actual code
|
||||
Iter(&pctx->ordered_decls){
|
||||
|
||||
Reference in New Issue
Block a user