develooper Front page | perl.cvs.parrot | Postings from January 2009

[svn:parrot] r34918 - trunk/compilers/pirc/src

From:
kjs
Date:
January 4, 2009 06:30
Subject:
[svn:parrot] r34918 - trunk/compilers/pirc/src
Message ID:
20090104142954.1A1A2CB9F9@x12.develooper.com
Author: kjs
Date: Sun Jan  4 06:29:52 2009
New Revision: 34918

Modified:
   trunk/compilers/pirc/src/bcgen.c
   trunk/compilers/pirc/src/pir.y
   trunk/compilers/pirc/src/pircompunit.c
   trunk/compilers/pirc/src/pircompunit.h
   trunk/compilers/pirc/src/piremit.c
   trunk/compilers/pirc/src/pirparser.c
   trunk/compilers/pirc/src/pirparser.h
   trunk/compilers/pirc/src/pirsymbol.c
   trunk/compilers/pirc/src/pirsymbol.h

Log:
[pirc] refactoring for .const.pir
+ new constdecl struct to replace constant for declarations; the latter can now be stripped of its name field.

Modified: trunk/compilers/pirc/src/bcgen.c
==============================================================================
--- trunk/compilers/pirc/src/bcgen.c	(original)
+++ trunk/compilers/pirc/src/bcgen.c	Sun Jan  4 06:29:52 2009
@@ -118,12 +118,12 @@
 
     /* Update the constant count and reallocate */
     if (interp->code->const_table->constants)
