1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-16 21:54:48 +00:00

refactor(c-api): Move JanetArray to use size_t on count and capacity fields

This commit is contained in:
GrayJack 2024-04-15 18:10:14 -03:00
parent bf19920d65
commit ee8a1694ba
2 changed files with 31 additions and 31 deletions

View File

@ -30,11 +30,11 @@
#include <string.h> #include <string.h>
static void janet_array_impl(JanetArray *array, int32_t capacity) { static void janet_array_impl(JanetArray *array, size_t capacity) {
Janet *data = NULL; Janet *data = NULL;
if (capacity > 0) { if (capacity > 0) {
janet_vm.next_collection += capacity * sizeof(Janet); janet_vm.next_collection += capacity * sizeof(Janet);
data = (Janet *) janet_malloc(sizeof(Janet) * (size_t) capacity); data = (Janet *) janet_malloc(sizeof(Janet) * capacity);
if (NULL == data) { if (NULL == data) {
JANET_OUT_OF_MEMORY; JANET_OUT_OF_MEMORY;
} }
@ -45,25 +45,25 @@ static void janet_array_impl(JanetArray *array, int32_t capacity) {
} }
/* Creates a new array */ /* Creates a new array */
JanetArray *janet_array(int32_t capacity) { JanetArray *janet_array(size_t capacity) {
JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY, sizeof(JanetArray)); JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY, sizeof(JanetArray));
janet_array_impl(array, capacity); janet_array_impl(array, capacity);
return array; return array;
} }
/* Creates a new array with weak references */ /* Creates a new array with weak references */
JanetArray *janet_array_weak(int32_t capacity) { JanetArray *janet_array_weak(size_t capacity) {
JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY_WEAK, sizeof(JanetArray)); JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY_WEAK, sizeof(JanetArray));
janet_array_impl(array, capacity); janet_array_impl(array, capacity);
return array; return array;
} }
/* Creates a new array from n elements. */ /* Creates a new array from n elements. */
JanetArray *janet_array_n(const Janet *elements, int32_t n) { JanetArray *janet_array_n(const Janet *elements, size_t n) {
JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY, sizeof(JanetArray)); JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY, sizeof(JanetArray));
array->capacity = n; array->capacity = n;
array->count = n; array->count = n;
array->data = janet_malloc(sizeof(Janet) * (size_t) n); array->data = janet_malloc(sizeof(Janet) * n);
if (!array->data) { if (!array->data) {
JANET_OUT_OF_MEMORY; JANET_OUT_OF_MEMORY;
} }
@ -72,13 +72,13 @@ JanetArray *janet_array_n(const Janet *elements, int32_t n) {
} }
/* Ensure the array has enough capacity for elements */ /* Ensure the array has enough capacity for elements */
void janet_array_ensure(JanetArray *array, int32_t capacity, int32_t growth) { void janet_array_ensure(JanetArray *array, size_t capacity, size_t growth) {
Janet *newData; Janet *newData;
Janet *old = array->data; Janet *old = array->data;
if (capacity <= array->capacity) return; if (capacity <= array->capacity) return;
int64_t new_capacity = ((int64_t) capacity) * growth; size_t new_capacity = (capacity) * growth;
if (new_capacity > INT32_MAX) new_capacity = INT32_MAX; if (new_capacity > JANET_INTMAX_INT64) new_capacity = JANET_INTMAX_INT64;
capacity = (int32_t) new_capacity; capacity = new_capacity;
newData = janet_realloc(old, capacity * sizeof(Janet)); newData = janet_realloc(old, capacity * sizeof(Janet));
if (NULL == newData) { if (NULL == newData) {
JANET_OUT_OF_MEMORY; JANET_OUT_OF_MEMORY;
@ -89,11 +89,11 @@ void janet_array_ensure(JanetArray *array, int32_t capacity, int32_t growth) {
} }
/* Set the count of an array. Extend with nil if needed. */ /* Set the count of an array. Extend with nil if needed. */
void janet_array_setcount(JanetArray *array, int32_t count) { void janet_array_setcount(JanetArray *array, size_t count) {
if (count < 0) if (count < 0)
return; return;
if (count > array->count) { if (count > array->count) {
int32_t i; size_t i;
janet_array_ensure(array, count, 1); janet_array_ensure(array, count, 1);
for (i = array->count; i < count; i++) { for (i = array->count; i < count; i++) {
array->data[i] = janet_wrap_nil(); array->data[i] = janet_wrap_nil();
@ -107,7 +107,7 @@ void janet_array_push(JanetArray *array, Janet x) {
if (array->count == INT32_MAX) { if (array->count == INT32_MAX) {
janet_panic("array overflow"); janet_panic("array overflow");
} }
int32_t newcount = array->count + 1; size_t newcount = array->count + 1;
janet_array_ensure(array, newcount, 2); janet_array_ensure(array, newcount, 2);
array->data[array->count] = x; array->data[array->count] = x;
array->count = newcount; array->count = newcount;
@ -138,7 +138,7 @@ JANET_CORE_FN(cfun_array_new,
"Creates a new empty array with a pre-allocated capacity. The same as " "Creates a new empty array with a pre-allocated capacity. The same as "
"`(array)` but can be more efficient if the maximum size of an array is known.") { "`(array)` but can be more efficient if the maximum size of an array is known.") {
janet_fixarity(argc, 1); janet_fixarity(argc, 1);
int32_t cap = janet_getinteger(argv, 0); size_t cap = janet_getsize(argv, 0);
JanetArray *array = janet_array(cap); JanetArray *array = janet_array(cap);
return janet_wrap_array(array); return janet_wrap_array(array);
} }
@ -147,7 +147,7 @@ JANET_CORE_FN(cfun_array_weak,
"(array/weak capacity)", "(array/weak capacity)",
"Creates a new empty array with a pre-allocated capacity and support for weak references. Similar to `array/new`.") { "Creates a new empty array with a pre-allocated capacity and support for weak references. Similar to `array/new`.") {
janet_fixarity(argc, 1); janet_fixarity(argc, 1);
int32_t cap = janet_getinteger(argv, 0); size_t cap = janet_getsize(argv, 0);
JanetArray *array = janet_array_weak(cap); JanetArray *array = janet_array_weak(cap);
return janet_wrap_array(array); return janet_wrap_array(array);
} }
@ -156,10 +156,10 @@ JANET_CORE_FN(cfun_array_new_filled,
"(array/new-filled count &opt value)", "(array/new-filled count &opt value)",
"Creates a new array of `count` elements, all set to `value`, which defaults to nil. Returns the new array.") { "Creates a new array of `count` elements, all set to `value`, which defaults to nil. Returns the new array.") {
janet_arity(argc, 1, 2); janet_arity(argc, 1, 2);
int32_t count = janet_getnat(argv, 0); size_t count = janet_getsize(argv, 0);
Janet x = (argc == 2) ? argv[1] : janet_wrap_nil(); Janet x = (argc == 2) ? argv[1] : janet_wrap_nil();
JanetArray *array = janet_array(count); JanetArray *array = janet_array(count);
for (int32_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
array->data[i] = x; array->data[i] = x;
} }
array->count = count; array->count = count;
@ -173,7 +173,7 @@ JANET_CORE_FN(cfun_array_fill,
janet_arity(argc, 1, 2); janet_arity(argc, 1, 2);
JanetArray *array = janet_getarray(argv, 0); JanetArray *array = janet_getarray(argv, 0);
Janet x = (argc == 2) ? argv[1] : janet_wrap_nil(); Janet x = (argc == 2) ? argv[1] : janet_wrap_nil();
for (int32_t i = 0; i < array->count; i++) { for (size_t i = 0; i < array->count; i++) {
array->data[i] = x; array->data[i] = x;
} }
return argv[0]; return argv[0];
@ -201,10 +201,10 @@ JANET_CORE_FN(cfun_array_push,
"Push all the elements of xs to the end of an array. Modifies the input array and returns it.") { "Push all the elements of xs to the end of an array. Modifies the input array and returns it.") {
janet_arity(argc, 1, -1); janet_arity(argc, 1, -1);
JanetArray *array = janet_getarray(argv, 0); JanetArray *array = janet_getarray(argv, 0);
if (INT32_MAX - argc + 1 <= array->count) { if (JANET_INTMAX_INT64 - argc + 1 <= array->count) {
janet_panic("array overflow"); janet_panic("array overflow");
} }
int32_t newcount = array->count - 1 + argc; size_t newcount = array->count - 1 + argc;
janet_array_ensure(array, newcount, 2); janet_array_ensure(array, newcount, 2);
if (argc > 1) memcpy(array->data + array->count, argv + 1, (size_t)(argc - 1) * sizeof(Janet)); if (argc > 1) memcpy(array->data + array->count, argv + 1, (size_t)(argc - 1) * sizeof(Janet));
array->count = newcount; array->count = newcount;
@ -219,8 +219,8 @@ JANET_CORE_FN(cfun_array_ensure,
"Otherwise, the backing memory will be reallocated so that there is enough space.") { "Otherwise, the backing memory will be reallocated so that there is enough space.") {
janet_fixarity(argc, 3); janet_fixarity(argc, 3);
JanetArray *array = janet_getarray(argv, 0); JanetArray *array = janet_getarray(argv, 0);
int32_t newcount = janet_getinteger(argv, 1); size_t newcount = janet_getsize(argv, 1);
int32_t growth = janet_getinteger(argv, 2); size_t growth = janet_getsize(argv, 2);
if (newcount < 1) janet_panic("expected positive integer"); if (newcount < 1) janet_panic("expected positive integer");
janet_array_ensure(array, newcount, growth); janet_array_ensure(array, newcount, growth);
return argv[0]; return argv[0];
@ -248,7 +248,7 @@ JANET_CORE_FN(cfun_array_concat,
"which must be an array. If any of the parts are arrays or tuples, their elements will " "which must be an array. If any of the parts are arrays or tuples, their elements will "
"be inserted into the array. Otherwise, each part in `parts` will be appended to `arr` in order. " "be inserted into the array. Otherwise, each part in `parts` will be appended to `arr` in order. "
"Return the modified array `arr`.") { "Return the modified array `arr`.") {
int32_t i; size_t i;
janet_arity(argc, 1, -1); janet_arity(argc, 1, -1);
JanetArray *array = janet_getarray(argv, 0); JanetArray *array = janet_getarray(argv, 0);
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
@ -258,11 +258,11 @@ JANET_CORE_FN(cfun_array_concat,
break; break;
case JANET_ARRAY: case JANET_ARRAY:
case JANET_TUPLE: { case JANET_TUPLE: {
int32_t j, len = 0; size_t j, len = 0;
const Janet *vals = NULL; const Janet *vals = NULL;
janet_indexed_view(argv[i], &vals, &len); janet_indexed_view(argv[i], &vals, &len);
if (array->data == vals) { if (array->data == vals) {
int32_t newcount = array->count + len; size_t newcount = array->count + len;
janet_array_ensure(array, newcount, 2); janet_array_ensure(array, newcount, 2);
janet_indexed_view(argv[i], &vals, &len); janet_indexed_view(argv[i], &vals, &len);
} }
@ -284,7 +284,7 @@ JANET_CORE_FN(cfun_array_insert,
size_t chunksize, restsize; size_t chunksize, restsize;
janet_arity(argc, 2, -1); janet_arity(argc, 2, -1);
JanetArray *array = janet_getarray(argv, 0); JanetArray *array = janet_getarray(argv, 0);
int32_t at = janet_getinteger(argv, 1); size_t at = janet_getinteger(argv, 1);
if (at < 0) { if (at < 0) {
at = array->count + at + 1; at = array->count + at + 1;
} }
@ -292,7 +292,7 @@ JANET_CORE_FN(cfun_array_insert,
janet_panicf("insertion index %d out of range [0,%d]", at, array->count); janet_panicf("insertion index %d out of range [0,%d]", at, array->count);
chunksize = (argc - 2) * sizeof(Janet); chunksize = (argc - 2) * sizeof(Janet);
restsize = (array->count - at) * sizeof(Janet); restsize = (array->count - at) * sizeof(Janet);
if (INT32_MAX - (argc - 2) < array->count) { if (JANET_INTMAX_INT64 - (argc - 2) < array->count) {
janet_panic("array overflow"); janet_panic("array overflow");
} }
janet_array_ensure(array, array->count + argc - 2, 2); janet_array_ensure(array, array->count + argc - 2, 2);
@ -314,8 +314,8 @@ JANET_CORE_FN(cfun_array_remove,
"Returns the array.") { "Returns the array.") {
janet_arity(argc, 2, 3); janet_arity(argc, 2, 3);
JanetArray *array = janet_getarray(argv, 0); JanetArray *array = janet_getarray(argv, 0);
int32_t at = janet_getinteger(argv, 1); size_t at = janet_getinteger(argv, 1);
int32_t n = 1; size_t n = 1;
if (at < 0) { if (at < 0) {
at = array->count + at; at = array->count + at;
} }

View File

@ -965,8 +965,8 @@ struct JanetStackFrame {
/* A dynamic array type. */ /* A dynamic array type. */
struct JanetArray { struct JanetArray {
JanetGCObject gc; JanetGCObject gc;
int32_t count; size_t count;
int32_t capacity; size_t capacity;
Janet *data; Janet *data;
}; };