mirror of
https://github.com/odin-lang/Odin.git
synced 2026-07-17 21:21:04 +00:00
Fix map assignment bug due to growth
This commit is contained in:
@@ -284,6 +284,9 @@ __string_eq :: proc(a, b: string) -> bool {
|
||||
if len(a) != len(b) {
|
||||
return false;
|
||||
}
|
||||
if len(a) == 0 {
|
||||
return true;
|
||||
}
|
||||
if ^a[0] == ^b[0] {
|
||||
return true;
|
||||
}
|
||||
@@ -570,10 +573,9 @@ __Map_Header :: struct #ordered {
|
||||
value_offset: int,
|
||||
}
|
||||
|
||||
__dynamic_map_reserve :: proc(using header: __Map_Header, cap: int) -> bool {
|
||||
h := __dynamic_array_reserve(^m.hashes, size_of(int), align_of(int), cap);
|
||||
e := __dynamic_array_reserve(^m.entries, entry_size, entry_align, cap);
|
||||
return h && e;
|
||||
__dynamic_map_reserve :: proc(using header: __Map_Header, cap: int) {
|
||||
__dynamic_array_reserve(^m.hashes, size_of(int), align_of(int), cap);
|
||||
__dynamic_array_reserve(^m.entries, entry_size, entry_align, cap);
|
||||
}
|
||||
|
||||
__dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
||||
@@ -587,7 +589,7 @@ __dynamic_map_rehash :: proc(using header: __Map_Header, new_count: int) {
|
||||
|
||||
reserve(nm.hashes, new_count);
|
||||
nm_hashes.len = nm_hashes.cap;
|
||||
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.len);
|
||||
__dynamic_array_reserve(^nm.entries, entry_size, entry_align, m.entries.cap);
|
||||
for _, i in nm.hashes {
|
||||
nm.hashes[i] = -1;
|
||||
}
|
||||
@@ -634,6 +636,8 @@ __dynamic_map_get :: proc(h: __Map_Header, key: __Map_Key) -> rawptr {
|
||||
|
||||
__dynamic_map_set :: proc(using h: __Map_Header, key: __Map_Key, value: rawptr) {
|
||||
index: int;
|
||||
assert(value != nil);
|
||||
|
||||
|
||||
if len(m.hashes) == 0 {
|
||||
__dynamic_map_grow(h);
|
||||
@@ -659,11 +663,12 @@ __dynamic_map_set :: proc(using h: __Map_Header, key: __Map_Key, value: rawptr)
|
||||
if __dynamic_map_full(h) {
|
||||
__dynamic_map_grow(h);
|
||||
}
|
||||
fmt.println("entries:", h.m.entries.len);
|
||||
}
|
||||
|
||||
|
||||
__dynamic_map_grow :: proc(using h: __Map_Header) {
|
||||
new_count := 2*m.entries.len + 8;
|
||||
new_count := max(2*m.entries.cap + 8, 8);
|
||||
__dynamic_map_rehash(h, new_count);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,12 +31,16 @@ TexImage2D :: proc(target, level, internal_format,
|
||||
format, type: i32, pixels: rawptr) #foreign lib "glTexImage2D";
|
||||
|
||||
|
||||
string_data :: proc(s: string) -> ^u8 #inline { return ^s[0]; }
|
||||
_string_data :: proc(s: string) -> ^u8 #inline { return ^s[0]; }
|
||||
|
||||
_libgl := win32.LoadLibraryA(string_data("opengl32.dll\x00"));
|
||||
_libgl := win32.LoadLibraryA(_string_data("opengl32.dll\x00"));
|
||||
|
||||
GetProcAddress :: proc(name: string) -> proc() #cc_c {
|
||||
assert(name[len(name)-1] == 0);
|
||||
if name[len(name)-1] == 0 {
|
||||
name = name[..len(name)-1];
|
||||
}
|
||||
// NOTE(bill): null terminated
|
||||
assert((^name[0] + len(name))^ == 0);
|
||||
res := wgl.GetProcAddress(^name[0]);
|
||||
if res == nil {
|
||||
res = win32.GetProcAddress(_libgl, ^name[0]);
|
||||
|
||||
Reference in New Issue
Block a user