aboutsummaryrefslogtreecommitdiff
path: root/code
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-09 18:56:19 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-09 18:56:19 +0330
commit8dc246166a007c2815f93ff6db535a660b05431c (patch)
treea3747464019316434103fe757a83fbdd990f16ce /code
parent03e9e1708eada3985529949302f214a223a297c2 (diff)
fix assigning to dereference access in a chain
Diffstat (limited to 'code')
-rw-r--r--code/lib/memory.felan11
-rw-r--r--code/lib/vector.felan18
-rw-r--r--code/main.felan2
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);
};