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

[email protected]
Newsgroups perl.cvs.parrot
Message-ID <[email protected]>
Author: kjs
Date: Sun Jan 18 05:59:00 2009
New Revision: 35717

Modified:
   trunk/compilers/pirc/src/pir.y
   trunk/compilers/pirc/src/piremit.c
   trunk/compilers/pirc/src/pirparser.c
   trunk/compilers/pirc/src/pirpcc.c
   trunk/compilers/pirc/src/pirpcc.h

Log:
[pirc] fix annotations and code generation for .get_results() (exception handling).

Modified: trunk/compilers/pirc/src/pir.y
==============================================================================
--- trunk/compilers/pirc/src/pir.y	(original)
+++ trunk/compilers/pirc/src/pir.y	Sun Jan 18 05:59:00 2009
@@ -990,8 +990,7 @@
 
 getresults_stat   : ".get_results" opt_target_list "\n"
                          {
-                           set_instrf(lexer, "get_results", "%T", $2);
-                           get_opinfo(lexer);
+                           generate_getresults_instr(lexer, $2);
                          }
                   ;
 

Modified: trunk/compilers/pirc/src/piremit.c
==============================================================================
--- trunk/compilers/pirc/src/piremit.c	(original)
+++ trunk/compilers/pirc/src/piremit.c	Sun Jan 18 05:59:00 2009
@@ -909,6 +909,7 @@
 
         opcode_t key, value;
 
+        key = add_string_const(lexer->bc, iter->key, "ascii");
 
         switch (iter->value->type) {
             case INT_VAL:

Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c	(original)
+++ trunk/compilers/pirc/src/pirparser.c	Sun Jan 18 05:59:00 2009
@@ -1074,37 +1074,37 @@
      878,   879,   880,   881,   882,   883,   884,   885,   886,   887,
      888,   891,   898,   901,   906,   907,   912,   913,   916,   918,
      926,   934,   935,   937,   940,   946,   947,   956,   957,   958,
-     959,   967,   971,   975,   984,   991,   998,  1001,  1002,  1005,
-    1014,  1021,  1024,  1025,  1028,  1029,  1032,  1068,  1070,  1074,
-    1076,  1081,  1083,  1087,  1110,  1114,  1116,  1125,  1136,  1148,
-    1158,  1161,  1162,  1165,  1174,  1183,  1188,  1193,  1214,  1219,
-    1260,  1278,  1285,  1290,  1301,  1312,  1323,  1334,  1339,  1344,
-    1349,  1359,  1378,  1412,  1414,  1416,  1418,  1420,  1422,  1424,
-    1426,  1431,  1440,  1442,  1444,  1446,  1448,  1450,  1452,  1454,
-    1456,  1458,  1470,  1477,  1479,  1485,  1487,  1489,  1491,  1493,
-    1495,  1497,  1499,  1501,  1503,  1505,  1536,  1562,  1570,  1579,
-    1588,  1590,  1592,  1594,  1596,  1600,  1605,  1607,  1612,  1613,
-    1616,  1617,  1620,  1621,  1624,  1632,  1636,  1638,  1642,  1646,
-    1647,  1650,  1665,  1669,  1670,  1673,  1685,  1686,  1690,  1692,
-    1696,  1700,  1702,  1704,  1710,  1711,  1716,  1717,  1721,  1723,
-    1732,  1734,  1738,  1742,  1744,  1746,  1750,  1751,  1754,  1774,
-    1781,  1783,  1793,  1810,  1812,  1814,  1818,  1827,  1832,  1839,
-    1840,  1844,  1846,  1850,  1852,  1857,  1858,  1862,  1864,  1866,
-    1868,  1878,  1882,  1883,  1884,  1885,  1888,  1893,  1904,  1911,
-    1916,  1917,  1921,  1923,  1927,  1928,  1931,  1935,  1939,  1943,
-    1952,  1962,  1963,  1968,  1970,  1975,  1980,  1981,  1985,  1987,
-    1991,  1997,  1998,  2002,  2004,  2012,  2013,  2017,  2021,  2024,
-    2028,  2029,  2032,  2036,  2037,  2040,  2044,  2046,  2048,  2050,
-    2054,  2058,  2059,  2072,  2073,  2077,  2078,  2079,  2082,  2083,
-    2086,  2087,  2088,  2089,  2090,  2091,  2094,  2095,  2096,  2097,
-    2105,  2108,  2109,  2122,  2123,  2124,  2125,  2129,  2130,  2133,
-    2134,  2135,  2136,  2137,  2138,  2139,  2140,  2143,  2144,  2145,
-    2148,  2149,  2150,  2151,  2152,  2153,  2154,  2155,  2156,  2157,
-    2158,  2159,  2160,  2161,  2162,  2163,  2164,  2165,  2166,  2167,
-    2168,  2169,  2170,  2176,  2177,  2178,  2179,  2180,  2181,  2182,
-    2183,  2184,  2185,  2186,  2187,  2199,  2207,  2211,  2212,  2215,
-    2216,  2217,  2218,  2219,  2220,  2223,  2225,  2226,  2229,  2230,
-    2233,  2237,  2242
+     959,   967,   971,   975,   984,   991,   997,  1000,  1001,  1004,
+    1013,  1020,  1023,  1024,  1027,  1028,  1031,  1067,  1069,  1073,
+    1075,  1080,  1082,  1086,  1109,  1113,  1115,  1124,  1135,  1147,
+    1157,  1160,  1161,  1164,  1173,  1182,  1187,  1192,  1213,  1218,
+    1259,  1277,  1284,  1289,  1300,  1311,  1322,  1333,  1338,  1343,
+    1348,  1358,  1377,  1411,  1413,  1415,  1417,  1419,  1421,  1423,
+    1425,  1430,  1439,  1441,  1443,  1445,  1447,  1449,  1451,  1453,
+    1455,  1457,  1469,  1476,  1478,  1484,  1486,  1488,  1490,  1492,
+    1494,  1496,  1498,  1500,  1502,  1504,  1535,  1561,  1569,  1578,
+    1587,  1589,  1591,  1593,  1595,  1599,  1604,  1606,  1611,  1612,
+    1615,  1616,  1619,  1620,  1623,  1631,  1635,  1637,  1641,  1645,
+    1646,  1649,  1664,  1668,  1669,  1672,  1684,  1685,  1689,  1691,
+    1695,  1699,  1701,  1703,  1709,  1710,  1715,  1716,  1720,  1722,
+    1731,  1733,  1737,  1741,  1743,  1745,  1749,  1750,  1753,  1773,
+    1780,  1782,  1792,  1809,  1811,  1813,  1817,  1826,  1831,  1838,
+    1839,  1843,  1845,  1849,  1851,  1856,  1857,  1861,  1863,  1865,
+    1867,  1877,  1881,  1882,  1883,  1884,  1887,  1892,  1903,  1910,
+    1915,  1916,  1920,  1922,  1926,  1927,  1930,  1934,  1938,  1942,
+    1951,  1961,  1962,  1967,  1969,  1974,  1979,  1980,  1984,  1986,
+    1990,  1996,  1997,  2001,  2003,  2011,  2012,  2016,  2020,  2023,
+    2027,  2028,  2031,  2035,  2036,  2039,  2043,  2045,  2047,  2049,
+    2053,  2057,  2058,  2071,  2072,  2076,  2077,  2078,  2081,  2082,
+    2085,  2086,  2087,  2088,  2089,  2090,  2093,  2094,  2095,  2096,
+    2104,  2107,  2108,  2121,  2122,  2123,  2124,  2128,  2129,  2132,
+    2133,  2134,  2135,  2136,  2137,  2138,  2139,  2142,  2143,  2144,
+    2147,  2148,  2149,  2150,  2151,  2152,  2153,  2154,  2155,  2156,
+    2157,  2158,  2159,  2160,  2161,  2162,  2163,  2164,  2165,  2166,
+    2167,  2168,  2169,  2175,  2176,  2177,  2178,  2179,  2180,  2181,
+    2182,  2183,  2184,  2185,  2186,  2198,  2206,  2210,  2211,  2214,
+    2215,  2216,  2217,  2218,  2219,  2222,  2224,  2225,  2228,  2229,
+    2232,  2236,  2241
 };
 #endif
 
