mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Fix global maps and initialize the preload types before
This commit is contained in:
+9
-3
@@ -9,7 +9,6 @@
|
|||||||
#import "utf8.odin";
|
#import "utf8.odin";
|
||||||
#import ht "http_test.odin";
|
#import ht "http_test.odin";
|
||||||
|
|
||||||
|
|
||||||
main :: proc() {
|
main :: proc() {
|
||||||
{
|
{
|
||||||
m: map[f32]int;
|
m: map[f32]int;
|
||||||
@@ -21,11 +20,18 @@ main :: proc() {
|
|||||||
m[3.0] = 564;
|
m[3.0] = 564;
|
||||||
c := m[3.0];
|
c := m[3.0];
|
||||||
_, ok := m[3.0];
|
_, ok := m[3.0];
|
||||||
assert(ok && c == 564);
|
// assert(ok && c == 564);
|
||||||
|
|
||||||
|
fmt.print("map[");
|
||||||
|
i := 0;
|
||||||
for val, key in m {
|
for val, key in m {
|
||||||
fmt.printf("m[%f] == %v\n", key, val);
|
if i > 0 {
|
||||||
|
fmt.print(", ");
|
||||||
|
}
|
||||||
|
fmt.printf("%f=%v", key, val);
|
||||||
|
i += 1;
|
||||||
}
|
}
|
||||||
|
fmt.println("]");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
m := map[string]u32{
|
m := map[string]u32{
|
||||||
|
|||||||
@@ -1132,6 +1132,12 @@ void check_map_type(Checker *c, Type *type, AstNode *node) {
|
|||||||
gbAllocator a = c->allocator;
|
gbAllocator a = c->allocator;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
// NOTE(bill): The preload types may have not been set yet
|
||||||
|
if (t_map_key == NULL) {
|
||||||
|
init_preload(c);
|
||||||
|
}
|
||||||
|
GB_ASSERT(t_map_key != NULL);
|
||||||
|
|
||||||
Type *entry_type = make_type_struct(a);
|
Type *entry_type = make_type_struct(a);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -261,7 +261,6 @@ Type *check_assignment_variable(Checker *c, Operand *op_a, AstNode *lhs) {
|
|||||||
case Addressing_Invalid:
|
case Addressing_Invalid:
|
||||||
return NULL;
|
return NULL;
|
||||||
case Addressing_Variable:
|
case Addressing_Variable:
|
||||||
break;
|
|
||||||
case Addressing_MapIndex:
|
case Addressing_MapIndex:
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
|
|||||||
@@ -1395,7 +1395,7 @@ irValue *ir_emit_struct_ep(irProcedure *proc, irValue *s, i32 index);
|
|||||||
irValue *ir_emit_comp(irProcedure *proc, TokenKind op_kind, irValue *left, irValue *right);
|
irValue *ir_emit_comp(irProcedure *proc, TokenKind op_kind, irValue *left, irValue *right);
|
||||||
|
|
||||||
irValue *ir_gen_map_header(irProcedure *proc, irValue *map_val, Type *map_type) {
|
irValue *ir_gen_map_header(irProcedure *proc, irValue *map_val, Type *map_type) {
|
||||||
GB_ASSERT(is_type_pointer(ir_type(map_val)));
|
GB_ASSERT_MSG(is_type_pointer(ir_type(map_val)), "%s", type_to_string(ir_type(map_val)));
|
||||||
gbAllocator a = proc->module->allocator;
|
gbAllocator a = proc->module->allocator;
|
||||||
irValue *h = ir_add_local_generated(proc, t_map_header);
|
irValue *h = ir_add_local_generated(proc, t_map_header);
|
||||||
|
|
||||||
@@ -3027,7 +3027,7 @@ irValue *ir_build_single_expr(irProcedure *proc, AstNode *expr, TypeAndValue *tv
|
|||||||
|
|
||||||
|
|
||||||
case_ast_node(cl, CompoundLit, expr);
|
case_ast_node(cl, CompoundLit, expr);
|
||||||
return ir_emit_load(proc, ir_build_addr(proc, expr).addr);
|
return ir_addr_load(proc, ir_build_addr(proc, expr));
|
||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
|
|
||||||
@@ -3597,11 +3597,11 @@ irValue *ir_build_single_expr(irProcedure *proc, AstNode *expr, TypeAndValue *tv
|
|||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
case_ast_node(de, DemaybeExpr, expr);
|
case_ast_node(de, DemaybeExpr, expr);
|
||||||
return ir_emit_load(proc, ir_build_addr(proc, expr).addr);
|
return ir_addr_load(proc, ir_build_addr(proc, expr));
|
||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
case_ast_node(se, SliceExpr, expr);
|
case_ast_node(se, SliceExpr, expr);
|
||||||
return ir_emit_load(proc, ir_build_addr(proc, expr).addr);
|
return ir_addr_load(proc, ir_build_addr(proc, expr));
|
||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
case_ast_node(ie, IndexExpr, expr);
|
case_ast_node(ie, IndexExpr, expr);
|
||||||
@@ -3824,17 +3824,12 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) {
|
|||||||
Type *t = base_type(type_of_expr(proc->module->info, ie->expr));
|
Type *t = base_type(type_of_expr(proc->module->info, ie->expr));
|
||||||
gbAllocator a = proc->module->allocator;
|
gbAllocator a = proc->module->allocator;
|
||||||
|
|
||||||
|
|
||||||
bool deref = is_type_pointer(t);
|
bool deref = is_type_pointer(t);
|
||||||
t = base_type(type_deref(t));
|
t = base_type(type_deref(t));
|
||||||
|
|
||||||
if (is_type_map(t)) {
|
if (is_type_map(t)) {
|
||||||
irAddr map_addr = ir_build_addr(proc, ie->expr);
|
irAddr map_addr = ir_build_addr(proc, ie->expr);
|
||||||
irValue *map_val = map_addr.addr;
|
irValue *map_val = map_addr.addr;
|
||||||
if (deref) {
|
|
||||||
map_val = ir_addr_load(proc, map_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
irValue *key = ir_build_expr(proc, ie->index);
|
irValue *key = ir_build_expr(proc, ie->index);
|
||||||
key = ir_emit_conv(proc, key, t->Map.key);
|
key = ir_emit_conv(proc, key, t->Map.key);
|
||||||
|
|
||||||
|
|||||||
@@ -923,6 +923,14 @@ bool are_types_identical(Type *x, Type *y) {
|
|||||||
are_types_identical(x->Proc.results, y->Proc.results);
|
are_types_identical(x->Proc.results, y->Proc.results);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Type_Map:
|
||||||
|
if (y->kind == Type_Map) {
|
||||||
|
return x->Map.count == y->Map.count &&
|
||||||
|
are_types_identical(x->Map.key, y->Map.key) &&
|
||||||
|
are_types_identical(x->Map.value, y->Map.value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user