aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xChangeLog19
-rw-r--r--awk.h3
-rw-r--r--awkgram.c844
-rw-r--r--awkgram.y8
-rw-r--r--debug.c6
-rw-r--r--doc/ChangeLog5
-rw-r--r--doc/gawk.info435
-rw-r--r--doc/gawk.texi11
-rw-r--r--doc/gawktexi.in11
-rw-r--r--eval.c1
-rw-r--r--interpret.h4
-rw-r--r--main.c2
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am7
-rw-r--r--test/Makefile.in12
-rw-r--r--test/Maketests5
-rw-r--r--test/dbugeval3.awk4
-rw-r--r--test/dbugeval3.in2
-rw-r--r--test/dbugeval3.ok3
19 files changed, 734 insertions, 653 deletions
diff --git a/ChangeLog b/ChangeLog
index 248453b3..1b4fe31a 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2019-02-17 Arnold D. Robbins <arnold@skeeve.com>
+
+ Fix debugger eval command so that return from a called
+ user-defined function works. Thanks to Lothar Langer
+ <lotharla@gmail.com> for the report.
+
+ * awk.h (Op_K_return_from_eval): New opcode.
+ (parse_program): Add boolean second parameter, `from_eval'.
+ * awkgram.y (called_from_eval): New variable
+ (Grammar): Check it for return statements. If true, change the
+ opcode to Op_K_return_from_eval.
+ (parse_program): Set called_from_eval to value of from_eval parameter.
+ * debug.c (pre_execute_code): Change test for Op_K_return to test
+ for Op_K_return_from_eval.
+ (do_eval): Call parse_program with second parameter true.
+ * eval.c (optypetab): Add entry for Op_K_return_from_eval.
+ * interpret.h (r_interpret): Ditto: can't-happen error.
+ * main.c (main): Call parse_program with second parameter false.
+
2019-02-15 Arnold D. Robbins <arnold@skeeve.com>
* awkgram.y: If profiling, correctly turn `print' into `print $0'.
diff --git a/awk.h b/awk.h
index a8a37f60..e90f83d5 100644
--- a/awk.h
+++ b/awk.h
@@ -664,6 +664,7 @@ typedef enum opcodeval {
Op_K_next,
Op_K_exit,
Op_K_return,
+ Op_K_return_from_eval,
Op_K_delete,
Op_K_delete_loop,
Op_K_getline_redir,
@@ -1402,7 +1403,7 @@ extern unsigned long (*hash)(const char *s, size_t len, unsigned long hsize, siz
extern void init_env_array(NODE *env_node);
/* awkgram.c */
extern NODE *variable(int location, char *name, NODETYPE type);
-extern int parse_program(INSTRUCTION **pcode);
+extern int parse_program(INSTRUCTION **pcode, bool from_eval);
extern void track_ext_func(const char *name);
extern void dump_funcs(void);
extern void dump_vars(const char *fname);
diff --git a/awkgram.c b/awkgram.c
index a9edb06d..a568f5da 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -220,6 +220,7 @@ static INSTRUCTION *ip_end;
static INSTRUCTION *ip_endfile;
static INSTRUCTION *ip_beginfile;
INSTRUCTION *main_beginfile;
+static bool called_from_eval = false;
static inline INSTRUCTION *list_create(INSTRUCTION *x);
static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
@@ -230,7 +231,7 @@ extern double fmod(double x, double y);
#define YYSTYPE INSTRUCTION *
-#line 234 "awkgram.c" /* yacc.c:337 */
+#line 235 "awkgram.c" /* yacc.c:337 */
# ifndef YY_NULLPTR
# if defined __cplusplus
# if 201103L <= __cplusplus
@@ -683,27 +684,27 @@ static const yytype_uint8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 231, 231, 232, 237, 247, 251, 263, 271, 285,
- 296, 306, 316, 329, 339, 341, 346, 356, 358, 363,
- 365, 367, 373, 377, 382, 412, 424, 436, 442, 451,
- 469, 470, 481, 487, 495, 496, 500, 500, 534, 533,
- 567, 582, 584, 589, 590, 610, 615, 616, 620, 631,
- 636, 643, 751, 802, 852, 978, 999, 1020, 1030, 1040,
- 1050, 1061, 1074, 1092, 1091, 1105, 1123, 1123, 1225, 1225,
- 1258, 1288, 1296, 1297, 1303, 1304, 1311, 1316, 1329, 1344,
- 1346, 1354, 1361, 1363, 1371, 1380, 1382, 1391, 1392, 1400,
- 1405, 1405, 1418, 1424, 1436, 1440, 1462, 1463, 1469, 1470,
- 1479, 1480, 1485, 1490, 1507, 1509, 1511, 1518, 1519, 1525,
- 1526, 1531, 1533, 1540, 1542, 1550, 1555, 1566, 1567, 1572,
- 1574, 1581, 1583, 1591, 1596, 1606, 1607, 1612, 1619, 1623,
- 1625, 1627, 1640, 1657, 1667, 1674, 1676, 1681, 1683, 1685,
- 1693, 1695, 1700, 1702, 1707, 1709, 1711, 1768, 1770, 1772,
- 1774, 1776, 1778, 1780, 1782, 1796, 1801, 1806, 1831, 1837,
- 1839, 1841, 1843, 1845, 1847, 1852, 1856, 1888, 1896, 1902,
- 1908, 1921, 1922, 1923, 1928, 1933, 1937, 1941, 1956, 1977,
- 1982, 2019, 2056, 2057, 2063, 2064, 2069, 2071, 2078, 2095,
- 2112, 2114, 2121, 2126, 2132, 2143, 2155, 2164, 2168, 2173,
- 2177, 2181, 2185, 2190, 2191, 2195, 2199, 2203
+ 0, 232, 232, 233, 238, 248, 252, 264, 272, 286,
+ 297, 307, 317, 330, 340, 342, 347, 357, 359, 364,
+ 366, 368, 374, 378, 383, 413, 425, 437, 443, 452,
+ 470, 471, 482, 488, 496, 497, 501, 501, 535, 534,
+ 568, 583, 585, 590, 591, 611, 616, 617, 621, 632,
+ 637, 644, 752, 803, 853, 979, 1000, 1021, 1031, 1041,
+ 1051, 1062, 1075, 1093, 1092, 1109, 1127, 1127, 1229, 1229,
+ 1262, 1292, 1300, 1301, 1307, 1308, 1315, 1320, 1333, 1348,
+ 1350, 1358, 1365, 1367, 1375, 1384, 1386, 1395, 1396, 1404,
+ 1409, 1409, 1422, 1428, 1440, 1444, 1466, 1467, 1473, 1474,
+ 1483, 1484, 1489, 1494, 1511, 1513, 1515, 1522, 1523, 1529,
+ 1530, 1535, 1537, 1544, 1546, 1554, 1559, 1570, 1571, 1576,
+ 1578, 1585, 1587, 1595, 1600, 1610, 1611, 1616, 1623, 1627,
+ 1629, 1631, 1644, 1661, 1671, 1678, 1680, 1685, 1687, 1689,
+ 1697, 1699, 1704, 1706, 1711, 1713, 1715, 1772, 1774, 1776,
+ 1778, 1780, 1782, 1784, 1786, 1800, 1805, 1810, 1835, 1841,
+ 1843, 1845, 1847, 1849, 1851, 1856, 1860, 1892, 1900, 1906,
+ 1912, 1925, 1926, 1927, 1932, 1937, 1941, 1945, 1960, 1981,
+ 1986, 2023, 2060, 2061, 2067, 2068, 2073, 2075, 2082, 2099,
+ 2116, 2118, 2125, 2130, 2136, 2147, 2159, 2168, 2172, 2177,
+ 2181, 2185, 2189, 2194, 2195, 2199, 2203, 2207
};
#endif
@@ -1908,22 +1909,22 @@ yyreduce:
switch (yyn)
{
case 2:
-#line 231 "awkgram.y" /* yacc.c:1652 */
+#line 232 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 1914 "awkgram.c" /* yacc.c:1652 */
+#line 1915 "awkgram.c" /* yacc.c:1652 */
break;
case 3:
-#line 233 "awkgram.y" /* yacc.c:1652 */
+#line 234 "awkgram.y" /* yacc.c:1652 */
{
rule = 0;
yyerrok;
}
-#line 1923 "awkgram.c" /* yacc.c:1652 */
+#line 1924 "awkgram.c" /* yacc.c:1652 */
break;
case 4:
-#line 238 "awkgram.y" /* yacc.c:1652 */
+#line 239 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0] != NULL) {
if (yyvsp[-1] == NULL)
@@ -1933,19 +1934,19 @@ yyreduce:
}
yyval = yyvsp[-1];
}
-#line 1937 "awkgram.c" /* yacc.c:1652 */
+#line 1938 "awkgram.c" /* yacc.c:1652 */
break;
case 5:
-#line 248 "awkgram.y" /* yacc.c:1652 */
+#line 249 "awkgram.y" /* yacc.c:1652 */
{
next_sourcefile();
}
-#line 1945 "awkgram.c" /* yacc.c:1652 */
+#line 1946 "awkgram.c" /* yacc.c:1652 */
break;
case 6:
-#line 252 "awkgram.y" /* yacc.c:1652 */
+#line 253 "awkgram.y" /* yacc.c:1652 */
{
rule = 0;
/*
@@ -1954,11 +1955,11 @@ yyreduce:
*/
/* yyerrok; */
}
-#line 1958 "awkgram.c" /* yacc.c:1652 */
+#line 1959 "awkgram.c" /* yacc.c:1652 */
break;
case 7:
-#line 264 "awkgram.y" /* yacc.c:1652 */
+#line 265 "awkgram.y" /* yacc.c:1652 */
{
(void) append_rule(yyvsp[-1], yyvsp[0]);
if (pending_comment != NULL) {
@@ -1966,11 +1967,11 @@ yyreduce:
pending_comment = NULL;
}
}
-#line 1970 "awkgram.c" /* yacc.c:1652 */
+#line 1971 "awkgram.c" /* yacc.c:1652 */
break;
case 8:
-#line 272 "awkgram.y" /* yacc.c:1652 */
+#line 273 "awkgram.y" /* yacc.c:1652 */
{
if (rule != Rule) {
msg(_("%s blocks must have an action part"), ruletab[rule]);
@@ -1984,11 +1985,11 @@ yyreduce:
(void) append_rule(yyvsp[-1], NULL);
}
}
-#line 1988 "awkgram.c" /* yacc.c:1652 */
+#line 1989 "awkgram.c" /* yacc.c:1652 */
break;
case 9:
-#line 286 "awkgram.y" /* yacc.c:1652 */
+#line 287 "awkgram.y" /* yacc.c:1652 */
{
in_function = false;
(void) mk_function(yyvsp[-1], yyvsp[0]);
@@ -1999,11 +2000,11 @@ yyreduce:
}
yyerrok;
}
-#line 2003 "awkgram.c" /* yacc.c:1652 */
+#line 2004 "awkgram.c" /* yacc.c:1652 */
break;
case 10:
-#line 297 "awkgram.y" /* yacc.c:1652 */
+#line 298 "awkgram.y" /* yacc.c:1652 */
{
want_source = false;
at_seen = false;
@@ -2013,11 +2014,11 @@ yyreduce:
}
yyerrok;
}
-#line 2017 "awkgram.c" /* yacc.c:1652 */
+#line 2018 "awkgram.c" /* yacc.c:1652 */
break;
case 11:
-#line 307 "awkgram.y" /* yacc.c:1652 */
+#line 308 "awkgram.y" /* yacc.c:1652 */
{
want_source = false;
at_seen = false;
@@ -2027,11 +2028,11 @@ yyreduce:
}
yyerrok;
}
-#line 2031 "awkgram.c" /* yacc.c:1652 */
+#line 2032 "awkgram.c" /* yacc.c:1652 */
break;
case 12:
-#line 317 "awkgram.y" /* yacc.c:1652 */
+#line 318 "awkgram.y" /* yacc.c:1652 */
{
want_source = false;
at_seen = false;
@@ -2041,11 +2042,11 @@ yyreduce:
yyerrok;
}
-#line 2045 "awkgram.c" /* yacc.c:1652 */
+#line 2046 "awkgram.c" /* yacc.c:1652 */
break;
case 13:
-#line 330 "awkgram.y" /* yacc.c:1652 */
+#line 331 "awkgram.y" /* yacc.c:1652 */
{
void *srcfile = NULL;
@@ -2055,23 +2056,23 @@ yyreduce:
bcfree(yyvsp[0]);
yyval = (INSTRUCTION *) srcfile;
}
-#line 2059 "awkgram.c" /* yacc.c:1652 */
+#line 2060 "awkgram.c" /* yacc.c:1652 */
break;
case 14:
-#line 340 "awkgram.y" /* yacc.c:1652 */
+#line 341 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2065 "awkgram.c" /* yacc.c:1652 */
+#line 2066 "awkgram.c" /* yacc.c:1652 */
break;
case 15:
-#line 342 "awkgram.y" /* yacc.c:1652 */
+#line 343 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2071 "awkgram.c" /* yacc.c:1652 */
+#line 2072 "awkgram.c" /* yacc.c:1652 */
break;
case 16:
-#line 347 "awkgram.y" /* yacc.c:1652 */
+#line 348 "awkgram.y" /* yacc.c:1652 */
{
void *srcfile;
@@ -2081,58 +2082,58 @@ yyreduce:
bcfree(yyvsp[0]);
yyval = (INSTRUCTION *) srcfile;
}
-#line 2085 "awkgram.c" /* yacc.c:1652 */
+#line 2086 "awkgram.c" /* yacc.c:1652 */
break;
case 17:
-#line 357 "awkgram.y" /* yacc.c:1652 */
+#line 358 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2091 "awkgram.c" /* yacc.c:1652 */
+#line 2092 "awkgram.c" /* yacc.c:1652 */
break;
case 18:
-#line 359 "awkgram.y" /* yacc.c:1652 */
+#line 360 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2097 "awkgram.c" /* yacc.c:1652 */
+#line 2098 "awkgram.c" /* yacc.c:1652 */
break;
case 19:
-#line 364 "awkgram.y" /* yacc.c:1652 */
+#line 365 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 2103 "awkgram.c" /* yacc.c:1652 */
+#line 2104 "awkgram.c" /* yacc.c:1652 */
break;
case 20:
-#line 366 "awkgram.y" /* yacc.c:1652 */
+#line 367 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2109 "awkgram.c" /* yacc.c:1652 */
+#line 2110 "awkgram.c" /* yacc.c:1652 */
break;
case 21:
-#line 368 "awkgram.y" /* yacc.c:1652 */
+#line 369 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2115 "awkgram.c" /* yacc.c:1652 */
+#line 2116 "awkgram.c" /* yacc.c:1652 */
break;
case 22:
-#line 373 "awkgram.y" /* yacc.c:1652 */
+#line 374 "awkgram.y" /* yacc.c:1652 */
{
rule = Rule;
yyval = NULL;
}
-#line 2124 "awkgram.c" /* yacc.c:1652 */
+#line 2125 "awkgram.c" /* yacc.c:1652 */
break;
case 23:
-#line 378 "awkgram.y" /* yacc.c:1652 */
+#line 379 "awkgram.y" /* yacc.c:1652 */
{
rule = Rule;
}
-#line 2132 "awkgram.c" /* yacc.c:1652 */
+#line 2133 "awkgram.c" /* yacc.c:1652 */
break;
case 24:
-#line 383 "awkgram.y" /* yacc.c:1652 */
+#line 384 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *tp;
@@ -2162,11 +2163,11 @@ yyreduce:
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), tp);
rule = Rule;
}
-#line 2166 "awkgram.c" /* yacc.c:1652 */
+#line 2167 "awkgram.c" /* yacc.c:1652 */
break;
case 25:
-#line 413 "awkgram.y" /* yacc.c:1652 */
+#line 414 "awkgram.y" /* yacc.c:1652 */
{
static int begin_seen = 0;
@@ -2178,11 +2179,11 @@ yyreduce:
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2182 "awkgram.c" /* yacc.c:1652 */
+#line 2183 "awkgram.c" /* yacc.c:1652 */
break;
case 26:
-#line 425 "awkgram.y" /* yacc.c:1652 */
+#line 426 "awkgram.y" /* yacc.c:1652 */
{
static int end_seen = 0;
@@ -2194,31 +2195,31 @@ yyreduce:
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2198 "awkgram.c" /* yacc.c:1652 */
+#line 2199 "awkgram.c" /* yacc.c:1652 */
break;
case 27:
-#line 437 "awkgram.y" /* yacc.c:1652 */
+#line 438 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->in_rule = rule = BEGINFILE;
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2208 "awkgram.c" /* yacc.c:1652 */
+#line 2209 "awkgram.c" /* yacc.c:1652 */
break;
case 28:
-#line 443 "awkgram.y" /* yacc.c:1652 */
+#line 444 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->in_rule = rule = ENDFILE;
yyvsp[0]->source_file = source;
yyval = yyvsp[0];
}
-#line 2218 "awkgram.c" /* yacc.c:1652 */
+#line 2219 "awkgram.c" /* yacc.c:1652 */
break;
case 29:
-#line 452 "awkgram.y" /* yacc.c:1652 */
+#line 453 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *ip = make_braced_statements(yyvsp[-4], yyvsp[-3], yyvsp[-2]);
@@ -2233,11 +2234,11 @@ yyreduce:
yyval = ip;
}
-#line 2237 "awkgram.c" /* yacc.c:1652 */
+#line 2238 "awkgram.c" /* yacc.c:1652 */
break;
case 31:
-#line 471 "awkgram.y" /* yacc.c:1652 */
+#line 472 "awkgram.y" /* yacc.c:1652 */
{
const char *name = yyvsp[0]->lextok;
char *qname = qualify_name(name, strlen(name));
@@ -2248,36 +2249,36 @@ yyreduce:
}
yyval = yyvsp[0];
}
-#line 2252 "awkgram.c" /* yacc.c:1652 */
+#line 2253 "awkgram.c" /* yacc.c:1652 */
break;
case 32:
-#line 482 "awkgram.y" /* yacc.c:1652 */
+#line 483 "awkgram.y" /* yacc.c:1652 */
{
yyerror(_("`%s' is a built-in function, it cannot be redefined"),
tokstart);
YYABORT;
}
-#line 2262 "awkgram.c" /* yacc.c:1652 */
+#line 2263 "awkgram.c" /* yacc.c:1652 */
break;
case 33:
-#line 488 "awkgram.y" /* yacc.c:1652 */
+#line 489 "awkgram.y" /* yacc.c:1652 */
{
yyval = yyvsp[0];
at_seen = false;
}
-#line 2271 "awkgram.c" /* yacc.c:1652 */
+#line 2272 "awkgram.c" /* yacc.c:1652 */
break;
case 36:
-#line 500 "awkgram.y" /* yacc.c:1652 */
+#line 501 "awkgram.y" /* yacc.c:1652 */
{ want_param_names = FUNC_HEADER; }
-#line 2277 "awkgram.c" /* yacc.c:1652 */
+#line 2278 "awkgram.c" /* yacc.c:1652 */
break;
case 37:
-#line 501 "awkgram.y" /* yacc.c:1652 */
+#line 502 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *func_comment = NULL;
// Merge any comments found in the parameter list with those
@@ -2303,17 +2304,17 @@ yyreduce:
yyval = yyvsp[-6];
want_param_names = FUNC_BODY;
}
-#line 2307 "awkgram.c" /* yacc.c:1652 */
+#line 2308 "awkgram.c" /* yacc.c:1652 */
break;
case 38:
-#line 534 "awkgram.y" /* yacc.c:1652 */
+#line 535 "awkgram.y" /* yacc.c:1652 */
{ want_regexp = true; }
-#line 2313 "awkgram.c" /* yacc.c:1652 */
+#line 2314 "awkgram.c" /* yacc.c:1652 */
break;
case 39:
-#line 536 "awkgram.y" /* yacc.c:1652 */
+#line 537 "awkgram.y" /* yacc.c:1652 */
{
NODE *n, *exp;
char *re;
@@ -2342,11 +2343,11 @@ yyreduce:
yyval->opcode = Op_match_rec;
yyval->memory = n;
}
-#line 2346 "awkgram.c" /* yacc.c:1652 */
+#line 2347 "awkgram.c" /* yacc.c:1652 */
break;
case 40:
-#line 568 "awkgram.y" /* yacc.c:1652 */
+#line 569 "awkgram.y" /* yacc.c:1652 */
{
char *re;
size_t len;
@@ -2359,23 +2360,23 @@ yyreduce:
yyval->opcode = Op_push_re;
yyval->memory = make_typed_regex(re, len);
}
-#line 2363 "awkgram.c" /* yacc.c:1652 */
+#line 2364 "awkgram.c" /* yacc.c:1652 */
break;
case 41:
-#line 583 "awkgram.y" /* yacc.c:1652 */
+#line 584 "awkgram.y" /* yacc.c:1652 */
{ bcfree(yyvsp[0]); }
-#line 2369 "awkgram.c" /* yacc.c:1652 */
+#line 2370 "awkgram.c" /* yacc.c:1652 */
break;
case 43:
-#line 589 "awkgram.y" /* yacc.c:1652 */
+#line 590 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2375 "awkgram.c" /* yacc.c:1652 */
+#line 2376 "awkgram.c" /* yacc.c:1652 */
break;
case 44:
-#line 591 "awkgram.y" /* yacc.c:1652 */
+#line 592 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0] == NULL) {
yyval = yyvsp[-1];
@@ -2395,29 +2396,29 @@ yyreduce:
yyerrok;
}
-#line 2399 "awkgram.c" /* yacc.c:1652 */
+#line 2400 "awkgram.c" /* yacc.c:1652 */
break;
case 45:
-#line 611 "awkgram.y" /* yacc.c:1652 */
+#line 612 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 2405 "awkgram.c" /* yacc.c:1652 */
+#line 2406 "awkgram.c" /* yacc.c:1652 */
break;
case 46:
-#line 615 "awkgram.y" /* yacc.c:1652 */
+#line 616 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 2411 "awkgram.c" /* yacc.c:1652 */
+#line 2412 "awkgram.c" /* yacc.c:1652 */
break;
case 47:
-#line 616 "awkgram.y" /* yacc.c:1652 */
+#line 617 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 2417 "awkgram.c" /* yacc.c:1652 */
+#line 2418 "awkgram.c" /* yacc.c:1652 */
break;
case 48:
-#line 621 "awkgram.y" /* yacc.c:1652 */
+#line 622 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0] != NULL) {
INSTRUCTION *ip;
@@ -2428,31 +2429,31 @@ yyreduce:
} else
yyval = NULL;
}
-#line 2432 "awkgram.c" /* yacc.c:1652 */
+#line 2433 "awkgram.c" /* yacc.c:1652 */
break;
case 49:
-#line 632 "awkgram.y" /* yacc.c:1652 */
+#line 633 "awkgram.y" /* yacc.c:1652 */
{
trailing_comment = yyvsp[0]; // NULL or comment
yyval = make_braced_statements(yyvsp[-2], yyvsp[-1], yyvsp[0]);
}
-#line 2441 "awkgram.c" /* yacc.c:1652 */
+#line 2442 "awkgram.c" /* yacc.c:1652 */
break;
case 50:
-#line 637 "awkgram.y" /* yacc.c:1652 */
+#line 638 "awkgram.y" /* yacc.c:1652 */
{
if (do_pretty_print)
yyval = list_prepend(yyvsp[0], instruction(Op_exec_count));
else
yyval = yyvsp[0];
}
-#line 2452 "awkgram.c" /* yacc.c:1652 */
+#line 2453 "awkgram.c" /* yacc.c:1652 */
break;
case 51:
-#line 644 "awkgram.y" /* yacc.c:1652 */
+#line 645 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
INSTRUCTION *ip, *nextc, *tbreak;
@@ -2560,11 +2561,11 @@ yyreduce:
break_allowed--;
fix_break_continue(ip, tbreak, NULL);
}
-#line 2564 "awkgram.c" /* yacc.c:1652 */
+#line 2565 "awkgram.c" /* yacc.c:1652 */
break;
case 52:
-#line 752 "awkgram.y" /* yacc.c:1652 */
+#line 753 "awkgram.y" /* yacc.c:1652 */
{
/*
* -----------------
@@ -2615,11 +2616,11 @@ yyreduce:
continue_allowed--;
fix_break_continue(ip, tbreak, tcont);
}
-#line 2619 "awkgram.c" /* yacc.c:1652 */
+#line 2620 "awkgram.c" /* yacc.c:1652 */
break;
case 53:
-#line 803 "awkgram.y" /* yacc.c:1652 */
+#line 804 "awkgram.y" /* yacc.c:1652 */
{
/*
* -----------------
@@ -2669,11 +2670,11 @@ yyreduce:
/* else
$1 and $4 are NULLs */
}
-#line 2673 "awkgram.c" /* yacc.c:1652 */
+#line 2674 "awkgram.c" /* yacc.c:1652 */
break;
case 54:
-#line 853 "awkgram.y" /* yacc.c:1652 */
+#line 854 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *ip;
char *var_name = yyvsp[-5]->lextok;
@@ -2799,11 +2800,11 @@ regular_loop:
break_allowed--;
continue_allowed--;
}
-#line 2803 "awkgram.c" /* yacc.c:1652 */
+#line 2804 "awkgram.c" /* yacc.c:1652 */
break;
case 55:
-#line 979 "awkgram.y" /* yacc.c:1652 */
+#line 980 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-7] != NULL) {
merge_comments(yyvsp[-7], NULL);
@@ -2824,11 +2825,11 @@ regular_loop:
break_allowed--;
continue_allowed--;
}
-#line 2828 "awkgram.c" /* yacc.c:1652 */
+#line 2829 "awkgram.c" /* yacc.c:1652 */
break;
case 56:
-#line 1000 "awkgram.y" /* yacc.c:1652 */
+#line 1001 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-6] != NULL) {
merge_comments(yyvsp[-6], NULL);
@@ -2849,22 +2850,22 @@ regular_loop:
break_allowed--;
continue_allowed--;
}
-#line 2853 "awkgram.c" /* yacc.c:1652 */
+#line 2854 "awkgram.c" /* yacc.c:1652 */
break;
case 57:
-#line 1021 "awkgram.y" /* yacc.c:1652 */
+#line 1022 "awkgram.y" /* yacc.c:1652 */
{
if (do_pretty_print)
yyval = list_prepend(yyvsp[0], instruction(Op_exec_count));
else
yyval = yyvsp[0];
}
-#line 2864 "awkgram.c" /* yacc.c:1652 */
+#line 2865 "awkgram.c" /* yacc.c:1652 */
break;
case 58:
-#line 1031 "awkgram.y" /* yacc.c:1652 */
+#line 1032 "awkgram.y" /* yacc.c:1652 */
{
if (! break_allowed)
error_ln(yyvsp[-1]->source_line,
@@ -2874,11 +2875,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2878 "awkgram.c" /* yacc.c:1652 */
+#line 2879 "awkgram.c" /* yacc.c:1652 */
break;
case 59:
-#line 1041 "awkgram.y" /* yacc.c:1652 */
+#line 1042 "awkgram.y" /* yacc.c:1652 */
{
if (! continue_allowed)
error_ln(yyvsp[-1]->source_line,
@@ -2888,11 +2889,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2892 "awkgram.c" /* yacc.c:1652 */
+#line 2893 "awkgram.c" /* yacc.c:1652 */
break;
case 60:
-#line 1051 "awkgram.y" /* yacc.c:1652 */
+#line 1052 "awkgram.y" /* yacc.c:1652 */
{
/* if inside function (rule = 0), resolve context at run-time */
if (rule && rule != Rule)
@@ -2903,11 +2904,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2907 "awkgram.c" /* yacc.c:1652 */
+#line 2908 "awkgram.c" /* yacc.c:1652 */
break;
case 61:
-#line 1062 "awkgram.y" /* yacc.c:1652 */
+#line 1063 "awkgram.y" /* yacc.c:1652 */
{
/* if inside function (rule = 0), resolve context at run-time */
if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2920,11 +2921,11 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2924 "awkgram.c" /* yacc.c:1652 */
+#line 2925 "awkgram.c" /* yacc.c:1652 */
break;
case 62:
-#line 1075 "awkgram.y" /* yacc.c:1652 */
+#line 1076 "awkgram.y" /* yacc.c:1652 */
{
/* Initialize the two possible jump targets, the actual target
* is resolved at run-time.
@@ -2941,21 +2942,24 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2945 "awkgram.c" /* yacc.c:1652 */
+#line 2946 "awkgram.c" /* yacc.c:1652 */
break;
case 63:
-#line 1092 "awkgram.y" /* yacc.c:1652 */
+#line 1093 "awkgram.y" /* yacc.c:1652 */
{
if (! in_function)
yyerror(_("`return' used outside function context"));
}
-#line 2954 "awkgram.c" /* yacc.c:1652 */
+#line 2955 "awkgram.c" /* yacc.c:1652 */
break;
case 64:
-#line 1095 "awkgram.y" /* yacc.c:1652 */
+#line 1096 "awkgram.y" /* yacc.c:1652 */
{
+ if (called_from_eval)
+ yyvsp[-3]->opcode = Op_K_return_from_eval;
+
if (yyvsp[-1] == NULL) {
yyval = list_create(yyvsp[-3]);
(void) list_prepend(yyval, instruction(Op_push_i));
@@ -2965,28 +2969,28 @@ regular_loop:
if (yyvsp[0] != NULL)
yyval = list_append(yyval, yyvsp[0]);
}
-#line 2969 "awkgram.c" /* yacc.c:1652 */
+#line 2973 "awkgram.c" /* yacc.c:1652 */
break;
case 65:
-#line 1106 "awkgram.y" /* yacc.c:1652 */
+#line 1110 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0] != NULL)
yyval = list_append(yyvsp[-1], yyvsp[0]);
else
yyval = yyvsp[-1];
}
-#line 2980 "awkgram.c" /* yacc.c:1652 */
+#line 2984 "awkgram.c" /* yacc.c:1652 */
break;
case 66:
-#line 1123 "awkgram.y" /* yacc.c:1652 */
+#line 1127 "awkgram.y" /* yacc.c:1652 */
{ in_print = true; in_parens = 0; }
-#line 2986 "awkgram.c" /* yacc.c:1652 */
+#line 2990 "awkgram.c" /* yacc.c:1652 */
break;
case 67:
-#line 1124 "awkgram.y" /* yacc.c:1652 */
+#line 1128 "awkgram.y" /* yacc.c:1652 */
{
/*
* Optimization: plain `print' has no expression list, so $3 is null.
@@ -3087,17 +3091,17 @@ regular_print:
}
}
}
-#line 3091 "awkgram.c" /* yacc.c:1652 */
+#line 3095 "awkgram.c" /* yacc.c:1652 */
break;
case 68:
-#line 1225 "awkgram.y" /* yacc.c:1652 */
+#line 1229 "awkgram.y" /* yacc.c:1652 */
{ sub_counter = 0; }
-#line 3097 "awkgram.c" /* yacc.c:1652 */
+#line 3101 "awkgram.c" /* yacc.c:1652 */
break;
case 69:
-#line 1226 "awkgram.y" /* yacc.c:1652 */
+#line 1230 "awkgram.y" /* yacc.c:1652 */
{
char *arr = yyvsp[-2]->lextok;
@@ -3130,11 +3134,11 @@ regular_print:
yyval = list_append(list_append(yyvsp[0], yyvsp[-2]), yyvsp[-3]);
}
}
-#line 3134 "awkgram.c" /* yacc.c:1652 */
+#line 3138 "awkgram.c" /* yacc.c:1652 */
break;
case 70:
-#line 1263 "awkgram.y" /* yacc.c:1652 */
+#line 1267 "awkgram.y" /* yacc.c:1652 */
{
static bool warned = false;
char *arr = yyvsp[-1]->lextok;
@@ -3160,54 +3164,54 @@ regular_print:
fatal(_("`delete' is not allowed with FUNCTAB"));
}
}
-#line 3164 "awkgram.c" /* yacc.c:1652 */
+#line 3168 "awkgram.c" /* yacc.c:1652 */
break;
case 71:
-#line 1289 "awkgram.y" /* yacc.c:1652 */
+#line 1293 "awkgram.y" /* yacc.c:1652 */
{
yyval = optimize_assignment(yyvsp[0]);
}
-#line 3172 "awkgram.c" /* yacc.c:1652 */
+#line 3176 "awkgram.c" /* yacc.c:1652 */
break;
case 72:
-#line 1296 "awkgram.y" /* yacc.c:1652 */
+#line 1300 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3178 "awkgram.c" /* yacc.c:1652 */
+#line 3182 "awkgram.c" /* yacc.c:1652 */
break;
case 73:
-#line 1298 "awkgram.y" /* yacc.c:1652 */
+#line 1302 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3184 "awkgram.c" /* yacc.c:1652 */
+#line 3188 "awkgram.c" /* yacc.c:1652 */
break;
case 74:
-#line 1303 "awkgram.y" /* yacc.c:1652 */
+#line 1307 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3190 "awkgram.c" /* yacc.c:1652 */
+#line 3194 "awkgram.c" /* yacc.c:1652 */
break;
case 75:
-#line 1305 "awkgram.y" /* yacc.c:1652 */
+#line 1309 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-1] == NULL)
yyval = list_create(yyvsp[0]);
else
yyval = list_prepend(yyvsp[-1], yyvsp[0]);
}
-#line 3201 "awkgram.c" /* yacc.c:1652 */
+#line 3205 "awkgram.c" /* yacc.c:1652 */
break;
case 76:
-#line 1312 "awkgram.y" /* yacc.c:1652 */
+#line 1316 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3207 "awkgram.c" /* yacc.c:1652 */
+#line 3211 "awkgram.c" /* yacc.c:1652 */
break;
case 77:
-#line 1317 "awkgram.y" /* yacc.c:1652 */
+#line 1321 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *casestmt = yyvsp[0];
if (yyvsp[0] == NULL)
@@ -3220,11 +3224,11 @@ regular_print:
bcfree(yyvsp[-2]);
yyval = yyvsp[-4];
}
-#line 3224 "awkgram.c" /* yacc.c:1652 */
+#line 3228 "awkgram.c" /* yacc.c:1652 */
break;
case 78:
-#line 1330 "awkgram.y" /* yacc.c:1652 */
+#line 1334 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *casestmt = yyvsp[0];
if (yyvsp[0] == NULL)
@@ -3236,17 +3240,17 @@ regular_print:
yyvsp[-3]->comment = yyvsp[-1];
yyval = yyvsp[-3];
}
-#line 3240 "awkgram.c" /* yacc.c:1652 */
+#line 3244 "awkgram.c" /* yacc.c:1652 */
break;
case 79:
-#line 1345 "awkgram.y" /* yacc.c:1652 */
+#line 1349 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3246 "awkgram.c" /* yacc.c:1652 */
+#line 3250 "awkgram.c" /* yacc.c:1652 */
break;
case 80:
-#line 1347 "awkgram.y" /* yacc.c:1652 */
+#line 1351 "awkgram.y" /* yacc.c:1652 */
{
NODE *n = yyvsp[0]->memory;
(void) force_number(n);
@@ -3254,28 +3258,28 @@ regular_print:
bcfree(yyvsp[-1]);
yyval = yyvsp[0];
}
-#line 3258 "awkgram.c" /* yacc.c:1652 */
+#line 3262 "awkgram.c" /* yacc.c:1652 */
break;
case 81:
-#line 1355 "awkgram.y" /* yacc.c:1652 */
+#line 1359 "awkgram.y" /* yacc.c:1652 */
{
NODE *n = yyvsp[0]->lasti->memory;
bcfree(yyvsp[-1]);
add_sign_to_num(n, '+');
yyval = yyvsp[0];
}
-#line 3269 "awkgram.c" /* yacc.c:1652 */
+#line 3273 "awkgram.c" /* yacc.c:1652 */
break;
case 82:
-#line 1362 "awkgram.y" /* yacc.c:1652 */
+#line 1366 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3275 "awkgram.c" /* yacc.c:1652 */
+#line 3279 "awkgram.c" /* yacc.c:1652 */
break;
case 83:
-#line 1364 "awkgram.y" /* yacc.c:1652 */
+#line 1368 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0]->memory->type == Node_regex)
yyvsp[0]->opcode = Op_push_re;
@@ -3283,57 +3287,57 @@ regular_print:
yyvsp[0]->opcode = Op_push;
yyval = yyvsp[0];
}
-#line 3287 "awkgram.c" /* yacc.c:1652 */
+#line 3291 "awkgram.c" /* yacc.c:1652 */
break;
case 84:
-#line 1372 "awkgram.y" /* yacc.c:1652 */
+#line 1376 "awkgram.y" /* yacc.c:1652 */
{
assert((yyvsp[0]->memory->flags & REGEX) == REGEX);
yyvsp[0]->opcode = Op_push_re;
yyval = yyvsp[0];
}
-#line 3297 "awkgram.c" /* yacc.c:1652 */
+#line 3301 "awkgram.c" /* yacc.c:1652 */
break;
case 85:
-#line 1381 "awkgram.y" /* yacc.c:1652 */
+#line 1385 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3303 "awkgram.c" /* yacc.c:1652 */
+#line 3307 "awkgram.c" /* yacc.c:1652 */
break;
case 86:
-#line 1383 "awkgram.y" /* yacc.c:1652 */
+#line 1387 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3309 "awkgram.c" /* yacc.c:1652 */
+#line 3313 "awkgram.c" /* yacc.c:1652 */
break;
case 88:
-#line 1393 "awkgram.y" /* yacc.c:1652 */
+#line 1397 "awkgram.y" /* yacc.c:1652 */
{
yyval = yyvsp[-1];
}
-#line 3317 "awkgram.c" /* yacc.c:1652 */
+#line 3321 "awkgram.c" /* yacc.c:1652 */
break;
case 89:
-#line 1400 "awkgram.y" /* yacc.c:1652 */
+#line 1404 "awkgram.y" /* yacc.c:1652 */
{
in_print = false;
in_parens = 0;
yyval = NULL;
}
-#line 3327 "awkgram.c" /* yacc.c:1652 */
+#line 3331 "awkgram.c" /* yacc.c:1652 */
break;
case 90:
-#line 1405 "awkgram.y" /* yacc.c:1652 */
+#line 1409 "awkgram.y" /* yacc.c:1652 */
{ in_print = false; in_parens = 0; }
-#line 3333 "awkgram.c" /* yacc.c:1652 */
+#line 3337 "awkgram.c" /* yacc.c:1652 */
break;
case 91:
-#line 1406 "awkgram.y" /* yacc.c:1652 */
+#line 1410 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-2]->redir_type == redirect_twoway
&& yyvsp[0]->lasti->opcode == Op_K_getline_redir
@@ -3343,21 +3347,21 @@ regular_print:
lintwarn(_("concatenation as I/O `>' redirection target is ambiguous"));
yyval = list_prepend(yyvsp[0], yyvsp[-2]);
}
-#line 3347 "awkgram.c" /* yacc.c:1652 */
+#line 3351 "awkgram.c" /* yacc.c:1652 */
break;
case 92:
-#line 1419 "awkgram.y" /* yacc.c:1652 */
+#line 1423 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-1] != NULL)
yyvsp[-5]->comment = yyvsp[-1];
yyval = mk_condition(yyvsp[-3], yyvsp[-5], yyvsp[0], NULL, NULL);
}
-#line 3357 "awkgram.c" /* yacc.c:1652 */
+#line 3361 "awkgram.c" /* yacc.c:1652 */
break;
case 93:
-#line 1426 "awkgram.y" /* yacc.c:1652 */
+#line 1430 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-4] != NULL)
yyvsp[-8]->comment = yyvsp[-4];
@@ -3365,19 +3369,19 @@ regular_print:
yyvsp[-2]->comment = yyvsp[-1];
yyval = mk_condition(yyvsp[-6], yyvsp[-8], yyvsp[-3], yyvsp[-2], yyvsp[0]);
}
-#line 3369 "awkgram.c" /* yacc.c:1652 */
+#line 3373 "awkgram.c" /* yacc.c:1652 */
break;
case 94:
-#line 1437 "awkgram.y" /* yacc.c:1652 */
+#line 1441 "awkgram.y" /* yacc.c:1652 */
{
yyval = yyvsp[0];
}
-#line 3377 "awkgram.c" /* yacc.c:1652 */
+#line 3381 "awkgram.c" /* yacc.c:1652 */
break;
case 95:
-#line 1441 "awkgram.y" /* yacc.c:1652 */
+#line 1445 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
if (yyvsp[-1]->memory->comment_type == EOL_COMMENT) {
@@ -3395,59 +3399,59 @@ regular_print:
} else
yyval = NULL;
}
-#line 3399 "awkgram.c" /* yacc.c:1652 */
+#line 3403 "awkgram.c" /* yacc.c:1652 */
break;
case 96:
-#line 1462 "awkgram.y" /* yacc.c:1652 */
+#line 1466 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3405 "awkgram.c" /* yacc.c:1652 */
+#line 3409 "awkgram.c" /* yacc.c:1652 */
break;
case 97:
-#line 1464 "awkgram.y" /* yacc.c:1652 */
+#line 1468 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3411 "awkgram.c" /* yacc.c:1652 */
+#line 3415 "awkgram.c" /* yacc.c:1652 */
break;
case 98:
-#line 1469 "awkgram.y" /* yacc.c:1652 */
+#line 1473 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3417 "awkgram.c" /* yacc.c:1652 */
+#line 3421 "awkgram.c" /* yacc.c:1652 */
break;
case 99:
-#line 1471 "awkgram.y" /* yacc.c:1652 */
+#line 1475 "awkgram.y" /* yacc.c:1652 */
{
bcfree(yyvsp[-1]);
yyval = yyvsp[0];
}
-#line 3426 "awkgram.c" /* yacc.c:1652 */
+#line 3430 "awkgram.c" /* yacc.c:1652 */
break;
case 100:
-#line 1479 "awkgram.y" /* yacc.c:1652 */
+#line 1483 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3432 "awkgram.c" /* yacc.c:1652 */
+#line 3436 "awkgram.c" /* yacc.c:1652 */
break;
case 101:
-#line 1481 "awkgram.y" /* yacc.c:1652 */
+#line 1485 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3438 "awkgram.c" /* yacc.c:1652 */
+#line 3442 "awkgram.c" /* yacc.c:1652 */
break;
case 102:
-#line 1486 "awkgram.y" /* yacc.c:1652 */
+#line 1490 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->param_count = 0;
yyval = list_create(yyvsp[0]);
}
-#line 3447 "awkgram.c" /* yacc.c:1652 */
+#line 3451 "awkgram.c" /* yacc.c:1652 */
break;
case 103:
-#line 1491 "awkgram.y" /* yacc.c:1652 */
+#line 1495 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-2] != NULL && yyvsp[0] != NULL) {
yyvsp[0]->param_count = yyvsp[-2]->lasti->param_count + 1;
@@ -3464,76 +3468,76 @@ regular_print:
} else
yyval = NULL;
}
-#line 3468 "awkgram.c" /* yacc.c:1652 */
+#line 3472 "awkgram.c" /* yacc.c:1652 */
break;
case 104:
-#line 1508 "awkgram.y" /* yacc.c:1652 */
+#line 1512 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3474 "awkgram.c" /* yacc.c:1652 */
+#line 3478 "awkgram.c" /* yacc.c:1652 */
break;
case 105:
-#line 1510 "awkgram.y" /* yacc.c:1652 */
+#line 1514 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[-1]; }
-#line 3480 "awkgram.c" /* yacc.c:1652 */
+#line 3484 "awkgram.c" /* yacc.c:1652 */
break;
case 106:
-#line 1512 "awkgram.y" /* yacc.c:1652 */
+#line 1516 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[-2]; }
-#line 3486 "awkgram.c" /* yacc.c:1652 */
+#line 3490 "awkgram.c" /* yacc.c:1652 */
break;
case 107:
-#line 1518 "awkgram.y" /* yacc.c:1652 */
+#line 1522 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3492 "awkgram.c" /* yacc.c:1652 */
+#line 3496 "awkgram.c" /* yacc.c:1652 */
break;
case 108:
-#line 1520 "awkgram.y" /* yacc.c:1652 */
+#line 1524 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3498 "awkgram.c" /* yacc.c:1652 */
+#line 3502 "awkgram.c" /* yacc.c:1652 */
break;
case 109:
-#line 1525 "awkgram.y" /* yacc.c:1652 */
+#line 1529 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3504 "awkgram.c" /* yacc.c:1652 */
+#line 3508 "awkgram.c" /* yacc.c:1652 */
break;
case 110:
-#line 1527 "awkgram.y" /* yacc.c:1652 */
+#line 1531 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3510 "awkgram.c" /* yacc.c:1652 */
+#line 3514 "awkgram.c" /* yacc.c:1652 */
break;
case 111:
-#line 1532 "awkgram.y" /* yacc.c:1652 */
+#line 1536 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_expression_list(NULL, yyvsp[0]); }
-#line 3516 "awkgram.c" /* yacc.c:1652 */
+#line 3520 "awkgram.c" /* yacc.c:1652 */
break;
case 112:
-#line 1534 "awkgram.y" /* yacc.c:1652 */
+#line 1538 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-1] != NULL)
yyvsp[-2]->lasti->comment = yyvsp[-1];
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
yyerrok;
}
-#line 3527 "awkgram.c" /* yacc.c:1652 */
+#line 3531 "awkgram.c" /* yacc.c:1652 */
break;
case 113:
-#line 1541 "awkgram.y" /* yacc.c:1652 */
+#line 1545 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3533 "awkgram.c" /* yacc.c:1652 */
+#line 3537 "awkgram.c" /* yacc.c:1652 */
break;
case 114:
-#line 1543 "awkgram.y" /* yacc.c:1652 */
+#line 1547 "awkgram.y" /* yacc.c:1652 */
{
/*
* Returning the expression list instead of NULL lets
@@ -3541,66 +3545,66 @@ regular_print:
*/
yyval = yyvsp[-1];
}
-#line 3545 "awkgram.c" /* yacc.c:1652 */
+#line 3549 "awkgram.c" /* yacc.c:1652 */
break;
case 115:
-#line 1551 "awkgram.y" /* yacc.c:1652 */
+#line 1555 "awkgram.y" /* yacc.c:1652 */
{
/* Ditto */
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
}
-#line 3554 "awkgram.c" /* yacc.c:1652 */
+#line 3558 "awkgram.c" /* yacc.c:1652 */
break;
case 116:
-#line 1556 "awkgram.y" /* yacc.c:1652 */
+#line 1560 "awkgram.y" /* yacc.c:1652 */
{
/* Ditto */
if (yyvsp[-1] != NULL)
yyvsp[-2]->lasti->comment = yyvsp[-1];
yyval = yyvsp[-2];
}
-#line 3565 "awkgram.c" /* yacc.c:1652 */
+#line 3569 "awkgram.c" /* yacc.c:1652 */
break;
case 117:
-#line 1566 "awkgram.y" /* yacc.c:1652 */
+#line 1570 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3571 "awkgram.c" /* yacc.c:1652 */
+#line 3575 "awkgram.c" /* yacc.c:1652 */
break;
case 118:
-#line 1568 "awkgram.y" /* yacc.c:1652 */
+#line 1572 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3577 "awkgram.c" /* yacc.c:1652 */
+#line 3581 "awkgram.c" /* yacc.c:1652 */
break;
case 119:
-#line 1573 "awkgram.y" /* yacc.c:1652 */
+#line 1577 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_expression_list(NULL, yyvsp[0]); }
-#line 3583 "awkgram.c" /* yacc.c:1652 */
+#line 3587 "awkgram.c" /* yacc.c:1652 */
break;
case 120:
-#line 1575 "awkgram.y" /* yacc.c:1652 */
+#line 1579 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-1] != NULL)
yyvsp[-2]->lasti->comment = yyvsp[-1];
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
yyerrok;
}
-#line 3594 "awkgram.c" /* yacc.c:1652 */
+#line 3598 "awkgram.c" /* yacc.c:1652 */
break;
case 121:
-#line 1582 "awkgram.y" /* yacc.c:1652 */
+#line 1586 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 3600 "awkgram.c" /* yacc.c:1652 */
+#line 3604 "awkgram.c" /* yacc.c:1652 */
break;
case 122:
-#line 1584 "awkgram.y" /* yacc.c:1652 */
+#line 1588 "awkgram.y" /* yacc.c:1652 */
{
/*
* Returning the expression list instead of NULL lets
@@ -3608,74 +3612,74 @@ regular_print:
*/
yyval = yyvsp[-1];
}
-#line 3612 "awkgram.c" /* yacc.c:1652 */
+#line 3616 "awkgram.c" /* yacc.c:1652 */
break;
case 123:
-#line 1592 "awkgram.y" /* yacc.c:1652 */
+#line 1596 "awkgram.y" /* yacc.c:1652 */
{
/* Ditto */
yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
}
-#line 3621 "awkgram.c" /* yacc.c:1652 */
+#line 3625 "awkgram.c" /* yacc.c:1652 */
break;
case 124:
-#line 1597 "awkgram.y" /* yacc.c:1652 */
+#line 1601 "awkgram.y" /* yacc.c:1652 */
{
/* Ditto */
if (yyvsp[-1] != NULL)
yyvsp[-2]->comment = yyvsp[-1];
yyval = yyvsp[-2];
}
-#line 3632 "awkgram.c" /* yacc.c:1652 */
+#line 3636 "awkgram.c" /* yacc.c:1652 */
break;
case 125:
-#line 1606 "awkgram.y" /* yacc.c:1652 */
+#line 1610 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3638 "awkgram.c" /* yacc.c:1652 */
+#line 3642 "awkgram.c" /* yacc.c:1652 */
break;
case 126:
-#line 1607 "awkgram.y" /* yacc.c:1652 */
+#line 1611 "awkgram.y" /* yacc.c:1652 */
{ yyval = list_create(yyvsp[0]); }
-#line 3644 "awkgram.c" /* yacc.c:1652 */
+#line 3648 "awkgram.c" /* yacc.c:1652 */
break;
case 127:
-#line 1613 "awkgram.y" /* yacc.c:1652 */
+#line 1617 "awkgram.y" /* yacc.c:1652 */
{
if (do_lint && yyvsp[0]->lasti->opcode == Op_match_rec)
lintwarn_ln(yyvsp[-1]->source_line,
_("regular expression on right of assignment"));
yyval = mk_assignment(yyvsp[-2], yyvsp[0], yyvsp[-1]);
}
-#line 3655 "awkgram.c" /* yacc.c:1652 */
+#line 3659 "awkgram.c" /* yacc.c:1652 */
break;
case 128:
-#line 1620 "awkgram.y" /* yacc.c:1652 */
+#line 1624 "awkgram.y" /* yacc.c:1652 */
{
yyval = mk_assignment(yyvsp[-2], list_create(yyvsp[0]), yyvsp[-1]);
}
-#line 3663 "awkgram.c" /* yacc.c:1652 */
+#line 3667 "awkgram.c" /* yacc.c:1652 */
break;
case 129:
-#line 1624 "awkgram.y" /* yacc.c:1652 */
+#line 1628 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3669 "awkgram.c" /* yacc.c:1652 */
+#line 3673 "awkgram.c" /* yacc.c:1652 */
break;
case 130:
-#line 1626 "awkgram.y" /* yacc.c:1652 */
+#line 1630 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3675 "awkgram.c" /* yacc.c:1652 */
+#line 3679 "awkgram.c" /* yacc.c:1652 */
break;
case 131:
-#line 1628 "awkgram.y" /* yacc.c:1652 */
+#line 1632 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-2]->lasti->opcode == Op_match_rec)
warning_ln(yyvsp[-1]->source_line,
@@ -3688,11 +3692,11 @@ regular_print:
bcfree(yyvsp[0]);
yyval = list_append(yyvsp[-2], yyvsp[-1]);
}
-#line 3692 "awkgram.c" /* yacc.c:1652 */
+#line 3696 "awkgram.c" /* yacc.c:1652 */
break;
case 132:
-#line 1641 "awkgram.y" /* yacc.c:1652 */
+#line 1645 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[-2]->lasti->opcode == Op_match_rec)
warning_ln(yyvsp[-1]->source_line,
@@ -3709,11 +3713,11 @@ regular_print:
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
}
}
-#line 3713 "awkgram.c" /* yacc.c:1652 */
+#line 3717 "awkgram.c" /* yacc.c:1652 */
break;
case 133:
-#line 1658 "awkgram.y" /* yacc.c:1652 */
+#line 1662 "awkgram.y" /* yacc.c:1652 */
{
if (do_lint_old)
warning_ln(yyvsp[-1]->source_line,
@@ -3723,91 +3727,91 @@ regular_print:
yyvsp[-1]->expr_count = 1;
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
}
-#line 3727 "awkgram.c" /* yacc.c:1652 */
+#line 3731 "awkgram.c" /* yacc.c:1652 */
break;
case 134:
-#line 1668 "awkgram.y" /* yacc.c:1652 */
+#line 1672 "awkgram.y" /* yacc.c:1652 */
{
if (do_lint && yyvsp[0]->lasti->opcode == Op_match_rec)
lintwarn_ln(yyvsp[-1]->source_line,
_("regular expression on right of comparison"));
yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
}
-#line 3738 "awkgram.c" /* yacc.c:1652 */
+#line 3742 "awkgram.c" /* yacc.c:1652 */
break;
case 135:
-#line 1675 "awkgram.y" /* yacc.c:1652 */
+#line 1679 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_condition(yyvsp[-4], yyvsp[-3], yyvsp[-2], yyvsp[-1], yyvsp[0]); }
-#line 3744 "awkgram.c" /* yacc.c:1652 */
+#line 3748 "awkgram.c" /* yacc.c:1652 */
break;
case 136:
-#line 1677 "awkgram.y" /* yacc.c:1652 */
+#line 1681 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3750 "awkgram.c" /* yacc.c:1652 */
+#line 3754 "awkgram.c" /* yacc.c:1652 */
break;
case 137:
-#line 1682 "awkgram.y" /* yacc.c:1652 */
+#line 1686 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3756 "awkgram.c" /* yacc.c:1652 */
+#line 3760 "awkgram.c" /* yacc.c:1652 */
break;
case 138:
-#line 1684 "awkgram.y" /* yacc.c:1652 */
+#line 1688 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3762 "awkgram.c" /* yacc.c:1652 */
+#line 3766 "awkgram.c" /* yacc.c:1652 */
break;
case 139:
-#line 1686 "awkgram.y" /* yacc.c:1652 */
+#line 1690 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->opcode = Op_assign_quotient;
yyval = yyvsp[0];
}
-#line 3771 "awkgram.c" /* yacc.c:1652 */
+#line 3775 "awkgram.c" /* yacc.c:1652 */
break;
case 140:
-#line 1694 "awkgram.y" /* yacc.c:1652 */
+#line 1698 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3777 "awkgram.c" /* yacc.c:1652 */
+#line 3781 "awkgram.c" /* yacc.c:1652 */
break;
case 141:
-#line 1696 "awkgram.y" /* yacc.c:1652 */
+#line 1700 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3783 "awkgram.c" /* yacc.c:1652 */
+#line 3787 "awkgram.c" /* yacc.c:1652 */
break;
case 142:
-#line 1701 "awkgram.y" /* yacc.c:1652 */
+#line 1705 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3789 "awkgram.c" /* yacc.c:1652 */
+#line 3793 "awkgram.c" /* yacc.c:1652 */
break;
case 143:
-#line 1703 "awkgram.y" /* yacc.c:1652 */
+#line 1707 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3795 "awkgram.c" /* yacc.c:1652 */
+#line 3799 "awkgram.c" /* yacc.c:1652 */
break;
case 144:
-#line 1708 "awkgram.y" /* yacc.c:1652 */
+#line 1712 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3801 "awkgram.c" /* yacc.c:1652 */
+#line 3805 "awkgram.c" /* yacc.c:1652 */
break;
case 145:
-#line 1710 "awkgram.y" /* yacc.c:1652 */
+#line 1714 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 3807 "awkgram.c" /* yacc.c:1652 */
+#line 3811 "awkgram.c" /* yacc.c:1652 */
break;
case 146:
-#line 1712 "awkgram.y" /* yacc.c:1652 */
+#line 1716 "awkgram.y" /* yacc.c:1652 */
{
int count = 2;
bool is_simple_var = false;
@@ -3861,47 +3865,47 @@ regular_print:
max_args = count;
}
}
-#line 3865 "awkgram.c" /* yacc.c:1652 */
+#line 3869 "awkgram.c" /* yacc.c:1652 */
break;
case 148:
-#line 1771 "awkgram.y" /* yacc.c:1652 */
+#line 1775 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3871 "awkgram.c" /* yacc.c:1652 */
+#line 3875 "awkgram.c" /* yacc.c:1652 */
break;
case 149:
-#line 1773 "awkgram.y" /* yacc.c:1652 */
+#line 1777 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3877 "awkgram.c" /* yacc.c:1652 */
+#line 3881 "awkgram.c" /* yacc.c:1652 */
break;
case 150:
-#line 1775 "awkgram.y" /* yacc.c:1652 */
+#line 1779 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3883 "awkgram.c" /* yacc.c:1652 */
+#line 3887 "awkgram.c" /* yacc.c:1652 */
break;
case 151:
-#line 1777 "awkgram.y" /* yacc.c:1652 */
+#line 1781 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3889 "awkgram.c" /* yacc.c:1652 */
+#line 3893 "awkgram.c" /* yacc.c:1652 */
break;
case 152:
-#line 1779 "awkgram.y" /* yacc.c:1652 */
+#line 1783 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3895 "awkgram.c" /* yacc.c:1652 */
+#line 3899 "awkgram.c" /* yacc.c:1652 */
break;
case 153:
-#line 1781 "awkgram.y" /* yacc.c:1652 */
+#line 1785 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3901 "awkgram.c" /* yacc.c:1652 */
+#line 3905 "awkgram.c" /* yacc.c:1652 */
break;
case 154:
-#line 1783 "awkgram.y" /* yacc.c:1652 */
+#line 1787 "awkgram.y" /* yacc.c:1652 */
{
/*
* In BEGINFILE/ENDFILE, allow `getline [var] < file'
@@ -3915,29 +3919,29 @@ regular_print:
_("non-redirected `getline' undefined inside END action"));
yyval = mk_getline(yyvsp[-2], yyvsp[-1], yyvsp[0], redirect_input);
}
-#line 3919 "awkgram.c" /* yacc.c:1652 */
+#line 3923 "awkgram.c" /* yacc.c:1652 */
break;
case 155:
-#line 1797 "awkgram.y" /* yacc.c:1652 */
+#line 1801 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->opcode = Op_postincrement;
yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
}
-#line 3928 "awkgram.c" /* yacc.c:1652 */
+#line 3932 "awkgram.c" /* yacc.c:1652 */
break;
case 156:
-#line 1802 "awkgram.y" /* yacc.c:1652 */
+#line 1806 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->opcode = Op_postdecrement;
yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
}
-#line 3937 "awkgram.c" /* yacc.c:1652 */
+#line 3941 "awkgram.c" /* yacc.c:1652 */
break;
case 157:
-#line 1807 "awkgram.y" /* yacc.c:1652 */
+#line 1811 "awkgram.y" /* yacc.c:1652 */
{
if (do_lint_old) {
warning_ln(yyvsp[-1]->source_line,
@@ -3957,64 +3961,64 @@ regular_print:
yyval = list_append(list_merge(t, yyvsp[0]), yyvsp[-1]);
}
}
-#line 3961 "awkgram.c" /* yacc.c:1652 */
+#line 3965 "awkgram.c" /* yacc.c:1652 */
break;
case 158:
-#line 1832 "awkgram.y" /* yacc.c:1652 */
+#line 1836 "awkgram.y" /* yacc.c:1652 */
{
yyval = mk_getline(yyvsp[-1], yyvsp[0], yyvsp[-3], yyvsp[-2]->redir_type);
bcfree(yyvsp[-2]);
}
-#line 3970 "awkgram.c" /* yacc.c:1652 */
+#line 3974 "awkgram.c" /* yacc.c:1652 */
break;
case 159:
-#line 1838 "awkgram.y" /* yacc.c:1652 */
+#line 1842 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3976 "awkgram.c" /* yacc.c:1652 */
+#line 3980 "awkgram.c" /* yacc.c:1652 */
break;
case 160:
-#line 1840 "awkgram.y" /* yacc.c:1652 */
+#line 1844 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3982 "awkgram.c" /* yacc.c:1652 */
+#line 3986 "awkgram.c" /* yacc.c:1652 */
break;
case 161:
-#line 1842 "awkgram.y" /* yacc.c:1652 */
+#line 1846 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3988 "awkgram.c" /* yacc.c:1652 */
+#line 3992 "awkgram.c" /* yacc.c:1652 */
break;
case 162:
-#line 1844 "awkgram.y" /* yacc.c:1652 */
+#line 1848 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3994 "awkgram.c" /* yacc.c:1652 */
+#line 3998 "awkgram.c" /* yacc.c:1652 */
break;
case 163:
-#line 1846 "awkgram.y" /* yacc.c:1652 */
+#line 1850 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4000 "awkgram.c" /* yacc.c:1652 */
+#line 4004 "awkgram.c" /* yacc.c:1652 */
break;
case 164:
-#line 1848 "awkgram.y" /* yacc.c:1652 */
+#line 1852 "awkgram.y" /* yacc.c:1652 */
{ yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4006 "awkgram.c" /* yacc.c:1652 */
+#line 4010 "awkgram.c" /* yacc.c:1652 */
break;
case 165:
-#line 1853 "awkgram.y" /* yacc.c:1652 */
+#line 1857 "awkgram.y" /* yacc.c:1652 */
{
yyval = list_create(yyvsp[0]);
}
-#line 4014 "awkgram.c" /* yacc.c:1652 */
+#line 4018 "awkgram.c" /* yacc.c:1652 */
break;
case 166:
-#line 1857 "awkgram.y" /* yacc.c:1652 */
+#line 1861 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0]->opcode == Op_match_rec) {
yyvsp[0]->opcode = Op_nomatch;
@@ -4046,11 +4050,11 @@ regular_print:
}
}
}
-#line 4050 "awkgram.c" /* yacc.c:1652 */
+#line 4054 "awkgram.c" /* yacc.c:1652 */
break;
case 167:
-#line 1889 "awkgram.y" /* yacc.c:1652 */
+#line 1893 "awkgram.y" /* yacc.c:1652 */
{
// Always include. Allows us to lint warn on
// print "foo" > "bar" 1
@@ -4058,31 +4062,31 @@ regular_print:
// print "foo" > ("bar" 1)
yyval = list_append(yyvsp[-1], bcalloc(Op_parens, 1, sourceline));
}
-#line 4062 "awkgram.c" /* yacc.c:1652 */
+#line 4066 "awkgram.c" /* yacc.c:1652 */
break;
case 168:
-#line 1897 "awkgram.y" /* yacc.c:1652 */
+#line 1901 "awkgram.y" /* yacc.c:1652 */
{
yyval = snode(yyvsp[-1], yyvsp[-3]);
if (yyval == NULL)
YYABORT;
}
-#line 4072 "awkgram.c" /* yacc.c:1652 */
+#line 4076 "awkgram.c" /* yacc.c:1652 */
break;
case 169:
-#line 1903 "awkgram.y" /* yacc.c:1652 */
+#line 1907 "awkgram.y" /* yacc.c:1652 */
{
yyval = snode(yyvsp[-1], yyvsp[-3]);
if (yyval == NULL)
YYABORT;
}
-#line 4082 "awkgram.c" /* yacc.c:1652 */
+#line 4086 "awkgram.c" /* yacc.c:1652 */
break;
case 170:
-#line 1909 "awkgram.y" /* yacc.c:1652 */
+#line 1913 "awkgram.y" /* yacc.c:1652 */
{
static bool warned = false;
@@ -4095,45 +4099,45 @@ regular_print:
if (yyval == NULL)
YYABORT;
}
-#line 4099 "awkgram.c" /* yacc.c:1652 */
+#line 4103 "awkgram.c" /* yacc.c:1652 */
break;
case 173:
-#line 1924 "awkgram.y" /* yacc.c:1652 */
+#line 1928 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[-1]->opcode = Op_preincrement;
yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
}
-#line 4108 "awkgram.c" /* yacc.c:1652 */
+#line 4112 "awkgram.c" /* yacc.c:1652 */
break;
case 174:
-#line 1929 "awkgram.y" /* yacc.c:1652 */
+#line 1933 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[-1]->opcode = Op_predecrement;
yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
}
-#line 4117 "awkgram.c" /* yacc.c:1652 */
+#line 4121 "awkgram.c" /* yacc.c:1652 */
break;
case 175:
-#line 1934 "awkgram.y" /* yacc.c:1652 */
+#line 1938 "awkgram.y" /* yacc.c:1652 */
{
yyval = list_create(yyvsp[0]);
}
-#line 4125 "awkgram.c" /* yacc.c:1652 */
+#line 4129 "awkgram.c" /* yacc.c:1652 */
break;
case 176:
-#line 1938 "awkgram.y" /* yacc.c:1652 */
+#line 1942 "awkgram.y" /* yacc.c:1652 */
{
yyval = list_create(yyvsp[0]);
}
-#line 4133 "awkgram.c" /* yacc.c:1652 */
+#line 4137 "awkgram.c" /* yacc.c:1652 */
break;
case 177:
-#line 1942 "awkgram.y" /* yacc.c:1652 */
+#line 1946 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0]->lasti->opcode == Op_push_i
&& (yyvsp[0]->lasti->memory->flags & STRING) == 0
@@ -4148,11 +4152,11 @@ regular_print:
yyval = list_append(yyvsp[0], yyvsp[-1]);
}
}
-#line 4152 "awkgram.c" /* yacc.c:1652 */
+#line 4156 "awkgram.c" /* yacc.c:1652 */
break;
case 178:
-#line 1957 "awkgram.y" /* yacc.c:1652 */
+#line 1961 "awkgram.y" /* yacc.c:1652 */
{
if (yyvsp[0]->lasti->opcode == Op_push_i
&& (yyvsp[0]->lasti->memory->flags & STRING) == 0
@@ -4170,20 +4174,20 @@ regular_print:
yyval = list_append(yyvsp[0], yyvsp[-1]);
}
}
-#line 4174 "awkgram.c" /* yacc.c:1652 */
+#line 4178 "awkgram.c" /* yacc.c:1652 */
break;
case 179:
-#line 1978 "awkgram.y" /* yacc.c:1652 */
+#line 1982 "awkgram.y" /* yacc.c:1652 */
{
func_use(yyvsp[0]->lasti->func_name, FUNC_USE);
yyval = yyvsp[0];
}
-#line 4183 "awkgram.c" /* yacc.c:1652 */
+#line 4187 "awkgram.c" /* yacc.c:1652 */
break;
case 180:
-#line 1983 "awkgram.y" /* yacc.c:1652 */
+#line 1987 "awkgram.y" /* yacc.c:1652 */
{
/* indirect function call */
INSTRUCTION *f, *t;
@@ -4217,11 +4221,11 @@ regular_print:
yyval = list_prepend(yyvsp[0], t);
at_seen = false;
}
-#line 4221 "awkgram.c" /* yacc.c:1652 */
+#line 4225 "awkgram.c" /* yacc.c:1652 */
break;
case 181:
-#line 2020 "awkgram.y" /* yacc.c:1652 */
+#line 2024 "awkgram.y" /* yacc.c:1652 */
{
NODE *n;
char *name = yyvsp[-3]->func_name;
@@ -4254,49 +4258,49 @@ regular_print:
yyval = list_append(t, yyvsp[-3]);
}
}
-#line 4258 "awkgram.c" /* yacc.c:1652 */
+#line 4262 "awkgram.c" /* yacc.c:1652 */
break;
case 182:
-#line 2056 "awkgram.y" /* yacc.c:1652 */
+#line 2060 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 4264 "awkgram.c" /* yacc.c:1652 */
+#line 4268 "awkgram.c" /* yacc.c:1652 */
break;
case 183:
-#line 2058 "awkgram.y" /* yacc.c:1652 */
+#line 2062 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 4270 "awkgram.c" /* yacc.c:1652 */
+#line 4274 "awkgram.c" /* yacc.c:1652 */
break;
case 184:
-#line 2063 "awkgram.y" /* yacc.c:1652 */
+#line 2067 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 4276 "awkgram.c" /* yacc.c:1652 */
+#line 4280 "awkgram.c" /* yacc.c:1652 */
break;
case 185:
-#line 2065 "awkgram.y" /* yacc.c:1652 */
+#line 2069 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[-1]; }
-#line 4282 "awkgram.c" /* yacc.c:1652 */
+#line 4286 "awkgram.c" /* yacc.c:1652 */
break;
case 186:
-#line 2070 "awkgram.y" /* yacc.c:1652 */
+#line 2074 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 4288 "awkgram.c" /* yacc.c:1652 */
+#line 4292 "awkgram.c" /* yacc.c:1652 */
break;
case 187:
-#line 2072 "awkgram.y" /* yacc.c:1652 */
+#line 2076 "awkgram.y" /* yacc.c:1652 */
{
yyval = list_merge(yyvsp[-1], yyvsp[0]);
}
-#line 4296 "awkgram.c" /* yacc.c:1652 */
+#line 4300 "awkgram.c" /* yacc.c:1652 */
break;
case 188:
-#line 2079 "awkgram.y" /* yacc.c:1652 */
+#line 2083 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *ip = yyvsp[0]->lasti;
int count = ip->sub_count; /* # of SUBSEP-seperated expressions */
@@ -4310,11 +4314,11 @@ regular_print:
sub_counter++; /* count # of dimensions */
yyval = yyvsp[0];
}
-#line 4314 "awkgram.c" /* yacc.c:1652 */
+#line 4318 "awkgram.c" /* yacc.c:1652 */
break;
case 189:
-#line 2096 "awkgram.y" /* yacc.c:1652 */
+#line 2100 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *t = yyvsp[-1];
if (yyvsp[-1] == NULL) {
@@ -4328,41 +4332,41 @@ regular_print:
yyvsp[0]->sub_count = count_expressions(&t, false);
yyval = list_append(t, yyvsp[0]);
}
-#line 4332 "awkgram.c" /* yacc.c:1652 */
+#line 4336 "awkgram.c" /* yacc.c:1652 */
break;
case 190:
-#line 2113 "awkgram.y" /* yacc.c:1652 */
+#line 2117 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 4338 "awkgram.c" /* yacc.c:1652 */
+#line 4342 "awkgram.c" /* yacc.c:1652 */
break;
case 191:
-#line 2115 "awkgram.y" /* yacc.c:1652 */
+#line 2119 "awkgram.y" /* yacc.c:1652 */
{
yyval = list_merge(yyvsp[-1], yyvsp[0]);
}
-#line 4346 "awkgram.c" /* yacc.c:1652 */
+#line 4350 "awkgram.c" /* yacc.c:1652 */
break;
case 192:
-#line 2122 "awkgram.y" /* yacc.c:1652 */
+#line 2126 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[-1]; }
-#line 4352 "awkgram.c" /* yacc.c:1652 */
+#line 4356 "awkgram.c" /* yacc.c:1652 */
break;
case 193:
-#line 2127 "awkgram.y" /* yacc.c:1652 */
+#line 2131 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->opcode = Op_push;
yyvsp[0]->memory = variable(yyvsp[0]->source_line, yyvsp[0]->lextok, Node_var_new);
yyval = list_create(yyvsp[0]);
}
-#line 4362 "awkgram.c" /* yacc.c:1652 */
+#line 4366 "awkgram.c" /* yacc.c:1652 */
break;
case 194:
-#line 2133 "awkgram.y" /* yacc.c:1652 */
+#line 2137 "awkgram.y" /* yacc.c:1652 */
{
char *arr = yyvsp[-1]->lextok;
@@ -4370,11 +4374,11 @@ regular_print:
yyvsp[-1]->opcode = Op_push_array;
yyval = list_prepend(yyvsp[0], yyvsp[-1]);
}
-#line 4374 "awkgram.c" /* yacc.c:1652 */
+#line 4378 "awkgram.c" /* yacc.c:1652 */
break;
case 195:
-#line 2144 "awkgram.y" /* yacc.c:1652 */
+#line 2148 "awkgram.y" /* yacc.c:1652 */
{
INSTRUCTION *ip = yyvsp[0]->nexti;
if (ip->opcode == Op_push
@@ -4386,85 +4390,85 @@ regular_print:
} else
yyval = yyvsp[0];
}
-#line 4390 "awkgram.c" /* yacc.c:1652 */
+#line 4394 "awkgram.c" /* yacc.c:1652 */
break;
case 196:
-#line 2156 "awkgram.y" /* yacc.c:1652 */
+#line 2160 "awkgram.y" /* yacc.c:1652 */
{
yyval = list_append(yyvsp[-1], yyvsp[-2]);
if (yyvsp[0] != NULL)
mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
}
-#line 4400 "awkgram.c" /* yacc.c:1652 */
+#line 4404 "awkgram.c" /* yacc.c:1652 */
break;
case 197:
-#line 2165 "awkgram.y" /* yacc.c:1652 */
+#line 2169 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->opcode = Op_postincrement;
}
-#line 4408 "awkgram.c" /* yacc.c:1652 */
+#line 4412 "awkgram.c" /* yacc.c:1652 */
break;
case 198:
-#line 2169 "awkgram.y" /* yacc.c:1652 */
+#line 2173 "awkgram.y" /* yacc.c:1652 */
{
yyvsp[0]->opcode = Op_postdecrement;
}
-#line 4416 "awkgram.c" /* yacc.c:1652 */
+#line 4420 "awkgram.c" /* yacc.c:1652 */
break;
case 199:
-#line 2173 "awkgram.y" /* yacc.c:1652 */
+#line 2177 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 4422 "awkgram.c" /* yacc.c:1652 */
+#line 4426 "awkgram.c" /* yacc.c:1652 */
break;
case 200:
-#line 2177 "awkgram.y" /* yacc.c:1652 */
+#line 2181 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; }
-#line 4428 "awkgram.c" /* yacc.c:1652 */
+#line 4432 "awkgram.c" /* yacc.c:1652 */
break;
case 201:
-#line 2181 "awkgram.y" /* yacc.c:1652 */
+#line 2185 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; yyerrok; }
-#line 4434 "awkgram.c" /* yacc.c:1652 */
+#line 4438 "awkgram.c" /* yacc.c:1652 */
break;
case 202:
-#line 2185 "awkgram.y" /* yacc.c:1652 */
+#line 2189 "awkgram.y" /* yacc.c:1652 */
{ yyerrok; }
-#line 4440 "awkgram.c" /* yacc.c:1652 */
+#line 4444 "awkgram.c" /* yacc.c:1652 */
break;
case 203:
-#line 2190 "awkgram.y" /* yacc.c:1652 */
+#line 2194 "awkgram.y" /* yacc.c:1652 */
{ yyval = NULL; }
-#line 4446 "awkgram.c" /* yacc.c:1652 */
+#line 4450 "awkgram.c" /* yacc.c:1652 */
break;
case 205:
-#line 2195 "awkgram.y" /* yacc.c:1652 */
+#line 2199 "awkgram.y" /* yacc.c:1652 */
{ yyerrok; }
-#line 4452 "awkgram.c" /* yacc.c:1652 */
+#line 4456 "awkgram.c" /* yacc.c:1652 */
break;
case 206:
-#line 2199 "awkgram.y" /* yacc.c:1652 */
+#line 2203 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; yyerrok; }
-#line 4458 "awkgram.c" /* yacc.c:1652 */
+#line 4462 "awkgram.c" /* yacc.c:1652 */
break;
case 207:
-#line 2203 "awkgram.y" /* yacc.c:1652 */
+#line 2207 "awkgram.y" /* yacc.c:1652 */
{ yyval = yyvsp[0]; yyerrok; }
-#line 4464 "awkgram.c" /* yacc.c:1652 */
+#line 4468 "awkgram.c" /* yacc.c:1652 */
break;
-#line 4468 "awkgram.c" /* yacc.c:1652 */
+#line 4472 "awkgram.c" /* yacc.c:1652 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -4695,7 +4699,7 @@ yyreturn:
#endif
return yyresult;
}
-#line 2205 "awkgram.y" /* yacc.c:1918 */
+#line 2209 "awkgram.y" /* yacc.c:1918 */
struct token {
@@ -5226,10 +5230,12 @@ out:
/* parse_program --- read in the program and convert into a list of instructions */
int
-parse_program(INSTRUCTION **pcode)
+parse_program(INSTRUCTION **pcode, bool from_eval)
{
int ret;
+ called_from_eval = from_eval;
+
/* pre-create non-local jump targets
* ip_end (Op_no_op) -- used as jump target for `exit'
* outside an END block.
diff --git a/awkgram.y b/awkgram.y
index 9f2b4d3c..87570dfa 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -176,6 +176,7 @@ static INSTRUCTION *ip_end;
static INSTRUCTION *ip_endfile;
static INSTRUCTION *ip_beginfile;
INSTRUCTION *main_beginfile;
+static bool called_from_eval = false;
static inline INSTRUCTION *list_create(INSTRUCTION *x);
static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
@@ -1093,6 +1094,9 @@ non_compound_stmt
if (! in_function)
yyerror(_("`return' used outside function context"));
} opt_exp statement_term {
+ if (called_from_eval)
+ $1->opcode = Op_K_return_from_eval;
+
if ($3 == NULL) {
$$ = list_create($1);
(void) list_prepend($$, instruction(Op_push_i));
@@ -2732,10 +2736,12 @@ out:
/* parse_program --- read in the program and convert into a list of instructions */
int
-parse_program(INSTRUCTION **pcode)
+parse_program(INSTRUCTION **pcode, bool from_eval)
{
int ret;
+ called_from_eval = from_eval;
+
/* pre-create non-local jump targets
* ip_end (Op_no_op) -- used as jump target for `exit'
* outside an END block.
diff --git a/debug.c b/debug.c
index 452b6b6f..19874284 100644
--- a/debug.c
+++ b/debug.c
@@ -5522,7 +5522,7 @@ pre_execute_code(INSTRUCTION **pi)
op2str(ei->opcode));
*pi = ei->nexti;
break;
- case Op_K_return:
+ case Op_K_return_from_eval:
if (ei->nexti != NULL) { /* not an implicit return */
NODE *r;
d_error(_("`return' not allowed in current context;"
@@ -5600,7 +5600,7 @@ do_eval(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
push_context(ctxt);
the_source = add_srcfile(SRC_CMDLINE, arg->a_string, srcfiles, NULL, NULL);
do_flags = false;
- ret = parse_program(&code);
+ ret = parse_program(&code, true);
do_flags = save_flags;
remove_params(this_func);
if (ret != 0) {
@@ -5783,7 +5783,7 @@ parse_condition(int type, int num, char *expr)
push_context(ctxt);
(void) add_srcfile(SRC_CMDLINE, expr, srcfiles, NULL, NULL);
do_flags = false;
- ret = parse_program(&code);
+ ret = parse_program(&code, true);
do_flags = save_flags;
remove_params(this_func);
pop_context();
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 3ed04bb4..d3da4d20 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-17 Arnold D. Robbins <arnold@skeeve.com>
+
+ * gawktexi.in (Viewing And Changing Data): Revise note for eval
+ to list commands that are not allowed using it.
+
2019-02-15 Arnold D. Robbins <arnold@skeeve.com>
* gawktexi.in: Fix wording for %f.
diff --git a/doc/gawk.info b/doc/gawk.info
index a91a2c63..d624d96d 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -22342,10 +22342,9 @@ The commands for viewing and changing variables inside of 'gawk' are:
can do anything that an 'awk' program would do: assign values to
variables, call functions, and so on.
- NOTE: Do to implementation constraintss, using 'eval' to call
- a user-defined function that returns a value does not work,
- generating an error message. We hope to one day remove this
- constraint.
+ NOTE: You cannot use 'eval' to execute a statement containing
+ any of the following: 'exit', 'getline', 'next', 'nextfile',
+ or 'return'.
'eval' PARAM, ...
AWK STATEMENTS
@@ -33979,7 +33978,7 @@ Index
* assert() user-defined function: Assert Function. (line 28)
* assertions: Assert Function. (line 6)
* assign values to variables, in debugger: Viewing And Changing Data.
- (line 63)
+ (line 62)
* assignment operators: Assignment Ops. (line 6)
* assignment operators, evaluation order: Assignment Ops. (line 110)
* assignment operators, lvalues/rvalues: Assignment Ops. (line 31)
@@ -34572,11 +34571,11 @@ Index
* debugger commands, o (option): Debugger Info. (line 57)
* debugger commands, option: Debugger Info. (line 57)
* debugger commands, p (print): Viewing And Changing Data.
- (line 40)
+ (line 39)
* debugger commands, print: Viewing And Changing Data.
- (line 40)
+ (line 39)
* debugger commands, printf: Viewing And Changing Data.
- (line 58)
+ (line 57)
* debugger commands, q (quit): Miscellaneous Debugger Commands.
(line 100)
* debugger commands, quit: Miscellaneous Debugger Commands.
@@ -34590,7 +34589,7 @@ Index
* debugger commands, s (step): Debugger Execution Control.
(line 68)
* debugger commands, set: Viewing And Changing Data.
- (line 63)
+ (line 62)
* debugger commands, si (stepi): Debugger Execution Control.
(line 75)
* debugger commands, silent: Debugger Execution Control.
@@ -34606,16 +34605,16 @@ Index
* debugger commands, u (until): Debugger Execution Control.
(line 82)
* debugger commands, undisplay: Viewing And Changing Data.
- (line 84)
+ (line 83)
* debugger commands, until: Debugger Execution Control.
(line 82)
* debugger commands, unwatch: Viewing And Changing Data.
- (line 88)
+ (line 87)
* debugger commands, up: Execution Stack. (line 36)
* debugger commands, w (watch): Viewing And Changing Data.
- (line 71)
+ (line 70)
* debugger commands, watch: Viewing And Changing Data.
- (line 71)
+ (line 70)
* debugger commands, where (backtrace): Execution Stack. (line 13)
* debugger, b command: Finding The Bug. (line 32)
* debugger, backtrace command: Finding The Bug. (line 52)
@@ -34665,7 +34664,7 @@ Index
* delete debugger command: Breakpoint Control. (line 64)
* delete statement: Delete. (line 6)
* delete watchpoint: Viewing And Changing Data.
- (line 88)
+ (line 87)
* deleting elements in arrays: Delete. (line 6)
* deleting entire arrays: Delete. (line 39)
* Demaille, Akim: Acknowledgments. (line 60)
@@ -35889,7 +35888,7 @@ Index
* output, records: Output Separators. (line 20)
* output, standard: Special FD. (line 6)
* p debugger command (alias for print): Viewing And Changing Data.
- (line 40)
+ (line 39)
* package, definition of: Global Namespace. (line 18)
* Papadopoulos, Panos: Contributors. (line 131)
* parent process ID of gawk process: Auto-set. (line 251)
@@ -36033,7 +36032,7 @@ Index
* pretty printing <1>: Profiling. (line 222)
* pretty-printing, profiling, difference with: Profiling. (line 229)
* print debugger command: Viewing And Changing Data.
- (line 40)
+ (line 39)
* print statement: Printing. (line 16)
* print statement, BEGIN/END patterns and: I/O And BEGIN/END. (line 15)
* print statement, commas, omitting: Print Examples. (line 30)
@@ -36044,9 +36043,9 @@ Index
(line 17)
* print statement, sprintf() function and: Round Function. (line 6)
* print variables, in debugger: Viewing And Changing Data.
- (line 40)
+ (line 39)
* printf debugger command: Viewing And Changing Data.
- (line 58)
+ (line 57)
* printf statement: Printing. (line 16)
* printf statement <1>: Printf. (line 6)
* printf statement, columns, aligning: Print Examples. (line 69)
@@ -36347,10 +36346,10 @@ Index
* separators, subscript: User-modified. (line 149)
* set breakpoint: Breakpoint Control. (line 11)
* set debugger command: Viewing And Changing Data.
- (line 63)
+ (line 62)
* set directory of message catalogs: I18N Functions. (line 11)
* set watchpoint: Viewing And Changing Data.
- (line 71)
+ (line 70)
* shadowing of variable values: Definition Syntax. (line 77)
* shell quoting, rules for: Quoting. (line 6)
* shells, piping commands into: Redirection. (line 136)
@@ -36509,7 +36508,7 @@ Index
* stepi debugger command: Debugger Execution Control.
(line 75)
* stop automatic display, in debugger: Viewing And Changing Data.
- (line 84)
+ (line 83)
* stream editors: Full Line Fields. (line 22)
* stream editors <1>: Simple Sed. (line 6)
* strftime: Time Functions. (line 50)
@@ -36679,7 +36678,7 @@ Index
(line 29)
* underscore (_), translatable string: Programmer i18n. (line 69)
* undisplay debugger command: Viewing And Changing Data.
- (line 84)
+ (line 83)
* undocumented features: Undocumented. (line 6)
* Unicode: Ordinal Functions. (line 45)
* Unicode <1>: Ranges and Locales. (line 61)
@@ -36700,7 +36699,7 @@ Index
* until debugger command: Debugger Execution Control.
(line 82)
* unwatch debugger command: Viewing And Changing Data.
- (line 88)
+ (line 87)
* up debugger command: Execution Stack. (line 36)
* uppercase names, namespace for: Default Namespace. (line 10)
* user database, reading: Passwd Functions. (line 6)
@@ -36761,7 +36760,7 @@ Index
* vertical bar (|), || operator <1>: Precedence. (line 88)
* Vinschen, Corinna: Acknowledgments. (line 60)
* w debugger command (alias for watch): Viewing And Changing Data.
- (line 71)
+ (line 70)
* w utility: Fixed width data. (line 17)
* wait() extension function: Extension Sample Fork.
(line 22)
@@ -36773,7 +36772,7 @@ Index
* Wallin, Anders: Contributors. (line 106)
* warnings, issuing: Options. (line 210)
* watch debugger command: Viewing And Changing Data.
- (line 71)
+ (line 70)
* watchpoint (debugger): Debugging Terms. (line 42)
* wc utility: Wc Program. (line 6)
* wc.awk program: Wc Program. (line 46)
@@ -37214,198 +37213,198 @@ Node: List of Debugger Commands895922
Node: Breakpoint Control897255
Node: Debugger Execution Control900949
Node: Viewing And Changing Data904311
-Node: Execution Stack907921
-Node: Debugger Info909558
-Node: Miscellaneous Debugger Commands913629
-Node: Readline Support918691
-Node: Limitations919587
-Node: Debugging Summary921696
-Node: Namespaces922975
-Node: Global Namespace924054
-Node: Qualified Names925452
-Node: Default Namespace926451
-Node: Changing The Namespace927192
-Node: Naming Rules928806
-Node: Internal Name Management930654
-Node: Namespace Example931696
-Node: Namespace And Features934258
-Node: Namespace Summary935693
-Node: Arbitrary Precision Arithmetic937170
-Node: Computer Arithmetic938657
-Ref: table-numeric-ranges942423
-Ref: table-floating-point-ranges942916
-Ref: Computer Arithmetic-Footnote-1943574
-Node: Math Definitions943631
-Ref: table-ieee-formats946947
-Ref: Math Definitions-Footnote-1947550
-Node: MPFR features947655
-Node: FP Math Caution949373
-Ref: FP Math Caution-Footnote-1950445
-Node: Inexactness of computations950814
-Node: Inexact representation951774
-Node: Comparing FP Values953134
-Node: Errors accumulate954375
-Node: Getting Accuracy955808
-Node: Try To Round958518
-Node: Setting precision959417
-Ref: table-predefined-precision-strings960114
-Node: Setting the rounding mode961944
-Ref: table-gawk-rounding-modes962318
-Ref: Setting the rounding mode-Footnote-1966249
-Node: Arbitrary Precision Integers966428
-Ref: Arbitrary Precision Integers-Footnote-1969603
-Node: Checking for MPFR969752
-Node: POSIX Floating Point Problems971226
-Ref: POSIX Floating Point Problems-Footnote-1975511
-Node: Floating point summary975549
-Node: Dynamic Extensions977739
-Node: Extension Intro979292
-Node: Plugin License980558
-Node: Extension Mechanism Outline981355
-Ref: figure-load-extension981794
-Ref: figure-register-new-function983359
-Ref: figure-call-new-function984451
-Node: Extension API Description986513
-Node: Extension API Functions Introduction988155
-Ref: table-api-std-headers989991
-Node: General Data Types993856
-Ref: General Data Types-Footnote-11002217
-Node: Memory Allocation Functions1002516
-Ref: Memory Allocation Functions-Footnote-11006726
-Node: Constructor Functions1006825
-Node: Registration Functions1010411
-Node: Extension Functions1011096
-Node: Exit Callback Functions1016418
-Node: Extension Version String1017668
-Node: Input Parsers1018331
-Node: Output Wrappers1031052
-Node: Two-way processors1035564
-Node: Printing Messages1037829
-Ref: Printing Messages-Footnote-11039000
-Node: Updating ERRNO1039153
-Node: Requesting Values1039892
-Ref: table-value-types-returned1040629
-Node: Accessing Parameters1041565
-Node: Symbol Table Access1042800
-Node: Symbol table by name1043312
-Ref: Symbol table by name-Footnote-11046336
-Node: Symbol table by cookie1046464
-Ref: Symbol table by cookie-Footnote-11050649
-Node: Cached values1050713
-Ref: Cached values-Footnote-11054249
-Node: Array Manipulation1054402
-Ref: Array Manipulation-Footnote-11055493
-Node: Array Data Types1055530
-Ref: Array Data Types-Footnote-11058188
-Node: Array Functions1058280
-Node: Flattening Arrays1062778
-Node: Creating Arrays1069754
-Node: Redirection API1074521
-Node: Extension API Variables1077354
-Node: Extension Versioning1078065
-Ref: gawk-api-version1078494
-Node: Extension GMP/MPFR Versioning1080225
-Node: Extension API Informational Variables1081853
-Node: Extension API Boilerplate1082926
-Node: Changes from API V11086900
-Node: Finding Extensions1088472
-Node: Extension Example1089031
-Node: Internal File Description1089829
-Node: Internal File Ops1093909
-Ref: Internal File Ops-Footnote-11105259
-Node: Using Internal File Ops1105399
-Ref: Using Internal File Ops-Footnote-11107782
-Node: Extension Samples1108056
-Node: Extension Sample File Functions1109585
-Node: Extension Sample Fnmatch1117234
-Node: Extension Sample Fork1118721
-Node: Extension Sample Inplace1119939
-Node: Extension Sample Ord1123243
-Node: Extension Sample Readdir1124079
-Ref: table-readdir-file-types1124968
-Node: Extension Sample Revout1125773
-Node: Extension Sample Rev2way1126362
-Node: Extension Sample Read write array1127102
-Node: Extension Sample Readfile1129044
-Node: Extension Sample Time1130139
-Node: Extension Sample API Tests1131487
-Node: gawkextlib1131979
-Node: Extension summary1134897
-Node: Extension Exercises1138599
-Node: Language History1139841
-Node: V7/SVR3.11141497
-Node: SVR41143649
-Node: POSIX1145083
-Node: BTL1146463
-Node: POSIX/GNU1147192
-Node: Feature History1152970
-Node: Common Extensions1169016
-Node: Ranges and Locales1170299
-Ref: Ranges and Locales-Footnote-11174915
-Ref: Ranges and Locales-Footnote-21174942
-Ref: Ranges and Locales-Footnote-31175177
-Node: Contributors1175398
-Node: History summary1181343
-Node: Installation1182723
-Node: Gawk Distribution1183667
-Node: Getting1184151
-Node: Extracting1185114
-Node: Distribution contents1186752
-Node: Unix Installation1193232
-Node: Quick Installation1193914
-Node: Shell Startup Files1196328
-Node: Additional Configuration Options1197417
-Node: Configuration Philosophy1199582
-Node: Non-Unix Installation1201951
-Node: PC Installation1202411
-Node: PC Binary Installation1203249
-Node: PC Compiling1203684
-Node: PC Using1204801
-Node: Cygwin1208354
-Node: MSYS1209453
-Node: VMS Installation1209954
-Node: VMS Compilation1210745
-Ref: VMS Compilation-Footnote-11211974
-Node: VMS Dynamic Extensions1212032
-Node: VMS Installation Details1213717
-Node: VMS Running1215970
-Node: VMS GNV1220249
-Node: VMS Old Gawk1220984
-Node: Bugs1221455
-Node: Bug address1222118
-Node: Usenet1225100
-Node: Maintainers1226104
-Node: Other Versions1227365
-Node: Installation summary1234279
-Node: Notes1235481
-Node: Compatibility Mode1236275
-Node: Additions1237057
-Node: Accessing The Source1237982
-Node: Adding Code1239419
-Node: New Ports1245638
-Node: Derived Files1250126
-Ref: Derived Files-Footnote-11255772
-Ref: Derived Files-Footnote-21255807
-Ref: Derived Files-Footnote-31256405
-Node: Future Extensions1256519
-Node: Implementation Limitations1257177
-Node: Extension Design1258360
-Node: Old Extension Problems1259504
-Ref: Old Extension Problems-Footnote-11261022
-Node: Extension New Mechanism Goals1261079
-Ref: Extension New Mechanism Goals-Footnote-11264443
-Node: Extension Other Design Decisions1264632
-Node: Extension Future Growth1266745
-Node: Notes summary1267581
-Node: Basic Concepts1268756
-Node: Basic High Level1269437
-Ref: figure-general-flow1269719
-Ref: figure-process-flow1270404
-Ref: Basic High Level-Footnote-11273705
-Node: Basic Data Typing1273890
-Node: Glossary1277218
-Node: Copying1309056
-Node: GNU Free Documentation License1346599
-Node: Index1371719
+Node: Execution Stack907852
+Node: Debugger Info909489
+Node: Miscellaneous Debugger Commands913560
+Node: Readline Support918622
+Node: Limitations919518
+Node: Debugging Summary921627
+Node: Namespaces922906
+Node: Global Namespace923985
+Node: Qualified Names925383
+Node: Default Namespace926382
+Node: Changing The Namespace927123
+Node: Naming Rules928737
+Node: Internal Name Management930585
+Node: Namespace Example931627
+Node: Namespace And Features934189
+Node: Namespace Summary935624
+Node: Arbitrary Precision Arithmetic937101
+Node: Computer Arithmetic938588
+Ref: table-numeric-ranges942354
+Ref: table-floating-point-ranges942847
+Ref: Computer Arithmetic-Footnote-1943505
+Node: Math Definitions943562
+Ref: table-ieee-formats946878
+Ref: Math Definitions-Footnote-1947481
+Node: MPFR features947586
+Node: FP Math Caution949304
+Ref: FP Math Caution-Footnote-1950376
+Node: Inexactness of computations950745
+Node: Inexact representation951705
+Node: Comparing FP Values953065
+Node: Errors accumulate954306
+Node: Getting Accuracy955739
+Node: Try To Round958449
+Node: Setting precision959348
+Ref: table-predefined-precision-strings960045
+Node: Setting the rounding mode961875
+Ref: table-gawk-rounding-modes962249
+Ref: Setting the rounding mode-Footnote-1966180
+Node: Arbitrary Precision Integers966359
+Ref: Arbitrary Precision Integers-Footnote-1969534
+Node: Checking for MPFR969683
+Node: POSIX Floating Point Problems971157
+Ref: POSIX Floating Point Problems-Footnote-1975442
+Node: Floating point summary975480
+Node: Dynamic Extensions977670
+Node: Extension Intro979223
+Node: Plugin License980489
+Node: Extension Mechanism Outline981286
+Ref: figure-load-extension981725
+Ref: figure-register-new-function983290
+Ref: figure-call-new-function984382
+Node: Extension API Description986444
+Node: Extension API Functions Introduction988086
+Ref: table-api-std-headers989922
+Node: General Data Types993787
+Ref: General Data Types-Footnote-11002148
+Node: Memory Allocation Functions1002447
+Ref: Memory Allocation Functions-Footnote-11006657
+Node: Constructor Functions1006756
+Node: Registration Functions1010342
+Node: Extension Functions1011027
+Node: Exit Callback Functions1016349
+Node: Extension Version String1017599
+Node: Input Parsers1018262
+Node: Output Wrappers1030983
+Node: Two-way processors1035495
+Node: Printing Messages1037760
+Ref: Printing Messages-Footnote-11038931
+Node: Updating ERRNO1039084
+Node: Requesting Values1039823
+Ref: table-value-types-returned1040560
+Node: Accessing Parameters1041496
+Node: Symbol Table Access1042731
+Node: Symbol table by name1043243
+Ref: Symbol table by name-Footnote-11046267
+Node: Symbol table by cookie1046395
+Ref: Symbol table by cookie-Footnote-11050580
+Node: Cached values1050644
+Ref: Cached values-Footnote-11054180
+Node: Array Manipulation1054333
+Ref: Array Manipulation-Footnote-11055424
+Node: Array Data Types1055461
+Ref: Array Data Types-Footnote-11058119
+Node: Array Functions1058211
+Node: Flattening Arrays1062709
+Node: Creating Arrays1069685
+Node: Redirection API1074452
+Node: Extension API Variables1077285
+Node: Extension Versioning1077996
+Ref: gawk-api-version1078425
+Node: Extension GMP/MPFR Versioning1080156
+Node: Extension API Informational Variables1081784
+Node: Extension API Boilerplate1082857
+Node: Changes from API V11086831
+Node: Finding Extensions1088403
+Node: Extension Example1088962
+Node: Internal File Description1089760
+Node: Internal File Ops1093840
+Ref: Internal File Ops-Footnote-11105190
+Node: Using Internal File Ops1105330
+Ref: Using Internal File Ops-Footnote-11107713
+Node: Extension Samples1107987
+Node: Extension Sample File Functions1109516
+Node: Extension Sample Fnmatch1117165
+Node: Extension Sample Fork1118652
+Node: Extension Sample Inplace1119870
+Node: Extension Sample Ord1123174
+Node: Extension Sample Readdir1124010
+Ref: table-readdir-file-types1124899
+Node: Extension Sample Revout1125704
+Node: Extension Sample Rev2way1126293
+Node: Extension Sample Read write array1127033
+Node: Extension Sample Readfile1128975
+Node: Extension Sample Time1130070
+Node: Extension Sample API Tests1131418
+Node: gawkextlib1131910
+Node: Extension summary1134828
+Node: Extension Exercises1138530
+Node: Language History1139772
+Node: V7/SVR3.11141428
+Node: SVR41143580
+Node: POSIX1145014
+Node: BTL1146394
+Node: POSIX/GNU1147123
+Node: Feature History1152901
+Node: Common Extensions1168947
+Node: Ranges and Locales1170230
+Ref: Ranges and Locales-Footnote-11174846
+Ref: Ranges and Locales-Footnote-21174873
+Ref: Ranges and Locales-Footnote-31175108
+Node: Contributors1175329
+Node: History summary1181274
+Node: Installation1182654
+Node: Gawk Distribution1183598
+Node: Getting1184082
+Node: Extracting1185045
+Node: Distribution contents1186683
+Node: Unix Installation1193163
+Node: Quick Installation1193845
+Node: Shell Startup Files1196259
+Node: Additional Configuration Options1197348
+Node: Configuration Philosophy1199513
+Node: Non-Unix Installation1201882
+Node: PC Installation1202342
+Node: PC Binary Installation1203180
+Node: PC Compiling1203615
+Node: PC Using1204732
+Node: Cygwin1208285
+Node: MSYS1209384
+Node: VMS Installation1209885
+Node: VMS Compilation1210676
+Ref: VMS Compilation-Footnote-11211905
+Node: VMS Dynamic Extensions1211963
+Node: VMS Installation Details1213648
+Node: VMS Running1215901
+Node: VMS GNV1220180
+Node: VMS Old Gawk1220915
+Node: Bugs1221386
+Node: Bug address1222049
+Node: Usenet1225031
+Node: Maintainers1226035
+Node: Other Versions1227296
+Node: Installation summary1234210
+Node: Notes1235412
+Node: Compatibility Mode1236206
+Node: Additions1236988
+Node: Accessing The Source1237913
+Node: Adding Code1239350
+Node: New Ports1245569
+Node: Derived Files1250057
+Ref: Derived Files-Footnote-11255703
+Ref: Derived Files-Footnote-21255738
+Ref: Derived Files-Footnote-31256336
+Node: Future Extensions1256450
+Node: Implementation Limitations1257108
+Node: Extension Design1258291
+Node: Old Extension Problems1259435
+Ref: Old Extension Problems-Footnote-11260953
+Node: Extension New Mechanism Goals1261010
+Ref: Extension New Mechanism Goals-Footnote-11264374
+Node: Extension Other Design Decisions1264563
+Node: Extension Future Growth1266676
+Node: Notes summary1267512
+Node: Basic Concepts1268687
+Node: Basic High Level1269368
+Ref: figure-general-flow1269650
+Ref: figure-process-flow1270335
+Ref: Basic High Level-Footnote-11273636
+Node: Basic Data Typing1273821
+Node: Glossary1277149
+Node: Copying1308987
+Node: GNU Free Documentation License1346530
+Node: Index1371650

End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index b0b4d3d0..24646435 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -31132,9 +31132,14 @@ You can do anything that an @command{awk} program would do: assign
values to variables, call functions, and so on.
@quotation NOTE
-Do to implementation constraintss, using @code{eval} to call a
-user-defined function that returns a value does not work, generating
-an error message. We hope to one day remove this constraint.
+You cannot use @code{eval} to execute a statement containing
+any of the following:
+@code{exit},
+@code{getline},
+@code{next},
+@code{nextfile},
+or
+@code{return}.
@end quotation
@item @code{eval} @var{param}, @dots{}
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 3f514c82..559244f0 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -30144,9 +30144,14 @@ You can do anything that an @command{awk} program would do: assign
values to variables, call functions, and so on.
@quotation NOTE
-Do to implementation constraintss, using @code{eval} to call a
-user-defined function that returns a value does not work, generating
-an error message. We hope to one day remove this constraint.
+You cannot use @code{eval} to execute a statement containing
+any of the following:
+@code{exit},
+@code{getline},
+@code{next},
+@code{nextfile},
+or
+@code{return}.
@end quotation
@item @code{eval} @var{param}, @dots{}
diff --git a/eval.c b/eval.c
index aa78d3e6..4858fa69 100644
--- a/eval.c
+++ b/eval.c
@@ -325,6 +325,7 @@ static struct optypetab {
{ "Op_K_next", "next" },
{ "Op_K_exit", "exit" },
{ "Op_K_return", "return" },
+ { "Op_K_return_from_eval", "return" },
{ "Op_K_delete", "delete" },
{ "Op_K_delete_loop", NULL },
{ "Op_K_getline_redir", "getline" },
diff --git a/interpret.h b/interpret.h
index c16da88f..cc6e02af 100644
--- a/interpret.h
+++ b/interpret.h
@@ -1199,6 +1199,10 @@ match_re:
JUMPTO(ni); /* Op_func */
}
+ case Op_K_return_from_eval:
+ cant_happen();
+ break;
+
case Op_K_return:
m = POP_SCALAR(); /* return value */
diff --git a/main.c b/main.c
index d42d1f43..5800231c 100644
--- a/main.c
+++ b/main.c
@@ -465,7 +465,7 @@ main(int argc, char **argv)
setlocale(LC_NUMERIC, "C");
#endif
/* Read in the program */
- if (parse_program(& code_block) != 0 || dash_v_errs > 0)
+ if (parse_program(& code_block, false) != 0 || dash_v_errs > 0)
exit(EXIT_FAILURE);
if (do_intl)
diff --git a/test/ChangeLog b/test/ChangeLog
index 173832d7..0c9b7ce1 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-17 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (EXTRA_DIST): New test: dbugeval3.
+ * dbugeval3.awk, dbugeval3.in, dbugeval3.ok: New files.
+
2019-02-17 Andrew J. Schorr <aschorr@telemetry-investments.com>
* timeout.awk, timeout.ok: Increase READ_TIMEOUT to 400 to increase
diff --git a/test/Makefile.am b/test/Makefile.am
index 19f1d686..cba648ed 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -217,6 +217,9 @@ EXTRA_DIST = \
dbugeval2.awk \
dbugeval2.in \
dbugeval2.ok \
+ dbugeval3.awk \
+ dbugeval3.in \
+ dbugeval3.ok \
dbugtypedre1.awk \
dbugtypedre1.in \
dbugtypedre1.ok \
@@ -1321,7 +1324,7 @@ GAWK_EXT_TESTS = \
backw badargs beginfile1 beginfile2 binmode1 \
charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
clos1way6 crlf \
- dbugeval dbugeval2 dbugtypedre1 dbugtypedre2 delsub \
+ dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
errno exit \
fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull fsfwfs \
@@ -1372,7 +1375,7 @@ SHLIB_TESTS = \
testext time
# List of the tests which should be run with --debug option:
-NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 symtab10
+NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 dbugeval3 symtab10
# List of the tests which should be run with --lint option:
NEED_LINT = \
diff --git a/test/Makefile.in b/test/Makefile.in
index 502533a0..114bf30f 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -475,6 +475,9 @@ EXTRA_DIST = \
dbugeval2.awk \
dbugeval2.in \
dbugeval2.ok \
+ dbugeval3.awk \
+ dbugeval3.in \
+ dbugeval3.ok \
dbugtypedre1.awk \
dbugtypedre1.in \
dbugtypedre1.ok \
@@ -1579,7 +1582,7 @@ GAWK_EXT_TESTS = \
backw badargs beginfile1 beginfile2 binmode1 \
charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
clos1way6 crlf \
- dbugeval dbugeval2 dbugtypedre1 dbugtypedre2 delsub \
+ dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
devfd devfd1 devfd2 dfacheck1 dumpvars \
errno exit \
fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull fsfwfs \
@@ -1627,7 +1630,7 @@ SHLIB_TESTS = \
# List of the tests which should be run with --debug option:
-NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 symtab10
+NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 dbugeval3 symtab10
# List of the tests which should be run with --lint option:
NEED_LINT = \
@@ -4039,6 +4042,11 @@ dbugeval2:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+dbugeval3:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
dbugtypedre1:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 84a0218d..bdc9633f 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1320,6 +1320,11 @@ dbugeval2:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+dbugeval3:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
dbugtypedre1:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/dbugeval3.awk b/test/dbugeval3.awk
new file mode 100644
index 00000000..cc69752a
--- /dev/null
+++ b/test/dbugeval3.awk
@@ -0,0 +1,4 @@
+
+function isnumeric(x) {
+ return (length(x) && x == x+0)
+}
diff --git a/test/dbugeval3.in b/test/dbugeval3.in
new file mode 100644
index 00000000..5ea49024
--- /dev/null
+++ b/test/dbugeval3.in
@@ -0,0 +1,2 @@
+eval "print isnumeric(\"hello\")"
+eval "print isnumeric(\"42.5\")"
diff --git a/test/dbugeval3.ok b/test/dbugeval3.ok
new file mode 100644
index 00000000..22550206
--- /dev/null
+++ b/test/dbugeval3.ok
@@ -0,0 +1,3 @@
+0
+1
+EXIT CODE: 2