diff options
| -rw-r--r-- | compile.c | 18 | ||||
| -rw-r--r-- | util.h | 1 |
2 files changed, 13 insertions, 6 deletions
@@ -167,12 +167,18 @@ CORD compile(ast_t *ast) } case Assign: { auto assign = Match(ast, Assign); - CORD code = CORD_EMPTY; - for (ast_list_t *target = assign->targets, *value = assign->values; target && value; target = target->next, value = value->next) { - CORD_sprintf(&code, "%r = %r", compile(target->ast), compile(value->ast)); - if (target->next) code = CORD_cat(code, ", "); - } - return CORD_cat(code, ";"); + // Single assignment: + if (assign->targets && !assign->targets->next) + return CORD_asprintf("%r = %r", compile(assign->targets->ast), compile(assign->values->ast)); + + CORD code = "{ // Assignment\n"; + int64_t i = 1; + for (ast_list_t *value = assign->values; value; value = value->next) + CORD_appendf(&code, "__declare(_%ld, %r);\n", i++, compile(value->ast)); + i = 1; + for (ast_list_t *target = assign->targets; target; target = target->next) + CORD_appendf(&code, "%r = _%ld;\n", compile(target->ast), i++); + return CORD_cat(code, "\n}"); } case Min: { return CORD_asprintf("min(%r, %r)", compile(Match(ast, Min)->lhs), compile(Match(ast, Min)->rhs)); @@ -25,6 +25,7 @@ char *heap_strn(const char *str, size_t len); char *heap_str(const char *str); char *heap_strf(const char *fmt, ...); CORD CORD_asprintf(const char *fmt, ...); +#define CORD_appendf(cord, fmt, ...) CORD_sprintf(cord, "%r" fmt, *(cord) __VA_OPT__(,) __VA_ARGS__) #define REVERSE_LIST(list) do { \ __typeof(list) _prev = NULL; \ |