@@ -3058,13 +3058,12 @@
   case 135:
 #line 992 "pir.y"
     {
-                           set_instrf(lexer, "get_results", "%T", (yyvsp[(2) - (3)].targ));
-                           get_opinfo(lexer);
+                           generate_getresults_instr(lexer, (yyvsp[(2) - (3)].targ));
                          ;}
     break;
 
   case 139:
-#line 1006 "pir.y"
+#line 1005 "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.
                             */
@@ -3074,7 +3073,7 @@
     break;
 
   case 140:
-#line 1015 "pir.y"
+#line 1014 "pir.y"
     { /* when this rule is activated, the initial identifier must
                            * be a parrot op.
                            */
@@ -3084,7 +3083,7 @@
     break;
 
   case 146:
-#line 1033 "pir.y"
+#line 1032 "pir.y"
     {
                          /* the "instruction" that was set now appears to be
                           * an identifier; get the name, and check its type.
@@ -3121,22 +3120,22 @@
     break;
 
   case 147:
-#line 1069 "pir.y"
+#line 1068 "pir.y"
     { push_operand(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 148:
-#line 1071 "pir.y"
+#line 1070 "pir.y"
     { push_operand(lexer, expr_from_key(lexer, (yyvsp[(1) - (1)].key))); ;}
     break;
 
   case 149:
-#line 1075 "pir.y"
+#line 1074 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 150:
-#line 1077 "pir.y"
+#line 1076 "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));
@@ -3144,17 +3143,17 @@
     break;
 
   case 151:
-#line 1082 "pir.y"
+#line 1081 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 152:
-#line 1084 "pir.y"
+#line 1083 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 153:
-#line 1088 "pir.y"
+#line 1087 "pir.y"
     {
                            /* if $1 is a register, just return that */
                            if (TEST_FLAG((yyvsp[(1) - (2)].targ)->flags, TARGET_FLAG_IS_REG))
@@ -3178,22 +3177,22 @@
     break;
 
   case 154:
-#line 1111 "pir.y"
+#line 1110 "pir.y"
     { (yyval.key) = (yyvsp[(2) - (3)].key); ;}
     break;
 
   case 155:
-#line 1115 "pir.y"
+#line 1114 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 156:
-#line 1117 "pir.y"
+#line 1116 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 157:
-#line 1126 "pir.y"
+#line 1125 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (6)].expr));
@@ -3207,7 +3206,7 @@
     break;
 
   case 158:
-#line 1137 "pir.y"
+#line 1136 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (4)].expr));
@@ -3222,7 +3221,7 @@
     break;
 
   case 159:
-#line 1149 "pir.y"
+#line 1148 "pir.y"
     {
                           unshift_operand(lexer, expr_from_key(lexer, (yyvsp[(4) - (6)].key)));
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (6)].targ)));
@@ -3233,7 +3232,7 @@
     break;
 
   case 163:
