mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-08 11:34:20 +00:00
Remove old dead code
This commit is contained in:
@@ -289,17 +289,6 @@ void check_type_decl(CheckerContext *ctx, Entity *e, Ast *init_expr, Type *def)
|
||||
if (decl != nullptr) {
|
||||
AttributeContext ac = {};
|
||||
check_decl_attributes(ctx, decl->attributes, type_decl_attribute, &ac);
|
||||
if (ac.atom_op_table != nullptr) {
|
||||
Type *bt = base_type(e->type);
|
||||
switch (bt->kind) {
|
||||
case Type_Struct:
|
||||
bt->Struct.atom_op_table = ac.atom_op_table;
|
||||
break;
|
||||
default:
|
||||
error(e->token, "Only struct types can have custom atom operations");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7573,47 +7573,6 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
||||
return Expr_Expr;
|
||||
}
|
||||
|
||||
if (t->kind == Type_Struct) {
|
||||
TypeAtomOpTable *atom_op_table = t->Struct.atom_op_table;
|
||||
if (atom_op_table != nullptr) {
|
||||
if (atom_op_table->op[TypeAtomOp_index_set]) {
|
||||
if (c->assignment_lhs_hint == node) {
|
||||
o->mode = Addressing_AtomOpAssign;
|
||||
o->type = o->type;
|
||||
o->expr = node;
|
||||
return kind;
|
||||
}
|
||||
}
|
||||
if (atom_op_table->op[TypeAtomOp_index_get]) {
|
||||
Entity *e = atom_op_table->op[TypeAtomOp_index_get];
|
||||
if (ie->index == nullptr) {
|
||||
gbString str = expr_to_string(o->expr);
|
||||
error(o->expr, "Missing index for '%s'", str);
|
||||
gb_string_free(str);
|
||||
o->mode = Addressing_Invalid;
|
||||
o->expr = node;
|
||||
return kind;
|
||||
}
|
||||
|
||||
GB_ASSERT(e->identifier != nullptr);
|
||||
Ast *proc_ident = clone_ast(e->identifier);
|
||||
|
||||
auto args = array_make<Ast *>(heap_allocator(), 2);
|
||||
args[0] = ie->expr;
|
||||
args[1] = ie->index;
|
||||
|
||||
GB_ASSERT(c->file != nullptr);
|
||||
Ast *fake_call = ast_call_expr(c->file, proc_ident, args, ie->open, ie->close, {});
|
||||
check_expr_base(c, o, fake_call, type_hint);
|
||||
AtomOpMapEntry entry = {TypeAtomOp_index_get, fake_call};
|
||||
map_set(&c->info->atom_op_map, hash_pointer(node), entry);
|
||||
o->expr = node;
|
||||
return kind;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
i64 max_count = -1;
|
||||
bool valid = check_set_index_data(o, t, is_ptr, &max_count, o->type);
|
||||
|
||||
@@ -7752,37 +7711,6 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
||||
if (is_type_soa_struct(t)) {
|
||||
valid = true;
|
||||
o->type = make_soa_struct_slice(c, nullptr, nullptr, t->Struct.soa_elem);
|
||||
} else {
|
||||
TypeAtomOpTable *atom_op_table = t->Struct.atom_op_table;
|
||||
if (atom_op_table != nullptr && atom_op_table->op[TypeAtomOp_slice]) {
|
||||
Entity *e = atom_op_table->op[TypeAtomOp_slice];
|
||||
GB_ASSERT(e->identifier != nullptr);
|
||||
Ast *proc_ident = clone_ast(e->identifier);
|
||||
|
||||
Ast *expr = se->expr;
|
||||
if (o->mode == Addressing_Variable) {
|
||||
expr = ast_unary_expr(c->file, {Token_And, STR_LIT("&")}, expr);
|
||||
} else if (is_type_pointer(o->type)) {
|
||||
// Okay
|
||||
} else {
|
||||
gbString str = expr_to_string(node);
|
||||
error(node, "Cannot slice '%s', value is not addressable", str);
|
||||
gb_string_free(str);
|
||||
o->mode = Addressing_Invalid;
|
||||
o->expr = node;
|
||||
return kind;
|
||||
}
|
||||
auto args = array_make<Ast *>(heap_allocator(), 1);
|
||||
args[0] = expr;
|
||||
|
||||
|
||||
GB_ASSERT(c->file != nullptr);
|
||||
Ast *fake_call = ast_call_expr(c->file, proc_ident, args, se->open, se->close, {});
|
||||
check_expr_base(c, o, fake_call, type_hint);
|
||||
AtomOpMapEntry entry = {TypeAtomOp_slice, fake_call};
|
||||
map_set(&c->info->atom_op_map, hash_pointer(node), entry);
|
||||
valid = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -1489,53 +1489,6 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) {
|
||||
auto lhs_to_ignore = array_make<bool>(temporary_allocator(), lhs_count);
|
||||
|
||||
isize max = gb_min(lhs_count, rhs_count);
|
||||
// NOTE(bill, 2020-05-02): This is an utter hack to get these custom atom operations working
|
||||
// correctly for assignments
|
||||
for (isize i = 0; i < max; i++) {
|
||||
if (lhs_operands[i].mode == Addressing_AtomOpAssign) {
|
||||
Operand lhs = lhs_operands[i];
|
||||
|
||||
Type *t = base_type(lhs.type);
|
||||
GB_ASSERT(t->kind == Type_Struct);
|
||||
ast_node(ie, IndexExpr, unparen_expr(lhs.expr));
|
||||
|
||||
TypeAtomOpTable *atom_op_table = t->Struct.atom_op_table;
|
||||
GB_ASSERT(atom_op_table->op[TypeAtomOp_index_set] != nullptr);
|
||||
Entity *e = atom_op_table->op[TypeAtomOp_index_set];
|
||||
|
||||
GB_ASSERT(e->identifier != nullptr);
|
||||
Ast *proc_ident = clone_ast(e->identifier);
|
||||
GB_ASSERT(ctx->file != nullptr);
|
||||
|
||||
|
||||
TypeAndValue tv = type_and_value_of_expr(ie->expr);
|
||||
Ast *expr = ie->expr;
|
||||
if (is_type_pointer(tv.type)) {
|
||||
// Okay
|
||||
} else if (tv.mode == Addressing_Variable) {
|
||||
// NOTE(bill): Hack it to take the address instead
|
||||
expr = ast_unary_expr(ctx->file, {Token_And, STR_LIT("&")}, ie->expr);
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto args = array_make<Ast *>(heap_allocator(), 3);
|
||||
args[0] = expr;
|
||||
args[1] = ie->index;
|
||||
args[2] = rhs_operands[i].expr;
|
||||
|
||||
Ast *fake_call = ast_call_expr(ctx->file, proc_ident, args, ie->open, ie->close, {});
|
||||
Operand fake_operand = {};
|
||||
fake_operand.expr = lhs.expr;
|
||||
check_expr_base(ctx, &fake_operand, fake_call, nullptr);
|
||||
AtomOpMapEntry entry = {TypeAtomOp_index_set, fake_call};
|
||||
map_set(&ctx->info->atom_op_map, hash_pointer(lhs.expr), entry);
|
||||
|
||||
lhs_to_ignore[i] = true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (isize i = 0; i < max; i++) {
|
||||
if (lhs_to_ignore[i]) {
|
||||
continue;
|
||||
|
||||
@@ -322,19 +322,6 @@ void add_polymorphic_record_entity(CheckerContext *ctx, Ast *node, Type *named_t
|
||||
array_add(&array, e);
|
||||
map_set(&ctx->checker->info.gen_types, hash_pointer(original_type), array);
|
||||
}
|
||||
|
||||
{
|
||||
Type *dst_bt = base_type(named_type);
|
||||
Type *src_bt = base_type(original_type);
|
||||
if ((dst_bt != nullptr && src_bt != nullptr) &&
|
||||
(dst_bt->kind == src_bt->kind)){
|
||||
if (dst_bt->kind == Type_Struct) {
|
||||
if (dst_bt->Struct.atom_op_table == nullptr) {
|
||||
dst_bt->Struct.atom_op_table = src_bt->Struct.atom_op_table;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Type *check_record_polymorphic_params(CheckerContext *ctx, Ast *polymorphic_params,
|
||||
|
||||
200
src/checker.cpp
200
src/checker.cpp
@@ -2666,206 +2666,6 @@ DECL_ATTRIBUTE_PROC(type_decl_attribute) {
|
||||
if (name == "private") {
|
||||
// NOTE(bill): Handled elsewhere `check_collect_value_decl`
|
||||
return true;
|
||||
} else if (name == "index_get") {
|
||||
if (value != nullptr) {
|
||||
Operand o = {};
|
||||
check_expr_or_type(c, &o, value);
|
||||
Entity *e = entity_of_node(value);
|
||||
if (e != nullptr && e->kind == Entity_Procedure) {
|
||||
if (ac->deferred_procedure.entity != nullptr) {
|
||||
error(elem, "Previous usage of the '%.*s' attribute", LIT(name));
|
||||
}
|
||||
|
||||
bool valid = true;
|
||||
|
||||
{
|
||||
Type *pt = base_type(e->type);
|
||||
GB_ASSERT(pt->kind == Type_Proc);
|
||||
|
||||
if (pt->Proc.result_count == 0) {
|
||||
error(value, "'%s' attribute must return something", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
|
||||
if (pt->Proc.param_count < 2) {
|
||||
error(value, "'%s' attribute must allow for 2 parameters", LIT(name));
|
||||
valid = false;
|
||||
} else {
|
||||
isize minimum_param_count = 0;
|
||||
for_array(i, pt->Proc.params->Tuple.variables) {
|
||||
Entity *param = pt->Proc.params->Tuple.variables[i];
|
||||
if (param->kind == Entity_Variable) {
|
||||
if (param->Variable.param_value.kind == ParameterValue_Invalid) {
|
||||
minimum_param_count += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (param->kind == Entity_Constant) {
|
||||
minimum_param_count += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (minimum_param_count > 2) {
|
||||
error(value, "'%s' attribute must allow for at a minimum 2 parameters", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
if (ac->atom_op_table == nullptr) {
|
||||
ac->atom_op_table = gb_alloc_item(permanent_allocator(), TypeAtomOpTable);
|
||||
}
|
||||
ac->atom_op_table->op[TypeAtomOp_index_get] = e;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
error(elem, "Expected a procedure entity for '%.*s'", LIT(name));
|
||||
return false;
|
||||
} else if (name == "index_set") {
|
||||
if (value != nullptr) {
|
||||
Operand o = {};
|
||||
check_expr_or_type(c, &o, value);
|
||||
Entity *e = entity_of_node(value);
|
||||
if (e != nullptr && e->kind == Entity_Procedure) {
|
||||
if (ac->deferred_procedure.entity != nullptr) {
|
||||
error(elem, "Previous usage of the '%.*s' attribute", LIT(name));
|
||||
}
|
||||
|
||||
bool valid = true;
|
||||
|
||||
{
|
||||
Type *pt = base_type(e->type);
|
||||
GB_ASSERT(pt->kind == Type_Proc);
|
||||
|
||||
if (pt->Proc.param_count < 3) {
|
||||
error(value, "'%s' attribute must allow for 3 parameters", LIT(name));
|
||||
valid = false;
|
||||
} else {
|
||||
isize minimum_param_count = 0;
|
||||
for_array(i, pt->Proc.params->Tuple.variables) {
|
||||
Entity *param = pt->Proc.params->Tuple.variables[i];
|
||||
if (param->kind == Entity_Variable) {
|
||||
if (param->Variable.param_value.kind == ParameterValue_Invalid) {
|
||||
minimum_param_count += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (param->kind == Entity_Constant) {
|
||||
minimum_param_count += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (minimum_param_count > 3) {
|
||||
error(value, "'%s' attribute must allow for at a minimum 3 parameters", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (pt->Proc.variadic || pt->Proc.c_vararg) {
|
||||
error(value, "'%s' attribute does not allow variadic procedures", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
if (ac->atom_op_table == nullptr) {
|
||||
ac->atom_op_table = gb_alloc_item(permanent_allocator(), TypeAtomOpTable);
|
||||
}
|
||||
ac->atom_op_table->op[TypeAtomOp_index_set] = e;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
error(elem, "Expected a procedure entity for '%.*s'", LIT(name));
|
||||
return false;
|
||||
} else if (name == "slice") {
|
||||
if (value != nullptr) {
|
||||
Operand o = {};
|
||||
check_expr_or_type(c, &o, value);
|
||||
Entity *e = entity_of_node(value);
|
||||
if (e != nullptr && e->kind == Entity_Procedure) {
|
||||
if (ac->deferred_procedure.entity != nullptr) {
|
||||
error(elem, "Previous usage of the '%.*s' attribute", LIT(name));
|
||||
}
|
||||
|
||||
bool valid = true;
|
||||
|
||||
{
|
||||
Type *pt = base_type(e->type);
|
||||
GB_ASSERT(pt->kind == Type_Proc);
|
||||
|
||||
if (pt->Proc.param_count < 1) {
|
||||
error(value, "'%s' attribute must allow for 1 parameter", LIT(name));
|
||||
valid = false;
|
||||
} else {
|
||||
isize minimum_param_count = 0;
|
||||
for_array(i, pt->Proc.params->Tuple.variables) {
|
||||
Entity *param = pt->Proc.params->Tuple.variables[i];
|
||||
if (param->kind == Entity_Variable) {
|
||||
if (param->Variable.param_value.kind == ParameterValue_Invalid) {
|
||||
minimum_param_count += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if (param->kind == Entity_Constant) {
|
||||
minimum_param_count += 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (minimum_param_count > 1) {
|
||||
error(value, "'%s' attribute must allow for at a minimum 1 parameter", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
{
|
||||
Entity *param = pt->Proc.params->Tuple.variables[0];
|
||||
Type *param_type = base_type(param->type);
|
||||
if (is_type_pointer(param_type) && !is_type_rawptr(param_type)) {
|
||||
// okay
|
||||
} else {
|
||||
error(value, "'%s' attribute's first parameter must be a pointer", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (pt->Proc.variadic || pt->Proc.c_vararg) {
|
||||
error(value, "'%s' attribute does not allow variadic procedures", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
|
||||
if (pt->Proc.result_count != 1) {
|
||||
error(value, "'%s' attribute must return 1 result", LIT(name));
|
||||
valid = false;
|
||||
} else {
|
||||
Type *rt = pt->Proc.results->Tuple.variables[0]->type;
|
||||
rt = base_type(rt);
|
||||
if (!is_type_slice(rt)) {
|
||||
error(value, "'%s' attribute must return a slice", LIT(name));
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
if (ac->atom_op_table == nullptr) {
|
||||
ac->atom_op_table = gb_alloc_item(permanent_allocator(), TypeAtomOpTable);
|
||||
}
|
||||
ac->atom_op_table->op[TypeAtomOp_slice] = e;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
error(elem, "Expected a procedure entity for '%.*s'", LIT(name));
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -114,7 +114,6 @@ struct AttributeContext {
|
||||
String deprecated_message;
|
||||
DeferredProcedure deferred_procedure;
|
||||
u32 optimization_mode; // ProcedureOptimizationMode
|
||||
struct TypeAtomOpTable *atom_op_table;
|
||||
};
|
||||
|
||||
AttributeContext make_attribute_context(String link_prefix) {
|
||||
|
||||
@@ -12147,27 +12147,6 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) {
|
||||
return lb_addr(val);
|
||||
}
|
||||
|
||||
if (!is_type_indexable(t)) {
|
||||
AtomOpMapEntry *found = map_get(&p->module->info->atom_op_map, hash_pointer(expr));
|
||||
if (found != nullptr) {
|
||||
if (found->kind == TypeAtomOp_index_get) {
|
||||
return lb_build_addr(p, found->node);
|
||||
} else if (found->kind == TypeAtomOp_index_get_ptr) {
|
||||
return lb_addr(lb_build_expr(p, found->node));
|
||||
} else if (found->kind == TypeAtomOp_index_set) {
|
||||
lbValue ptr = lb_build_addr_ptr(p, ie->expr);
|
||||
if (deref) {
|
||||
ptr = lb_emit_load(p, ptr);
|
||||
}
|
||||
|
||||
lbAddr addr = {lbAddr_AtomOp_index_set};
|
||||
addr.addr = ptr;
|
||||
addr.index_set.index = lb_build_expr(p, ie->index);
|
||||
addr.index_set.node = found->node;
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
}
|
||||
GB_ASSERT_MSG(is_type_indexable(t), "%s %s", type_to_string(t), expr_to_string(expr));
|
||||
|
||||
if (is_type_map(t)) {
|
||||
@@ -12312,36 +12291,6 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) {
|
||||
|
||||
bool no_indices = se->low == nullptr && se->high == nullptr;
|
||||
|
||||
{
|
||||
Type *type = base_type(type_of_expr(se->expr));
|
||||
if (type->kind == Type_Struct && !is_type_soa_struct(type)) {
|
||||
TypeAtomOpTable *atom_op_table = type->Struct.atom_op_table;
|
||||
if (atom_op_table != nullptr && atom_op_table->op[TypeAtomOp_slice]) {
|
||||
AtomOpMapEntry *found = map_get(&p->module->info->atom_op_map, hash_pointer(expr));
|
||||
if (found) {
|
||||
lbValue base = lb_build_expr(p, found->node);
|
||||
|
||||
Type *slice_type = base.type;
|
||||
lbValue len = lb_slice_len(p, base);
|
||||
if (high.value == nullptr) high = len;
|
||||
|
||||
if (!no_indices) {
|
||||
lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr);
|
||||
}
|
||||
|
||||
|
||||
lbValue elem = lb_emit_ptr_offset(p, lb_slice_elem(p, base), low);
|
||||
lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int);
|
||||
|
||||
lbAddr slice = lb_add_local_generated(p, slice_type, false);
|
||||
lb_fill_slice(p, slice, elem, new_len);
|
||||
return slice;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
lbAddr addr = lb_build_addr(p, se->expr);
|
||||
lbValue base = lb_addr_load(p, addr);
|
||||
Type *type = base_type(base.type);
|
||||
|
||||
@@ -22,7 +22,6 @@ enum AddressingMode {
|
||||
Addressing_OptionalOk = 10, // rhs: acts like a value with an optional boolean part (for existence check)
|
||||
Addressing_SoaVariable = 11, // Struct-Of-Arrays indexed variable
|
||||
|
||||
Addressing_AtomOpAssign = 12, // Specialized for custom atom operations for assignments
|
||||
};
|
||||
|
||||
struct TypeAndValue {
|
||||
|
||||
@@ -128,21 +128,6 @@ enum StructSoaKind {
|
||||
StructSoa_Dynamic = 3,
|
||||
};
|
||||
|
||||
enum TypeAtomOpKind {
|
||||
TypeAtomOp_Invalid,
|
||||
|
||||
TypeAtomOp_index_get,
|
||||
TypeAtomOp_index_set,
|
||||
TypeAtomOp_slice,
|
||||
TypeAtomOp_index_get_ptr,
|
||||
|
||||
TypeAtomOp_COUNT,
|
||||
};
|
||||
|
||||
struct TypeAtomOpTable {
|
||||
Entity *op[TypeAtomOp_COUNT];
|
||||
};
|
||||
|
||||
struct TypeStruct {
|
||||
Array<Entity *> fields;
|
||||
Array<String> tags;
|
||||
@@ -156,8 +141,6 @@ struct TypeStruct {
|
||||
i64 custom_align;
|
||||
Entity * names;
|
||||
|
||||
TypeAtomOpTable *atom_op_table;
|
||||
|
||||
Type * soa_elem;
|
||||
i64 soa_count;
|
||||
StructSoaKind soa_kind;
|
||||
@@ -180,8 +163,6 @@ struct TypeUnion {
|
||||
Type * polymorphic_params; // Type_Tuple
|
||||
Type * polymorphic_parent;
|
||||
|
||||
TypeAtomOpTable *atom_op_table;
|
||||
|
||||
bool no_nil;
|
||||
bool maybe;
|
||||
bool is_polymorphic;
|
||||
|
||||
Reference in New Issue
Block a user