aboutsummaryrefslogtreecommitdiff
path: root/src/checker/expression.cpp
diff options
context:
space:
mode:
authorgingerBill <ginger.bill.22@gmail.com>2016-07-30 00:09:30 +0100
committergingerBill <ginger.bill.22@gmail.com>2016-07-30 00:17:13 +0100
commit776dc0e8f1aa506ae0096c78ff10565e56c175e7 (patch)
tree946508a869196a3bf1d005e0ddffd182a1786a1d /src/checker/expression.cpp
parent32ab8fcf99df786c264ca566799b022c66cca34b (diff)
Restart LLVM IR SSA generation
This is the third go and I'm going for it!
Diffstat (limited to 'src/checker/expression.cpp')
-rw-r--r--src/checker/expression.cpp76
1 files changed, 18 insertions, 58 deletions
diff --git a/src/checker/expression.cpp b/src/checker/expression.cpp
index 9302990b5..1d4cf02a8 100644
--- a/src/checker/expression.cpp
+++ b/src/checker/expression.cpp
@@ -9,8 +9,8 @@ void check_selector (Checker *c, Operand *operand, AstNode *n
void check_not_tuple (Checker *c, Operand *operand);
void convert_to_typed (Checker *c, Operand *operand, Type *target_type);
gbString expression_to_string (AstNode *expression);
-void check_entity_declaration(Checker *c, Entity *e, Type *named_type);
-void check_procedure_body(Checker *c, Token token, DeclarationInfo *decl, Type *type, AstNode *body);
+void check_entity_declaration(Checker *c, Entity *e, DeclarationInfo *decl, Type *named_type);
+void check_procedure_body (Checker *c, Token token, DeclarationInfo *decl, Type *type, AstNode *body);
void check_struct_type(Checker *c, Type *struct_type, AstNode *node) {
@@ -51,7 +51,7 @@ void check_struct_type(Checker *c, Type *struct_type, AstNode *node) {
map_set(&entity_map, key, e);
fields[field_index++] = e;
}
- add_entity_use(c, name, e);
+ add_entity_use(&c->info, name, e);
}
}
struct_type->structure.fields = fields;
@@ -143,9 +143,16 @@ void check_identifier(Checker *c, Operand *o, AstNode *n, Type *named_type) {
"Undeclared type or identifier `%.*s`", LIT(n->identifier.token.string));
return;
}
- add_entity_use(c, n, e);
+ add_entity_use(&c->info, n, e);
- check_entity_declaration(c, e, named_type);
+ if (e->type == NULL) {
+ auto *found = map_get(&c->info.entities, hash_pointer(e));
+ if (found != NULL) {
+ check_entity_declaration(c, e, *found, named_type);
+ } else {
+ GB_PANIC("Internal Compiler Error: DeclarationInfo not found!");
+ }
+ }
if (e->type == NULL) {
GB_PANIC("Compiler error: How did this happen? type: %s; identifier: %.*s\n", type_to_string(e->type), LIT(n->identifier.token.string));
@@ -386,7 +393,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type) {
end:
GB_ASSERT(is_type_typed(type));
- add_type_and_value(c, e, Addressing_Type, type, null_value);
+ add_type_and_value(&c->info, e, Addressing_Type, type, null_value);
return type;
}
@@ -758,7 +765,7 @@ void check_binary_expression(Checker *c, Operand *x, AstNode *node) {
void update_expression_type(Checker *c, AstNode *e, Type *type) {
- ExpressionInfo *found = map_get(&c->untyped, hash_pointer(e));
+ ExpressionInfo *found = map_get(&c->info.untyped, hash_pointer(e));
if (!found)
return;
@@ -786,7 +793,7 @@ void update_expression_type(Checker *c, AstNode *e, Type *type) {
}
void update_expression_value(Checker *c, AstNode *e, ExactValue value) {
- ExpressionInfo *found = map_get(&c->untyped, hash_pointer(e));
+ ExpressionInfo *found = map_get(&c->info.untyped, hash_pointer(e));
if (found)
found->value = value;
}
@@ -977,7 +984,7 @@ void check_selector(Checker *c, Operand *operand, AstNode *node) {
operand->expression = node;
return;
}
- add_entity_use(c, selector, entity);
+ add_entity_use(&c->info, selector, entity);
operand->type = entity->type;
operand->expression = node;
@@ -1241,53 +1248,6 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
operand->mode = Addressing_Value;
} break;
- case BuiltinProcedure_copy_bytes: {
- // copy_bytes :: proc(dest, source: rawptr, byte_count: int)
- Type *dest_type = NULL, *src_type = NULL;
-
- Type *d = get_base_type(operand->type);
- if (is_type_pointer(d))
- dest_type = d;
-
- Operand op = {};
- check_expression(c, &op, ce->arg_list->next);
- if (op.mode == Addressing_Invalid)
- return false;
- Type *s = get_base_type(op.type);
- if (is_type_pointer(s))
- src_type = s;
-
- if (dest_type == NULL || src_type == NULL) {
- error(&c->error_collector, ast_node_token(call), "`copy_bytes` only expects pointers for the destintation and source");
- return false;
- }
-
- check_expression(c, &op, ce->arg_list->next->next);
- if (op.mode == Addressing_Invalid)
- return false;
-
- convert_to_typed(c, &op, &basic_types[Basic_int]);
- if (op.mode == Addressing_Invalid ||
- op.type->kind != Type_Basic ||
- op.type->basic.kind != Basic_int) {
- gbString str = type_to_string(op.type);
- defer (gb_string_free(str));
- error(&c->error_collector, ast_node_token(call), "`copy_bytes` 3rd argument must be of type `int`, a `%s` was given", str);
- return false;
- }
-
- if (op.mode == Addressing_Constant) {
- if (exact_value_to_integer(op.value).value_integer <= 0) {
- error(&c->error_collector, ast_node_token(call), "You cannot copy a zero or negative amount of bytes with `copy_bytes`");
- return false;
- }
- }
-
- operand->type = NULL;
- operand->mode = Addressing_NoValue;
- } break;
-
-
case BuiltinProcedure_print:
case BuiltinProcedure_println: {
for (AstNode *arg = ce->arg_list; arg != NULL; arg = arg->next) {
@@ -1896,9 +1856,9 @@ ExpressionKind check_expression_base(Checker *c, Operand *o, AstNode *node, Type
if (type != NULL) {
if (is_type_untyped(type)) {
- add_untyped(c, node, false, o->mode, type, value);
+ add_untyped(&c->info, node, false, o->mode, type, value);
} else {
- add_type_and_value(c, node, o->mode, type, value);
+ add_type_and_value(&c->info, node, o->mode, type, value);
}
}
return kind;