aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2022-02-25 12:22:54 +0200
committerArnold D. Robbins <arnold@skeeve.com>2022-02-25 12:22:54 +0200
commiteb2c6b89f4eeea5a8069ffd2800012e652e30475 (patch)
tree6a086e30e22c44236094cf0678d74c9c0898d645
parent1baf3e67f24c419cf160755506fc3a6c4101585e (diff)
downloadegawk-eb2c6b89f4eeea5a8069ffd2800012e652e30475.tar.gz
egawk-eb2c6b89f4eeea5a8069ffd2800012e652e30475.tar.bz2
egawk-eb2c6b89f4eeea5a8069ffd2800012e652e30475.zip
Fix memory management of GMP/MPFR values for extensions.
-rw-r--r--ChangeLog9
-rw-r--r--extension/ChangeLog7
-rw-r--r--extension/intdiv.c3
-rw-r--r--extension/testext.c29
-rw-r--r--gawkapi.c3
5 files changed, 47 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index c1d3977c..3f417e10 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)) {
diff --git a/gawkapi.c b/gawkapi.c
index 3e5cdbe8..90f328f8 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -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