| 1 | #From [email protected] Thu Jun 18 09:10 EDT 1998
|
|---|
| 2 | #Received: from mescaline.gnu.org ([email protected] [158.121.106.21]) by cssun.mathcs.emory.edu (8.7.5/8.6.9-940818.01cssun) with ESMTP id JAA23649 for <[email protected]>; Thu, 18 Jun 1998 09:10:54 -0400 (EDT)
|
|---|
| 3 | #Received: from khromeleque.dmat.uevora.pt by mescaline.gnu.org (8.8.5/8.6.12GNU) with ESMTP id JAA21732 for <[email protected]>; Thu, 18 Jun 1998 09:11:19 -0400
|
|---|
| 4 | #Received: from khromeleque.dmat.uevora.pt (vp@localhost [127.0.0.1])
|
|---|
| 5 | # by khromeleque.dmat.uevora.pt (8.8.8/8.8.8/Debian/GNU) with ESMTP id OAA11817
|
|---|
| 6 | # for <[email protected]>; Thu, 18 Jun 1998 14:13:57 +0100
|
|---|
| 7 | #Message-Id: <[email protected]>
|
|---|
| 8 | #To: [email protected]
|
|---|
| 9 | #Subject: concatenation bug in gawk 3.0.3
|
|---|
| 10 | #Date: Thu, 18 Jun 1998 14:13:57 +0200
|
|---|
| 11 | #From: Vasco Pedro <[email protected]>
|
|---|
| 12 | #Content-Type: text
|
|---|
| 13 | #Content-Length: 2285
|
|---|
| 14 | #Status: RO
|
|---|
| 15 | #
|
|---|
| 16 | #Hi,
|
|---|
| 17 | #
|
|---|
| 18 | #The gawk program '{print NR " " 10/NR}' will print:
|
|---|
| 19 | #
|
|---|
| 20 | #1 10
|
|---|
| 21 | #5 5
|
|---|
| 22 | #3 3.33333
|
|---|
| 23 | #2 2.5
|
|---|
| 24 | #2 2
|
|---|
| 25 | #1 1.66667
|
|---|
| 26 | #
|
|---|
| 27 | #instead of the correct:
|
|---|
| 28 | #
|
|---|
| 29 | #1 10
|
|---|
| 30 | #2 5
|
|---|
| 31 | #3 3.33333
|
|---|
| 32 | #4 2.5
|
|---|
| 33 | #5 2
|
|---|
| 34 | #6 1.66667
|
|---|
| 35 | #
|
|---|
| 36 | #You'll notice, on the incorrect output, that the first column is
|
|---|
| 37 | #the first digit of the second.
|
|---|
| 38 | #
|
|---|
| 39 | #I think the problem comes from the way builtin variables are handled.
|
|---|
| 40 | #Since the items to be concatenated are processed in reverse order and
|
|---|
| 41 | #the return value of tree_eval(``NR'') is a pointer to the value part
|
|---|
| 42 | #of `NR_node', the `unref()' of `NR_node' due to its second occurrence
|
|---|
| 43 | #will leave a dangling pointer in `strlist'. The reason that it doesn't
|
|---|
| 44 | #reuse the freed space with objects of the same type. (Using Electric
|
|---|
| 45 | #Fence with EF_PROTECT_FREE set confirms that freed space is being
|
|---|
| 46 | #accessed.)
|
|---|
| 47 | #
|
|---|
| 48 | #The enclosed patch (hack would be a better word to describe it) is
|
|---|
| 49 | #all I could come up with. With it installed, things seem to work ok,
|
|---|
| 50 | #but I doubt this is the correct way to do it. (If I treated the
|
|---|
| 51 | #case for `Node_field_spec' as the I did others, `make check' would
|
|---|
| 52 | #fail in several places.)
|
|---|
| 53 | #
|
|---|
| 54 | #Regards,
|
|---|
| 55 | #vasco
|
|---|
| 56 | #
|
|---|
| 57 | #*** eval.c~ Tue May 6 21:39:55 1997
|
|---|
| 58 | #--- eval.c Thu Jun 18 13:39:25 1998
|
|---|
| 59 | #***************
|
|---|
| 60 | #*** 685,697 ****
|
|---|
| 61 | # return func_call(tree->rnode, tree->lnode);
|
|---|
| 62 | #
|
|---|
| 63 | # /* unary operations */
|
|---|
| 64 | # case Node_NR:
|
|---|
| 65 | # case Node_FNR:
|
|---|
| 66 | # case Node_NF:
|
|---|
| 67 | # case Node_FIELDWIDTHS:
|
|---|
| 68 | # case Node_FS:
|
|---|
| 69 | # case Node_RS:
|
|---|
| 70 | #- case Node_field_spec:
|
|---|
| 71 | # case Node_subscript:
|
|---|
| 72 | # case Node_IGNORECASE:
|
|---|
| 73 | # case Node_OFS:
|
|---|
| 74 | #--- 685,700 ----
|
|---|
| 75 | # return func_call(tree->rnode, tree->lnode);
|
|---|
| 76 | #
|
|---|
| 77 | # /* unary operations */
|
|---|
| 78 | #+ case Node_field_spec:
|
|---|
| 79 | #+ lhs = get_lhs(tree, (Func_ptr *) NULL);
|
|---|
| 80 | #+ return *lhs;
|
|---|
| 81 | #+
|
|---|
| 82 | # case Node_NR:
|
|---|
| 83 | # case Node_FNR:
|
|---|
| 84 | # case Node_NF:
|
|---|
| 85 | # case Node_FIELDWIDTHS:
|
|---|
| 86 | # case Node_FS:
|
|---|
| 87 | # case Node_RS:
|
|---|
| 88 | # case Node_subscript:
|
|---|
| 89 | # case Node_IGNORECASE:
|
|---|
| 90 | # case Node_OFS:
|
|---|
| 91 | #***************
|
|---|
| 92 | #*** 699,705 ****
|
|---|
| 93 | # case Node_OFMT:
|
|---|
| 94 | # case Node_CONVFMT:
|
|---|
| 95 | # lhs = get_lhs(tree, (Func_ptr *) NULL);
|
|---|
| 96 | #! return *lhs;
|
|---|
| 97 | #
|
|---|
| 98 | # case Node_var_array:
|
|---|
| 99 | # fatal("attempt to use array `%s' in a scalar context",
|
|---|
| 100 | #--- 702,710 ----
|
|---|
| 101 | # case Node_OFMT:
|
|---|
| 102 | # case Node_CONVFMT:
|
|---|
| 103 | # lhs = get_lhs(tree, (Func_ptr *) NULL);
|
|---|
| 104 | #! r = dupnode(*lhs);
|
|---|
| 105 | #! r->flags |= TEMP;
|
|---|
| 106 | #! return r;
|
|---|
| 107 | #
|
|---|
| 108 | # case Node_var_array:
|
|---|
| 109 | # fatal("attempt to use array `%s' in a scalar context",
|
|---|
| 110 | #
|
|---|
| 111 | { print NR " " 10/NR }
|
|---|