diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-03-08 16:34:57 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-03-08 16:34:57 +0000 |
| commit | 90efb7b60b3e90729632c5334693ed1ddb1f24df (patch) | |
| tree | 48a01dafcc0e98dc9382c99b320463f55f287aed /runtime | |
| parent | dbe19ddd1fbb769f6f778dc1e9909bef70ece48f (diff) | |
Support divergent list building
Diffstat (limited to 'runtime')
| -rw-r--r-- | runtime/src/shed/namespaces/Std/Lists.c | 30 |
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, |
