diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-06-09 18:56:19 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-06-09 18:56:19 +0330 |
commit | 8dc246166a007c2815f93ff6db535a660b05431c (patch) | |
tree | a3747464019316434103fe757a83fbdd990f16ce /code | |
parent | 03e9e1708eada3985529949302f214a223a297c2 (diff) |
fix assigning to dereference access in a chain
Diffstat (limited to 'code')
-rw-r--r-- | code/lib/memory.felan | 11 | ||||
-rw-r--r-- | code/lib/vector.felan | 18 | ||||
-rw-r--r-- | code/main.felan | 2 |
3 files changed, 26 insertions, 5 deletions
diff --git a/code/lib/memory.felan b/code/lib/memory.felan index 55451c5..2710685 100644 --- a/code/lib/memory.felan +++ b/code/lib/memory.felan @@ -2,12 +2,23 @@ libc :: @c_library("/usr/lib/libc.so.6"); malloc :: @c_function(libc,"malloc",(i64)->(*void)); +realloc :: @c_function(libc,"realloc",(*void,i64)->(*void)); free :: @c_function(libc,"free",(*void)->void); malloc :: (size:i64,comptime t:type) -> (*t) { return @cast(malloc(size*@cast(@size_of(t),i64)),*t); }; +realloc :: (ptr:*anytype,size:u64) -> (@type_of(ptr)) { + return @cast( + realloc( + @cast(ptr,*void), + @cast(size*@size_of(@type_of(ptr.*)),i64), + ), + @type_of(ptr) + ); +}; + free :: (ptr:*anytype) -> void { free(@cast(ptr,*void)); }; diff --git a/code/lib/vector.felan b/code/lib/vector.felan index a33d386..d6faece 100644 --- a/code/lib/vector.felan +++ b/code/lib/vector.felan @@ -21,16 +21,26 @@ __get_item__ :: (left:vector(anytype),index:i64) -> (@type_of(left.ptr.*)) { return (left.ptr + index).*; }; -__set_item__ :: (left:vector(anytype),index:i64,item:@type_of(left.ptr.*)) -> (@type_of(left.ptr.*)) { +__set_item__ :: (left:*vector(anytype),index:i64,item:@type_of(left.*.ptr.*)) -> (@type_of(left.ptr.*)) { return (left.ptr + index).* = item; }; -__get_item_address__ :: (left:vector(anytype),index:i64) -> (@type_of(left.ptr)) { +__get_item_address__ :: (left:*vector(anytype),index:i64) -> (@type_of(left.*.ptr)) { return (left.ptr + index); }; -push_back :: (vec:vector(anytype),value:@type_of(vec.ptr.*)) -> void { - @putc('h'); +push_back :: (vec:*vector(anytype),value:@type_of(vec.*[0])) -> void { + _grow_if_needed(vec); +}; + +_grow_if_needed :: (vec:*vector(anytype)) -> void { + if vec.*.size == vec.*.capacity { + @putc('a'); + vec.*.capacity = vec.*.capacity + vec.*.capacity/2u64 + 1u64; + vec.*.ptr = realloc(vec.*.ptr,vec.*.capacity); + }else{ + @putc('b'); + } }; delete :: (vec:vector(anytype)) -> void { diff --git a/code/main.felan b/code/main.felan index 20c815a..63f98a2 100644 --- a/code/main.felan +++ b/code/main.felan @@ -30,7 +30,7 @@ t :: (comptime formatter : string) macro -> void { main :: () -> void { v := vector_new(u8); - push_back(v,2u8); + push_back(&v,'2'); delete(v); }; |