Remove addressing mode Addressing_Immutable

This commit is contained in:
gingerBill
2019-12-01 19:11:00 +00:00
parent ee78374281
commit e229885b2b
8 changed files with 34 additions and 58 deletions
-2
View File
@@ -1154,7 +1154,6 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty
if (!(e->flags & EntityFlag_Using)) {
continue;
}
bool is_immutable = e->Variable.is_immutable;
bool is_value = (e->flags & EntityFlag_Value) != 0 && !is_type_pointer(e->type);
String name = e->token.string;
Type *t = base_type(type_deref(e->type));
@@ -1168,7 +1167,6 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty
Entity *f = scope->elements.entries[i].value;
if (f->kind == Entity_Variable) {
Entity *uvar = alloc_entity_using_variable(e, f->token, f->type, nullptr);
uvar->Variable.is_immutable = is_immutable;
if (is_value) uvar->flags |= EntityFlag_Value;
ProcUsingVar puv = {e, uvar};
+11 -23
View File
@@ -1142,9 +1142,6 @@ Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *named_type, Typ
if (e->flags & EntityFlag_Value) {
o->mode = Addressing_Value;
}
if (e->Variable.is_immutable) {
o->mode = Addressing_Immutable;
}
break;
case Entity_Procedure:
@@ -3251,9 +3248,7 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ
break;
case Entity_Variable:
// TODO(bill): Is this the rule I need?
if (operand->mode == Addressing_Immutable) {
// Okay
} else if (operand->mode == Addressing_Context) {
if (operand->mode == Addressing_Context) {
if (sel.indirect) {
operand->mode = Addressing_Variable;
}
@@ -6778,8 +6773,7 @@ bool check_set_index_data(Operand *o, Type *t, bool indirection, i64 *max_count,
if (o->mode == Addressing_Constant) {
*max_count = o->value.value_string.len;
}
if (o->mode != Addressing_Immutable && o->mode != Addressing_Constant) {
// o->mode = Addressing_Variable;
if (o->mode != Addressing_Constant) {
o->mode = Addressing_Value;
}
o->type = t_u8;
@@ -6789,27 +6783,25 @@ bool check_set_index_data(Operand *o, Type *t, bool indirection, i64 *max_count,
case Type_Array:
*max_count = t->Array.count;
if (o->mode != Addressing_Immutable) {
if (indirection) {
o->mode = Addressing_Variable;
} else if (o->mode != Addressing_Variable &&
o->mode != Addressing_Constant) {
o->mode = Addressing_Value;
}
if (indirection) {
o->mode = Addressing_Variable;
} else if (o->mode != Addressing_Variable &&
o->mode != Addressing_Constant) {
o->mode = Addressing_Value;
}
o->type = t->Array.elem;
return true;
case Type_Slice:
o->type = t->Slice.elem;
if (o->mode != Addressing_Immutable && o->mode != Addressing_Constant) {
if (o->mode != Addressing_Constant) {
o->mode = Addressing_Variable;
}
return true;
case Type_DynamicArray:
o->type = t->DynamicArray.elem;
if (o->mode != Addressing_Immutable && o->mode != Addressing_Constant) {
if (o->mode != Addressing_Constant) {
o->mode = Addressing_Variable;
}
return true;
@@ -8137,9 +8129,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
return kind;
}
if (o->mode != Addressing_Immutable) {
o->mode = Addressing_Value;
}
o->mode = Addressing_Value;
if (se->low == nullptr && se->high != nullptr) {
// error(se->interval0, "1st index is required if a 2nd index is specified");
@@ -8191,9 +8181,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
} else {
Type *t = base_type(o->type);
if (t->kind == Type_Pointer && !is_type_empty_union(t->Pointer.elem)) {
if (o->mode != Addressing_Immutable) {
o->mode = Addressing_Variable;
}
o->mode = Addressing_Variable;
o->type = t->Pointer.elem;
} else {
gbString str = expr_to_string(o->expr);
+6 -11
View File
@@ -313,9 +313,7 @@ Type *check_assignment_variable(CheckerContext *ctx, Operand *lhs, Operand *rhs)
Entity *e = entity_of_ident(lhs->expr);
gbString str = expr_to_string(lhs->expr);
if (lhs->mode == Addressing_Immutable) {
error(lhs->expr, "Cannot assign to an immutable: '%s'", str);
} else if (e != nullptr && e->flags & EntityFlag_Param) {
if (e != nullptr && e->flags & EntityFlag_Param) {
error(lhs->expr, "Cannot assign to '%s' which is a procedure parameter", str);
} else {
error(lhs->expr, "Cannot assign to '%s'", str);
@@ -688,8 +686,7 @@ void check_inline_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) {
found = scope_lookup_current(ctx->scope, str);
}
if (found == nullptr) {
bool is_immutable = true;
entity = alloc_entity_variable(ctx->scope, token, type, is_immutable, EntityState_Resolved);
entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved);
entity->flags |= EntityFlag_Value;
add_entity_definition(&ctx->checker->info, name, entity);
} else {
@@ -1164,7 +1161,7 @@ void check_type_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) {
check_open_scope(ctx, stmt);
{
Entity *tag_var = alloc_entity_variable(ctx->scope, lhs->Ident.token, case_type, false, EntityState_Resolved);
Entity *tag_var = alloc_entity_variable(ctx->scope, lhs->Ident.token, case_type, EntityState_Resolved);
tag_var->flags |= EntityFlag_Used;
tag_var->flags |= EntityFlag_Value;
add_entity(ctx->checker, ctx->scope, lhs, tag_var);
@@ -1609,8 +1606,7 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) {
found = scope_lookup_current(ctx->scope, str);
}
if (found == nullptr) {
bool is_immutable = false;
entity = alloc_entity_variable(ctx->scope, token, type, is_immutable, EntityState_Resolved);
entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved);
entity->flags |= EntityFlag_Value;
add_entity_definition(&ctx->checker->info, name, entity);
} else {
@@ -1815,7 +1811,7 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) {
new_name_count += 1;
}
if (found == nullptr) {
entity = alloc_entity_variable(ctx->scope, token, nullptr, false);
entity = alloc_entity_variable(ctx->scope, token, nullptr);
entity->identifier = name;
Ast *fl = ctx->foreign_context.curr_library;
@@ -1975,7 +1971,6 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) {
if (e->kind != Entity_Variable) {
continue;
}
bool is_immutable = e->Variable.is_immutable;
String name = e->token.string;
Type *t = base_type(type_deref(e->type));
@@ -1987,7 +1982,7 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) {
Entity *f = scope->elements.entries[i].value;
if (f->kind == Entity_Variable) {
Entity *uvar = alloc_entity_using_variable(e, f->token, f->type, nullptr);
uvar->Variable.is_immutable = is_immutable;
uvar->flags |= (e->flags & EntityFlag_Value);
Entity *prev = scope_insert(ctx->scope, uvar);
if (prev != nullptr) {
error(token, "Namespace collision while 'using' '%.*s' of: %.*s", LIT(name), LIT(prev->token.string));
+2 -2
View File
@@ -200,8 +200,8 @@ void check_struct_fields(CheckerContext *ctx, Ast *node, Array<Entity *> *fields
Entity *make_names_field_for_struct(CheckerContext *ctx, Scope *scope) {
Entity *e = alloc_entity_field(scope, make_token_ident(str_lit("names")), t_string_slice, false, 0);
e->Variable.is_immutable = true;
e->flags |= EntityFlag_TypeField;
e->flags |= EntityFlag_Value;
return e;
}
@@ -935,7 +935,7 @@ void check_bit_field_type(CheckerContext *ctx, Type *bit_field_type, Ast *node)
u32 bits = cast(u32)bits_;
Type *value_type = alloc_type_bit_field_value(bits);
Entity *e = alloc_entity_variable(bit_field_type->BitField.scope, ident->Ident.token, value_type, false);
Entity *e = alloc_entity_variable(bit_field_type->BitField.scope, ident->Ident.token, value_type);
e->identifier = ident;
e->flags |= EntityFlag_BitFieldValue;
+1 -2
View File
@@ -7,7 +7,6 @@ void check_expr(CheckerContext *c, Operand *operand, Ast *expression);
bool is_operand_value(Operand o) {
switch (o.mode) {
case Addressing_Value:
case Addressing_Immutable:
case Addressing_Context:
case Addressing_Variable:
case Addressing_Constant:
@@ -2607,7 +2606,7 @@ void check_collect_value_decl(CheckerContext *c, Ast *decl) {
error(name, "A declaration's name must be an identifier, got %.*s", LIT(ast_strings[name->kind]));
continue;
}
Entity *e = alloc_entity_variable(c->scope, name->Ident.token, nullptr, false);
Entity *e = alloc_entity_variable(c->scope, name->Ident.token, nullptr);
e->identifier = name;
if (entity_is_private) {
+5 -8
View File
@@ -121,7 +121,6 @@ struct Entity {
String link_prefix;
bool is_foreign;
bool is_export;
bool is_immutable;
} Variable;
struct {
Type * type_parameter_specialization;
@@ -216,9 +215,8 @@ Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) {
return entity;
}
Entity *alloc_entity_variable(Scope *scope, Token token, Type *type, bool is_immutable, EntityState state = EntityState_Unresolved) {
Entity *alloc_entity_variable(Scope *scope, Token token, Type *type, EntityState state = EntityState_Unresolved) {
Entity *entity = alloc_entity(Entity_Variable, scope, token, type);
entity->Variable.is_immutable = is_immutable;
entity->state = state;
return entity;
}
@@ -250,8 +248,7 @@ Entity *alloc_entity_type_name(Scope *scope, Token token, Type *type, EntityStat
}
Entity *alloc_entity_param(Scope *scope, Token token, Type *type, bool is_using, bool is_value) {
bool is_immutable = false;
Entity *entity = alloc_entity_variable(scope, token, type, is_immutable);
Entity *entity = alloc_entity_variable(scope, token, type);
entity->flags |= EntityFlag_Used;
entity->flags |= EntityFlag_Param;
entity->state = EntityState_Resolved;
@@ -271,7 +268,7 @@ Entity *alloc_entity_const_param(Scope *scope, Token token, Type *type, ExactVal
Entity *alloc_entity_field(Scope *scope, Token token, Type *type, bool is_using, i32 field_src_index, EntityState state = EntityState_Unresolved) {
Entity *entity = alloc_entity_variable(scope, token, type, false);
Entity *entity = alloc_entity_variable(scope, token, type);
entity->Variable.field_src_index = field_src_index;
entity->Variable.field_index = field_src_index;
if (is_using) entity->flags |= EntityFlag_Using;
@@ -281,7 +278,7 @@ Entity *alloc_entity_field(Scope *scope, Token token, Type *type, bool is_using,
}
Entity *alloc_entity_array_elem(Scope *scope, Token token, Type *type, i32 field_src_index) {
Entity *entity = alloc_entity_variable(scope, token, type, false);
Entity *entity = alloc_entity_variable(scope, token, type);
entity->Variable.field_src_index = field_src_index;
entity->Variable.field_index = field_src_index;
entity->flags |= EntityFlag_Field;
@@ -347,6 +344,6 @@ Entity *alloc_entity_label(Scope *scope, Token token, Type *type, Ast *node, Ast
Entity *alloc_entity_dummy_variable(Scope *scope, Token token) {
token.string = str_lit("_");
return alloc_entity_variable(scope, token, nullptr, false);
return alloc_entity_variable(scope, token, nullptr);
}
+9 -9
View File
@@ -1476,7 +1476,7 @@ irValue *ir_generate_array(irModule *m, Type *elem_type, i64 count, String prefi
String s = make_string_c(text);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(s), alloc_type_array(elem_type, count), false);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(s), alloc_type_array(elem_type, count));
irValue *value = ir_value_global(e, nullptr);
value->Global.is_private = true;
ir_module_add_value(m, e, value);
@@ -1743,7 +1743,7 @@ irValue *ir_add_local_generated(irProcedure *proc, Type *type, bool zero_initial
if (proc->curr_block) {
scope = proc->curr_block->scope;
}
Entity *e = alloc_entity_variable(scope, empty_token, type, false);
Entity *e = alloc_entity_variable(scope, empty_token, type);
return ir_add_local(proc, e, nullptr, zero_initialized);
}
@@ -1759,7 +1759,7 @@ irValue *ir_add_global_generated(irModule *m, Type *type, irValue *value) {
String name = make_string(str, len-1);
Scope *scope = nullptr;
Entity *e = alloc_entity_variable(scope, make_token_ident(name), type, false);
Entity *e = alloc_entity_variable(scope, make_token_ident(name), type);
irValue *g = ir_value_global(e, value);
ir_module_add_value(m, e, g);
map_set(&m->members, hash_string(name), g);
@@ -10562,7 +10562,7 @@ void ir_init_module(irModule *m, Checker *c) {
isize max_type_info_count = ir_type_info_count(m->info);
String name = str_lit(IR_TYPE_INFO_DATA_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name), alloc_type_array(t_type_info, max_type_info_count), false);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name), alloc_type_array(t_type_info, max_type_info_count));
irValue *g = ir_value_global(e, nullptr);
g->Global.is_private = true;
ir_module_add_value(m, e, g);
@@ -10600,7 +10600,7 @@ void ir_init_module(irModule *m, Checker *c) {
{
String name = str_lit(IR_TYPE_INFO_TYPES_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
alloc_type_array(t_type_info_ptr, count), false);
alloc_type_array(t_type_info_ptr, count));
irValue *g = ir_value_global(e, nullptr);
ir_module_add_value(m, e, g);
map_set(&m->members, hash_string(name), g);
@@ -10609,7 +10609,7 @@ void ir_init_module(irModule *m, Checker *c) {
{
String name = str_lit(IR_TYPE_INFO_NAMES_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
alloc_type_array(t_string, count), false);
alloc_type_array(t_string, count));
irValue *g = ir_value_global(e, nullptr);
ir_module_add_value(m, e, g);
map_set(&m->members, hash_string(name), g);
@@ -10618,7 +10618,7 @@ void ir_init_module(irModule *m, Checker *c) {
{
String name = str_lit(IR_TYPE_INFO_OFFSETS_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
alloc_type_array(t_uintptr, count), false);
alloc_type_array(t_uintptr, count));
irValue *g = ir_value_global(e, nullptr);
ir_module_add_value(m, e, g);
map_set(&m->members, hash_string(name), g);
@@ -10628,7 +10628,7 @@ void ir_init_module(irModule *m, Checker *c) {
{
String name = str_lit(IR_TYPE_INFO_USINGS_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
alloc_type_array(t_bool, count), false);
alloc_type_array(t_bool, count));
irValue *g = ir_value_global(e, nullptr);
ir_module_add_value(m, e, g);
map_set(&m->members, hash_string(name), g);
@@ -10638,7 +10638,7 @@ void ir_init_module(irModule *m, Checker *c) {
{
String name = str_lit(IR_TYPE_INFO_TAGS_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
alloc_type_array(t_string, count), false);
alloc_type_array(t_string, count));
irValue *g = ir_value_global(e, nullptr);
ir_module_add_value(m, e, g);
map_set(&m->members, hash_string(name), g);
-1
View File
@@ -10,7 +10,6 @@ enum AddressingMode {
Addressing_Invalid, // invalid addressing mode
Addressing_NoValue, // no value (void in C)
Addressing_Value, // computed value (rvalue)
Addressing_Immutable, // immutable computed value (const rvalue)
Addressing_Context, // context value
Addressing_Variable, // addressable variable (lvalue)
Addressing_Constant, // constant