aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-11-09 22:48:00 +0000
committergingerBill <bill@gingerbill.org>2017-11-09 22:48:00 +0000
commiteb4b3f5976d1563cd97841964e829fc638179cc5 (patch)
tree4031277bf8d44d261a5c8a10ad2c62aed9e3dbfb /src
parentdbb070524ffde7d392c6776dae41ea440b0e84c6 (diff)
Change push allocator system; update core libraries
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp24
-rw-r--r--src/check_stmt.cpp20
-rw-r--r--src/ir.cpp26
-rw-r--r--src/parser.cpp76
-rw-r--r--src/ssa.cpp3
-rw-r--r--src/tokenizer.cpp2
6 files changed, 44 insertions, 107 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 2e36a5c1f..5e24c575e 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -5179,7 +5179,6 @@ bool ternary_compare_types(Type *x, Type *y) {
return are_types_identical(x, y);
}
-
ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *type_hint) {
ExprKind kind = Expr_Stmt;
@@ -5550,16 +5549,17 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
}
}
- isize field_index = 0;
+ bool seen_field_value = false;
+
for_array(index, cl->elems) {
- Entity *field = t->Struct.fields_in_src_order[field_index++];
- if (!all_fields_are_blank && is_blank_ident(field->token)) {
- // NOTE(bill): Ignore blank identifiers
- continue;
- }
+ Entity *field = nullptr;
AstNode *elem = cl->elems[index];
if (elem->kind == AstNode_FieldValue) {
- error(elem, "Mixture of `field = value` and value elements in a literal is not allowed");
+ seen_field_value = true;
+ // error(elem, "Mixture of `field = value` and value elements in a literal is not allowed");
+ // continue;
+ } else if (seen_field_value) {
+ error(elem, "Value elements cannot be used after a `field = value`");
continue;
}
if (index >= field_count) {
@@ -5567,6 +5567,14 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
break;
}
+ if (field == nullptr) {
+ field = t->Struct.fields_in_src_order[index];
+ }
+ if (!all_fields_are_blank && is_blank_ident(field->token)) {
+ // NOTE(bill): Ignore blank identifiers
+ continue;
+ }
+
check_expr_with_type_hint(c, o, elem, field->type);
if (!check_is_field_exported(c, field)) {
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp
index d0783d4f4..371931b1f 100644
--- a/src/check_stmt.cpp
+++ b/src/check_stmt.cpp
@@ -170,9 +170,6 @@ bool check_is_terminating(AstNode *node) {
return has_default;
case_end;
- case_ast_node(pa, PushAllocator, node);
- return check_is_terminating(pa->body);
- case_end;
case_ast_node(pc, PushContext, node);
return check_is_terminating(pc->body);
case_end;
@@ -697,7 +694,13 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
array_init(&rhs_operands, c->tmp_allocator, 2 * lhs_count);
for_array(i, as->lhs) {
- check_expr(c, &lhs_operands[i], as->lhs[i]);
+ if (is_blank_ident(as->lhs[i])) {
+ Operand *o = &lhs_operands[i];
+ o->expr = as->lhs[i];
+ o->mode = Addressing_Value;
+ } else {
+ check_expr(c, &lhs_operands[i], as->lhs[i]);
+ }
}
check_unpack_arguments(c, nullptr, lhs_operands.count, &rhs_operands, as->rhs, true);
@@ -1648,18 +1651,11 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
case_end;
- case_ast_node(pa, PushAllocator, node);
- Operand op = {};
- check_expr(c, &op, pa->expr);
- check_assignment(c, &op, t_allocator, str_lit("argument to push_allocator"));
- check_stmt(c, pa->body, mod_flags);
- case_end;
-
case_ast_node(pa, PushContext, node);
Operand op = {};
check_expr(c, &op, pa->expr);
- check_assignment(c, &op, t_context, str_lit("argument to push_context"));
+ check_assignment(c, &op, t_context, str_lit("argument to context <-"));
check_stmt(c, pa->body, mod_flags);
case_end;
diff --git a/src/ir.cpp b/src/ir.cpp
index fddb80cee..88c20d312 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -7251,32 +7251,6 @@ void ir_build_stmt_internal(irProcedure *proc, AstNode *node) {
case_end;
-
- case_ast_node(pa, PushAllocator, node);
- ir_emit_comment(proc, str_lit("push_allocator"));
- irValue *new_allocator = ir_build_expr(proc, pa->expr);
-
- ir_open_scope(proc);
-
- irValue *prev = ir_find_or_generate_context_ptr(proc);
- irValue *next = ir_add_local_generated(proc, t_context);
- ir_emit_store(proc, next, ir_emit_load(proc, prev));
-
- Selection sel = lookup_field(proc->module->allocator, t_context, str_lit("allocator"), false);
- irValue *gep = ir_emit_deep_field_gep(proc, next, sel);
- ir_emit_store(proc, gep, new_allocator);
-
- array_add(&proc->context_stack, next);
- defer (array_pop(&proc->context_stack));
-
- // TODO(bill): is this too leaky?
-
- ir_build_stmt(proc, pa->body);
-
- ir_close_scope(proc, irDeferExit_Default, nullptr);
- case_end;
-
-
case_ast_node(pc, PushContext, node);
ir_emit_comment(proc, str_lit("push_context"));
irValue *new_context = ir_build_expr(proc, pc->expr);
diff --git a/src/parser.cpp b/src/parser.cpp
index abc556d5c..f81bb1a39 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -313,12 +313,7 @@ AST_NODE_KIND(_ComplexStmtBegin, "", i32) \
AstNode *clobber_list; \
isize output_count, input_count, clobber_count; \
}) \
- AST_NODE_KIND(PushAllocator, "push_allocator statement", struct { \
- Token token; \
- AstNode *expr; \
- AstNode *body; \
- }) \
- AST_NODE_KIND(PushContext, "push_context statement", struct { \
+ AST_NODE_KIND(PushContext, "context <- statement", struct { \
Token token; \
AstNode *expr; \
AstNode *body; \
@@ -596,7 +591,6 @@ Token ast_node_token(AstNode *node) {
case AstNode_BranchStmt: return node->BranchStmt.token;
case AstNode_UsingStmt: return node->UsingStmt.token;
case AstNode_AsmStmt: return node->AsmStmt.token;
- case AstNode_PushAllocator: return node->PushAllocator.token;
case AstNode_PushContext: return node->PushContext.token;
case AstNode_BadDecl: return node->BadDecl.begin;
@@ -829,10 +823,6 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) {
n->AsmStmt.input_list = clone_ast_node(a, n->AsmStmt.input_list);
n->AsmStmt.clobber_list = clone_ast_node(a, n->AsmStmt.clobber_list);
break;
- case AstNode_PushAllocator:
- n->PushAllocator.expr = clone_ast_node(a, n->PushAllocator.expr);
- n->PushAllocator.body = clone_ast_node(a, n->PushAllocator.body);
- break;
case AstNode_PushContext:
n->PushContext.expr = clone_ast_node(a, n->PushContext.expr);
n->PushContext.body = clone_ast_node(a, n->PushContext.body);
@@ -1365,14 +1355,6 @@ AstNode *ast_asm_stmt(AstFile *f, Token token, bool is_volatile, Token open, Tok
return result;
}
-AstNode *ast_push_allocator(AstFile *f, Token token, AstNode *expr, AstNode *body) {
- AstNode *result = make_ast_node(f, AstNode_PushAllocator);
- result->PushAllocator.token = token;
- result->PushAllocator.expr = expr;
- result->PushAllocator.body = body;
- return result;
-}
-
AstNode *ast_push_context(AstFile *f, Token token, AstNode *expr, AstNode *body) {
AstNode *result = make_ast_node(f, AstNode_PushContext);
result->PushContext.token = token;
@@ -1832,9 +1814,6 @@ void fix_advance_to_next_stmt(AstFile *f) {
case Token_continue:
case Token_fallthrough:
- case Token_push_allocator:
- case Token_push_context:
-
case Token_Hash:
{
if (t.pos == f->fix_prev_pos &&
@@ -4454,6 +4433,25 @@ AstNode *parse_stmt(AstFile *f) {
switch (token.kind) {
// Operands
case Token_context:
+ if (look_ahead_token_kind(f, 1) == Token_ArrowLeft) {
+ advance_token(f);
+ Token arrow = expect_token(f, Token_ArrowLeft);
+ AstNode *body = nullptr;
+ isize prev_level = f->expr_level;
+ f->expr_level = -1;
+ AstNode *expr = parse_expr(f, false);
+ f->expr_level = prev_level;
+
+ if (allow_token(f, Token_do)) {
+ body = convert_stmt_to_body(f, parse_stmt(f));
+ } else {
+ body = parse_block_stmt(f, false);
+ }
+
+ return ast_push_context(f, token, expr, body);
+ }
+ /*fallthrough*/
+
case Token_Ident:
case Token_Integer:
case Token_Float:
@@ -4539,40 +4537,6 @@ AstNode *parse_stmt(AstFile *f) {
return ast_bad_stmt(f, token, f->curr_token);
} break;
- case Token_push_allocator: {
- advance_token(f);
- AstNode *body = nullptr;
- isize prev_level = f->expr_level;
- f->expr_level = -1;
- AstNode *expr = parse_expr(f, false);
- f->expr_level = prev_level;
-
- if (allow_token(f, Token_do)) {
- body = convert_stmt_to_body(f, parse_stmt(f));
- } else {
- body = parse_block_stmt(f, false);
- }
-
- return ast_push_allocator(f, token, expr, body);
- } break;
-
- case Token_push_context: {
- advance_token(f);
- AstNode *body = nullptr;
- isize prev_level = f->expr_level;
- f->expr_level = -1;
- AstNode *expr = parse_expr(f, false);
- f->expr_level = prev_level;
-
- if (allow_token(f, Token_do)) {
- body = convert_stmt_to_body(f, parse_stmt(f));
- } else {
- body = parse_block_stmt(f, false);
- }
-
- return ast_push_context(f, token, expr, body);
- } break;
-
case Token_At: {
advance_token(f);
diff --git a/src/ssa.cpp b/src/ssa.cpp
index 3a5e283e2..0edd7b1b3 100644
--- a/src/ssa.cpp
+++ b/src/ssa.cpp
@@ -2176,9 +2176,6 @@ void ssa_build_stmt_internal(ssaProc *p, AstNode *node) {
ssa_emit_jump(p, b);
case_end;
- case_ast_node(pa, PushAllocator, node);
- GB_PANIC("TODO: PushAllocator");
- case_end;
case_ast_node(pc, PushContext, node);
GB_PANIC("TODO: PushContext");
case_end;
diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp
index f5b5b241f..14686d155 100644
--- a/src/tokenizer.cpp
+++ b/src/tokenizer.cpp
@@ -117,8 +117,6 @@ TOKEN_KIND(Token__KeywordBegin, "_KeywordBegin"), \
TOKEN_KIND(Token_inline, "inline"), \
TOKEN_KIND(Token_no_inline, "no_inline"), \
TOKEN_KIND(Token_context, "context"), \
- TOKEN_KIND(Token_push_context, "push_context"), \
- TOKEN_KIND(Token_push_allocator, "push_allocator"), \
TOKEN_KIND(Token_size_of, "size_of"), \
TOKEN_KIND(Token_align_of, "align_of"), \
TOKEN_KIND(Token_offset_of, "offset_of"), \