diff --git a/src/lib/compiler/compile.c b/src/lib/compiler/compile.c index 88e1564..e25051d 100644 --- a/src/lib/compiler/compile.c +++ b/src/lib/compiler/compile.c @@ -144,7 +144,7 @@ static void emitInstr_ASS(CodegenContext *ctx, const char *name, int off, int le Operand opv[] = { { .type = OPTP_STRING, .as_string = name }, }; - emitInstr(ctx, OPCODE_ASS, &op, 1, off, len); + emitInstr(ctx, OPCODE_ASS, opv, 1, off, len); } static Promise *newOffsetPromise(CodegenContext *ctx) @@ -206,7 +206,7 @@ static void emitInstrForFuncCallNode(CodegenContext *ctx, CallExprNode *expr, emitInstr(ctx, OPCODE_CALL, ops, 2, expr->base.base.offset, expr->base.base.length); } -static void emitInstrForFuncNode(CodegenContext *ctx, FuncExprNode *func, Promise *break_dest) +static void emitInstrForFuncNode(CodegenContext *ctx, FunctionNode *func, Promise *break_dest) { Promise *func_index = newOffsetPromise(ctx); Promise *jump_index = newOffsetPromise(ctx); @@ -224,7 +224,7 @@ static void emitInstrForFuncNode(CodegenContext *ctx, FuncExprNode *func, Promis emitInstr_POP1(ctx, func->base.offset, func->base.length); // Pop function object // Jump after the function code. - op = (Operand) { .type = OPTP_PROMISE, .as_promise = jump_index }; + Operand op = { .type = OPTP_PROMISE, .as_promise = jump_index }; emitInstr(ctx, OPCODE_JUMP, &op, 1, func->base.offset, func->base.length); // This is the function code index. @@ -271,7 +271,7 @@ static void emitInstrForIfElseNode(CodegenContext *ctx, IfElseNode *ifelse, Prom Promise *done_offset = newOffsetPromise(ctx); Operand op = { .type = OPTP_PROMISE, .as_promise = else_offset }; - emitInstr(ctx, OPCODE_JUMPIFNOTANDPOP, &op, 1, node->offset, node->length); + emitInstr(ctx, OPCODE_JUMPIFNOTANDPOP, &op, 1, ifelse->base.offset, ifelse->base.length); emitInstrForNode(ctx, ifelse->true_branch, break_dest); @@ -279,7 +279,7 @@ static void emitInstrForIfElseNode(CodegenContext *ctx, IfElseNode *ifelse, Prom emitInstr_POP(ctx, 1, ifelse->true_branch->offset, 0); op = (Operand) { .type = OPTP_PROMISE, .as_promise = done_offset }; - emitInstr(ctx, OPCODE_JUMP, &op, 1, node->offset, node->length); + emitInstr(ctx, OPCODE_JUMP, &op, 1, ifelse->base.offset, ifelse->base.length); long long int temp = ExeBuilder_InstrCount(ctx->builder); Promise_Resolve(else_offset, &temp, sizeof(temp)); @@ -299,7 +299,8 @@ static void emitInstrForIfElseNode(CodegenContext *ctx, IfElseNode *ifelse, Prom { Promise *done_offset = newOffsetPromise(ctx); - emitInstr(ctx, OPCODE_JUMPIFNOTANDPOP, &(Operand) { .type = OPTP_PROMISE, .as_promise = done_offset }, 1, node->offset, node->length); + Operand op = { .type = OPTP_PROMISE, .as_promise = done_offset }; + emitInstr(ctx, OPCODE_JUMPIFNOTANDPOP, &op, 1, ifelse->base.offset, ifelse->base.length); emitInstrForNode(ctx, ifelse->true_branch, break_dest); @@ -313,6 +314,26 @@ static void emitInstrForIfElseNode(CodegenContext *ctx, IfElseNode *ifelse, Prom } } +static void flattenTupleTree(CodegenContext *ctx, ExprNode *root, ExprNode *tuple[], int max, int *count) +{ + if(root->kind == EXPR_PAIR) + { + flattenTupleTree(ctx, (ExprNode*) ((OperExprNode*) root)->head, tuple, max, count); + flattenTupleTree(ctx, (ExprNode*) ((OperExprNode*) root)->head->next, tuple, max, count); + } + else + { + + if(max == *count) + { + reportErrorAndJump(ctx, 0, "Static buffer is too small"); + UNREACHABLE; + } + + tuple[(*count)++] = root; + } +} + static void emitInstrForAssignmentNode(CodegenContext *ctx, OperExprNode *asgn, Promise *break_dest) { Node *lop, *rop; @@ -366,27 +387,7 @@ static void emitInstrForAssignmentNode(CodegenContext *ctx, OperExprNode *asgn, } if(i+1 < count) - emitInstr_POP1(ctx, node->offset, 0); - } -} - -static void flattenTupleTree(CodegenContext *ctx, ExprNode *root, ExprNode *tuple[], int max, int *count) -{ - if(root->kind == EXPR_PAIR) - { - flattenTupleTree(ctx, (ExprNode*) ((OperExprNode*) root)->head, tuple, max, count); - flattenTupleTree(ctx, (ExprNode*) ((OperExprNode*) root)->head->next, tuple, max, count); - } - else - { - - if(max == *count) - { - reportErrorAndJump(ctx, 0, "Static buffer is too small"); - UNREACHABLE; - } - - tuple[(*count)++] = root; + emitInstr_POP1(ctx, asgn->base.base.offset, 0); } }