diff options
author | Gavin D. Howard <gavin@gavinhoward.com> | 2023-02-27 08:44:21 -0700 |
---|---|---|
committer | Gavin D. Howard <gavin@gavinhoward.com> | 2023-02-27 08:44:21 -0700 |
commit | 8521d5795b4c19ea991964ac8b0ffb96cc9beaa3 (patch) | |
tree | 9b62809ffba7453f88acbe0a7311ea2e04204d85 | |
parent | 0b669e88aabe436731d3ae845fd5fe9e67c32361 (diff) | |
download | bc-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.h | 10 | ||||
-rw-r--r-- | src/library.c | 22 |
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); |