Skip to content

Commit 9bfee62

Browse files
committed
Adjust dynamic array capacity (#506)
1 parent 8efa731 commit 9bfee62

File tree

3 files changed

+19
-8
lines changed

3 files changed

+19
-8
lines changed

playground/umka.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/umka_vm.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,11 @@ static FORCE_INLINE char *doAllocStr(HeapPages *pages, int64_t len, Error *error
10451045
{
10461046
StrDimensions dims = {.len = len, .capacity = 2 * (len + 1)};
10471047

1048+
if (dims.capacity > INT_MAX - MEM_MIN_FREE_HEAP)
1049+
dims.capacity = INT_MAX - MEM_MIN_FREE_HEAP;
1050+
if (dims.capacity < dims.len)
1051+
dims.capacity = dims.len;
1052+
10481053
char *dimsAndData = chunkAlloc(pages, sizeof(StrDimensions) + dims.capacity, NULL, NULL, false, error);
10491054
*(StrDimensions *)dimsAndData = dims;
10501055

@@ -1076,6 +1081,11 @@ static FORCE_INLINE void doAllocDynArray(HeapPages *pages, DynArray *array, Type
10761081

10771082
DynArrayDimensions dims = {.len = len, .capacity = 2 * (len + 1)};
10781083

1084+
if (dims.capacity * array->itemSize > INT_MAX - MEM_MIN_FREE_HEAP)
1085+
dims.capacity = (INT_MAX - MEM_MIN_FREE_HEAP) / array->itemSize;
1086+
if (dims.capacity < dims.len)
1087+
dims.capacity = dims.len;
1088+
10791089
char *dimsAndData = chunkAlloc(pages, sizeof(DynArrayDimensions) + dims.capacity * array->itemSize, array->type, NULL, false, error);
10801090
*(DynArrayDimensions *)dimsAndData = dims;
10811091

@@ -2018,7 +2028,7 @@ static FORCE_INLINE void doBuiltinMake(Fiber *fiber, HeapPages *pages, Error *er
20182028
if (type->kind == TYPE_DYNARRAY)
20192029
{
20202030
DynArray *result = (DynArray *)(fiber->top++)->ptrVal;
2021-
int len = (fiber->top++)->intVal;
2031+
int64_t len = (fiber->top++)->intVal;
20222032

20232033
doAllocDynArray(pages, result, type, len, error);
20242034
(--fiber->top)->ptrVal = result;
@@ -2046,7 +2056,7 @@ static FORCE_INLINE void doBuiltinMake(Fiber *fiber, HeapPages *pages, Error *er
20462056
static FORCE_INLINE void doBuiltinMakefromarr(Fiber *fiber, HeapPages *pages, Error *error)
20472057
{
20482058
DynArray *dest = (DynArray *)(fiber->top++)->ptrVal;
2049-
int len = (fiber->top++)->intVal;
2059+
int64_t len = (fiber->top++)->intVal;
20502060
void *src = (fiber->top++)->ptrVal;
20512061

20522062
Type *destType = fiber->code[fiber->ip].type;
@@ -2136,7 +2146,7 @@ static FORCE_INLINE void doBuiltinMaketostr(Fiber *fiber, HeapPages *pages, Erro
21362146

21372147
if (src->data)
21382148
{
2139-
const int len = strlen((const char *)src->data);
2149+
const int64_t len = strlen((const char *)src->data);
21402150
dest = doAllocStr(pages, len, error);
21412151
memcpy(dest, src->data, len);
21422152
}
@@ -3368,7 +3378,7 @@ static FORCE_INLINE void doGetDynArrayPtr(Fiber *fiber, Error *error)
33683378
error->runtimeHandler(error->context, ERR_RUNTIME, "Dynamic array is null");
33693379

33703380
int itemSize = array->itemSize;
3371-
int len = getDims(array)->len;
3381+
int64_t len = getDims(array)->len;
33723382

33733383
if (index < 0 || index > len - 1)
33743384
error->runtimeHandler(error->context, ERR_RUNTIME, "Index %d is out of range 0...%d", index, len - 1);

src/umka_vm.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ typedef enum
2020

2121
enum // Memory manager settings
2222
{
23-
MEM_MIN_FREE_STACK = 1024, // Slots
24-
MEM_MIN_HEAP_CHUNK = 64, // Bytes
25-
MEM_MIN_HEAP_PAGE = 1024 * 1024, // Bytes
23+
MEM_MIN_FREE_STACK = 1024, // Slots
24+
MEM_MIN_FREE_HEAP = 1024, // Bytes
25+
MEM_MIN_HEAP_CHUNK = 64, // Bytes
26+
MEM_MIN_HEAP_PAGE = 1024 * 1024, // Bytes
2627
};
2728

2829

0 commit comments

Comments
 (0)