[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[SCM] gawk branch, gawk-5.3-stable, updated. gawk-4.1.0-5606-g28c67338
From: |
Arnold Robbins |
Subject: |
[SCM] gawk branch, gawk-5.3-stable, updated. gawk-4.1.0-5606-g28c67338 |
Date: |
Wed, 5 Feb 2025 07:03:19 -0500 (EST) |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".
The branch, gawk-5.3-stable has been updated
via 28c67338510f6ca025f4be8451dd72fbb690e543 (commit)
via 9c0d9ba9542f415221482dd9c5a797326c704fb1 (commit)
via 136e88a134dca730dad3faee21c1cc864347ff1e (commit)
via 650d32c6b8b0f925b707dae65c17a42422530b05 (commit)
from 6c1709389b992853f0b2acc5eb9a856211d78344 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=28c67338510f6ca025f4be8451dd72fbb690e543
commit 28c67338510f6ca025f4be8451dd72fbb690e543
Author: Arnold D. Robbins <arnold@skeeve.com>
Date: Wed Feb 5 12:51:12 2025 +0200
More stylistic cleanups.
diff --git a/ChangeLog b/ChangeLog
index e69f35f9..7d4a69cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
2025-02-05 Arnold D. Robbins <arnold@skeeve.com>
+ Stylistic cleanups and small code cleanups.
+
* array.c, eval.c, ext.c, interpret.h: Some stylistic cleanups.
+ * awk.h (eln_pa, eln_vn): Renamed to elemnew_parent and
+ elemnew_vname. All uses adjusted.
+ (union worn): Renamed to `z' and only needs the wsp and vn
+ pointers in it.
2025-02-03 Cristian Ioneci <mekanofox@astropostale.com>
diff --git a/array.c b/array.c
index 41657728..e460ca63 100644
--- a/array.c
+++ b/array.c
@@ -338,10 +338,10 @@ force_array(NODE *symbol, bool canfatal)
switch (symbol->type) {
case Node_elem_new:
- elem_new_parent = symbol->eln_pa;
- symbol->eln_pa = NULL;
- elem_new_vname = symbol->eln_vn;
- symbol->eln_vn = NULL;
+ elem_new_parent = symbol->elemnew_parent;
+ symbol->elemnew_parent = NULL;
+ elem_new_vname = symbol->elemnew_vname;
+ symbol->elemnew_vname = NULL;
efree(symbol->stptr);
symbol->stptr = NULL;
symbol->stlen = 0;
@@ -514,7 +514,7 @@ adjust_fcall_stack(NODE *symbol, int nsubs)
&& r->orig_array->type != Node_elem_new))
continue;
n = r->orig_array;
-#define PARENT_ARRAY(n) ((n->type == Node_elem_new) ? n->eln_pa :
n->parent_array)
+#define PARENT_ARRAY(n) ((n->type == Node_elem_new) ? n->elemnew_parent :
n->parent_array)
/* Case 1 */
if (n == symbol
diff --git a/awk.h b/awk.h
index 920b76f9..8741dbe9 100644
--- a/awk.h
+++ b/awk.h
@@ -375,13 +375,12 @@ typedef struct exp_node {
char *sp;
size_t slen;
int idx;
- union {
- struct {
- wchar_t *wsp;
- size_t wslen;
- } ws;
- char * vn;
- } worn;
+ union { // this union is for convenience of space
+ // reuse; the elements aren't otherwise related
+ wchar_t *wsp;
+ char *vn;
+ } z;
+ size_t wslen;
struct exp_node *typre;
enum commenttype comtype;
} val;
@@ -504,12 +503,12 @@ typedef struct exp_node {
#define stlen sub.val.slen
#define stfmt sub.val.idx
#define strndmode sub.val.rndmode
-#define wstptr sub.val.worn.ws.wsp
-#define wstlen sub.val.worn.ws.wslen
+#define wstptr sub.val.z.wsp
+#define wstlen sub.val.wslen
/* Node_elem_new */
-#define eln_vn sub.val.worn.vn
-#define eln_pa sub.val.typre
+#define elemnew_vname sub.val.z.vn
+#define elemnew_parent sub.val.typre
#ifdef HAVE_MPFR
#define mpg_numbr sub.val.nm.mpnum
diff --git a/eval.c b/eval.c
index 376b93f1..cc19d705 100644
--- a/eval.c
+++ b/eval.c
@@ -1897,18 +1897,18 @@ init_interpret()
interpret = r_interpret;
}
-/* elem_new_reset --- clear the eln_pa and eln_vn fields of a Node_elem_new. */
+/* elem_new_reset --- clear the elemnew_parent and elemnew_vname fields of a
Node_elem_new. */
void
elem_new_reset(NODE *n)
{
assert(n->type == Node_elem_new);
- if (n->eln_vn != NULL) {
- efree(n->eln_vn);
- n->eln_vn = NULL;
+ if (n->elemnew_vname != NULL) {
+ efree(n->elemnew_vname);
+ n->elemnew_vname = NULL;
}
- n->eln_pa = NULL;
+ n->elemnew_parent = NULL;
}
/* elem_new_to_scalar --- convert Node_elem_new to untyped scalar */
diff --git a/interpret.h b/interpret.h
index 2ae49fb0..de6a04f6 100644
--- a/interpret.h
+++ b/interpret.h
@@ -345,11 +345,11 @@ uninitialized_scalar:
}
}
- if (r->type == Node_elem_new && r->eln_pa == NULL) {
- r->eln_pa = t1;
+ if (r->type == Node_elem_new && r->elemnew_parent ==
NULL) {
+ r->elemnew_parent = t1;
t2 = force_string(t2);
- assert(r->eln_vn == NULL);
- r->eln_vn = estrdup(t2->stptr, t2->stlen);
/* the subscript in parent array */
+ assert(r->elemnew_vname == NULL);
+ r->elemnew_vname = estrdup(t2->stptr,
t2->stlen); /* the subscript in parent array */
}
DEREF(t2);
diff --git a/node.c b/node.c
index a4687752..550edc2e 100644
--- a/node.c
+++ b/node.c
@@ -549,8 +549,8 @@ r_unref(NODE *tmp)
mpfr_unset(tmp);
- if (tmp->type == Node_elem_new && tmp->eln_vn != NULL)
- efree(tmp->eln_vn);
+ if (tmp->type == Node_elem_new && tmp->elemnew_vname != NULL)
+ efree(tmp->elemnew_vname);
free_wstr(tmp);
freenode(tmp);
}
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=9c0d9ba9542f415221482dd9c5a797326c704fb1
commit 9c0d9ba9542f415221482dd9c5a797326c704fb1
Author: Arnold D. Robbins <arnold@skeeve.com>
Date: Wed Feb 5 12:17:45 2025 +0200
Start on stylistic cleanups.
diff --git a/ChangeLog b/ChangeLog
index cee26ec8..e69f35f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2025-02-05 Arnold D. Robbins <arnold@skeeve.com>
+
+ * array.c, eval.c, ext.c, interpret.h: Some stylistic cleanups.
+
2025-02-03 Cristian Ioneci <mekanofox@astropostale.com>
Fix issues triggered by using in certain ways array elements passed to
diff --git a/array.c b/array.c
index 5dcb747a..41657728 100644
--- a/array.c
+++ b/array.c
@@ -333,8 +333,8 @@ force_array(NODE *symbol, bool canfatal)
symbol = symbol->orig_array;
}
- NODE * elem_new_parent = NULL;
- char * elem_new_vname = NULL;
+ NODE *elem_new_parent = NULL;
+ char *elem_new_vname = NULL;
switch (symbol->type) {
case Node_elem_new:
@@ -510,17 +510,15 @@ adjust_fcall_stack(NODE *symbol, int nsubs)
for (; pcount > 0; pcount--) {
r = *sp++;
if (r->type != Node_array_ref
- || ( r->orig_array->type != Node_var_array
- && r->orig_array->type != Node_elem_new
- )
- )
+ || (r->orig_array->type != Node_var_array
+ && r->orig_array->type != Node_elem_new))
continue;
n = r->orig_array;
-#define NPAR(n) ((n->type == Node_elem_new)?n->eln_pa:n->parent_array)
+#define PARENT_ARRAY(n) ((n->type == Node_elem_new) ? n->eln_pa :
n->parent_array)
/* Case 1 */
if (n == symbol
- && NPAR(symbol) != NULL
+ && PARENT_ARRAY(symbol) != NULL
&& nsubs > 0
) {
/*
@@ -540,7 +538,7 @@ adjust_fcall_stack(NODE *symbol, int nsubs)
}
/* Case 2 */
- for (n = NPAR(n); n != NULL; n = NPAR(n)) {
+ for (n = PARENT_ARRAY(n); n != NULL; n = PARENT_ARRAY(n)) {
assert(n->type == Node_var_array);
if (n == symbol) {
/*
@@ -653,7 +651,8 @@ do_delete(NODE *symbol, int nsubs)
mpfr_unset(val);
#ifdef MEMDEBUG
- memset(val,0,sizeof(NODE)); val->type = 0xbaad;
+ memset(val, 0, sizeof(NODE));
+ val->type = 0xbaad;
#endif
freenode(val);
} else {
diff --git a/eval.c b/eval.c
index 67bfae0a..376b93f1 100644
--- a/eval.c
+++ b/eval.c
@@ -1897,7 +1897,7 @@ init_interpret()
interpret = r_interpret;
}
-/* elem_new_reset --- clear the eln_pa and eln_vn fields of a Node_elem_new */
+/* elem_new_reset --- clear the eln_pa and eln_vn fields of a Node_elem_new. */
void
elem_new_reset(NODE *n)
diff --git a/ext.c b/ext.c
index b31181f8..9e962e43 100644
--- a/ext.c
+++ b/ext.c
@@ -206,7 +206,7 @@ get_actual_argument(NODE *t, int i, bool want_array)
else {
if (t->type == Node_elem_new) {
elem_new_reset(t);
- if (t->valref > 1)
+ if (t->valref > 1) // ADR: 2/2025: Can
this happen?
unref(t);
}
t->type = Node_var;
diff --git a/interpret.h b/interpret.h
index 3feb7fe4..2ae49fb0 100644
--- a/interpret.h
+++ b/interpret.h
@@ -348,8 +348,7 @@ uninitialized_scalar:
if (r->type == Node_elem_new && r->eln_pa == NULL) {
r->eln_pa = t1;
t2 = force_string(t2);
- assert(r->eln_vn == NULL); /* if
(r->eln_vn != NULL) */
-
/* efree(r->eln_vn); */
+ assert(r->eln_vn == NULL);
r->eln_vn = estrdup(t2->stptr, t2->stlen);
/* the subscript in parent array */
}
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=136e88a134dca730dad3faee21c1cc864347ff1e
commit 136e88a134dca730dad3faee21c1cc864347ff1e
Author: Arnold D. Robbins <arnold@skeeve.com>
Date: Mon Feb 3 15:49:09 2025 +0200
Add test files.
diff --git a/test/ar2fn_elnew_sc.awk b/test/ar2fn_elnew_sc.awk
new file mode 100644
index 00000000..1f4288d1
--- /dev/null
+++ b/test/ar2fn_elnew_sc.awk
@@ -0,0 +1,9 @@
+function f(y)
+{
+ y[3] = 14
+ y
+}
+
+BEGIN {
+ f(a[10])
+}
diff --git a/test/ar2fn_elnew_sc.ok b/test/ar2fn_elnew_sc.ok
new file mode 100644
index 00000000..ee1fcb7b
--- /dev/null
+++ b/test/ar2fn_elnew_sc.ok
@@ -0,0 +1,2 @@
+gawk: ar2fn_elnew_sc.awk:4: fatal: attempt to use array `y (from a["10"])' in
a scalar context
+EXIT CODE: 2
diff --git a/test/ar2fn_elnew_sc2.awk b/test/ar2fn_elnew_sc2.awk
new file mode 100644
index 00000000..7c6d5dcb
--- /dev/null
+++ b/test/ar2fn_elnew_sc2.awk
@@ -0,0 +1,9 @@
+function f(y)
+{
+ y[3] = 14
+}
+
+BEGIN {
+ f(a[10])
+ a[10]
+}
diff --git a/test/ar2fn_elnew_sc2.ok b/test/ar2fn_elnew_sc2.ok
new file mode 100644
index 00000000..a2630eeb
--- /dev/null
+++ b/test/ar2fn_elnew_sc2.ok
@@ -0,0 +1,2 @@
+gawk: ar2fn_elnew_sc2.awk:8: fatal: attempt to use array `a["10"]' in a scalar
context
+EXIT CODE: 2
diff --git a/test/ar2fn_fmod.awk b/test/ar2fn_fmod.awk
new file mode 100644
index 00000000..1bc060ce
--- /dev/null
+++ b/test/ar2fn_fmod.awk
@@ -0,0 +1,16 @@
+function f(y)
+{
+ delete a
+ g(y)
+ print typeof(a)
+ print typeof(y)
+}
+
+function g(x)
+{
+ x
+}
+
+BEGIN {
+ f(a[10])
+}
diff --git a/test/ar2fn_fmod.ok b/test/ar2fn_fmod.ok
new file mode 100644
index 00000000..92afc941
--- /dev/null
+++ b/test/ar2fn_fmod.ok
@@ -0,0 +1,2 @@
+array
+unassigned
diff --git a/test/ar2fn_unxptyp_aref.awk b/test/ar2fn_unxptyp_aref.awk
new file mode 100644
index 00000000..3ab9ef0f
--- /dev/null
+++ b/test/ar2fn_unxptyp_aref.awk
@@ -0,0 +1,16 @@
+function f(y)
+{
+ delete a
+ print typeof(y)
+ print y
+ g(y)
+}
+
+function g(x)
+{
+ print "hey", x
+}
+
+BEGIN {
+ f(a[10])
+}
diff --git a/test/ar2fn_unxptyp_aref.ok b/test/ar2fn_unxptyp_aref.ok
new file mode 100644
index 00000000..d7b4d782
--- /dev/null
+++ b/test/ar2fn_unxptyp_aref.ok
@@ -0,0 +1,3 @@
+untyped
+
+hey
diff --git a/test/ar2fn_unxptyp_val.awk b/test/ar2fn_unxptyp_val.awk
new file mode 100644
index 00000000..ca261a5e
--- /dev/null
+++ b/test/ar2fn_unxptyp_val.awk
@@ -0,0 +1,25 @@
+function f1(y)
+{
+ delete a1
+ y
+ print typeof(a1)
+ print typeof(y)
+}
+
+BEGIN {
+ a1[10] = 14
+ delete a1[10]
+ f1(a1[10])
+}
+
+function f2(y)
+{
+ delete a2
+ y
+ print typeof(a2)
+ print typeof(y)
+}
+
+BEGIN {
+ f2(a2[10])
+}
diff --git a/test/ar2fn_unxptyp_val.ok b/test/ar2fn_unxptyp_val.ok
new file mode 100644
index 00000000..bf6c74f8
--- /dev/null
+++ b/test/ar2fn_unxptyp_val.ok
@@ -0,0 +1,4 @@
+array
+unassigned
+array
+unassigned
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=650d32c6b8b0f925b707dae65c17a42422530b05
commit 650d32c6b8b0f925b707dae65c17a42422530b05
Author: Arnold D. Robbins <arnold@skeeve.com>
Date: Mon Feb 3 15:47:43 2025 +0200
Significant fixes for Node_elem_new, plus new tests.
diff --git a/ChangeLog b/ChangeLog
index 07d55583..cee26ec8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2025-02-03 Cristian Ioneci <mekanofox@astropostale.com>
+
+ Fix issues triggered by using in certain ways array elements passed to
+ a function; issues include crash dumps, reads-after-free, internal
errors,
+ incorrect results.
+ See test cases in test/ar2fn_*.awk.
+
+ * awk.h: Add an union around `wsp', `wslen', part of NODE's `sub.val',
in
+ order to overlap a char* over `wsp'; adjust/add #defines to access the
+ moved/added members.
+ (force_string_fmt, force_number): Clear Node_elem_new specific members
+ when the type is changed.
+ * interpret.h (r_interpret): Make a newborn Node_elem_new remember its
+ parent and a string representation of the index in the parent; for that
+ use `typre' and the added char* mentioned above (in awk.h)
+ (r_interpret): Clear Node_elem_new specific members when the type is
+ changed.
+ * array.c (force_array): The node will become a Node_var_array: if
+ present, use the values stashed in the previously mentioned fields to
+ properly set its `parent_array' and `vname'.
+ (adjust_param_node): New function.
+ (adjust_fcall_stack): Extra handling of Node_elem_new nodes.
+ * eval.c (elem_new_reset): New function.
+ (elem_new_to_scalar): Clear Node_elem_new specific members using the
newly
+ introduced function above.
+ * ext.c (get_actual_argument): Clear Node_elem_new specific members when
+ the type is changed.
+ * gawkapi.c (api_sym_update): Clear Node_elem_new specific members when
+ the type is changed.
+ * mpfr.c (mpg_force_number): Clear Node_elem_new specific members when
+ the type is changed.
+ * node.c (r_force_number): Clear Node_elem_new specific members when
+ the type is changed.
+ (r_unref): Add code to free the eln_vn member of a Node_elem_new.
+
2025-01-26 Arnold D. Robbins <arnold@skeeve.com>
* interpret.h (r_interpret): Case Op_store_var; move REGEX
diff --git a/array.c b/array.c
index 88d3b001..5dcb747a 100644
--- a/array.c
+++ b/array.c
@@ -333,8 +333,15 @@ force_array(NODE *symbol, bool canfatal)
symbol = symbol->orig_array;
}
+ NODE * elem_new_parent = NULL;
+ char * elem_new_vname = NULL;
+
switch (symbol->type) {
case Node_elem_new:
+ elem_new_parent = symbol->eln_pa;
+ symbol->eln_pa = NULL;
+ elem_new_vname = symbol->eln_vn;
+ symbol->eln_vn = NULL;
efree(symbol->stptr);
symbol->stptr = NULL;
symbol->stlen = 0;
@@ -345,6 +352,10 @@ force_array(NODE *symbol, bool canfatal)
symbol->parent_array = NULL; /* main array has no parent */
/* fall through */
case Node_var_array:
+ if (elem_new_parent != NULL)
+ symbol->parent_array = elem_new_parent;
+ if (elem_new_vname != NULL)
+ symbol->vname = elem_new_vname;
break;
case Node_array_ref:
@@ -435,6 +446,30 @@ concat_exp(int nargs, bool do_subsep)
}
+/*
+ * adjust_param_node: change a parameter node when adjusting the call stack
+ * (code factored out from the adjust_fcall_stack function)
+ */
+
+static void
+adjust_param_node(NODE *r)
+{
+ if (r->orig_array != NULL)
+ if (r->orig_array->valref > 0)
+ DEREF(r->orig_array);
+ if (r->prev_array != NULL && r->prev_array != r->orig_array)
+ if (r->prev_array->valref > 0)
+ DEREF(r->prev_array);
+ if (r->orig_array->type == Node_var_array) {
+ r->orig_array = r->prev_array = NULL;
+ null_array(r);
+ } else { /* Node_elem_new */
+ r->type = Node_var_new;
+ }
+ r->parent_array = NULL;
+}
+
+
/*
* adjust_fcall_stack: remove subarray(s) of symbol[] from
* function call stack.
@@ -475,13 +510,17 @@ adjust_fcall_stack(NODE *symbol, int nsubs)
for (; pcount > 0; pcount--) {
r = *sp++;
if (r->type != Node_array_ref
- || r->orig_array->type != Node_var_array)
+ || ( r->orig_array->type != Node_var_array
+ && r->orig_array->type != Node_elem_new
+ )
+ )
continue;
n = r->orig_array;
+#define NPAR(n) ((n->type == Node_elem_new)?n->eln_pa:n->parent_array)
/* Case 1 */
if (n == symbol
- && symbol->parent_array != NULL
+ && NPAR(symbol) != NULL
&& nsubs > 0
) {
/*
@@ -496,13 +535,12 @@ adjust_fcall_stack(NODE *symbol, int nsubs)
* BEGIN { a[0][0] = 1; f(a[0], a[0]); ...}
*/
- null_array(r);
- r->parent_array = NULL;
+ adjust_param_node(r);
continue;
}
/* Case 2 */
- for (n = n->parent_array; n != NULL; n = n->parent_array) {
+ for (n = NPAR(n); n != NULL; n = NPAR(n)) {
assert(n->type == Node_var_array);
if (n == symbol) {
/*
@@ -514,8 +552,7 @@ adjust_fcall_stack(NODE *symbol, int nsubs)
* BEGIN { a[0][0][0][0] = 1; f(a[0],
a[0][0][0]); .. }
*
*/
- null_array(r);
- r->parent_array = NULL;
+ adjust_param_node(r);
break;
}
}
@@ -608,8 +645,20 @@ do_delete(NODE *symbol, int nsubs)
/* cleared a sub-array, free Node_var_array */
efree(val->vname);
freenode(val);
- } else
+ } else if (val->type == Node_elem_new) {
+ adjust_fcall_stack(val, nsubs); /* fix function call stack;
See above. */
+ elem_new_reset(val);
+ if ((val->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+ efree(val->stptr);
+
+ mpfr_unset(val);
+#ifdef MEMDEBUG
+ memset(val,0,sizeof(NODE)); val->type = 0xbaad;
+#endif
+ freenode(val);
+ } else {
unref(val);
+ }
(void) assoc_remove(symbol, subs);
DEREF(subs);
diff --git a/awk.h b/awk.h
index 9bfbd1ee..920b76f9 100644
--- a/awk.h
+++ b/awk.h
@@ -375,8 +375,13 @@ typedef struct exp_node {
char *sp;
size_t slen;
int idx;
- wchar_t *wsp;
- size_t wslen;
+ union {
+ struct {
+ wchar_t *wsp;
+ size_t wslen;
+ } ws;
+ char * vn;
+ } worn;
struct exp_node *typre;
enum commenttype comtype;
} val;
@@ -499,8 +504,13 @@ typedef struct exp_node {
#define stlen sub.val.slen
#define stfmt sub.val.idx
#define strndmode sub.val.rndmode
-#define wstptr sub.val.wsp
-#define wstlen sub.val.wslen
+#define wstptr sub.val.worn.ws.wsp
+#define wstlen sub.val.worn.ws.wslen
+
+/* Node_elem_new */
+#define eln_vn sub.val.worn.vn
+#define eln_pa sub.val.typre
+
#ifdef HAVE_MPFR
#define mpg_numbr sub.val.nm.mpnum
#define mpg_i sub.val.nm.mpi
@@ -1561,6 +1571,7 @@ extern STACK_ITEM *grow_stack(void);
extern void dump_fcall_stack(FILE *fp);
extern int register_exec_hook(Func_pre_exec preh, Func_post_exec posth);
extern NODE **r_get_field(NODE *n, Func_ptr *assign, bool reference);
+extern void elem_new_reset(NODE *n);
extern NODE *elem_new_to_scalar(NODE *n);
/* ext.c */
extern NODE *do_ext(int nargs);
@@ -1963,6 +1974,7 @@ static inline NODE *
force_string_fmt(NODE *s, const char *fmtstr, int fmtidx)
{
if (s->type == Node_elem_new) {
+ elem_new_reset(s);
s->type = Node_val;
return s;
@@ -2004,6 +2016,7 @@ static inline NODE *
force_number(NODE *n)
{
if (n->type == Node_elem_new) {
+ elem_new_reset(n);
n->type = Node_val;
return n;
diff --git a/eval.c b/eval.c
index 6e18344f..67bfae0a 100644
--- a/eval.c
+++ b/eval.c
@@ -1897,6 +1897,20 @@ init_interpret()
interpret = r_interpret;
}
+/* elem_new_reset --- clear the eln_pa and eln_vn fields of a Node_elem_new */
+
+void
+elem_new_reset(NODE *n)
+{
+ assert(n->type == Node_elem_new);
+
+ if (n->eln_vn != NULL) {
+ efree(n->eln_vn);
+ n->eln_vn = NULL;
+ }
+ n->eln_pa = NULL;
+}
+
/* elem_new_to_scalar --- convert Node_elem_new to untyped scalar */
NODE *
@@ -1905,6 +1919,8 @@ elem_new_to_scalar(NODE *n)
if (n->type != Node_elem_new)
return n;
+ elem_new_reset(n);
+
if (n->valref > 1) {
unref(n);
return dupnode(Nnull_string);
diff --git a/ext.c b/ext.c
index 26894bf1..b31181f8 100644
--- a/ext.c
+++ b/ext.c
@@ -204,6 +204,11 @@ get_actual_argument(NODE *t, int i, bool want_array)
if (want_array)
return force_array(t, false);
else {
+ if (t->type == Node_elem_new) {
+ elem_new_reset(t);
+ if (t->valref > 1)
+ unref(t);
+ }
t->type = Node_var;
t->var_value = dupnode(Nnull_string);
return t->var_value;
diff --git a/gawkapi.c b/gawkapi.c
index c32df77a..6a2bca43 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -910,9 +910,12 @@ api_sym_update(awk_ext_id_t id,
unref(node->var_value);
node->var_value = awk_value_to_node(value);
if ((node->type == Node_var_new || node->type == Node_elem_new)
- && value->val_type != AWK_UNDEFINED)
+ && value->val_type != AWK_UNDEFINED) {
+ if (node->type == Node_elem_new) {
+ elem_new_reset(node);
+ }
node->type = Node_var;
-
+ }
return awk_true;
}
diff --git a/interpret.h b/interpret.h
index 239f2ed6..3feb7fe4 100644
--- a/interpret.h
+++ b/interpret.h
@@ -241,6 +241,7 @@ uninitialized_scalar:
if (op != Op_push_arg_untyped) {
// convert very original untyped to
scalar
+ elem_new_reset(m);
m->type = Node_var;
m->var_value = dupnode(Nnull_string);
m->flags &= ~(MPFN | MPZN);
@@ -326,7 +327,6 @@ uninitialized_scalar:
r = *assoc_lookup(t1, t2);
}
- DEREF(t2);
/* for SYMTAB, step through to the actual variable */
if (t1 == symbol_table) {
@@ -345,6 +345,16 @@ uninitialized_scalar:
}
}
+ if (r->type == Node_elem_new && r->eln_pa == NULL) {
+ r->eln_pa = t1;
+ t2 = force_string(t2);
+ assert(r->eln_vn == NULL); /* if
(r->eln_vn != NULL) */
+
/* efree(r->eln_vn); */
+ r->eln_vn = estrdup(t2->stptr, t2->stlen);
/* the subscript in parent array */
+ }
+
+ DEREF(t2);
+
if (r->type == Node_val
|| r->type == Node_var
|| r->type == Node_elem_new)
@@ -384,7 +394,8 @@ uninitialized_scalar:
r = force_array(r, false);
r->parent_array = t1;
t2 = force_string(t2);
- r->vname = estrdup(t2->stptr, t2->stlen);
/* the subscript in parent array */
+ if (r->vname == NULL)
+ r->vname = estrdup(t2->stptr,
t2->stlen); /* the subscript in parent array */
} else if (r->type != Node_var_array) {
t2 = force_string(t2);
fatal(_("attempt to use scalar `%s[\"%.*s\"]'
as an array"),
diff --git a/mpfr.c b/mpfr.c
index e783a5bb..a80d0c84 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -350,6 +350,7 @@ mpg_force_number(NODE *n)
char *cp, *cpend;
if (n->type == Node_elem_new) {
+ elem_new_reset(n);
n->type = Node_val;
return n;
diff --git a/node.c b/node.c
index 117c01bf..a4687752 100644
--- a/node.c
+++ b/node.c
@@ -61,6 +61,7 @@ r_force_number(NODE *n)
char *ptr;
if (n->type == Node_elem_new) {
+ elem_new_reset(n);
n->type = Node_val;
return n;
@@ -548,6 +549,8 @@ r_unref(NODE *tmp)
mpfr_unset(tmp);
+ if (tmp->type == Node_elem_new && tmp->eln_vn != NULL)
+ efree(tmp->eln_vn);
free_wstr(tmp);
freenode(tmp);
}
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index 029a5dbb..2e6435db 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -190,6 +190,7 @@ UNIX_TESTS = \
GAWK_EXT_TESTS = \
aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \
arraysort2 arraytype asortbool asortsymtab backw badargs \
+ ar2fn_elnew_sc ar2fn_elnew_sc2 ar2fn_fmod ar2fn_unxptyp_aref
ar2fn_unxptyp_val \
beginfile1 beginfile2 binmode1 charasbytes clos1way clos1way2 \
clos1way3 clos1way4 clos1way5 clos1way6 colonwarn commas crlf \
csv1 csv2 csv3 csvodd dbugarray1 dbugarray2 dbugarray3 dbugarray4 \
@@ -2737,6 +2738,31 @@ backw:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1
|| echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ar2fn_elnew_sc:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_elnew_sc2:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_fmod:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_unxptyp_aref:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_unxptyp_val:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
clos1way:
@echo $@
@-[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
diff --git a/test/ChangeLog b/test/ChangeLog
index d7a0b05c..cd864399 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,13 @@
+2025-02-03 Cristian Ioneci <mekanofox@astropostale.com>
+
+ * Makefile.am (EXTRADIST): New tests: ar2fn_elnew_sc, ar2fn_elnew_sc2,
+ ar2fn_fmod, ar2fn_unxptyp_aref, ar2fn_unxptyp_val
+
+ * ar2fn_elnew_sc.awk, ar2fn_elnew_sc.ok, ar2fn_elnew_sc2.awk,
+ ar2fn_elnew_sc2.ok, ar2fn_fmod.awk, ar2fn_fmod.ok,
ar2fn_unxptyp_aref.awk,
+ ar2fn_unxptyp_aref.ok, ar2fn_unxptyp_val.awk, ar2fn_unxptyp_val.ok: New
+ files.
+
2025-01-23 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (EXTRADIST): New test, memleak2.
diff --git a/test/Makefile.am b/test/Makefile.am
index 505f7966..c292383d 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -122,6 +122,16 @@ EXTRA_DIST = \
arysubnm.ok \
aryunasgn.awk \
aryunasgn.ok \
+ ar2fn_elnew_sc.awk \
+ ar2fn_elnew_sc.ok \
+ ar2fn_elnew_sc2.awk \
+ ar2fn_elnew_sc2.ok \
+ ar2fn_fmod.awk \
+ ar2fn_fmod.ok \
+ ar2fn_unxptyp_aref.awk \
+ ar2fn_unxptyp_aref.ok \
+ ar2fn_unxptyp_val.awk \
+ ar2fn_unxptyp_val.ok \
asgext.awk \
asgext.in \
asgext.ok \
@@ -1576,6 +1586,7 @@ UNIX_TESTS = \
GAWK_EXT_TESTS = \
aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \
arraysort2 arraytype asortbool asortsymtab backw badargs \
+ ar2fn_elnew_sc ar2fn_elnew_sc2 ar2fn_fmod ar2fn_unxptyp_aref
ar2fn_unxptyp_val \
beginfile1 beginfile2 binmode1 charasbytes clos1way clos1way2 \
clos1way3 clos1way4 clos1way5 clos1way6 colonwarn commas crlf \
csv1 csv2 csv3 csvodd dbugarray1 dbugarray2 dbugarray3 dbugarray4 \
diff --git a/test/Makefile.in b/test/Makefile.in
index 1c3bc61d..70e437a3 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -386,6 +386,16 @@ EXTRA_DIST = \
arysubnm.ok \
aryunasgn.awk \
aryunasgn.ok \
+ ar2fn_elnew_sc.awk \
+ ar2fn_elnew_sc.ok \
+ ar2fn_elnew_sc2.awk \
+ ar2fn_elnew_sc2.ok \
+ ar2fn_fmod.awk \
+ ar2fn_fmod.ok \
+ ar2fn_unxptyp_aref.awk \
+ ar2fn_unxptyp_aref.ok \
+ ar2fn_unxptyp_val.awk \
+ ar2fn_unxptyp_val.ok \
asgext.awk \
asgext.in \
asgext.ok \
@@ -1840,6 +1850,7 @@ UNIX_TESTS = \
GAWK_EXT_TESTS = \
aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \
arraysort2 arraytype asortbool asortsymtab backw badargs \
+ ar2fn_elnew_sc ar2fn_elnew_sc2 ar2fn_fmod ar2fn_unxptyp_aref
ar2fn_unxptyp_val \
beginfile1 beginfile2 binmode1 charasbytes clos1way clos1way2 \
clos1way3 clos1way4 clos1way5 clos1way6 colonwarn commas crlf \
csv1 csv2 csv3 csvodd dbugarray1 dbugarray2 dbugarray3 dbugarray4 \
@@ -4570,6 +4581,31 @@ backw:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1
|| echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ar2fn_elnew_sc:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_elnew_sc2:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_fmod:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_unxptyp_aref:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_unxptyp_val:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
clos1way:
@echo $@
@-[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
diff --git a/test/Maketests b/test/Maketests
index 2322d88f..77a02181 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1420,6 +1420,31 @@ backw:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1
|| echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ar2fn_elnew_sc:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_elnew_sc2:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_fmod:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_unxptyp_aref:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ar2fn_unxptyp_val:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE:
$$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
clos1way:
@echo $@
@-[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 45 ++++++++++++++++++++++
array.c | 64 +++++++++++++++++++++++++++----
awk.h | 16 +++++++-
eval.c | 16 ++++++++
ext.c | 5 +++
gawkapi.c | 7 +++-
interpret.h | 14 ++++++-
mpfr.c | 1 +
node.c | 3 ++
pc/Makefile.tst | 26 +++++++++++++
test/ChangeLog | 10 +++++
test/Makefile.am | 11 ++++++
test/Makefile.in | 36 +++++++++++++++++
test/Maketests | 25 ++++++++++++
test/ar2fn_elnew_sc.awk | 9 +++++
test/ar2fn_elnew_sc.ok | 2 +
test/ar2fn_elnew_sc2.awk | 9 +++++
test/ar2fn_elnew_sc2.ok | 2 +
test/ar2fn_fmod.awk | 16 ++++++++
test/{elemnew3.ok => ar2fn_fmod.ok} | 1 +
test/ar2fn_unxptyp_aref.awk | 16 ++++++++
test/ar2fn_unxptyp_aref.ok | 3 ++
test/ar2fn_unxptyp_val.awk | 25 ++++++++++++
test/{typeof5.ok => ar2fn_unxptyp_val.ok} | 4 +-
24 files changed, 350 insertions(+), 16 deletions(-)
create mode 100644 test/ar2fn_elnew_sc.awk
create mode 100644 test/ar2fn_elnew_sc.ok
create mode 100644 test/ar2fn_elnew_sc2.awk
create mode 100644 test/ar2fn_elnew_sc2.ok
create mode 100644 test/ar2fn_fmod.awk
copy test/{elemnew3.ok => ar2fn_fmod.ok} (64%)
create mode 100644 test/ar2fn_unxptyp_aref.awk
create mode 100644 test/ar2fn_unxptyp_aref.ok
create mode 100644 test/ar2fn_unxptyp_val.awk
copy test/{typeof5.ok => ar2fn_unxptyp_val.ok} (55%)
hooks/post-receive
--
gawk
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] gawk branch, gawk-5.3-stable, updated. gawk-4.1.0-5606-g28c67338,
Arnold Robbins <=