aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-03-08 16:34:57 +0000
committerMichael Williamson <mike@zwobble.org>2025-03-08 16:34:57 +0000
commit90efb7b60b3e90729632c5334693ed1ddb1f24df (patch)
tree48a01dafcc0e98dc9382c99b320463f55f287aed /runtime
parentdbe19ddd1fbb769f6f778dc1e9909bef70ece48f (diff)
Support divergent list building
Diffstat (limited to 'runtime')
-rw-r--r--runtime/src/shed/namespaces/Std/Lists.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/runtime/src/shed/namespaces/Std/Lists.c b/runtime/src/shed/namespaces/Std/Lists.c
index f4a01a6d..f7fcf0f8 100644
--- a/runtime/src/shed/namespaces/Std/Lists.c
+++ b/runtime/src/shed/namespaces/Std/Lists.c
@@ -6,6 +6,7 @@ struct ShedArrayBuilder {
struct ShedGcObjectHeader object_header;
PatioInt capacity;
PatioInt size;
+ bool is_owner;
struct ShedArray* array;
};
@@ -31,6 +32,7 @@ ShedObject shed__runtime__namespace__Std__Lists__arrayBuilder(ShedClosurePointer
array_builder->object_header.mark = 0b110;
array_builder->capacity = capacity;
array_builder->size = 0;
+ array_builder->is_owner = true;
array_builder->array = array;
return (ShedObject) array_builder;
@@ -59,13 +61,32 @@ ShedObject shed__runtime__namespace__Std__Lists__method__ArrayBuilder__size(Shed
ShedObject shed__runtime__namespace__Std__Lists__method__ArrayBuilder__unsafeAdd(ShedClosurePointer closurePointer, ShedObject arg0, ShedObject arg1) {
struct ShedArrayBuilder* array_builder = (struct ShedArrayBuilder*) arg0;
- array_builder->array->elements[array_builder->size] = arg1;
+
+ struct ShedArray* array;
+ if (array_builder->is_owner) {
+ array_builder->is_owner = false;
+ array = array_builder->array;
+ } else {
+ array = shed__runtime__gc_alloc(
+ sizeof(struct ShedArray) + sizeof(ShedObject) * array_builder->capacity,
+ 0
+ );
+ array->object_header.mark = 0b110;
+ array->size = array_builder->size;
+
+ for (PatioInt element_index = 0; element_index < array_builder->size; element_index++) {
+ array->elements[element_index] = array_builder->array->elements[element_index];
+ }
+ }
+
+ array->elements[array_builder->size] = arg1;
struct ShedArrayBuilder* new_array_builder = shed__runtime__gc_alloc(sizeof(struct ShedArrayBuilder), 0);
new_array_builder->object_header.mark = 0b110;
new_array_builder->capacity = array_builder->capacity;
new_array_builder->size = array_builder->size + 1;
- new_array_builder->array = array_builder->array;
+ new_array_builder->is_owner = true;
+ new_array_builder->array = array;
return (ShedObject) new_array_builder;
}
@@ -77,11 +98,10 @@ ShedObject shed__runtime__namespace__Std__Lists__method__ArrayBuilder__unsafeEnl
ShedObject shed__runtime__namespace__Std__Lists__method__ArrayBuilder__build(ShedClosurePointer closurePointer, ShedObject arg0) {
struct ShedArrayBuilder* array_builder = (struct ShedArrayBuilder*) arg0;
- if (array_builder->array->size == 0) {
+ if (array_builder->is_owner) {
+ array_builder->is_owner = false;
array_builder->array->size = array_builder->size;
return (ShedObject) array_builder->array;
- } else if (array_builder->size == array_builder->array->size) {
- return (ShedObject) array_builder->array;
} else {
struct ShedArray* array = shed__runtime__gc_alloc(
sizeof(struct ShedArray) + sizeof(ShedObject) * array_builder->size,