diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2022-02-25 12:22:54 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2022-02-25 12:22:54 +0200 |
commit | eb2c6b89f4eeea5a8069ffd2800012e652e30475 (patch) | |
tree | 6a086e30e22c44236094cf0678d74c9c0898d645 | |
parent | 1baf3e67f24c419cf160755506fc3a6c4101585e (diff) | |
download | egawk-eb2c6b89f4eeea5a8069ffd2800012e652e30475.tar.gz egawk-eb2c6b89f4eeea5a8069ffd2800012e652e30475.tar.bz2 egawk-eb2c6b89f4eeea5a8069ffd2800012e652e30475.zip |
Fix memory management of GMP/MPFR values for extensions.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | extension/ChangeLog | 7 | ||||
-rw-r--r-- | extension/intdiv.c | 3 | ||||
-rw-r--r-- | extension/testext.c | 29 | ||||
-rw-r--r-- | gawkapi.c | 3 |
5 files changed, 47 insertions, 4 deletions
@@ -1,3 +1,12 @@ +2022-02-25 Arnold D. Robbins <arnold@skeeve.com> + + Memory issues with MPFR, fix part 2. (Part 1 is in the + extension directory.) + + * gawkapi.c (awk_value_to_node): Clear the GMP/MPFR values + returned from the C extension after setting the internal + variable. + 2022-02-22 Arnold D. Robbins <arnold@skeeve.com> Enable interval expressions even for --traditional, as BWK diff --git a/extension/ChangeLog b/extension/ChangeLog index bbdf27a0..ff37ca6f 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,10 @@ +2022-02-25 Andrew J. Schorr <aschorr@telemetry-investments.com> + + Memory issues with MPFR, fix part 1. + + * intdiv.c (do_intdiv): Don't clear quotient and remainder. + * testext.c (test_scalar): Add GMP/MPFR support. + 2022-02-22 Arnold D. Robbins <arnold@skeeve.com> Fix resource links found by Coverity. Thanks to diff --git a/extension/intdiv.c b/extension/intdiv.c index 8d52c879..7eaa4841 100644 --- a/extension/intdiv.c +++ b/extension/intdiv.c @@ -222,9 +222,6 @@ do_intdiv(int nargs, awk_value_t *result, struct awk_ext_func *unused) array_set_mpz(array, "quotient", 8, quotient); array_set_mpz(array, "remainder", 9, remainder); - mpz_clear(quotient); - mpz_clear(remainder); - /* release temporary variables */ if (numer == numer_tmp) mpz_clear(numer); diff --git a/extension/testext.c b/extension/testext.c index 18465f2a..30dcdeb3 100644 --- a/extension/testext.c +++ b/extension/testext.c @@ -39,6 +39,11 @@ #include <sys/stat.h> #include <fcntl.h> +#ifdef HAVE_MPFR +#include <gmp.h> +#include <mpfr.h> +#endif + #include "gawkapi.h" static const gawk_api_t *api; /* for convenience macros to work */ @@ -767,6 +772,10 @@ test_scalar(int nargs, awk_value_t *result, struct awk_ext_func *unused) { awk_value_t new_value, new_value2; awk_value_t the_scalar; +#ifdef HAVE_MPFR + mpz_t mpz_val; + mpfr_t mpfr_val; +#endif (void) nargs; /* silence warnings */ make_number(0.0, result); @@ -786,8 +795,26 @@ test_scalar(int nargs, awk_value_t *result, struct awk_ext_func *unused) if (new_value.val_type == AWK_STRING) { make_const_string(new_value.str_value.str, new_value.str_value.len, & new_value2); - } else { + } else { /* AWK_NUMBER */ +#ifdef HAVE_MPFR + switch (new_value.num_type) { + case AWK_NUMBER_TYPE_MPZ: + mpz_init(mpz_val); + mpz_set(mpz_val, new_value.num_ptr); + make_number_mpz(mpz_val, & new_value2); + break; + case AWK_NUMBER_TYPE_MPFR: + mpfr_init(mpfr_val); + mpfr_set(mpfr_val, (mpfr_ptr) new_value.num_ptr, mpfr_get_default_rounding_mode()); + make_number_mpfr(mpfr_val, & new_value2); + break; + default: + new_value2 = new_value; + break; + } +#else new_value2 = new_value; +#endif } if (! sym_update_scalar(the_scalar.scalar_cookie, & new_value2)) { @@ -176,6 +176,7 @@ awk_value_to_node(const awk_value_t *retval) mpfr_init(ext_ret_val->mpg_numbr); tval = mpfr_set(ext_ret_val->mpg_numbr, (mpfr_srcptr) retval->num_ptr, ROUND_MODE); IEEE_FMT(ext_ret_val->mpg_numbr, tval); + mpfr_clear(retval->num_ptr); #else fatal(_("awk_value_to_node: MPFR not supported")); #endif @@ -185,7 +186,9 @@ awk_value_to_node(const awk_value_t *retval) if (! do_mpfr) fatal(_("awk_value_to_node: not in MPFR mode")); ext_ret_val = make_number_node(MPZN); + mpz_init(ext_ret_val->mpg_i); mpz_set(ext_ret_val->mpg_i, (mpz_ptr) retval->num_ptr); + mpz_clear(retval->num_ptr); #else fatal(_("awk_value_to_node: MPFR not supported")); #endif |