diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2020-01-10 22:39:01 -0500 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2020-01-10 22:39:01 -0500 |
commit | 56a9ba5ea53a5d0b6268939d6a6e89837c2e4658 (patch) | |
tree | 2e3aa79b863a1c8c858a504764260b3614ba9d1c | |
parent | 17f78f57b2225840144b7b9027e3e032684c4cb0 (diff) |
made Field.type not a pointer
-rw-r--r-- | cgen.c | 2 | ||||
-rw-r--r-- | copy.c | 2 | ||||
-rw-r--r-- | decls_cgen.c | 4 | ||||
-rw-r--r-- | eval.c | 8 | ||||
-rw-r--r-- | infer.c | 2 | ||||
-rw-r--r-- | instance_table.c | 4 | ||||
-rw-r--r-- | package.c | 16 | ||||
-rw-r--r-- | parse.c | 3 | ||||
-rw-r--r-- | types.c | 8 | ||||
-rw-r--r-- | types.h | 48 |
10 files changed, 54 insertions, 43 deletions
@@ -1702,7 +1702,7 @@ static bool cgen_val_ptr(CGenerator *g, void *v, Type *t, Location where) { arr_foreach(t->struc->fields, Field, f) { if (f != t->struc->fields) cgen_write(g, ", "); - cgen_val_ptr(g, (char *)v + f->offset, f->type, where); + cgen_val_ptr(g, (char *)v + f->offset, &f->type, where); } cgen_write(g, "}"); break; @@ -126,7 +126,7 @@ static void copy_type(Copier *c, Type *out, Type *in) { Field *fout = &out->struc->fields[i]; Field *fin = &in->struc->fields[i]; *fout = *fin; - copy_type(c, fout->type = allocr_malloc(c->allocr, sizeof *fout->type), fin->type); + copy_type(c, &fout->type, &fin->type); } } break; } diff --git a/decls_cgen.c b/decls_cgen.c index e8f7cca..bc6df42 100644 --- a/decls_cgen.c +++ b/decls_cgen.c @@ -25,10 +25,10 @@ static bool cgen_decls_type(CGenerator *g, Type *type, Location where) { cgen_nl(g); ++g->indent_lvl; arr_foreach(sdef->fields, Field, f) { - if (!cgen_type_pre(g, f->type, where)) return false; + if (!cgen_type_pre(g, &f->type, where)) return false; cgen_write(g, " "); cgen_ident(g, f->name); - if (!cgen_type_post(g, f->type, where)) return false; + if (!cgen_type_post(g, &f->type, where)) return false; cgen_write(g, ";"); cgen_nl(g); } @@ -65,7 +65,7 @@ static void eval_struct_find_offsets(Type *t) { size_t bytes = 0; size_t total_align = 0; arr_foreach(t->struc->fields, Field, f) { - size_t falign = compiler_alignof(f->type); + size_t falign = compiler_alignof(&f->type); if (falign > total_align) total_align = falign; /* align */ @@ -73,7 +73,7 @@ static void eval_struct_find_offsets(Type *t) { assert(bytes % falign == 0); f->offset = bytes; /* add size */ - bytes += compiler_sizeof(f->type); + bytes += compiler_sizeof(&f->type); } bytes += ((total_align - bytes) % total_align + total_align) % total_align; /* = -bytes mod align */ t->struc->size = bytes; @@ -344,7 +344,7 @@ static void fprint_val_ptr(FILE *f, void *p, Type *t) { fprintf(f, ", "); fprint_ident_debug(f, fi->name); fprintf(f, ": "); - fprint_val_ptr(f, (char *)p + fi->offset, fi->type); + fprint_val_ptr(f, (char *)p + fi->offset, &fi->type); } fprintf(f, "]"); break; @@ -843,7 +843,7 @@ static bool eval_set(Evaluator *ev, Expression *set, Value *to) { case BINARY_DOT: { void *ptr = eval_ptr_to_struct_field(ev, set); if (!ptr) return false; - eval_deref_set(ptr, to, set->binary.field->type); + eval_deref_set(ptr, to, &set->binary.field->type); } break; default: assert(0); break; } @@ -123,7 +123,7 @@ static bool infer_from_type(Typer *tr, Type *match, Type *to, Identifier *idents size_t i, len = arr_len(fields_m); if (len != arr_len(fields_t)) return true; for (i = 0; i < len; ++i) { - if (!infer_from_type(tr, fields_m[i].type, fields_t[i].type, idents, vals, types)) + if (!infer_from_type(tr, &fields_m[i].type, &fields_t[i].type, idents, vals, types)) return false; } } break; diff --git a/instance_table.c b/instance_table.c index 0e5827f..fe667b8 100644 --- a/instance_table.c +++ b/instance_table.c @@ -187,7 +187,7 @@ static U64 val_ptr_hash(void *v, Type *t) { U32 x = 1; U64 hash = 0; arr_foreach(t->struc->fields, Field, f) { - hash += (U64)x * val_ptr_hash((char *)v + f->offset, f->type); + hash += (U64)x * val_ptr_hash((char *)v + f->offset, &f->type); x = rand_u32(x); } return hash; @@ -271,7 +271,7 @@ static bool val_ptr_eq(void *u, void *v, Type *t) { } case TYPE_STRUCT: arr_foreach(t->struc->fields, Field, f) { - if (!val_ptr_eq((char *)u + f->offset, (char *)v + f->offset, f->type)) + if (!val_ptr_eq((char *)u + f->offset, (char *)v + f->offset, &f->type)) return false; } return true; @@ -256,7 +256,7 @@ static bool import_pkg(Allocator *allocr, Package *p, FILE *f, const char *fname static bool export_type(Exporter *ex, Type *type, Location where) { assert(type->flags & TYPE_IS_RESOLVED); if (type->kind == TYPE_BUILTIN) { - export_u8(ex, (U8)(type->builtin + TYPE_COUNT)); + export_u8(ex, (U8)((int)type->builtin + TYPE_COUNT)); } else { export_u8(ex, (U8)type->kind); } @@ -312,6 +312,16 @@ static bool export_type(Exporter *ex, Type *type, Location where) { return true; } +static void import_type(Importer *im, Type *type) { + U8 kind = import_u8(im); + if (kind > TYPE_COUNT) { + type->kind = TYPE_BUILTIN; + type->builtin = (BuiltinType)(kind - TYPE_COUNT); + } else { + + } +} + static bool export_fn_ptr(Exporter *ex, FnExpr *f, Location where) { if (f->export.id == 0) { FnExpr **fptr = arr_add(&ex->exported_fns); @@ -378,7 +388,7 @@ static bool export_val_ptr(Exporter *ex, void *val, Type *type, Location where) case TYPE_STRUCT: eval_struct_find_offsets(type); arr_foreach(type->struc->fields, Field, f) { - if (!export_val_ptr(ex, (char *)val + f->offset, f->type, where)) + if (!export_val_ptr(ex, (char *)val + f->offset, &f->type, where)) return false; } break; @@ -709,7 +719,7 @@ static bool export_struct(Exporter *ex, StructDef *s) { export_len(ex, arr_len(s->fields)); arr_foreach(s->fields, Field, f) { export_ident(ex, f->name); - if (!export_type(ex, f->type, s->where)) + if (!export_type(ex, &f->type, s->where)) return false; } return true; @@ -603,8 +603,7 @@ static bool parse_type(Parser *p, Type *type) { Type *ftype = field_decl.type.kind == TYPE_TUPLE ? &field_decl.type.tuple[idx] : &field_decl.type; Field *f = parser_arr_add(p, &type->struc->fields); f->name = *fident; - f->type = parser_malloc(p, sizeof *f->type); - *f->type = *ftype; + f->type = *ftype; ++idx; } } @@ -216,7 +216,7 @@ static bool type_is_compileonly(Type *t) { return false; case TYPE_STRUCT: arr_foreach(t->struc->fields, Field, f) - if (type_is_compileonly(f->type)) + if (type_is_compileonly(&f->type)) return true; return false; case TYPE_EXPR: break; @@ -556,7 +556,7 @@ static bool type_resolve_(Typer *tr, Type *t, Location where, bool is_reference) break; case TYPE_STRUCT: arr_foreach(t->struc->fields, Field, f) { - if (!type_resolve_(tr, f->type, where, is_reference)) + if (!type_resolve_(tr, &f->type, where, is_reference)) return false; } break; @@ -1898,7 +1898,7 @@ static bool types_expr(Typer *tr, Expression *e) { arr_foreach(lhs_type->struc->fields, Field, f) { if (ident_eq_str(f->name, field_name.slice.data)) { is_field = true; - *t = *f->type; + *t = f->type; e->binary.field = f; } } @@ -1937,7 +1937,7 @@ static bool types_expr(Typer *tr, Expression *e) { arr_foreach(struct_type->struc->fields, Field, f) { if (f->name == rhs->ident) { is_field = true; - *t = *f->type; + *t = f->type; e->binary.field = f; } } @@ -377,13 +377,6 @@ typedef enum { BUILTIN_PKG } BuiltinType; -/* field of a struct */ -typedef struct Field { - Identifier name; - struct Type *type; - size_t offset; /* offset during compile time */ -} Field; - typedef U8 Constness; @@ -401,21 +394,6 @@ enum { STRUCT_DEF_CGENERATED = 0x02, }; -typedef struct { - Field *fields; - Location where; - U16 flags; - size_t size; /* size of this struct during compile time */ - size_t align; - struct { - Identifier name; - IdentID id; - } c; - struct { - U32 id; /* (index into exptr->exported_structs) + 1, or 0 if hasn't been exported */ - } export; -} StructDef; - enum { TYPE_IS_FLEXIBLE = 0x01, TYPE_IS_RESOLVED = 0x02, @@ -439,11 +417,35 @@ typedef struct Type { } arr; struct Type *ptr; struct Type *slice; - StructDef *struc; /* it's a pointer so that multiple Types can reference the same struct definition */ + struct StructDef *struc; /* it's a pointer so that multiple Types can reference the same struct definition */ struct Expression *expr; }; } Type; + +/* field of a struct */ +typedef struct Field { + Identifier name; + Type type; + size_t offset; /* offset during compile time */ +} Field; + +typedef struct StructDef { + Field *fields; + Location where; + U16 flags; + size_t size; /* size of this struct during compile time */ + size_t align; + struct { + Identifier name; + IdentID id; + } c; + struct { + U32 id; /* (index into exptr->exported_structs) + 1, or 0 if hasn't been exported */ + } export; +} StructDef; + + enum { BLOCK_IS_FN = 0x01, BLOCK_FOUND_TYPES = 0x02, |