-#line 1166 "pir.y"
+#line 1165 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3245,7 +3244,7 @@
     break;
 
   case 164:
-#line 1175 "pir.y"
+#line 1174 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 0.0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3257,7 +3256,7 @@
     break;
 
   case 165:
-#line 1184 "pir.y"
+#line 1183 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%C", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].cval));
                           get_opinfo(lexer);
@@ -3265,7 +3264,7 @@
     break;
 
   case 166:
-#line 1189 "pir.y"
+#line 1188 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(lexer);
@@ -3273,7 +3272,7 @@
     break;
 
   case 167:
-#line 1194 "pir.y"
+#line 1193 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (3)].sval));
                           if (sym) {
@@ -3297,7 +3296,7 @@
     break;
 
   case 168:
-#line 1215 "pir.y"
+#line 1214 "pir.y"
     {
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (3)].targ)));
                           get_opinfo(lexer);
@@ -3305,7 +3304,7 @@
     break;
 
   case 169:
-#line 1220 "pir.y"
+#line 1219 "pir.y"
     {
                           /*   $P0 = foo ["bar"]    # PIR style
                            *
@@ -3349,7 +3348,7 @@
     break;
 
   case 170:
-#line 1261 "pir.y"
+#line 1260 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (4)].sval));
                           target *t;
@@ -3370,7 +3369,7 @@
     break;
 
   case 171:
-#line 1279 "pir.y"
+#line 1278 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (4)].ival));
                           set_target_key(preg, (yyvsp[(4) - (4)].key));
@@ -3380,7 +3379,7 @@
     break;
 
   case 172:
-#line 1286 "pir.y"
+#line 1285 "pir.y"
     {
                           set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%E", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].expr));
                           get_opinfo(lexer);
@@ -3388,7 +3387,7 @@
     break;
 
   case 173:
-#line 1291 "pir.y"
+#line 1290 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3402,7 +3401,7 @@
     break;
 
   case 174:
-#line 1302 "pir.y"
+#line 1301 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3416,7 +3415,7 @@
     break;
 
   case 175:
-#line 1313 "pir.y"
+#line 1312 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3430,7 +3429,7 @@
     break;
 
   case 176:
-#line 1324 "pir.y"
+#line 1323 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3444,7 +3443,7 @@
     break;
 
   case 177:
-#line 1335 "pir.y"
+#line 1334 "pir.y"
     {
                           set_instrf(lexer, "add", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(lexer);
@@ -3452,7 +3451,7 @@
     break;
 
   case 178:
-#line 1340 "pir.y"
+#line 1339 "pir.y"
     {
                           set_instrf(lexer, "sub", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(lexer);
@@ -3460,7 +3459,7 @@
     break;
 
   case 179:
-#line 1345 "pir.y"
+#line 1344 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(3) - (4)].sval), "%T%E", (yyvsp[(1) - (4)].targ), (yyvsp[(4) - (4)].expr));
                           get_opinfo(lexer);
@@ -3468,7 +3467,7 @@
     break;
 
   case 180:
-#line 1350 "pir.y"
+#line 1349 "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));
@@ -3481,7 +3480,7 @@
     break;
 
   case 181:
-#line 1360 "pir.y"
+#line 1359 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (4)].sval));
                           target *t;
@@ -3503,7 +3502,7 @@
     break;
 
   case 182:
-#line 1379 "pir.y"
+#line 1378 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (4)].ival));
                           set_target_key(preg, (yyvsp[(2) - (4)].key));
@@ -3513,97 +3512,97 @@
     break;
 
   case 183:
-#line 1413 "pir.y"
+#line 1412 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%i%T", (yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 184:
-#line 1415 "pir.y"
+#line 1414 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%n%T", (yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 185:
-#line 1417 "pir.y"
+#line 1416 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%s%T", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 186:
-#line 1419 "pir.y"
+#line 1418 "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 187:
-#line 1421 "pir.y"
+#line 1420 "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 188:
-#line 1423 "pir.y"
+#line 1422 "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 189:
-#line 1425 "pir.y"
+#line 1424 "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 190:
-#line 1427 "pir.y"
+#line 1426 "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 191:
-#line 1432 "pir.y"
+#line 1431 "pir.y"
     { get_opinfo(lexer); ;}
     break;
 
   case 192:
-#line 1441 "pir.y"
+#line 1440 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, (yyvsp[(3) - (5)].sval), (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 193:
-#line 1443 "pir.y"
+#line 1442 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "int", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 194:
-#line 1445 "pir.y"
+#line 1444 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "num", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 195:
-#line 1447 "pir.y"
+#line 1446 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "pmc", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 196:
-#line 1449 "pir.y"
+#line 1448 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "string", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 197:
-#line 1451 "pir.y"
+#line 1450 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "if", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 198:
-#line 1453 "pir.y"
+#line 1452 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "unless", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 199:
-#line 1455 "pir.y"
+#line 1454 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "goto", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 200:
-#line 1457 "pir.y"
+#line 1456 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (5)].ival), 1, "null", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 201:
-#line 1459 "pir.y"
+#line 1458 "pir.y"
     {
                           int istrue = evaluate_c(lexer, (yyvsp[(2) - (4)].cval));
                           /* if "unless", invert the true-ness */
@@ -3618,7 +3617,7 @@
     break;
 
   case 202:
-#line 1471 "pir.y"
+#line 1470 "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));
@@ -3628,12 +3627,12 @@
     break;
 
   case 203:
-#line 1478 "pir.y"
+#line 1477 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 204:
-#line 1480 "pir.y"
+#line 1479 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(1) - (4)].ival) ? "unless" : "if", "%T%I", (yyvsp[(2) - (4)].targ), (yyvsp[(4) - (4)].sval));
                           /* set a flag indicating that the 2nd operand is a label */
@@ -3642,57 +3641,57 @@
     break;
 
   case 205:
-#line 1486 "pir.y"
+#line 1485 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "int", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 206:
-#line 1488 "pir.y"
+#line 1487 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "num", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 207:
-#line 1490 "pir.y"
+#line 1489 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "pmc", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 208:
-#line 1492 "pir.y"
+#line 1491 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "string", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 209:
-#line 1494 "pir.y"
+#line 1493 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "if", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 210:
-#line 1496 "pir.y"
+#line 1495 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "unless", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 211:
-#line 1498 "pir.y"
+#line 1497 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 212:
-#line 1500 "pir.y"
+#line 1499 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 213:
-#line 1502 "pir.y"
+#line 1501 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 214:
-#line 1504 "pir.y"
+#line 1503 "pir.y"
     { create_if_instr(lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 215:
-#line 1506 "pir.y"
+#line 1505 "pir.y"
     {
                           if ((yyvsp[(2) - (4)].ival) == COMPUTE_DURING_RUNTIME) {
                              if ((yyvsp[(1) - (4)].ival) == NEED_INVERT_OPNAME) /* "unless" */
@@ -3720,7 +3719,7 @@
     break;
 
   case 216:
-#line 1537 "pir.y"
+#line 1536 "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
@@ -3749,7 +3748,7 @@
     break;
 
   case 217:
-#line 1563 "pir.y"
+#line 1562 "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));
@@ -3760,7 +3759,7 @@
     break;
 
   case 218:
-#line 1571 "pir.y"
+#line 1570 "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));
@@ -3772,7 +3771,7 @@
     break;
 
   case 219:
-#line 1580 "pir.y"
+#line 1579 "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));
@@ -3784,32 +3783,32 @@
     break;
 
   case 220:
-#line 1589 "pir.y"
+#line 1588 "pir.y"
     { (yyval.ival) = evaluate_i_i((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 221:
-#line 1591 "pir.y"
+#line 1590 "pir.y"
     { (yyval.ival) = evaluate_i_n((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 222:
-#line 1593 "pir.y"
+#line 1592 "pir.y"
     { (yyval.ival) = evaluate_n_i((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 223:
-#line 1595 "pir.y"
+#line 1594 "pir.y"
     { (yyval.ival) = evaluate_n_n((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 224:
-#line 1597 "pir.y"
+#line 1596 "pir.y"
     { (yyval.ival) = evaluate_s_s((yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 225:
-#line 1601 "pir.y"
+#line 1600 "pir.y"
     {
                           yypirerror(yyscanner, lexer, "cannot compare string to %s",
                                      (yyvsp[(3) - (3)].ival) == INT_TYPE ? "integer" : "number");
@@ -3817,37 +3816,37 @@
     break;
 
   case 226:
-#line 1606 "pir.y"
+#line 1605 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare integer to string"); ;}
     break;
 
   case 227:
-#line 1608 "pir.y"
+#line 1607 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare number to string"); ;}
     break;
 
   case 228:
-#line 1612 "pir.y"
+#line 1611 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 229:
-#line 1613 "pir.y"
+#line 1612 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 230:
-#line 1616 "pir.y"
+#line 1615 "pir.y"
     { (yyval.ival) = DONT_INVERT_OPNAME; /* no need to invert */ ;}
     break;
 
   case 231:
-#line 1617 "pir.y"
+#line 1616 "pir.y"
     { (yyval.ival) = NEED_INVERT_OPNAME; /* yes, invert opname */ ;}
     break;
 
   case 234:
-#line 1625 "pir.y"
+#line 1624 "pir.y"
     {
                           set_instrf(lexer, "branch", "%I", (yyvsp[(2) - (3)].sval));
                           set_op_labelflag(lexer, BIT(0)); /* bit 0 means: "1 << 0" */
@@ -3856,37 +3855,37 @@
     break;
 
   case 235:
-#line 1633 "pir.y"
+#line 1632 "pir.y"
     { declare_local(lexer, (yyvsp[(2) - (4)].ival), (yyvsp[(3) - (4)].symb)); ;}
     break;
 
   case 236:
-#line 1637 "pir.y"
+#line 1636 "pir.y"
     { (yyval.symb) = (yyvsp[(1) - (1)].symb); ;}
     break;
 
   case 237:
-#line 1639 "pir.y"
+#line 1638 "pir.y"
     { (yyval.symb) = add_local((yyvsp[(1) - (3)].symb), (yyvsp[(3) - (3)].symb)); ;}
     break;
 
   case 238:
-#line 1643 "pir.y"
+#line 1642 "pir.y"
     { (yyval.symb) = new_local(lexer, (yyvsp[(1) - (2)].sval), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 239:
-#line 1646 "pir.y"
+#line 1645 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 240:
-#line 1647 "pir.y"
+#line 1646 "pir.y"
     { (yyval.ival) = 1; ;}
     break;
 
   case 241:
-#line 1651 "pir.y"
+#line 1650 "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)) {
 
@@ -3899,12 +3898,12 @@
     break;
 
   case 242:
-#line 1666 "pir.y"
+#line 1665 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 245:
-#line 1678 "pir.y"
+#line 1677 "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));
@@ -3912,72 +3911,72 @@
     break;
 
   case 246:
-#line 1685 "pir.y"
+#line 1684 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 247:
-#line 1687 "pir.y"
+#line 1686 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 248:
-#line 1691 "pir.y"
+#line 1690 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 249:
-#line 1693 "pir.y"
+#line 1692 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 250:
-#line 1697 "pir.y"
+#line 1696 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 251:
-#line 1701 "pir.y"
+#line 1700 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(2) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 252:
-#line 1703 "pir.y"
+#line 1702 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_NCI, (yyvsp[(2) - (2)].targ)); ;}
     break;
 
   case 253:
-#line 1706 "pir.y"
+#line 1705 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_METHOD, (yyvsp[(2) - (5)].targ), (yyvsp[(5) - (5)].expr)); ;}
     break;
 
   case 254:
-#line 1710 "pir.y"
+#line 1709 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 255:
-#line 1712 "pir.y"
+#line 1711 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (2)].targ); ;}
     break;
 
   case 256:
-#line 1716 "pir.y"
+#line 1715 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 257:
-#line 1718 "pir.y"
+#line 1717 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 258:
-#line 1722 "pir.y"
+#line 1721 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 259:
-#line 1724 "pir.y"
+#line 1723 "pir.y"
     {
                              if ((yyvsp[(2) - (2)].targ))
                                  (yyval.targ) = add_target(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].targ));
@@ -3987,32 +3986,32 @@
     break;
 
   case 260:
-#line 1733 "pir.y"
+#line 1732 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (3)].targ); ;}
     break;
 
   case 261:
-#line 1735 "pir.y"
+#line 1734 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 263:
-#line 1743 "pir.y"
+#line 1742 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 264:
-#line 1745 "pir.y"
+#line 1744 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 265:
-#line 1747 "pir.y"
+#line 1746 "pir.y"
     {  (yyval.invo) = set_invocation_results(lexer, (yyvsp[(1) - (1)].invo), NULL); ;}
     break;
 
   case 268:
-#line 1755 "pir.y"
+#line 1754 "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)) {
@@ -4033,7 +4032,7 @@
     break;
 
   case 269:
-#line 1775 "pir.y"
+#line 1774 "pir.y"
     {
                              (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(1) - (2)].targ), NULL);
                              set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (2)].argm));
@@ -4041,12 +4040,12 @@
     break;
 
   case 270:
-#line 1782 "pir.y"
+#line 1781 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 271:
-#line 1784 "pir.y"
+#line 1783 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4057,7 +4056,7 @@
     break;
 
   case 272:
-#line 1794 "pir.y"
+#line 1793 "pir.y"
     { /* check that this identifier was declared */
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
 
@@ -4077,22 +4076,22 @@
     break;
 
   case 273:
-#line 1811 "pir.y"
+#line 1810 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 274:
-#line 1813 "pir.y"
+#line 1812 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 275:
-#line 1815 "pir.y"
+#line 1814 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, new_const(lexer, STRING_VAL, (yyvsp[(1) - (1)].sval))); ;}
     break;
 
   case 276:
-#line 1819 "pir.y"
+#line 1818 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4104,74 +4103,74 @@
     break;
 
   case 277:
-#line 1828 "pir.y"
+#line 1827 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 278:
-#line 1833 "pir.y"
+#line 1832 "pir.y"
     {
                              (yyval.targ) = (yyvsp[(2) - (3)].targ);
                            ;}
     break;
 
   case 279:
-#line 1839 "pir.y"
+#line 1838 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 280:
-#line 1841 "pir.y"
+#line 1840 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 281:
-#line 1845 "pir.y"
+#line 1844 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 282:
-#line 1847 "pir.y"
+#line 1846 "pir.y"
     { (yyval.targ) = add_target(lexer, (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 283:
-#line 1851 "pir.y"
+#line 1850 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 284:
-#line 1853 "pir.y"
+#line 1852 "pir.y"
     { (yyval.targ) = set_param_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 285:
-#line 1857 "pir.y"
+#line 1856 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 286:
-#line 1859 "pir.y"
+#line 1858 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 287:
-#line 1863 "pir.y"
+#line 1862 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPTIONAL; ;}
     break;
 
   case 288:
-#line 1865 "pir.y"
+#line 1864 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPT_FLAG; ;}
     break;
 
   case 289:
-#line 1867 "pir.y"
+#line 1866 "pir.y"
     { (yyval.ival) = TARGET_FLAG_SLURPY; ;}
     break;
 
   case 290:
-#line 1869 "pir.y"
+#line 1868 "pir.y"
     {
                              (yyval.ival) = TARGET_FLAG_NAMED;
                              set_param_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4179,12 +4178,12 @@
     break;
 
   case 291:
-#line 1879 "pir.y"
+#line 1878 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 296:
-#line 1889 "pir.y"
+#line 1888 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4192,7 +4191,7 @@
     break;
 
   case 297:
-#line 1894 "pir.y"
+#line 1893 "pir.y"
     { /* was the invocation a method call? then it becomes a method tail
                                * call, otherwise it's just a normal (sub) tail call.
                                */
@@ -4204,7 +4203,7 @@
     break;
 
   case 298:
-#line 1905 "pir.y"
+#line 1904 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4212,47 +4211,47 @@
     break;
 
   case 299:
-#line 1912 "pir.y"
+#line 1911 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 300:
-#line 1916 "pir.y"
+#line 1915 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 301:
-#line 1918 "pir.y"
+#line 1917 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 302:
-#line 1922 "pir.y"
+#line 1921 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 303:
-#line 1924 "pir.y"
+#line 1923 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (3)].argm), (yyvsp[(3) - (3)].argm)); ;}
     break;
 
   case 306:
-#line 1932 "pir.y"
+#line 1931 "pir.y"
     { (yyval.argm) = set_arg_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 307:
-#line 1936 "pir.y"
+#line 1935 "pir.y"
     { (yyval.argm) = set_arg_flag((yyval.argm), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 308:
-#line 1940 "pir.y"
+#line 1939 "pir.y"
     { (yyval.argm) = set_curarg(lexer, new_argument(lexer, (yyvsp[(1) - (1)].expr)));  ;}
     break;
 
   case 309:
-#line 1946 "pir.y"
+#line 1945 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4260,7 +4259,7 @@
     break;
 
   case 310:
-#line 1955 "pir.y"
+#line 1954 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4268,72 +4267,72 @@
     break;
 
   case 311:
-#line 1962 "pir.y"
+#line 1961 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 312:
-#line 1964 "pir.y"
+#line 1963 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 313:
-#line 1969 "pir.y"
+#line 1968 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 314:
-#line 1971 "pir.y"
+#line 1970 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 315:
-#line 1976 "pir.y"
+#line 1975 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 316:
-#line 1980 "pir.y"
+#line 1979 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 317:
-#line 1982 "pir.y"
+#line 1981 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 318:
-#line 1986 "pir.y"
+#line 1985 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 319:
-#line 1988 "pir.y"
+#line 1987 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 320:
-#line 1992 "pir.y"
+#line 1991 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 321:
-#line 1997 "pir.y"
+#line 1996 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 322:
-#line 1999 "pir.y"
+#line 1998 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 323:
-#line 2003 "pir.y"
+#line 2002 "pir.y"
     { (yyval.ival) = ARG_FLAG_FLAT; ;}
     break;
 
   case 324:
-#line 2005 "pir.y"
+#line 2004 "pir.y"
     {
                                (yyval.ival) = ARG_FLAG_NAMED;
                                set_arg_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4341,62 +4340,62 @@
     break;
 
   case 325:
-#line 2012 "pir.y"
+#line 2011 "pir.y"
     { (yyval.sval) = NULL; ;}
     break;
 
   case 326:
-#line 2014 "pir.y"
+#line 2013 "pir.y"
     { (yyval.sval) = (yyvsp[(1) - (1)].sval); ;}
     break;
 
   case 327:
-#line 2018 "pir.y"
+#line 2017 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 329:
-#line 2025 "pir.y"
+#line 2024 "pir.y"
     { store_global_constant(lexer, (yyvsp[(2) - (2)].cdec)); ;}
     break;
 
   case 332:
-#line 2033 "pir.y"
+#line 2032 "pir.y"
     { (yyval.cdec) = (yyvsp[(2) - (2)].cdec); ;}
     break;
 
   case 335:
-#line 2041 "pir.y"
+#line 2040 "pir.y"
     { store_global_constant(lexer, (yyvsp[(2) - (2)].cdec)); ;}
     break;
 
   case 336:
-#line 2045 "pir.y"
+#line 2044 "pir.y"
     { (yyval.cdec) = new_named_const(lexer, INT_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
     break;
 
   case 337:
-#line 2047 "pir.y"
+#line 2046 "pir.y"
     { (yyval.cdec) = new_named_const(lexer, NUM_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
     break;
 
   case 338:
-#line 2049 "pir.y"
+#line 2048 "pir.y"
     { (yyval.cdec) = new_named_const(lexer, STRING_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 339:
-#line 2051 "pir.y"
+#line 2050 "pir.y"
     { (yyval.cdec) = new_named_const(lexer, USTRING_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ustr)); ;}
     break;
 
   case 340:
-#line 2055 "pir.y"
+#line 2054 "pir.y"
     { (yyval.cdec) = new_pmc_const(lexer, (yyvsp[(1) - (4)].sval), (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].cval)); ;}
     break;
 
   case 342:
-#line 2060 "pir.y"
+#line 2059 "pir.y"
     { /* this alternative is necessary, otherwise the parser
                                * just stops when assigning an identifier to a pmc
                                * const, without an error message. That may be
@@ -4407,97 +4406,97 @@
     break;
 
   case 343:
-#line 2072 "pir.y"
+#line 2071 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 344:
-#line 2073 "pir.y"
+#line 2072 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 345:
-#line 2077 "pir.y"
+#line 2076 "pir.y"
     { (yyval.cval) = new_const(lexer, INT_VAL, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 346:
-#line 2078 "pir.y"
+#line 2077 "pir.y"
     { (yyval.cval) = new_const(lexer, NUM_VAL, (yyvsp[(1) - (1)].dval)); ;}
     break;
 
   case 347:
-#line 2079 "pir.y"
+#line 2078 "pir.y"
     { (yyval.cval) = (yyvsp[(1) - (1)].cval); ;}
     break;
 
   case 348:
-#line 2082 "pir.y"
+#line 2081 "pir.y"
     { (yyval.cval) = new_const(lexer, STRING_VAL, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 349:
-#line 2083 "pir.y"
+#line 2082 "pir.y"
     { (yyval.cval) = new_const(lexer, USTRING_VAL, (yyvsp[(1) - (1)].ustr)); ;}
     break;
 
   case 350:
-#line 2086 "pir.y"
+#line 2085 "pir.y"
     { (yyval.ival) = OP_NE; ;}
     break;
 
   case 351:
-#line 2087 "pir.y"
+#line 2086 "pir.y"
     { (yyval.ival) = OP_EQ; ;}
     break;
 
   case 352:
-#line 2088 "pir.y"
+#line 2087 "pir.y"
     { (yyval.ival) = OP_LT; ;}
     break;
 
   case 353:
-#line 2089 "pir.y"
+#line 2088 "pir.y"
     { (yyval.ival) = OP_LE; ;}
     break;
 
   case 354:
-#line 2090 "pir.y"
+#line 2089 "pir.y"
     { (yyval.ival) = OP_GE; ;}
     break;
 
   case 355:
-#line 2091 "pir.y"
+#line 2090 "pir.y"
     { (yyval.ival) = OP_GT; ;}
     break;
 
   case 356:
-#line 2094 "pir.y"
+#line 2093 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 357:
-#line 2095 "pir.y"
+#line 2094 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 358:
-#line 2096 "pir.y"
+#line 2095 "pir.y"
     { (yyval.ival) = PMC_TYPE; ;}
     break;
 
   case 359:
-#line 2097 "pir.y"
+#line 2096 "pir.y"
     { (yyval.ival) = STRING_TYPE; ;}
     break;
 
   case 360:
-#line 2105 "pir.y"
+#line 2104 "pir.y"
     { set_curtarget(lexer, (yyvsp[(1) - (1)].targ));  ;}
     break;
 
   case 362:
-#line 2109 "pir.y"
+#line 2108 "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) {
@@ -4512,277 +4511,277 @@
     break;
 
   case 363:
-#line 2122 "pir.y"
+#line 2121 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 364:
-#line 2123 "pir.y"
+#line 2122 "pir.y"
     { (yyval.targ) = new_reg(lexer, NUM_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 365:
-#line 2124 "pir.y"
+#line 2123 "pir.y"
     { (yyval.targ) = new_reg(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 366:
-#line 2125 "pir.y"
+#line 2124 "pir.y"
     { (yyval.targ) = new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 369:
-#line 2133 "pir.y"
+#line 2132 "pir.y"
     { (yyval.sval) = "if"; ;}
     break;
 
   case 370:
-#line 2134 "pir.y"
+#line 2133 "pir.y"
     { (yyval.sval) = "unless"; ;}
     break;
 
   case 371:
-#line 2135 "pir.y"
+#line 2134 "pir.y"
     { (yyval.sval) = "goto"; ;}
     break;
 
   case 372:
-#line 2136 "pir.y"
+#line 2135 "pir.y"
     { (yyval.sval) = "int"; ;}
     break;
 
   case 373:
-#line 2137 "pir.y"
+#line 2136 "pir.y"
     { (yyval.sval) = "num"; ;}
     break;
 
   case 374:
-#line 2138 "pir.y"
+#line 2137 "pir.y"
     { (yyval.sval) = "string"; ;}
     break;
 
   case 375:
-#line 2139 "pir.y"
+#line 2138 "pir.y"
     { (yyval.sval) = "pmc"; ;}
     break;
 
   case 376:
-#line 2140 "pir.y"
+#line 2139 "pir.y"
     { (yyval.sval) = "null"; ;}
     break;
 
   case 377:
-#line 2143 "pir.y"
+#line 2142 "pir.y"
     { (yyval.sval) = "neg"; ;}
     break;
 
   case 378:
-#line 2144 "pir.y"
+#line 2143 "pir.y"
     { (yyval.sval) = "not"; ;}
     break;
 
   case 379:
-#line 2145 "pir.y"
+#line 2144 "pir.y"
     { (yyval.sval) = "bnot"; ;}
     break;
 
   case 380:
-#line 2148 "pir.y"
+#line 2147 "pir.y"
     { (yyval.ival) = OP_ADD; ;}
     break;
 
   case 381:
-#line 2149 "pir.y"
+#line 2148 "pir.y"
     { (yyval.ival) = OP_SUB; ;}
     break;
 
   case 382:
-#line 2150 "pir.y"
+#line 2149 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 383:
-#line 2151 "pir.y"
+#line 2150 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 384:
-#line 2152 "pir.y"
+#line 2151 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 385:
-#line 2153 "pir.y"
+#line 2152 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 386:
-#line 2154 "pir.y"
+#line 2153 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 387:
-#line 2155 "pir.y"
+#line 2154 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 388:
-#line 2156 "pir.y"
+#line 2155 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 389:
-#line 2157 "pir.y"
+#line 2156 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 390:
-#line 2158 "pir.y"
+#line 2157 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 391:
-#line 2159 "pir.y"
+#line 2158 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 392:
-#line 2160 "pir.y"
+#line 2159 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 393:
-#line 2161 "pir.y"
+#line 2160 "pir.y"
     { (yyval.ival) = OP_OR; ;}
     break;
 
   case 394:
-#line 2162 "pir.y"
+#line 2161 "pir.y"
     { (yyval.ival) = OP_AND; ;}
     break;
 
   case 395:
-#line 2163 "pir.y"
+#line 2162 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 396:
-#line 2164 "pir.y"
+#line 2163 "pir.y"
     { (yyval.ival) = OP_XOR; ;}
     break;
 
   case 397:
-#line 2165 "pir.y"
+#line 2164 "pir.y"
     { (yyval.ival) = OP_ISEQ; ;}
     break;
 
   case 398:
-#line 2166 "pir.y"
+#line 2165 "pir.y"
     { (yyval.ival) = OP_ISLE; ;}
     break;
 
   case 399:
-#line 2167 "pir.y"
+#line 2166 "pir.y"
     { (yyval.ival) = OP_ISLT; ;}
     break;
 
   case 400:
-#line 2168 "pir.y"
+#line 2167 "pir.y"
     { (yyval.ival) = OP_ISGE; ;}
     break;
 
   case 401:
-#line 2169 "pir.y"
+#line 2168 "pir.y"
     { (yyval.ival) = OP_ISGT; ;}
     break;
 
   case 402:
-#line 2170 "pir.y"
+#line 2169 "pir.y"
     { (yyval.ival) = OP_ISNE; ;}
     break;
 
   case 403:
-#line 2176 "pir.y"
+#line 2175 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 404:
-#line 2177 "pir.y"
+#line 2176 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 405:
-#line 2178 "pir.y"
+#line 2177 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 406:
-#line 2179 "pir.y"
+#line 2178 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 407:
-#line 2180 "pir.y"
+#line 2179 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 408:
-#line 2181 "pir.y"
+#line 2180 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 409:
-#line 2182 "pir.y"
+#line 2181 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 410:
-#line 2183 "pir.y"
+#line 2182 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 411:
-#line 2184 "pir.y"
+#line 2183 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 412:
-#line 2185 "pir.y"
+#line 2184 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 413:
-#line 2186 "pir.y"
+#line 2185 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 414:
-#line 2187 "pir.y"
+#line 2186 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 416:
-#line 2208 "pir.y"
+#line 2207 "pir.y"
     { new_subr(lexer, "@start"); ;}
     break;
 
   case 425:
-#line 2224 "pir.y"
+#line 2223 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 430:
-#line 2234 "pir.y"
+#line 2233 "pir.y"
     { set_sub_name(lexer, (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 431:
-#line 2238 "pir.y"
+#line 2237 "pir.y"
     { new_subr(lexer, NULL); ;}
     break;
 
   case 432:
-#line 2243 "pir.y"
+#line 2242 "pir.y"
     {
 
                                   if (is_parrot_op(lexer, (yyvsp[(1) - (3)].sval))) {
@@ -4797,7 +4796,7 @@
 
 
 /* Line 1267 of yacc.c.  */
-#line 4801 "pirparser.c"
+#line 4800 "pirparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -5011,7 +5010,7 @@
 }
 
 
-#line 2257 "pir.y"
+#line 2256 "pir.y"
 
 
 

Modified: trunk/compilers/pirc/src/pirpcc.c
==============================================================================
--- trunk/compilers/pirc/src/pirpcc.c	(original)
+++ trunk/compilers/pirc/src/pirpcc.c	Sun Jan 18 05:59:00 2009
@@ -362,6 +362,33 @@
     /* convert the parameter list into operands. Parameters are stored as target nodes. */
     targets_to_operands(lexer, CURRENT_SUB(lexer)->parameters, num_parameters);
 }
+
+
+/*
+
+=item C<void
+generate_getresults_instr(lexer_state * const lexer, target * const targetlist)>
+
+Generate instruction for the C<.get_results> statement.
+
+=cut
+
+*/
+void
+generate_getresults_instr(lexer_state * const lexer, target * const targetlist) {
+    /* add this point we know that there's only 1 target, as that's the convention for
+     * exception handlers:
+     *
+     * .get_results($P0)
+     *
+     * If exception handlers can take any number of targets, this should be updated
+     * here as well.
+     */
+    new_sub_instr(lexer, PARROT_OP_get_results_pc, "get_results_pc", 1);
+    targets_to_operands(lexer, targetlist, 1);
+}
+
+
 /*
 
 =item C<static void

Modified: trunk/compilers/pirc/src/pirpcc.h
==============================================================================
--- trunk/compilers/pirc/src/pirpcc.h	(original)
+++ trunk/compilers/pirc/src/pirpcc.h	Sun Jan 18 05:59:00 2009
@@ -11,7 +11,7 @@
 
 void convert_inv_to_instr(struct lexer_state * const lexer, invocation * const inv);
 void generate_parameters_instr(struct lexer_state * const lexer, unsigned num_parameters);
-
+void generate_getresults_instr(struct lexer_state * const lexer, target * const targetlist);
 void emit_sub_epilogue(struct lexer_state * const lexer);
 
 #endif /* PARROT_PIR_PIRPCC_H_GUARD */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.