aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin D. Howard <gavin@gavinhoward.com>2023-02-27 08:44:21 -0700
committerGavin D. Howard <gavin@gavinhoward.com>2023-02-27 08:44:21 -0700
commit8521d5795b4c19ea991964ac8b0ffb96cc9beaa3 (patch)
tree9b62809ffba7453f88acbe0a7311ea2e04204d85
parent0b669e88aabe436731d3ae845fd5fe9e67c32361 (diff)
downloadbc-8521d5795b4c19ea991964ac8b0ffb96cc9beaa3.tar.gz
Only grow num vector in library when necessary
Signed-off-by: Gavin D. Howard <gavin@gavinhoward.com>
-rw-r--r--include/library.h10
-rw-r--r--src/library.c22
2 files changed, 21 insertions, 11 deletions
diff --git a/include/library.h b/include/library.h
index 76df9139..df94f1fd 100644
--- a/include/library.h
+++ b/include/library.h
@@ -201,6 +201,16 @@
*/
#define BC_NUM(c, n) ((BcNum*) bc_vec_item(&(c)->nums, (n).i))
+#define BC_GROW_NUMS(ctxt) \
+ do \
+ { \
+ if ((ctxt)->free_nums.len == 0) \
+ { \
+ bc_vec_grow(&((ctxt)->nums), 1); \
+ } \
+ } \
+ while (0)
+
/**
* Frees a BcNum for bcl. This is a destructor.
* @param num The BcNum to free, as a void pointer.
diff --git a/src/library.c b/src/library.c
index 6283d198..3f8aa0dc 100644
--- a/src/library.c
+++ b/src/library.c
@@ -502,7 +502,7 @@ bcl_num_create(void)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
bc_num_init(&n, BC_NUM_DEF_SIZE);
@@ -586,7 +586,7 @@ bcl_dup(BclNumber s)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(s.i < ctxt->nums.len);
@@ -760,7 +760,7 @@ bcl_bigdig2num(BclBigDig val)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
bc_num_createFromBigdig(&n, val);
@@ -798,7 +798,7 @@ bcl_binary(BclNumber a, BclNumber b, const BcNumBinaryOp op,
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len);
@@ -890,7 +890,7 @@ bcl_sqrt(BclNumber a)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(a.i < ctxt->nums.len);
@@ -924,7 +924,7 @@ bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 2);
+ BC_GROW_NUMS(ctxt);
assert(c != NULL && d != NULL);
@@ -999,7 +999,7 @@ bcl_modexp(BclNumber a, BclNumber b, BclNumber c)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len);
assert(c.i < ctxt->nums.len);
@@ -1105,7 +1105,7 @@ bcl_parse(const char* restrict val)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(val != NULL);
@@ -1193,7 +1193,7 @@ bcl_irand(BclNumber a)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(a.i < ctxt->nums.len);
@@ -1274,7 +1274,7 @@ bcl_frand(size_t places)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
// Clear and initialize the number.
bc_num_clear(&n);
@@ -1339,7 +1339,7 @@ bcl_ifrand(BclNumber a, size_t places)
BC_FUNC_HEADER(vm, err);
- bc_vec_grow(&ctxt->nums, 1);
+ BC_GROW_NUMS(ctxt);
assert(a.i < ctxt->nums.len);