aboutsummaryrefslogtreecommitdiffstats
path: root/extension
diff options
context:
space:
mode:
Diffstat (limited to 'extension')
-rw-r--r--extension/ChangeLog7
-rw-r--r--extension/intdiv.c3
-rw-r--r--extension/testext.c29
3 files changed, 35 insertions, 4 deletions
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)) {