]> git.pld-linux.org Git - packages/gawk.git/blobdiff - gawk-4.2.1-002-copy-MPZ-MPFR-bits-also-in-r_dupnode.patch
- rel 2; upstream fixes used in fc
[packages/gawk.git] / gawk-4.2.1-002-copy-MPZ-MPFR-bits-also-in-r_dupnode.patch
diff --git a/gawk-4.2.1-002-copy-MPZ-MPFR-bits-also-in-r_dupnode.patch b/gawk-4.2.1-002-copy-MPZ-MPFR-bits-also-in-r_dupnode.patch
new file mode 100644 (file)
index 0000000..af71827
--- /dev/null
@@ -0,0 +1,208 @@
+From 0fafaee9bb38a3ea4b8be4009e9ce99334460ddd Mon Sep 17 00:00:00 2001
+From: "Arnold D. Robbins" <arnold@skeeve.com>
+Date: Mon, 2 Apr 2018 16:37:17 +0300
+Subject: [PATCH] Copy MPZ/MPFR bits also, in r_dupnode.
+
+---
+ interpret.h        | 27 ++++++++++++++++++---------
+ node.c             | 20 ++++++++++++++++++--
+ test/Makefile.am   | 12 ++++++++++--
+ test/Makefile.in   | 12 ++++++++++--
+ test/mpfrfield.awk | 14 ++++++++++++++
+ test/mpfrfield.in  | 10 ++++++++++
+ test/mpfrfield.ok  |  1 +
+ 7 files changed, 81 insertions(+), 15 deletions(-)
+ create mode 100644 test/mpfrfield.awk
+ create mode 100644 test/mpfrfield.in
+ create mode 100644 test/mpfrfield.ok
+
+diff --git a/interpret.h b/interpret.h
+index 96e2c89..20fcb7a 100644
+--- a/interpret.h
++++ b/interpret.h
+@@ -32,16 +32,25 @@
+  * valref 1, that effectively means that this is an assignment like "$n = $n",
+  * so a no-op, other than triggering $0 reconstitution.
+  */
+-#define UNFIELD(l, r) \
+-{ \
+-      /* if was a field, turn it into a var */ \
+-      if ((r->flags & MALLOC) != 0 || r->valref == 1) { \
+-              l = r; \
+-      } else { \
+-              l = dupnode(r); \
+-              DEREF(r); \
+-      } \
++
++// not a macro so we can step into it with a debugger
++#ifndef UNFIELD_DEFINED
++#define UNFIELD_DEFINED 1
++static inline void
++unfield(NODE **l, NODE **r)
++{
++      /* if was a field, turn it into a var */
++      if (((*r)->flags & MALLOC) != 0 || (*r)->valref == 1) {
++              (*l) = (*r);
++      } else {
++              (*l) = dupnode(*r);
++              DEREF(*r);
++      }
+ }
++
++#define UNFIELD(l, r) unfield(& (l), & (r))
++#endif
++
+ int
+ r_interpret(INSTRUCTION *code)
+ {
+diff --git a/node.c b/node.c
+index add959f..fcd2bf3 100644
+--- a/node.c
++++ b/node.c
+@@ -306,8 +306,24 @@ r_dupnode(NODE *n)
+       }
+ #endif
+-      getnode(r);
+-      *r = *n;
++#ifdef HAVE_MPFR
++      if ((n->flags & MPZN) != 0) {
++              r = mpg_integer();
++              mpz_set(r->mpg_i, n->mpg_i);
++              r->flags = n->flags;
++      } else if ((n->flags & MPFN) != 0) {
++              r = mpg_float();
++              int tval = mpfr_set(r->mpg_numbr, n->mpg_numbr, ROUND_MODE);
++              IEEE_FMT(r->mpg_numbr, tval);
++              r->flags = n->flags;
++      } else {
++#endif
++              getnode(r);
++              *r = *n;
++#ifdef HAVE_MPFR
++      }
++#endif
++
+       r->flags |= MALLOC;
+       r->valref = 1;
+       /*
+diff --git a/test/Makefile.am b/test/Makefile.am
+index 40e25b2..93a6ee5 100644
+--- a/test/Makefile.am
++++ b/test/Makefile.am
+@@ -655,6 +655,9 @@ EXTRA_DIST = \
+       mpfrbigint.ok \
+       mpfrexprange.awk \
+       mpfrexprange.ok \
++      mpfrfield.awk \
++      mpfrfield.in \
++      mpfrfield.ok \
+       mpfrieee.awk \
+       mpfrieee.ok \
+       mpfrmemok1.awk \
+@@ -1302,8 +1305,8 @@ INET_TESTS = inetdayu inetdayt inetechu inetecht
+ MACHINE_TESTS = double1 double2 fmtspcl intformat
+-MPFR_TESTS = mpfrbigint mpfrexprange mpfrieee mpfrmemok1 mpfrnegzero \
+-      mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
++MPFR_TESTS = mpfrbigint mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
++      mpfrnegzero mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
+       mpfrstrtonum mpgforcenum mpfruplus
+ LOCALE_CHARSET_TESTS = \
+@@ -2148,6 +2151,11 @@ mpfrmemok1:
+       @$(AWK) -p- -M -f "$(srcdir)"/$@.awk 2>&1 | sed 1d > _$@
+       @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
++mpfrfield:
++      @echo $@
++      @$(AWK) -M -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > _$@ 2>&1
++      @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
++
+ jarebug::
+       @echo $@
+       @"$(srcdir)"/$@.sh "$(AWKPROG)" "$(srcdir)"/$@.awk "$(srcdir)"/$@.in "_$@"
+diff --git a/test/Makefile.in b/test/Makefile.in
+index 74405f8..2358988 100644
+--- a/test/Makefile.in
++++ b/test/Makefile.in
+@@ -913,6 +913,9 @@ EXTRA_DIST = \
+       mpfrbigint.ok \
+       mpfrexprange.awk \
+       mpfrexprange.ok \
++      mpfrfield.awk \
++      mpfrfield.in \
++      mpfrfield.ok \
+       mpfrieee.awk \
+       mpfrieee.ok \
+       mpfrmemok1.awk \
+@@ -1555,8 +1558,8 @@ ARRAYDEBUG_TESTS = arrdbg
+ EXTRA_TESTS = inftest regtest ignrcas3 
+ INET_TESTS = inetdayu inetdayt inetechu inetecht
+ MACHINE_TESTS = double1 double2 fmtspcl intformat
+-MPFR_TESTS = mpfrbigint mpfrexprange mpfrieee mpfrmemok1 mpfrnegzero \
+-      mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
++MPFR_TESTS = mpfrbigint mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
++      mpfrnegzero mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
+       mpfrstrtonum mpgforcenum mpfruplus
+ LOCALE_CHARSET_TESTS = \
+@@ -2588,6 +2591,11 @@ mpfrmemok1:
+       @$(AWK) -p- -M -f "$(srcdir)"/$@.awk 2>&1 | sed 1d > _$@
+       @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
++mpfrfield:
++      @echo $@
++      @$(AWK) -M -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > _$@ 2>&1
++      @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
++
+ jarebug::
+       @echo $@
+       @"$(srcdir)"/$@.sh "$(AWKPROG)" "$(srcdir)"/$@.awk "$(srcdir)"/$@.in "_$@"
+diff --git a/test/mpfrfield.awk b/test/mpfrfield.awk
+new file mode 100644
+index 0000000..35a97b7
+--- /dev/null
++++ b/test/mpfrfield.awk
+@@ -0,0 +1,14 @@
++#! /bin/gawk -Mf
++
++NR == 1 {
++      min = $1
++}
++
++{
++      if ($1 < min)
++              min = $1
++}
++
++END {
++      print "min", min
++}
+diff --git a/test/mpfrfield.in b/test/mpfrfield.in
+new file mode 100644
+index 0000000..05d3344
+--- /dev/null
++++ b/test/mpfrfield.in
+@@ -0,0 +1,10 @@
++7
++9
++1
++3
++9
++1
++9
++5
++0
++8
+diff --git a/test/mpfrfield.ok b/test/mpfrfield.ok
+new file mode 100644
+index 0000000..3736de4
+--- /dev/null
++++ b/test/mpfrfield.ok
+@@ -0,0 +1 @@
++min 0
+-- 
+2.14.4
+
This page took 0.028084 seconds and 4 git commands to generate.