-        interp->code->const_table->constants =
-            mem_realloc_n_typed(interp->code->const_table->constants,
+        interp->code->const_table->constants
+            = mem_realloc_n_typed(interp->code->const_table->constants,
                 newcount, PackFile_Constant *);
     else
-        interp->code->const_table->constants =
-            mem_allocate_n_typed(newcount, PackFile_Constant *);
+        interp->code->const_table->constants
+            = mem_allocate_n_typed(newcount, PackFile_Constant *);
 
     interp->code->const_table->constants[oldcount] = new_pbc_constant;
     interp->code->const_table->const_count         = newcount;

Modified: trunk/compilers/pirc/src/pir.y
==============================================================================
--- trunk/compilers/pirc/src/pir.y	(original)
+++ trunk/compilers/pirc/src/pir.y	Sun Jan  4 06:29:52 2009
@@ -239,6 +239,7 @@
     unsigned            uval;
     char   const       *sval;
     struct constant    *cval;
+    struct constdecl   *cdec;
     struct ucstring    *ustr;
     struct instruction *instr;
     struct expression  *expr;
@@ -491,10 +492,14 @@
              short_invocation
              return_instr
 
-%type <cval> const_tail
-             constant
+%type <cval> constant
              stringconst
 
+%type <cdec> const_tail
+             const_decl
+             globalconst_decl
+             const_stat
+
 
 /* all exported functions start with "yypir", instead of default "yy". */
 %name-prefix="yypir"
@@ -1994,6 +1999,7 @@
                       ;
 
 const_decl_stat       : const_stat "\n"
+
                       ;
 
 const_stat            : const_decl

Modified: trunk/compilers/pirc/src/pircompunit.c
==============================================================================
--- trunk/compilers/pirc/src/pircompunit.c	(original)
+++ trunk/compilers/pirc/src/pircompunit.c	Sun Jan  4 06:29:52 2009
@@ -1242,9 +1242,8 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 static constant *
-create_const(lexer_state * const lexer, value_type type, char const * const name, va_list arg_ptr) {
+create_const(lexer_state * const lexer, value_type type, va_list arg_ptr) {
     constant *c = pir_mem_allocate_zeroed_typed(lexer, constant);
-    c->name     = name;
     c->type     = type;
     c->next     = NULL;
 
@@ -1274,6 +1273,29 @@
 /*
 
 =item C<constant *
+new_const(lexer_state * const lexer, value_type type, ...)>
+
+Creates a new constant node of the given type.
+Wrapper function for C<create_const>
+
+=cut
+
+*/
+PARROT_WARN_UNUSED_RESULT
+PARROT_CANNOT_RETURN_NULL
+constant *
+new_const(lexer_state * const lexer, value_type type, ...) {
+    constant *c;
+    va_list arg_ptr;
+    va_start(arg_ptr, type);
+    c = create_const(lexer, type, arg_ptr);
+    va_end(arg_ptr);
+    return c;
+}
+
+/*
+
+=item C<constant *
 new_named_const(lexer_state * const lexer, value_type type, char * const name, ...)>
 
 Creates a new constant node of the given type, by the given name.
@@ -1284,12 +1306,34 @@
 */
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-constant *
+constdecl *
 new_named_const(lexer_state * const lexer, value_type type, char const * const name, ...) {
-    constant *c;
+    constdecl *c = pir_mem_allocate(lexer, sizeof (constdecl));
     va_list arg_ptr;
     va_start(arg_ptr, name);
-    c = create_const(lexer, type, name, arg_ptr);
+
+       /* based on the indicated type, cast the variable argument to the right type. */
+    switch (type) {
+        case INT_VAL:
+            c->val.ival = va_arg(arg_ptr, int);
+            break;
+        case NUM_VAL:
+            c->val.nval = va_arg(arg_ptr, double);
+            break;
+        case PMC_VAL:  /* value of a PMC_VAL constant is also a string */
+        case STRING_VAL:
+            c->val.sval = va_arg(arg_ptr, char *);
+            break;
+        case USTRING_VAL:
+            c->val.ustr = va_arg(arg_ptr, ucstring *);
+            break;
+        default:
+            panic(lexer, "unknown data type in create_const() (%d)", type);
+            break;
+    }
+
+    c->name = name;
+    c->type = type;
     va_end(arg_ptr);
     return c;
 }
@@ -1306,7 +1350,7 @@
 =cut
 
 */
-constant *
+constdecl *
 new_pmc_const(lexer_state * const lexer, char const * const type,
               char const * const name, constant * const value)
 {
@@ -1319,6 +1363,7 @@
     /* check whether that PMC isa "Sub" */
     INTVAL is_a_sub      = VTABLE_isa(lexer->interp, constclass, subclassname);
 
+    constdecl *decl      = (constdecl *)pir_mem_allocate(lexer, sizeof (constdecl));
     /* fprintf(stderr, "new_pmc_const: is a sub=%d\n", is_a_sub);
     */
 
@@ -1333,7 +1378,6 @@
         declare_local(lexer, PMC_TYPE, constsym);
         assign_vanilla_register(lexer, constsym);
 
-        value->name     = name;    /* set name of constant node */
         value->type     = PMC_VAL; /* set type of constant node */
         value->val.pval = value->val.sval;
 
@@ -1346,6 +1390,9 @@
         push_operand(lexer, expr_from_target(lexer, consttarg));
         push_operand(lexer, expr_from_const(lexer, value));
 
+        decl->name     = name;
+        decl->type     = PMC_VAL;
+        decl->val.pval = value->val.sval;
     }
 
     else if (value->type == INT_VAL) {
@@ -1365,7 +1412,6 @@
             declare_local(lexer, PMC_TYPE, constsym);
             assign_vanilla_register(lexer, constsym);
 
-            value->name = name;
 
             new_sub_instr(lexer, PARROT_OP_set_p_pc, "set_p_pc", 0);
             push_operand(lexer, expr_from_target(lexer, consttarg));
@@ -1394,8 +1440,6 @@
             declare_local(lexer, PMC_TYPE, constsym);
             assign_vanilla_register(lexer, constsym);
 
-            value->name = name;
-
             new_sub_instr(lexer, PARROT_OP_set_p_pc, "set_p_pc", 0);
             push_operand(lexer, expr_from_target(lexer, consttarg));
             push_operand(lexer, expr_from_int(lexer, index));
@@ -1424,8 +1468,6 @@
             declare_local(lexer, PMC_TYPE, constsym);
             assign_vanilla_register(lexer, constsym);
 
-            value->name = name;
-
             new_sub_instr(lexer, PARROT_OP_set_p_pc, "set_p_pc", 0);
             push_operand(lexer, expr_from_target(lexer, consttarg));
             push_operand(lexer, expr_from_int(lexer, index));
@@ -1437,31 +1479,10 @@
         }
     }
 
-    return value;
+    return decl;
 }
 
-/*
-
-=item C<constant *
-new_const(lexer_state * const lexer, value_type type, ...)>
 
-Creates a new constant node of the given type.
-Wrapper function for C<create_const>
-
-=cut
-
-*/
-PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-constant *
-new_const(lexer_state * const lexer, value_type type, ...) {
-    constant *c;
-    va_list arg_ptr;
-    va_start(arg_ptr, type);
-    c = create_const(lexer, type, NULL, arg_ptr);
-    va_end(arg_ptr);
-    return c;
-}
 
 /*
 

Modified: trunk/compilers/pirc/src/pircompunit.h
==============================================================================
--- trunk/compilers/pirc/src/pircompunit.h	(original)
+++ trunk/compilers/pirc/src/pircompunit.h	Sun Jan  4 06:29:52 2009
@@ -155,10 +155,18 @@
 
 } value;
 
+/* represent a .const or .globalconst declaration */
+typedef struct constdecl {
+    char const   *name;
+    int           global;
+    value_type    type;
+    value         val;
+
+} constdecl;
+
 
 /* literal constants, possibly named */
 typedef struct constant {
-    char const      *name;     /* name of the constant, if declared as a constant */
     value_type       type;     /* type of the constant; see enum value_types */
     value            val;      /* value of the constant */
     struct constant *next;
@@ -299,7 +307,7 @@
         struct symbol       *sym;
         struct local_label  *loc;
         struct global_label *glob;
-        struct constant     *cons;
+        struct constdecl    *cons;
     } u;
 
     struct bucket *next; /* link to next bucket, in case of hash clash */
@@ -378,12 +386,12 @@
 argument *set_arg_alias(struct lexer_state * const lexer, char const * const alias);
 
 /* constructors for constant nodes */
-constant *new_named_const(struct lexer_state * const lexer, value_type type,
+constdecl *new_named_const(struct lexer_state * const lexer, value_type type,
                           char const * const name, ...);
 
 constant *new_const(struct lexer_state * const lexer, value_type type, ...);
 
-constant *new_pmc_const(struct lexer_state * const lexer, char const * const type,
+constdecl *new_pmc_const(struct lexer_state * const lexer, char const * const type,
                         char const * const name, constant * const value);
 
 /* conversion functions, each wrapping its argument in an expression node */

Modified: trunk/compilers/pirc/src/piremit.c
==============================================================================
--- trunk/compilers/pirc/src/piremit.c	(original)
+++ trunk/compilers/pirc/src/piremit.c	Sun Jan  4 06:29:52 2009
@@ -481,7 +481,7 @@
             break;
         }
         case PMC_VAL: {
-            if (c->name) { /* XXX this check necessary? */
+
                 /* look up the sub by its name stored in c->val.pval, then
                  * find out what that sub's PMC_CONST is in the constant table,
                  * and emit that.
@@ -497,7 +497,7 @@
                     yypirerror(lexer->yyscanner, lexer,
                                "cannot find referenced sub '%s'", c->val.pval);
                 }
-            }
+
             break;
         }
         case USTRING_VAL: {

Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c	(original)
+++ trunk/compilers/pirc/src/pirparser.c	Sun Jan  4 06:29:52 2009
@@ -574,6 +574,7 @@
     unsigned            uval;
     char   const       *sval;
     struct constant    *cval;
+    struct constdecl   *cdec;
     struct ucstring    *ustr;
     struct instruction *instr;
     struct expression  *expr;
@@ -586,7 +587,7 @@
     struct macro_param *pval;
 }
 /* Line 187 of yacc.c.  */
-#line 590 "pirparser.c"
+#line 591 "pirparser.c"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -599,7 +600,7 @@
 
 
 /* Line 216 of yacc.c.  */
-#line 603 "pirparser.c"
+#line 604 "pirparser.c"
 
 #ifdef short
 # undef short
@@ -1055,49 +1056,49 @@
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   553,   553,   554,   559,   565,   566,   569,   570,   573,
-     574,   575,   576,   577,   578,   579,   580,   581,   588,   589,
-     592,   596,   602,   609,   610,   613,   614,   617,   621,   622,
-     625,   626,   629,   632,   633,   636,   640,   651,   655,   657,
-     661,   667,   671,   675,   680,   681,   685,   687,   691,   695,
-     701,   705,   709,   710,   713,   714,   717,   719,   721,   723,
-     725,   727,   729,   731,   733,   735,   737,   739,   741,   743,
-     747,   752,   756,   760,   769,   780,   782,   784,   788,   797,
-     798,   811,   815,   820,   821,   825,   826,   827,   830,   837,
-     843,   844,   854,   856,   859,   860,   861,   862,   863,   864,
-     865,   866,   867,   868,   869,   870,   871,   872,   873,   879,
-     882,   887,   888,   893,   894,   897,   899,   907,   915,   916,
-     918,   921,   927,   928,   937,   938,   939,   940,   948,   952,
-     956,   965,   972,   979,   982,   983,   986,   995,  1002,  1005,
-    1006,  1009,  1010,  1013,  1049,  1051,  1055,  1057,  1062,  1064,
-    1068,  1091,  1095,  1097,  1106,  1117,  1129,  1139,  1142,  1143,
-    1146,  1155,  1164,  1169,  1174,  1195,  1200,  1241,  1259,  1266,
-    1271,  1282,  1293,  1304,  1315,  1320,  1325,  1330,  1340,  1359,
-    1393,  1395,  1397,  1399,  1401,  1403,  1405,  1407,  1412,  1421,
-    1423,  1425,  1427,  1429,  1431,  1433,  1435,  1437,  1439,  1451,
-    1456,  1458,  1460,  1462,  1464,  1466,  1468,  1470,  1472,  1474,
-    1476,  1478,  1480,  1511,  1537,  1545,  1554,  1563,  1565,  1567,
-    1569,  1571,  1575,  1580,  1582,  1587,  1588,  1591,  1592,  1595,
-    1596,  1599,  1607,  1611,  1613,  1617,  1621,  1622,  1625,  1640,
-    1644,  1645,  1648,  1660,  1661,  1665,  1667,  1671,  1675,  1677,
-    1679,  1685,  1686,  1691,  1692,  1696,  1698,  1707,  1709,  1713,
-    1717,  1719,  1721,  1725,  1726,  1729,  1749,  1756,  1758,  1768,
-    1785,  1787,  1789,  1793,  1802,  1807,  1814,  1815,  1819,  1821,
-    1825,  1827,  1832,  1833,  1837,  1839,  1841,  1843,  1853,  1857,
-    1858,  1859,  1860,  1863,  1868,  1879,  1886,  1891,  1892,  1896,
-    1898,  1902,  1903,  1906,  1910,  1914,  1918,  1927,  1937,  1938,
-    1943,  1945,  1950,  1955,  1956,  1960,  1962,  1966,  1972,  1973,
-    1977,  1979,  1987,  1988,  1992,  1996,  1999,  2000,  2003,  2007,
-    2011,  2013,  2015,  2017,  2025,  2026,  2030,  2031,  2032,  2035,
-    2036,  2039,  2040,  2041,  2042,  2043,  2044,  2047,  2048,  2049,
-    2050,  2058,  2061,  2062,  2073,  2074,  2075,  2076,  2080,  2081,
-    2084,  2085,  2086,  2087,  2088,  2089,  2090,  2091,  2094,  2095,
-    2096,  2099,  2100,  2101,  2102,  2103,  2104,  2105,  2106,  2107,
-    2108,  2109,  2110,  2111,  2112,  2113,  2114,  2115,  2116,  2117,
-    2118,  2119,  2120,  2121,  2127,  2128,  2129,  2130,  2131,  2132,
-    2133,  2134,  2135,  2136,  2137,  2138,  2150,  2158,  2162,  2163,
-    2166,  2167,  2168,  2169,  2170,  2171,  2174,  2176,  2177,  2180,
-    2181,  2184,  2188,  2193
+       0,   558,   558,   559,   564,   570,   571,   574,   575,   578,
+     579,   580,   581,   582,   583,   584,   585,   586,   593,   594,
+     597,   601,   607,   614,   615,   618,   619,   622,   626,   627,
+     630,   631,   634,   637,   638,   641,   645,   656,   660,   662,
+     666,   672,   676,   680,   685,   686,   690,   692,   696,   700,
+     706,   710,   714,   715,   718,   719,   722,   724,   726,   728,
+     730,   732,   734,   736,   738,   740,   742,   744,   746,   748,
+     752,   757,   761,   765,   774,   785,   787,   789,   793,   802,
+     803,   816,   820,   825,   826,   830,   831,   832,   835,   842,
+     848,   849,   859,   861,   864,   865,   866,   867,   868,   869,
+     870,   871,   872,   873,   874,   875,   876,   877,   878,   884,
+     887,   892,   893,   898,   899,   902,   904,   912,   920,   921,
+     923,   926,   932,   933,   942,   943,   944,   945,   953,   957,
+     961,   970,   977,   984,   987,   988,   991,  1000,  1007,  1010,
+    1011,  1014,  1015,  1018,  1054,  1056,  1060,  1062,  1067,  1069,
+    1073,  1096,  1100,  1102,  1111,  1122,  1134,  1144,  1147,  1148,
+    1151,  1160,  1169,  1174,  1179,  1200,  1205,  1246,  1264,  1271,
+    1276,  1287,  1298,  1309,  1320,  1325,  1330,  1335,  1345,  1364,
+    1398,  1400,  1402,  1404,  1406,  1408,  1410,  1412,  1417,  1426,
+    1428,  1430,  1432,  1434,  1436,  1438,  1440,  1442,  1444,  1456,
+    1461,  1463,  1465,  1467,  1469,  1471,  1473,  1475,  1477,  1479,
+    1481,  1483,  1485,  1516,  1542,  1550,  1559,  1568,  1570,  1572,
+    1574,  1576,  1580,  1585,  1587,  1592,  1593,  1596,  1597,  1600,
+    1601,  1604,  1612,  1616,  1618,  1622,  1626,  1627,  1630,  1645,
+    1649,  1650,  1653,  1665,  1666,  1670,  1672,  1676,  1680,  1682,
+    1684,  1690,  1691,  1696,  1697,  1701,  1703,  1712,  1714,  1718,
+    1722,  1724,  1726,  1730,  1731,  1734,  1754,  1761,  1763,  1773,
+    1790,  1792,  1794,  1798,  1807,  1812,  1819,  1820,  1824,  1826,
+    1830,  1832,  1837,  1838,  1842,  1844,  1846,  1848,  1858,  1862,
+    1863,  1864,  1865,  1868,  1873,  1884,  1891,  1896,  1897,  1901,
+    1903,  1907,  1908,  1911,  1915,  1919,  1923,  1932,  1942,  1943,
+    1948,  1950,  1955,  1960,  1961,  1965,  1967,  1971,  1977,  1978,
+    1982,  1984,  1992,  1993,  1997,  2001,  2005,  2006,  2009,  2013,
+    2017,  2019,  2021,  2023,  2031,  2032,  2036,  2037,  2038,  2041,
+    2042,  2045,  2046,  2047,  2048,  2049,  2050,  2053,  2054,  2055,
+    2056,  2064,  2067,  2068,  2079,  2080,  2081,  2082,  2086,  2087,
+    2090,  2091,  2092,  2093,  2094,  2095,  2096,  2097,  2100,  2101,
+    2102,  2105,  2106,  2107,  2108,  2109,  2110,  2111,  2112,  2113,
+    2114,  2115,  2116,  2117,  2118,  2119,  2120,  2121,  2122,  2123,
+    2124,  2125,  2126,  2127,  2133,  2134,  2135,  2136,  2137,  2138,
+    2139,  2140,  2141,  2142,  2143,  2144,  2156,  2164,  2168,  2169,
+    2172,  2173,  2174,  2175,  2176,  2177,  2180,  2182,  2183,  2186,
+    2187,  2190,  2194,  2199
 };
 #endif
 
@@ -2611,22 +2612,22 @@
   switch (yyn)
     {
         case 4:
-#line 562 "pir.y"
+#line 567 "pir.y"
     { fixup_global_labels(lexer); ;}
     break;
 
   case 20:
-#line 593 "pir.y"
+#line 598 "pir.y"
     { new_macro_const(lexer->macros, (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].sval), yypirget_lineno(yyscanner)); ;}
     break;
 
   case 21:
-#line 599 "pir.y"
+#line 604 "pir.y"
     { /* fprintf(stderr, "macro body: [%s]\n", CURRENT_MACRO(lexer)->body);*/ ;}
     break;
 
   case 22:
-#line 603 "pir.y"
+#line 608 "pir.y"
     {
                           new_macro(lexer->macros, (yyvsp[(2) - (2)].sval), yypirget_lineno(yyscanner), TRUE,
                                     lexer->macro_size);
@@ -2634,17 +2635,17 @@
     break;
 
   case 27:
-#line 618 "pir.y"
+#line 623 "pir.y"
     { add_macro_param(CURRENT_MACRO(lexer), (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 35:
-#line 637 "pir.y"
+#line 642 "pir.y"
     { store_macro_string(CURRENT_MACRO(lexer), "%s\n", (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 36:
-#line 641 "pir.y"
+#line 646 "pir.y"
     {
                           store_macro_string(CURRENT_MACRO(lexer), ".local %s %s\n",
                                              pir_type_names[(yyvsp[(2) - (3)].ival)], (yyvsp[(3) - (3)].sval));
@@ -2652,152 +2653,152 @@
     break;
 
   case 37:
-#line 652 "pir.y"
+#line 657 "pir.y"
     { load_library(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 38:
-#line 656 "pir.y"
+#line 661 "pir.y"
     { yypirset_lineno ((yyvsp[(2) - (2)].ival), yyscanner); ;}
     break;
 
   case 39:
-#line 658 "pir.y"
+#line 663 "pir.y"
     { lexer->filename = (yyvsp[(2) - (2)].sval); ;}
     break;
 
   case 40:
-#line 662 "pir.y"
+#line 667 "pir.y"
     { annotate(lexer, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 41:
-#line 668 "pir.y"
+#line 673 "pir.y"
     { set_hll(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 42:
-#line 672 "pir.y"
+#line 677 "pir.y"
     { set_hll_map(lexer, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 43:
-#line 676 "pir.y"
+#line 681 "pir.y"
     { set_namespace(lexer, (yyvsp[(3) - (4)].key)); ;}
     break;
 
   case 44:
-#line 680 "pir.y"
+#line 685 "pir.y"
     { (yyval.key) = NULL; ;}
     break;
 
   case 45:
-#line 682 "pir.y"
+#line 687 "pir.y"
     { (yyval.key) = (yyvsp[(1) - (1)].key); ;}
     break;
 
   case 46:
-#line 686 "pir.y"
+#line 691 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 47:
-#line 688 "pir.y"
+#line 693 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 48:
-#line 692 "pir.y"
+#line 697 "pir.y"
     { (yyval.expr) = expr_from_string(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 50:
-#line 702 "pir.y"
+#line 707 "pir.y"
     { close_sub(lexer); ;}
     break;
 
   case 51:
-#line 706 "pir.y"
+#line 711 "pir.y"
     { new_subr(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 56:
-#line 718 "pir.y"
+#line 723 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_ANON);;}
     break;
 
   case 57:
-#line 720 "pir.y"
+#line 725 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_INIT); ;}
     break;
 
   case 58:
-#line 722 "pir.y"
+#line 727 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_LOAD); ;}
     break;
 
   case 59:
-#line 724 "pir.y"
+#line 729 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_MAIN); ;}
     break;
 
   case 60:
-#line 726 "pir.y"
+#line 731 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_LEX); ;}
     break;
 
   case 61:
-#line 728 "pir.y"
+#line 733 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_POSTCOMP); ;}
     break;
 
   case 62:
-#line 730 "pir.y"
+#line 735 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_IMMEDIATE); ;}
     break;
 
   case 63:
-#line 732 "pir.y"
+#line 737 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_MULTI); ;}
     break;
 
   case 64:
-#line 734 "pir.y"
+#line 739 "pir.y"
     { set_sub_outer(lexer, (yyvsp[(3) - (4)].sval)); ;}
     break;
 
   case 65:
-#line 736 "pir.y"
+#line 741 "pir.y"
     { set_sub_methodname(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 66:
-#line 738 "pir.y"
+#line 743 "pir.y"
     { set_sub_vtable(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 67:
-#line 740 "pir.y"
+#line 745 "pir.y"
     { set_sub_subid(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 68:
-#line 742 "pir.y"
+#line 747 "pir.y"
     { set_sub_instanceof(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 69:
-#line 744 "pir.y"
+#line 749 "pir.y"
     { set_sub_nsentry(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 70:
-#line 748 "pir.y"
+#line 753 "pir.y"
     { set_sub_multi_types(lexer, (yyvsp[(2) - (3)].expr)); ;}
     break;
 
   case 71:
-#line 752 "pir.y"
+#line 757 "pir.y"
     {
                           CURRENT_SUB(lexer)->info.num_multi_types = 1;
                           /* n=1 means :multi() -- without any types. */
@@ -2805,12 +2806,12 @@
     break;
 
   case 72:
-#line 757 "pir.y"
+#line 762 "pir.y"
     { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
     break;
 
   case 73:
-#line 761 "pir.y"
+#line 766 "pir.y"
     {
                           CURRENT_SUB(lexer)->info.num_multi_types = 2;
                           /* start counting multi types; always 1 higher than actual number
@@ -2822,7 +2823,7 @@
     break;
 
   case 74:
-#line 770 "pir.y"
+#line 775 "pir.y"
     {
                           ++CURRENT_SUB(lexer)->info.num_multi_types;
                           /* link the multi types in reverse other. That's fine,
@@ -2834,22 +2835,22 @@
     break;
 
   case 75:
-#line 781 "pir.y"
+#line 786 "pir.y"
     { (yyval.expr) = expr_from_ident(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 76:
-#line 783 "pir.y"
+#line 788 "pir.y"
     { (yyval.expr) = expr_from_string(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 77:
-#line 785 "pir.y"
+#line 790 "pir.y"
     { (yyval.expr) = expr_from_key(lexer, (yyvsp[(1) - (1)].key)); ;}
     break;
 
   case 78:
-#line 789 "pir.y"
+#line 794 "pir.y"
     {
                            /* if there are parameters, then emit a get_params instruction. */
                            if ((yyvsp[(1) - (1)].uval) > 0)
@@ -2858,12 +2859,12 @@
     break;
 
   case 79:
-#line 797 "pir.y"
+#line 802 "pir.y"
     { (yyval.uval) = 0; ;}
     break;
 
   case 80:
-#line 799 "pir.y"
+#line 804 "pir.y"
     {
                           /* if the :named flag was set, there's an extra
                            * constant string argument for the name. count that too.
@@ -2877,27 +2878,27 @@
     break;
 
   case 81:
-#line 812 "pir.y"
+#line 817 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(2) - (4)].targ), (yyvsp[(3) - (4)].ival)); ;}
     break;
 
   case 82:
-#line 816 "pir.y"
+#line 821 "pir.y"
     { (yyval.targ) = add_param(lexer, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 83:
-#line 820 "pir.y"
+#line 825 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 84:
-#line 822 "pir.y"
+#line 827 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 88:
-#line 831 "pir.y"
+#line 836 "pir.y"
     { (yyval.ival) = TARGET_FLAG_INVOCANT;
                            /* XXX handle multi_type */
 
@@ -2905,12 +2906,12 @@
     break;
 
   case 89:
-#line 838 "pir.y"
+#line 843 "pir.y"
     { (yyval.ival) = TARGET_FLAG_UNIQUE_REG; ;}
     break;
 
   case 91:
-#line 845 "pir.y"
+#line 850 "pir.y"
     {
                          ++lexer->stmt_counter;
                          /* increment the logical statement counter; a statement can be
@@ -2921,37 +2922,37 @@
     break;
 
   case 92:
-#line 855 "pir.y"
+#line 860 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 110:
-#line 883 "pir.y"
+#line 888 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (3)].mval), (yyvsp[(2) - (3)].pval)); ;}
     break;
 
   case 111:
-#line 887 "pir.y"
+#line 892 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 112:
-#line 889 "pir.y"
+#line 894 "pir.y"
     { (yyval.pval) = (yyvsp[(2) - (3)].pval); ;}
     break;
 
   case 113:
-#line 893 "pir.y"
+#line 898 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 115:
-#line 898 "pir.y"
+#line 903 "pir.y"
     { (yyval.pval) = new_macro_param((yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 116:
-#line 900 "pir.y"
+#line 905 "pir.y"
     {
                           macro_param *param = new_macro_param((yyvsp[(3) - (3)].sval));
                           param->next = (yyvsp[(1) - (3)].pval);
@@ -2960,7 +2961,7 @@
     break;
 
   case 117:
-#line 908 "pir.y"
+#line 913 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                           if (sym == NULL) {
@@ -2971,22 +2972,22 @@
     break;
 
   case 119:
-#line 917 "pir.y"
+#line 922 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 121:
-#line 922 "pir.y"
+#line 927 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 122:
-#line 927 "pir.y"
+#line 932 "pir.y"
     { (yyval.sval) = ""; ;}
     break;
 
   case 123:
-#line 929 "pir.y"
+#line 934 "pir.y"
     { /* XXX cleanup memory stuff */
                           char *newbuff = (char *)mem_sys_allocate((strlen((yyvsp[(1) - (2)].sval)) + strlen((yyvsp[(2) - (2)].sval)) + 2)
                                                                    * sizeof (char));
@@ -2996,17 +2997,17 @@
     break;
 
   case 127:
-#line 941 "pir.y"
+#line 946 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 128:
-#line 949 "pir.y"
+#line 954 "pir.y"
     { set_instr(lexer, NULL); ;}
     break;
 
   case 130:
-#line 957 "pir.y"
+#line 962 "pir.y"
     {
                            if (lexer->parse_errors > MAX_NUM_ERRORS)
                                panic(lexer, "Too many errors. Compilation aborted.\n");
@@ -3016,7 +3017,7 @@
     break;
 
   case 131:
-#line 966 "pir.y"
+#line 971 "pir.y"
     {
                            set_instrf(lexer, "null", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -3024,7 +3025,7 @@
     break;
 
   case 132:
-#line 973 "pir.y"
+#line 978 "pir.y"
     {
                            set_instrf(lexer, "get_results", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -3032,7 +3033,7 @@
     break;
 
   case 136:
-#line 987 "pir.y"
+#line 992 "pir.y"
     { /* at this point, TK_IDENT may in fact be a symbol identifier,
                             * not an op, so don't do any checks like is_parrot_op() just yet.
                             */
@@ -3042,7 +3043,7 @@
     break;
 
   case 137:
-#line 996 "pir.y"
+#line 1001 "pir.y"
     { /* when this rule is activated, the initial identifier must
                            * be a parrot op.
                            */
@@ -3052,7 +3053,7 @@
     break;
 
   case 143:
-#line 1014 "pir.y"
+#line 1019 "pir.y"
     {
                          /* the "instruction" that was set now appears to be
                           * an identifier; get the name, and check its type.
@@ -3089,22 +3090,22 @@
     break;
 
   case 144:
-#line 1050 "pir.y"
+#line 1055 "pir.y"
     { push_operand(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 145:
-#line 1052 "pir.y"
+#line 1057 "pir.y"
     { push_operand(lexer, expr_from_key(lexer, (yyvsp[(1) - (1)].key))); ;}
     break;
 
   case 146:
-#line 1056 "pir.y"
+#line 1061 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 147:
-#line 1058 "pir.y"
+#line 1063 "pir.y"
     { /* this is either a LABEL or a symbol; in the latter case, the type
                             * will be filled in later. */
                            (yyval.expr) = expr_from_ident(lexer, (yyvsp[(1) - (1)].sval));
@@ -3112,17 +3113,17 @@
     break;
 
   case 148:
-#line 1063 "pir.y"
+#line 1068 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 149:
-#line 1065 "pir.y"
+#line 1070 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 150:
-#line 1069 "pir.y"
+#line 1074 "pir.y"
     {
                            /* if $1 is a register, just return that */
                            if (TEST_FLAG((yyvsp[(1) - (2)].targ)->flags, TARGET_FLAG_IS_REG))
@@ -3146,22 +3147,22 @@
     break;
 
   case 151:
-#line 1092 "pir.y"
+#line 1097 "pir.y"
     { (yyval.key) = (yyvsp[(2) - (3)].key); ;}
     break;
 
   case 152:
-#line 1096 "pir.y"
+#line 1101 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 153:
-#line 1098 "pir.y"
+#line 1103 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 154:
-#line 1107 "pir.y"
+#line 1112 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (6)].expr));
@@ -3175,7 +3176,7 @@
     break;
 
   case 155:
-#line 1118 "pir.y"
+#line 1123 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (4)].expr));
@@ -3190,7 +3191,7 @@
     break;
 
   case 156:
-#line 1130 "pir.y"
+#line 1135 "pir.y"
     { /* XXX create a PMC const for $4 */
                           unshift_operand(lexer, expr_from_key(lexer, (yyvsp[(4) - (6)].key)));
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (6)].targ)));
@@ -3201,7 +3202,7 @@
     break;
 
   case 160:
-#line 1147 "pir.y"
+#line 1152 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3213,7 +3214,7 @@
     break;
 
   case 161:
-#line 1156 "pir.y"
+#line 1161 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 0.0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3225,7 +3226,7 @@
     break;
 
   case 162:
-#line 1165 "pir.y"
+#line 1170 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%C", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].cval));
                           get_opinfo(yyscanner);
@@ -3233,7 +3234,7 @@
     break;
 
   case 163:
-#line 1170 "pir.y"
+#line 1175 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3241,7 +3242,7 @@
     break;
 
   case 164:
-#line 1175 "pir.y"
+#line 1180 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (3)].sval));
                           if (sym) {
@@ -3265,7 +3266,7 @@
     break;
 
   case 165:
-#line 1196 "pir.y"
+#line 1201 "pir.y"
     {
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (3)].targ)));
                           get_opinfo(yyscanner);
@@ -3273,7 +3274,7 @@
     break;
 
   case 166:
-#line 1201 "pir.y"
+#line 1206 "pir.y"
     {
                           /*   $P0 = foo ["bar"]
                            *
@@ -3317,7 +3318,7 @@
     break;
 
   case 167:
-#line 1242 "pir.y"
+#line 1247 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (4)].sval));
                           target *t;
@@ -3338,7 +3339,7 @@
     break;
 
   case 168:
-#line 1260 "pir.y"
+#line 1265 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (4)].ival));
                           set_target_key(preg, (yyvsp[(4) - (4)].key));
@@ -3348,7 +3349,7 @@
     break;
 
   case 169:
-#line 1267 "pir.y"
+#line 1272 "pir.y"
     {
                           set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%E", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].expr));
                           get_opinfo(yyscanner);
@@ -3356,7 +3357,7 @@
     break;
 
   case 170:
-#line 1272 "pir.y"
+#line 1277 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3370,7 +3371,7 @@
     break;
 
   case 171:
-#line 1283 "pir.y"
+#line 1288 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3384,7 +3385,7 @@
     break;
 
   case 172:
-#line 1294 "pir.y"
+#line 1299 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3398,7 +3399,7 @@
     break;
 
   case 173:
-#line 1305 "pir.y"
+#line 1310 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3412,7 +3413,7 @@
     break;
 
   case 174:
-#line 1316 "pir.y"
+#line 1321 "pir.y"
     {
                           set_instrf(lexer, "add", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3420,7 +3421,7 @@
     break;
 
   case 175:
-#line 1321 "pir.y"
+#line 1326 "pir.y"
     {
                           set_instrf(lexer, "sub", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3428,7 +3429,7 @@
     break;
 
   case 176:
-#line 1326 "pir.y"
+#line 1331 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(3) - (4)].sval), "%T%E", (yyvsp[(1) - (4)].targ), (yyvsp[(4) - (4)].expr));
                           get_opinfo(yyscanner);
@@ -3436,7 +3437,7 @@
     break;
 
   case 177:
-#line 1331 "pir.y"
+#line 1336 "pir.y"
     {
                           if (targets_equal((yyvsp[(1) - (5)].targ), (yyvsp[(3) - (5)].targ))) /* $P0 = $P0 + $P1 ==> $P0 += $P1 */
                               set_instrf(lexer, opnames[(yyvsp[(4) - (5)].ival)], "%T%E", (yyvsp[(1) - (5)].targ), (yyvsp[(5) - (5)].expr));
@@ -3449,7 +3450,7 @@
     break;
 
   case 178:
-#line 1341 "pir.y"
+#line 1346 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (4)].sval));
                           target *t;
@@ -3471,7 +3472,7 @@
     break;
 
   case 179:
-#line 1360 "pir.y"
+#line 1365 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (4)].ival));
                           set_target_key(preg, (yyvsp[(2) - (4)].key));
@@ -3481,97 +3482,97 @@
     break;
 
   case 180:
-#line 1394 "pir.y"
+#line 1399 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%i%T", (yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 181:
-#line 1396 "pir.y"
+#line 1401 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%n%T", (yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 182:
-#line 1398 "pir.y"
+#line 1403 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%s%T", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 183:
-#line 1400 "pir.y"
+#line 1405 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_s_s(yyscanner, (yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval))); ;}
     break;
 
   case 184:
-#line 1402 "pir.y"
+#line 1407 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_i_i(yyscanner, (yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival))); ;}
     break;
 
   case 185:
-#line 1404 "pir.y"
+#line 1409 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_n_n(yyscanner, (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval))); ;}
     break;
 
   case 186:
-#line 1406 "pir.y"
+#line 1411 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_i_n(yyscanner, (yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval))); ;}
     break;
 
   case 187:
-#line 1408 "pir.y"
+#line 1413 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_n_i(yyscanner, (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival))); ;}
     break;
 
   case 188:
-#line 1413 "pir.y"
+#line 1418 "pir.y"
     { get_opinfo(yyscanner); ;}
     break;
 
   case 189:
-#line 1422 "pir.y"
+#line 1427 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, (yyvsp[(3) - (5)].sval), (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 190:
-#line 1424 "pir.y"
+#line 1429 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "int", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 191:
-#line 1426 "pir.y"
+#line 1431 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "num", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 192:
-#line 1428 "pir.y"
+#line 1433 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "pmc", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 193:
-#line 1430 "pir.y"
+#line 1435 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "string", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 194:
-#line 1432 "pir.y"
+#line 1437 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "if", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 195:
-#line 1434 "pir.y"
+#line 1439 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "unless", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 196:
-#line 1436 "pir.y"
+#line 1441 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "goto", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 197:
-#line 1438 "pir.y"
+#line 1443 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "null", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 198:
-#line 1440 "pir.y"
+#line 1445 "pir.y"
     {
                           int istrue = evaluate_c(lexer, (yyvsp[(2) - (4)].cval));
                           /* if "unless", invert the true-ness */
@@ -3586,7 +3587,7 @@
     break;
 
   case 199:
-#line 1452 "pir.y"
+#line 1457 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(1) - (5)].ival) ? "unless_null" : "if_null", "%T%I",
                                      new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (5)].ival)), (yyvsp[(5) - (5)].sval));
@@ -3594,67 +3595,67 @@
     break;
 
   case 200:
-#line 1457 "pir.y"
+#line 1462 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 201:
-#line 1459 "pir.y"
+#line 1464 "pir.y"
     { set_instrf(lexer, (yyvsp[(1) - (4)].ival) ? "unless" : "if", "%T%I", (yyvsp[(2) - (4)].targ), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 202:
-#line 1461 "pir.y"
+#line 1466 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "int", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 203:
-#line 1463 "pir.y"
+#line 1468 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "num", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 204:
-#line 1465 "pir.y"
+#line 1470 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "pmc", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 205:
-#line 1467 "pir.y"
+#line 1472 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "string", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 206:
-#line 1469 "pir.y"
+#line 1474 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "if", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 207:
-#line 1471 "pir.y"
+#line 1476 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "unless", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 208:
-#line 1473 "pir.y"
+#line 1478 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 209:
-#line 1475 "pir.y"
+#line 1480 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 210:
-#line 1477 "pir.y"
+#line 1482 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 211:
-#line 1479 "pir.y"
+#line 1484 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 212:
-#line 1481 "pir.y"
+#line 1486 "pir.y"
     {
                           if ((yyvsp[(2) - (4)].ival) == COMPUTE_DURING_RUNTIME) {
                              if ((yyvsp[(1) - (4)].ival) == NEED_INVERT_OPNAME) /* "unless" */
@@ -3682,7 +3683,7 @@
     break;
 
   case 213:
-#line 1512 "pir.y"
+#line 1517 "pir.y"
     {
                           /* the instructions "gt" and "ge" are converted to "lt" and "le".
                            * if so, then the arguments must be reversed as well. "lt" and
@@ -3711,7 +3712,7 @@
     break;
 
   case 214:
-#line 1538 "pir.y"
+#line 1543 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival) + 1], "%T%i", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].ival));
@@ -3722,7 +3723,7 @@
     break;
 
   case 215:
-#line 1546 "pir.y"
+#line 1551 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival) + 1], "%T%n", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].dval));
@@ -3734,7 +3735,7 @@
     break;
 
   case 216:
-#line 1555 "pir.y"
+#line 1560 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%s", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].sval));
@@ -3746,32 +3747,32 @@
     break;
 
   case 217:
-#line 1564 "pir.y"
+#line 1569 "pir.y"
     { (yyval.ival) = evaluate_i_i((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 218:
-#line 1566 "pir.y"
+#line 1571 "pir.y"
     { (yyval.ival) = evaluate_i_n((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 219:
-#line 1568 "pir.y"
+#line 1573 "pir.y"
     { (yyval.ival) = evaluate_n_i((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 220:
-#line 1570 "pir.y"
+#line 1575 "pir.y"
     { (yyval.ival) = evaluate_n_n((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 221:
-#line 1572 "pir.y"
+#line 1577 "pir.y"
     { (yyval.ival) = evaluate_s_s((yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 222:
-#line 1576 "pir.y"
+#line 1581 "pir.y"
     {
                           yypirerror(yyscanner, lexer, "cannot compare string to %s",
                                      (yyvsp[(3) - (3)].ival) == INT_TYPE ? "integer" : "number");
@@ -3779,37 +3780,37 @@
     break;
 
   case 223:
-#line 1581 "pir.y"
+#line 1586 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare integer to string"); ;}
     break;
 
   case 224:
-#line 1583 "pir.y"
+#line 1588 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare number to string"); ;}
     break;
 
   case 225:
-#line 1587 "pir.y"
+#line 1592 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 226:
-#line 1588 "pir.y"
+#line 1593 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 227:
-#line 1591 "pir.y"
+#line 1596 "pir.y"
     { (yyval.ival) = DONT_INVERT_OPNAME; /* no need to invert */ ;}
     break;
 
   case 228:
-#line 1592 "pir.y"
+#line 1597 "pir.y"
     { (yyval.ival) = NEED_INVERT_OPNAME; /* yes, invert opname */ ;}
     break;
 
   case 231:
-#line 1600 "pir.y"
+#line 1605 "pir.y"
     {
                           set_instrf(lexer, "branch", "%I", (yyvsp[(2) - (3)].sval));
                           set_op_labelflag(lexer, BIT(0)); /* bit 0 means: "1 << 0" */
@@ -3818,37 +3819,37 @@
     break;
 
   case 232:
-#line 1608 "pir.y"
+#line 1613 "pir.y"
     { declare_local(lexer, (yyvsp[(2) - (4)].ival), (yyvsp[(3) - (4)].symb)); ;}
     break;
 
   case 233:
-#line 1612 "pir.y"
+#line 1617 "pir.y"
     { (yyval.symb) = (yyvsp[(1) - (1)].symb); ;}
     break;
 
   case 234:
-#line 1614 "pir.y"
+#line 1619 "pir.y"
     { (yyval.symb) = add_local((yyvsp[(1) - (3)].symb), (yyvsp[(3) - (3)].symb)); ;}
     break;
 
   case 235:
-#line 1618 "pir.y"
+#line 1623 "pir.y"
     { (yyval.symb) = new_local(lexer, (yyvsp[(1) - (2)].sval), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 236:
-#line 1621 "pir.y"
+#line 1626 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 237:
-#line 1622 "pir.y"
+#line 1627 "pir.y"
     { (yyval.ival) = 1; ;}
     break;
 
   case 238:
-#line 1626 "pir.y"
+#line 1631 "pir.y"
     { /* if $4 is not a register, it must be a declared symbol */
                           if (!TEST_FLAG((yyvsp[(4) - (5)].targ)->flags, TARGET_FLAG_IS_REG)) {
 
@@ -3861,12 +3862,12 @@
     break;
 
   case 239:
-#line 1641 "pir.y"
+#line 1646 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 242:
-#line 1653 "pir.y"
+#line 1658 "pir.y"
     { /* $4 contains an invocation object */
                               set_invocation_args(lexer, (yyvsp[(4) - (8)].invo), (yyvsp[(3) - (8)].argm));
                               (yyval.invo) = set_invocation_results(lexer, (yyvsp[(4) - (8)].invo), (yyvsp[(6) - (8)].targ));
@@ -3874,72 +3875,72 @@
     break;
 
   case 243:
-#line 1660 "pir.y"
+#line 1665 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 244:
-#line 1662 "pir.y"
+#line 1667 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 245:
-#line 1666 "pir.y"
+#line 1671 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 246:
-#line 1668 "pir.y"
+#line 1673 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 247:
-#line 1672 "pir.y"
+#line 1677 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 248:
-#line 1676 "pir.y"
+#line 1681 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(2) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 249:
-#line 1678 "pir.y"
+#line 1683 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_NCI, (yyvsp[(2) - (2)].targ)); ;}
     break;
 
   case 250:
-#line 1681 "pir.y"
+#line 1686 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_METHOD, (yyvsp[(2) - (5)].targ), (yyvsp[(5) - (5)].expr)); ;}
     break;
 
   case 251:
-#line 1685 "pir.y"
+#line 1690 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 252:
-#line 1687 "pir.y"
+#line 1692 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (2)].targ); ;}
     break;
 
   case 253:
-#line 1691 "pir.y"
+#line 1696 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 254:
-#line 1693 "pir.y"
+#line 1698 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 255:
-#line 1697 "pir.y"
+#line 1702 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 256:
-#line 1699 "pir.y"
+#line 1704 "pir.y"
     {
                              if ((yyvsp[(2) - (2)].targ))
                                  (yyval.targ) = add_target(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].targ));
@@ -3949,32 +3950,32 @@
     break;
 
   case 257:
-#line 1708 "pir.y"
+#line 1713 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (3)].targ); ;}
     break;
 
   case 258:
-#line 1710 "pir.y"
+#line 1715 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 260:
-#line 1718 "pir.y"
+#line 1723 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 261:
-#line 1720 "pir.y"
+#line 1725 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 262:
-#line 1722 "pir.y"
+#line 1727 "pir.y"
     {  (yyval.invo) = set_invocation_results(lexer, (yyvsp[(1) - (1)].invo), NULL); ;}
     break;
 
   case 265:
-#line 1730 "pir.y"
+#line 1735 "pir.y"
     {
                              /* if $1 is not a register, check whether the symbol was declared */
                              if (!TEST_FLAG((yyvsp[(1) - (4)].targ)->flags, TARGET_FLAG_IS_REG)) {
@@ -3995,7 +3996,7 @@
     break;
 
   case 266:
-#line 1750 "pir.y"
+#line 1755 "pir.y"
     {
                              (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(1) - (2)].targ), NULL);
                              set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (2)].argm));
@@ -4003,12 +4004,12 @@
     break;
 
   case 267:
-#line 1757 "pir.y"
+#line 1762 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 268:
-#line 1759 "pir.y"
+#line 1764 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4019,7 +4020,7 @@
     break;
 
   case 269:
-#line 1769 "pir.y"
+#line 1774 "pir.y"
     { /* check that this identifier was declared */
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
 
@@ -4039,22 +4040,22 @@
     break;
 
   case 270:
-#line 1786 "pir.y"
+#line 1791 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 271:
-#line 1788 "pir.y"
+#line 1793 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 272:
-#line 1790 "pir.y"
+#line 1795 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval))); ;}
     break;
 
   case 273:
-#line 1794 "pir.y"
+#line 1799 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4066,74 +4067,74 @@
     break;
 
   case 274:
-#line 1803 "pir.y"
+#line 1808 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 275:
-#line 1808 "pir.y"
+#line 1813 "pir.y"
     {
                              (yyval.targ) = (yyvsp[(2) - (3)].targ);
                            ;}
     break;
 
   case 276:
-#line 1814 "pir.y"
+#line 1819 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 277:
-#line 1816 "pir.y"
+#line 1821 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 278:
-#line 1820 "pir.y"
+#line 1825 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 279:
-#line 1822 "pir.y"
+#line 1827 "pir.y"
     { (yyval.targ) = add_target(lexer, (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 280:
-#line 1826 "pir.y"
+#line 1831 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 281:
-#line 1828 "pir.y"
+#line 1833 "pir.y"
     { (yyval.targ) = set_param_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 282:
-#line 1832 "pir.y"
+#line 1837 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 283:
-#line 1834 "pir.y"
+#line 1839 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 284:
-#line 1838 "pir.y"
+#line 1843 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPTIONAL; ;}
     break;
 
   case 285:
-#line 1840 "pir.y"
+#line 1845 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPT_FLAG; ;}
     break;
 
   case 286:
-#line 1842 "pir.y"
+#line 1847 "pir.y"
     { (yyval.ival) = TARGET_FLAG_SLURPY; ;}
     break;
 
   case 287:
-#line 1844 "pir.y"
+#line 1849 "pir.y"
     {
                              (yyval.ival) = TARGET_FLAG_NAMED;
                              set_param_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4141,12 +4142,12 @@
     break;
 
   case 288:
-#line 1854 "pir.y"
+#line 1859 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 293:
-#line 1864 "pir.y"
+#line 1869 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4154,7 +4155,7 @@
     break;
 
   case 294:
-#line 1869 "pir.y"
+#line 1874 "pir.y"
     { /* was the invocation a method call? then it becomes a method tail
                                * call, otherwise it's just a normal (sub) tail call.
                                */
@@ -4166,7 +4167,7 @@
     break;
 
   case 295:
-#line 1880 "pir.y"
+#line 1885 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4174,47 +4175,47 @@
     break;
 
   case 296:
-#line 1887 "pir.y"
+#line 1892 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 297:
-#line 1891 "pir.y"
+#line 1896 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 298:
-#line 1893 "pir.y"
+#line 1898 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 299:
-#line 1897 "pir.y"
+#line 1902 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 300:
-#line 1899 "pir.y"
+#line 1904 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (3)].argm), (yyvsp[(3) - (3)].argm)); ;}
     break;
 
   case 303:
-#line 1907 "pir.y"
+#line 1912 "pir.y"
     { (yyval.argm) = set_arg_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 304:
-#line 1911 "pir.y"
+#line 1916 "pir.y"
     { (yyval.argm) = set_arg_flag((yyval.argm), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 305:
-#line 1915 "pir.y"
+#line 1920 "pir.y"
     { (yyval.argm) = set_curarg(lexer, new_argument(lexer, (yyvsp[(1) - (1)].expr)));  ;}
     break;
 
   case 306:
-#line 1921 "pir.y"
+#line 1926 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4222,7 +4223,7 @@
     break;
 
   case 307:
-#line 1930 "pir.y"
+#line 1935 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4230,72 +4231,72 @@
     break;
 
   case 308:
-#line 1937 "pir.y"
+#line 1942 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 309:
-#line 1939 "pir.y"
+#line 1944 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 310:
-#line 1944 "pir.y"
+#line 1949 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 311:
-#line 1946 "pir.y"
+#line 1951 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 312:
-#line 1951 "pir.y"
+#line 1956 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 313:
-#line 1955 "pir.y"
+#line 1960 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 314:
-#line 1957 "pir.y"
+#line 1962 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 315:
-#line 1961 "pir.y"
+#line 1966 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 316:
-#line 1963 "pir.y"
+#line 1968 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 317:
-#line 1967 "pir.y"
+#line 1972 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 318:
-#line 1972 "pir.y"
+#line 1977 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 319:
-#line 1974 "pir.y"
+#line 1979 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 320:
-#line 1978 "pir.y"
+#line 1983 "pir.y"
     { (yyval.ival) = ARG_FLAG_FLAT; ;}
     break;
 
   case 321:
-#line 1980 "pir.y"
+#line 1985 "pir.y"
     {
                                (yyval.ival) = ARG_FLAG_NAMED;
                                set_arg_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4303,137 +4304,137 @@
     break;
 
   case 322:
-#line 1987 "pir.y"
+#line 1992 "pir.y"
     { (yyval.sval) = NULL; ;}
     break;
 
   case 323:
-#line 1989 "pir.y"
+#line 1994 "pir.y"
     { (yyval.sval) = (yyvsp[(1) - (1)].sval); ;}
     break;
 
   case 324:
-#line 1993 "pir.y"
+#line 1998 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 328:
-#line 2004 "pir.y"
-    { store_global_constant(lexer, (yyvsp[(2) - (2)].cval)); ;}
+#line 2010 "pir.y"
+    { store_global_constant(lexer, (yyvsp[(2) - (2)].cdec)); ;}
     break;
 
   case 329:
-#line 2008 "pir.y"
+#line 2014 "pir.y"
     { /* XXX is .globalconst to be kept? */ ;}
     break;
 
   case 330:
-#line 2012 "pir.y"
-    { (yyval.cval) = new_named_const(lexer, INT_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
+#line 2018 "pir.y"
+    { (yyval.cdec) = new_named_const(lexer, INT_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
     break;
 
   case 331:
-#line 2014 "pir.y"
-    { (yyval.cval) = new_named_const(lexer, NUM_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
+#line 2020 "pir.y"
+    { (yyval.cdec) = new_named_const(lexer, NUM_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
     break;
 
   case 332:
-#line 2016 "pir.y"
-    { (yyval.cval) = new_named_const(lexer, STRING_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
+#line 2022 "pir.y"
+    { (yyval.cdec) = new_named_const(lexer, STRING_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 333:
-#line 2018 "pir.y"
-    { (yyval.cval) = new_pmc_const(lexer, (yyvsp[(1) - (4)].sval), (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].cval)); ;}
+#line 2024 "pir.y"
+    { (yyval.cdec) = new_pmc_const(lexer, (yyvsp[(1) - (4)].sval), (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].cval)); ;}
     break;
 
   case 334:
-#line 2025 "pir.y"
+#line 2031 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 335:
-#line 2026 "pir.y"
+#line 2032 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 336:
-#line 2030 "pir.y"
+#line 2036 "pir.y"
     { (yyval.cval) = new_const(lexer, INT_VAL, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 337:
-#line 2031 "pir.y"
+#line 2037 "pir.y"
     { (yyval.cval) = new_const(lexer, NUM_VAL, (yyvsp[(1) - (1)].dval)); ;}
     break;
 
   case 339:
-#line 2035 "pir.y"
+#line 2041 "pir.y"
     { (yyval.cval) = new_const(lexer, STRING_VAL, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 340:
-#line 2036 "pir.y"
+#line 2042 "pir.y"
     { (yyval.cval) = new_const(lexer, USTRING_VAL, (yyvsp[(1) - (1)].ustr)); ;}
     break;
 
   case 341:
-#line 2039 "pir.y"
+#line 2045 "pir.y"
     { (yyval.ival) = OP_NE; ;}
     break;
 
   case 342:
-#line 2040 "pir.y"
+#line 2046 "pir.y"
     { (yyval.ival) = OP_EQ; ;}
     break;
 
   case 343:
-#line 2041 "pir.y"
+#line 2047 "pir.y"
     { (yyval.ival) = OP_LT; ;}
     break;
 
   case 344:
-#line 2042 "pir.y"
+#line 2048 "pir.y"
     { (yyval.ival) = OP_LE; ;}
     break;
 
   case 345:
-#line 2043 "pir.y"
+#line 2049 "pir.y"
     { (yyval.ival) = OP_GE; ;}
     break;
 
   case 346:
-#line 2044 "pir.y"
+#line 2050 "pir.y"
     { (yyval.ival) = OP_GT; ;}
     break;
 
   case 347:
-#line 2047 "pir.y"
+#line 2053 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 348:
-#line 2048 "pir.y"
+#line 2054 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 349:
-#line 2049 "pir.y"
+#line 2055 "pir.y"
     { (yyval.ival) = PMC_TYPE; ;}
     break;
 
   case 350:
-#line 2050 "pir.y"
+#line 2056 "pir.y"
     { (yyval.ival) = STRING_TYPE; ;}
     break;
 
   case 351:
-#line 2058 "pir.y"
+#line 2064 "pir.y"
     { set_curtarget(lexer, (yyvsp[(1) - (1)].targ));  ;}
     break;
 
   case 353:
-#line 2062 "pir.y"
+#line 2068 "pir.y"
     { /* a symbol must have been declared; check that at this point. */
                            symbol * sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                            if (sym == NULL) {
@@ -4446,277 +4447,277 @@
     break;
 
   case 354:
-#line 2073 "pir.y"
+#line 2079 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 355:
-#line 2074 "pir.y"
+#line 2080 "pir.y"
     { (yyval.targ) = new_reg(lexer, NUM_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 356:
-#line 2075 "pir.y"
+#line 2081 "pir.y"
     { (yyval.targ) = new_reg(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 357:
-#line 2076 "pir.y"
+#line 2082 "pir.y"
     { (yyval.targ) = new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 360:
-#line 2084 "pir.y"
+#line 2090 "pir.y"
     { (yyval.sval) = "if"; ;}
     break;
 
   case 361:
-#line 2085 "pir.y"
+#line 2091 "pir.y"
     { (yyval.sval) = "unless"; ;}
     break;
 
   case 362:
-#line 2086 "pir.y"
+#line 2092 "pir.y"
     { (yyval.sval) = "goto"; ;}
     break;
 
   case 363:
-#line 2087 "pir.y"
+#line 2093 "pir.y"
     { (yyval.sval) = "int"; ;}
     break;
 
   case 364:
-#line 2088 "pir.y"
+#line 2094 "pir.y"
     { (yyval.sval) = "num"; ;}
     break;
 
   case 365:
-#line 2089 "pir.y"
+#line 2095 "pir.y"
     { (yyval.sval) = "string"; ;}
     break;
 
   case 366:
-#line 2090 "pir.y"
+#line 2096 "pir.y"
     { (yyval.sval) = "pmc"; ;}
     break;
 
   case 367:
-#line 2091 "pir.y"
+#line 2097 "pir.y"
     { (yyval.sval) = "null"; ;}
     break;
 
   case 368:
-#line 2094 "pir.y"
+#line 2100 "pir.y"
     { (yyval.sval) = "neg"; ;}
     break;
 
   case 369:
-#line 2095 "pir.y"
+#line 2101 "pir.y"
     { (yyval.sval) = "not"; ;}
     break;
 
   case 370:
-#line 2096 "pir.y"
+#line 2102 "pir.y"
     { (yyval.sval) = "bnot"; ;}
     break;
 
   case 371:
-#line 2099 "pir.y"
+#line 2105 "pir.y"
     { (yyval.ival) = OP_ADD; ;}
     break;
 
   case 372:
-#line 2100 "pir.y"
+#line 2106 "pir.y"
     { (yyval.ival) = OP_SUB; ;}
     break;
 
   case 373:
-#line 2101 "pir.y"
+#line 2107 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 374:
-#line 2102 "pir.y"
+#line 2108 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 375:
-#line 2103 "pir.y"
+#line 2109 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 376:
-#line 2104 "pir.y"
+#line 2110 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 377:
-#line 2105 "pir.y"
+#line 2111 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 378:
-#line 2106 "pir.y"
+#line 2112 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 379:
-#line 2107 "pir.y"
+#line 2113 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 380:
-#line 2108 "pir.y"
+#line 2114 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 381:
-#line 2109 "pir.y"
+#line 2115 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 382:
-#line 2110 "pir.y"
+#line 2116 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 383:
-#line 2111 "pir.y"
+#line 2117 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 384:
-#line 2112 "pir.y"
+#line 2118 "pir.y"
     { (yyval.ival) = OP_OR; ;}
     break;
 
   case 385:
-#line 2113 "pir.y"
+#line 2119 "pir.y"
     { (yyval.ival) = OP_AND; ;}
     break;
 
   case 386:
-#line 2114 "pir.y"
+#line 2120 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 387:
-#line 2115 "pir.y"
+#line 2121 "pir.y"
     { (yyval.ival) = OP_XOR; ;}
     break;
 
   case 388:
-#line 2116 "pir.y"
+#line 2122 "pir.y"
     { (yyval.ival) = OP_ISEQ; ;}
     break;
 
   case 389:
-#line 2117 "pir.y"
+#line 2123 "pir.y"
     { (yyval.ival) = OP_ISLE; ;}
     break;
 
   case 390:
-#line 2118 "pir.y"
+#line 2124 "pir.y"
     { (yyval.ival) = OP_ISLT; ;}
     break;
 
   case 391:
-#line 2119 "pir.y"
+#line 2125 "pir.y"
     { (yyval.ival) = OP_ISGE; ;}
     break;
 
   case 392:
-#line 2120 "pir.y"
+#line 2126 "pir.y"
     { (yyval.ival) = OP_ISGT; ;}
     break;
 
   case 393:
-#line 2121 "pir.y"
+#line 2127 "pir.y"
     { (yyval.ival) = OP_ISNE; ;}
     break;
 
   case 394:
-#line 2127 "pir.y"
+#line 2133 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 395:
-#line 2128 "pir.y"
+#line 2134 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 396:
-#line 2129 "pir.y"
+#line 2135 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 397:
-#line 2130 "pir.y"
+#line 2136 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 398:
-#line 2131 "pir.y"
+#line 2137 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 399:
-#line 2132 "pir.y"
+#line 2138 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 400:
-#line 2133 "pir.y"
+#line 2139 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 401:
-#line 2134 "pir.y"
+#line 2140 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 402:
-#line 2135 "pir.y"
+#line 2141 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 403:
-#line 2136 "pir.y"
+#line 2142 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 404:
-#line 2137 "pir.y"
+#line 2143 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 405:
-#line 2138 "pir.y"
+#line 2144 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 407:
-#line 2159 "pir.y"
+#line 2165 "pir.y"
     { new_subr(lexer, "@start"); ;}
     break;
 
   case 416:
-#line 2175 "pir.y"
+#line 2181 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 421:
-#line 2185 "pir.y"
+#line 2191 "pir.y"
     { set_sub_name(lexer, (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 422:
-#line 2189 "pir.y"
+#line 2195 "pir.y"
     { new_subr(lexer, NULL); ;}
     break;
 
   case 423:
-#line 2194 "pir.y"
+#line 2200 "pir.y"
     {
                                   if (is_parrot_op(lexer, (yyvsp[(1) - (3)].sval)))
                                       get_opinfo(yyscanner);
@@ -4728,7 +4729,7 @@
 
 
 /* Line 1267 of yacc.c.  */
-#line 4732 "pirparser.c"
+#line 4733 "pirparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -4942,7 +4943,7 @@
 }
 
 
-#line 2205 "pir.y"
+#line 2211 "pir.y"
 
 
 

Modified: trunk/compilers/pirc/src/pirparser.h
==============================================================================
--- trunk/compilers/pirc/src/pirparser.h	(original)
+++ trunk/compilers/pirc/src/pirparser.h	Sun Jan  4 06:29:52 2009
@@ -287,6 +287,7 @@
     unsigned            uval;
     char   const       *sval;
     struct constant    *cval;
+    struct constdecl   *cdec;
     struct ucstring    *ustr;
     struct instruction *instr;
     struct expression  *expr;
@@ -299,7 +300,7 @@
     struct macro_param *pval;
 }
 /* Line 1489 of yacc.c.  */
-#line 303 "pirparser.h"
+#line 304 "pirparser.h"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1

Modified: trunk/compilers/pirc/src/pirsymbol.c
==============================================================================
--- trunk/compilers/pirc/src/pirsymbol.c	(original)
+++ trunk/compilers/pirc/src/pirsymbol.c	Sun Jan  4 06:29:52 2009
@@ -310,7 +310,7 @@
     hashtable    *table    = &CURRENT_SUB(lexer)->symbols;
     unsigned long hashcode = get_hashcode(name, table->size);
     bucket       *buck     = get_bucket(table, hashcode);
-    constant     *c;
+    constdecl    *c;
 
 
     while (buck) {
@@ -613,13 +613,13 @@
 
 */
 void
-store_global_constant(NOTNULL(lexer_state * const lexer), NOTNULL(constant * const c)) {
+store_global_constant(NOTNULL(lexer_state * const lexer), NOTNULL(constdecl * const c)) {
     hashtable    *table  = &lexer->constants;
     unsigned long hash   = get_hashcode(c->name, table->size);
     bucket *b            = new_bucket(lexer);
     bucket_constant(b)   = c;
     store_bucket(table, b, hash);
-
+    fprintf(stderr, "store global constant\n");
 }
 
 /*
@@ -635,7 +635,7 @@
 */
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
-constant *
+constdecl *
 find_global_constant(NOTNULL(lexer_state * const lexer), NOTNULL(char const * const name)) {
     hashtable    *table    = &lexer->constants;
     unsigned long hashcode = get_hashcode(name, table->size);

Modified: trunk/compilers/pirc/src/pirsymbol.h
==============================================================================
--- trunk/compilers/pirc/src/pirsymbol.h	(original)
+++ trunk/compilers/pirc/src/pirsymbol.h	Sun Jan  4 06:29:52 2009
@@ -97,10 +97,10 @@
 global_label *find_global_label(struct lexer_state * const lexer, char const * const name);
 
 /* store a global .const symbol */
-void store_global_constant(struct lexer_state * const lexer, constant * const c);
+void store_global_constant(struct lexer_state * const lexer, constdecl * const c);
 
 /* find a global .const symbol */
-constant *find_global_constant(struct lexer_state * const lexer, char const * const name);
+constdecl *find_global_constant(struct lexer_state * const lexer, char const * const name);
 
 void assign_vanilla_register(struct lexer_state * const lexer, symbol * const sym);
 



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About