diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-02-12 01:46:32 -0500 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-02-12 01:46:32 -0500 |
| commit | 26c89b77dbf7fc124a5b57c2d5846d249ab84a1f (patch) | |
| tree | 6a26f8897144548d6173544e43db30022eb92c7e /compile.c | |
| parent | 179648b005b980e5c891d953b7c3ddef96f075f1 (diff) | |
Compile struct constructors and field accesses
Diffstat (limited to 'compile.c')
| -rw-r--r-- | compile.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -260,7 +260,10 @@ CORD compile(ast_t *ast) // Extern, case StructDef: { auto def = Match(ast, StructDef); - CORD code = CORD_asprintf("typedef struct %s_s %s_t;\nstruct %s_s {\n", def->name, def->name, def->name); + CORD code = CORD_asprintf( + "typedef struct %s_s %s_t;\n" + "#define %s(...) ((%s_t){__VA_ARGS__})\n" + "struct %s_s {\n", def->name, def->name, def->name, def->name, def->name); for (arg_ast_t *field = def->fields; field; field = field->next) { CORD_sprintf(&code, "%r%r %s;\n", code, compile_type(field->type), field->name); } @@ -293,6 +296,10 @@ CORD compile(ast_t *ast) compile(test->expr), compile(WrapAST(test->expr, StringLiteral, .cord=test->output))); } + case FieldAccess: { + auto f = Match(ast, FieldAccess); + return CORD_asprintf("(%r).%s", compile(f->fielded), f->field); + } // Index, FieldAccess, // DocTest, // Use, |
