Changes in uspace/app/sbi/src/run_expr.c [6c39a907:caad59a] in mainline
- File:
-
- 1 edited
-
uspace/app/sbi/src/run_expr.c (modified) (45 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/run_expr.c
r6c39a907 rcaad59a 27 27 */ 28 28 29 /** @file Run expressions. */29 /** @file Runner (executes the code). */ 30 30 31 31 #include <stdio.h> … … 109 109 static void run_assign(run_t *run, stree_assign_t *assign, rdata_item_t **res); 110 110 static void run_as(run_t *run, stree_as_t *as_op, rdata_item_t **res); 111 static void run_box(run_t *run, stree_box_t *box, rdata_item_t **res); 112 113 /** Evaluate expression. 114 * 115 * Run the expression @a expr and store pointer to the result in *(@a res). 116 * If the expression has on value (assignment) then @c NULL is returned. 117 * @c NULL is also returned if an error or exception occurs. 118 * 119 * @param run Runner object 120 * @param expr Expression to run 121 * @param res Place to store result 122 */ 111 112 /** Evaluate expression. */ 123 113 void run_expr(run_t *run, stree_expr_t *expr, rdata_item_t **res) 124 114 { … … 161 151 run_as(run, expr->u.as_op, res); 162 152 break; 163 case ec_box:164 run_box(run, expr->u.box, res);165 break;166 153 } 167 154 … … 173 160 } 174 161 175 /** Evaluate name reference expression. 176 * 177 * @param run Runner object 178 * @param nameref Name reference 179 * @param res Place to store result 180 */ 162 /** Evaluate name reference expression. */ 181 163 static void run_nameref(run_t *run, stree_nameref_t *nameref, 182 164 rdata_item_t **res) … … 265 247 assert(csi != NULL); 266 248 267 if (symbol_search_csi(run->program, csi, nameref->name) 268 == NULL) { 249 if (sym->outer_csi != csi) { 269 250 /* Function is not in the current object. */ 270 251 printf("Error: Cannot access non-static member " … … 302 283 assert(obj != NULL); 303 284 304 if (symbol_search_csi(run->program, csi, nameref->name) 305 == NULL) { 285 if (sym->outer_csi != csi) { 306 286 /* Variable is not in the current object. */ 307 287 printf("Error: Cannot access non-static member " … … 336 316 } 337 317 338 /** Evaluate literal. 339 * 340 * @param run Runner object 341 * @param literal Literal 342 * @param res Place to store result 343 */ 318 /** Evaluate literal. */ 344 319 static void run_literal(run_t *run, stree_literal_t *literal, 345 320 rdata_item_t **res) … … 367 342 } 368 343 369 /** Evaluate Boolean literal. 370 * 371 * @param run Runner object 372 * @param lit_bool Boolean literal 373 * @param res Place to store result 374 */ 344 /** Evaluate Boolean literal. */ 375 345 static void run_lit_bool(run_t *run, stree_lit_bool_t *lit_bool, 376 346 rdata_item_t **res) … … 426 396 } 427 397 428 /** Evaluate integer literal. 429 * 430 * @param run Runner object 431 * @param lit_int Integer literal 432 * @param res Place to store result 433 */ 398 /** Evaluate integer literal. */ 434 399 static void run_lit_int(run_t *run, stree_lit_int_t *lit_int, 435 400 rdata_item_t **res) … … 458 423 } 459 424 460 /** Evaluate reference literal (@c nil). 461 * 462 * @param run Runner object 463 * @param lit_ref Reference literal 464 * @param res Place to store result 465 */ 425 /** Evaluate reference literal (@c nil). */ 466 426 static void run_lit_ref(run_t *run, stree_lit_ref_t *lit_ref, 467 427 rdata_item_t **res) … … 491 451 } 492 452 493 /** Evaluate string literal. 494 * 495 * @param run Runner object 496 * @param lit_string String literal 497 * @param res Place to store result 498 */ 453 /** Evaluate string literal. */ 499 454 static void run_lit_string(run_t *run, stree_lit_string_t *lit_string, 500 455 rdata_item_t **res) … … 523 478 } 524 479 525 /** Evaluate @c self reference. 526 * 527 * @param run Runner object 528 * @param self_ref Self reference 529 * @param res Place to store result 530 */ 480 /** Evaluate @c self reference. */ 531 481 static void run_self_ref(run_t *run, stree_self_ref_t *self_ref, 532 482 rdata_item_t **res) … … 544 494 } 545 495 546 /** Evaluate binary operation. 547 * 548 * @param run Runner object 549 * @param binop Binary operation 550 * @param res Place to store result 551 */ 496 /** Evaluate binary operation. */ 552 497 static void run_binop(run_t *run, stree_binop_t *binop, rdata_item_t **res) 553 498 { … … 629 574 } 630 575 631 /** Evaluate binary operation on bool arguments. 632 * 633 * @param run Runner object 634 * @param binop Binary operation 635 * @param v1 Value of first argument 636 * @param v2 Value of second argument 637 * @param res Place to store result 638 */ 576 /** Evaluate binary operation on bool arguments. */ 639 577 static void run_binop_bool(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 640 578 rdata_value_t *v2, rdata_item_t **res) … … 690 628 } 691 629 692 /** Evaluate binary operation on char arguments. 693 * 694 * @param run Runner object 695 * @param binop Binary operation 696 * @param v1 Value of first argument 697 * @param v2 Value of second argument 698 * @param res Place to store result 699 */ 630 /** Evaluate binary operation on char arguments. */ 700 631 static void run_binop_char(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 701 632 rdata_value_t *v2, rdata_item_t **res) … … 760 691 } 761 692 762 /** Evaluate binary operation on int arguments. 763 * 764 * @param run Runner object 765 * @param binop Binary operation 766 * @param v1 Value of first argument 767 * @param v2 Value of second argument 768 * @param res Place to store result 769 */ 693 /** Evaluate binary operation on int arguments. */ 770 694 static void run_binop_int(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 771 695 rdata_value_t *v2, rdata_item_t **res) … … 857 781 } 858 782 859 /** Evaluate binary operation on string arguments. 860 * 861 * @param run Runner object 862 * @param binop Binary operation 863 * @param v1 Value of first argument 864 * @param v2 Value of second argument 865 * @param res Place to store result 866 */ 783 /** Evaluate binary operation on string arguments. */ 867 784 static void run_binop_string(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 868 785 rdata_value_t *v2, rdata_item_t **res) … … 873 790 rdata_string_t *string_v; 874 791 875 c onst char *s1, *s2;792 char *s1, *s2; 876 793 877 794 (void) run; … … 903 820 } 904 821 905 /** Evaluate binary operation on ref arguments. 906 * 907 * @param run Runner object 908 * @param binop Binary operation 909 * @param v1 Value of first argument 910 * @param v2 Value of second argument 911 * @param res Place to store result 912 */ 822 /** Evaluate binary operation on ref arguments. */ 913 823 static void run_binop_ref(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 914 824 rdata_value_t *v2, rdata_item_t **res) … … 952 862 953 863 954 /** Evaluate unary operation. 955 * 956 * @param run Runner object 957 * @param unop Unary operation 958 * @param res Place to store result 959 */ 864 /** Evaluate unary operation. */ 960 865 static void run_unop(run_t *run, stree_unop_t *unop, rdata_item_t **res) 961 866 { … … 993 898 } 994 899 995 /** Evaluate unary operation on int argument. 996 * 997 * @param run Runner object 998 * @param unop Unary operation 999 * @param val Value of argument 1000 * @param res Place to store result 1001 */ 900 /** Evaluate unary operation on int argument. */ 1002 901 static void run_unop_int(run_t *run, stree_unop_t *unop, rdata_value_t *val, 1003 902 rdata_item_t **res) … … 1033 932 1034 933 1035 /** Evaluate @c new operation. 1036 * 1037 * Evaluates operation per the @c new operator that creates a new 1038 * instance of some type. 1039 * 1040 * @param run Runner object 1041 * @param unop Unary operation 1042 * @param res Place to store result 1043 */ 934 /** Evaluate @c new operation. */ 1044 935 static void run_new(run_t *run, stree_new_t *new_op, rdata_item_t **res) 1045 936 { … … 1067 958 } 1068 959 1069 /** Create new array. 1070 * 1071 * @param run Runner object 1072 * @param new_op New operation 1073 * @param titem Type of new var node (tic_tarray) 1074 * @param res Place to store result 1075 */ 960 /** Create new array. */ 1076 961 static void run_new_array(run_t *run, stree_new_t *new_op, 1077 962 tdata_item_t *titem, rdata_item_t **res) … … 1161 1046 /* Create member variables */ 1162 1047 for (i = 0; i < length; ++i) { 1163 /* Create and initialize element. */ 1164 run_var_new(run, tarray->base_ti, &elem_var); 1048 /* XXX Depends on member variable type. */ 1049 elem_var = rdata_var_new(vc_int); 1050 elem_var->u.int_v = rdata_int_new(); 1051 bigint_init(&elem_var->u.int_v->value, 0); 1165 1052 1166 1053 array->element[i] = elem_var; … … 1175 1062 } 1176 1063 1177 /** Create new object. 1178 * 1179 * @param run Runner object 1180 * @param new_op New operation 1181 * @param titem Type of new var node (tic_tobject) 1182 * @param res Place to store result 1183 */ 1064 /** Create new object. */ 1184 1065 static void run_new_object(run_t *run, stree_new_t *new_op, 1185 1066 tdata_item_t *titem, rdata_item_t **res) … … 1200 1081 } 1201 1082 1202 /** Evaluate member acccess. 1203 * 1204 * Evaluate operation per the member access ('.') operator. 1205 * 1206 * @param run Runner object 1207 * @param access Access operation 1208 * @param res Place to store result 1209 */ 1083 /** Evaluate member acccess. */ 1210 1084 static void run_access(run_t *run, stree_access_t *access, rdata_item_t **res) 1211 1085 { … … 1229 1103 } 1230 1104 1231 /** Evaluate member acccess (with base already evaluated). 1232 * 1233 * @param run Runner object 1234 * @param access Access operation 1235 * @param arg Evaluated base expression 1236 * @param res Place to store result 1237 */ 1105 /** Evaluate member acccess (with base already evaluated). */ 1238 1106 static void run_access_item(run_t *run, stree_access_t *access, 1239 1107 rdata_item_t *arg, rdata_item_t **res) … … 1263 1131 } 1264 1132 1265 /** Evaluate reference acccess. 1266 * 1267 * @param run Runner object 1268 * @param access Access operation 1269 * @param arg Evaluated base expression 1270 * @param res Place to store result 1271 */ 1133 /** Evaluate reference acccess. */ 1272 1134 static void run_access_ref(run_t *run, stree_access_t *access, 1273 1135 rdata_item_t *arg, rdata_item_t **res) … … 1287 1149 } 1288 1150 1289 /** Evaluate delegate-member acccess. 1290 * 1291 * @param run Runner object 1292 * @param access Access operation 1293 * @param arg Evaluated base expression 1294 * @param res Place to store result 1295 */ 1151 /** Evaluate delegate-member acccess. */ 1296 1152 static void run_access_deleg(run_t *run, stree_access_t *access, 1297 1153 rdata_item_t *arg, rdata_item_t **res) … … 1336 1192 } 1337 1193 1338 /** Evaluate object member acccess. 1339 * 1340 * @param run Runner object 1341 * @param access Access operation 1342 * @param arg Evaluated base expression 1343 * @param res Place to store result 1344 */ 1194 /** Evaluate object member acccess. */ 1345 1195 static void run_access_object(run_t *run, stree_access_t *access, 1346 1196 rdata_item_t *arg, rdata_item_t **res) … … 1386 1236 #endif 1387 1237 1388 /* Make compiler happy. */1389 ritem = NULL;1390 1391 1238 switch (member->sc) { 1392 1239 case sc_csi: 1393 1240 printf("Error: Accessing object member which is nested CSI.\n"); 1394 1241 exit(1); 1395 case sc_deleg:1396 printf("Error: Accessing object member which is a delegate.\n");1397 exit(1);1398 1242 case sc_fun: 1399 /* Construct anonymousdelegate. */1243 /* Construct delegate. */ 1400 1244 ritem = rdata_item_new(ic_value); 1401 1245 value = rdata_value_new(); … … 1437 1281 addr_prop->u.named->prop_d = deleg_p; 1438 1282 break; 1283 default: 1284 ritem = NULL; 1439 1285 } 1440 1286 … … 1442 1288 } 1443 1289 1444 /** Call a function. 1445 * 1446 * Call a function and return the result in @a res. 1447 * 1448 * @param run Runner object 1449 * @param call Call operation 1450 * @param res Place to store result 1451 */ 1290 /** Call a function. */ 1452 1291 static void run_call(run_t *run, stree_call_t *call, rdata_item_t **res) 1453 1292 { 1454 rdata_item_t *r deleg, *rdeleg_vi;1293 rdata_item_t *rfun; 1455 1294 rdata_deleg_t *deleg_v; 1456 1295 list_t arg_vals; … … 1465 1304 printf("Run call operation.\n"); 1466 1305 #endif 1467 run_expr(run, call->fun, &r deleg);1306 run_expr(run, call->fun, &rfun); 1468 1307 if (run_is_bo(run)) { 1469 1308 *res = NULL; … … 1476 1315 } 1477 1316 1478 run_cvt_value_item(run, rdeleg, &rdeleg_vi); 1479 assert(rdeleg_vi->ic == ic_value); 1480 1481 if (rdeleg_vi->u.value->var->vc != vc_deleg) { 1482 printf("Unimplemented: Call expression of this type ("); 1483 rdata_item_print(rdeleg_vi); 1484 printf(").\n"); 1317 if (rfun->ic != ic_value || rfun->u.value->var->vc != vc_deleg) { 1318 printf("Unimplemented: Call expression of this type.\n"); 1485 1319 exit(1); 1486 1320 } 1487 1321 1488 deleg_v = r deleg_vi->u.value->var->u.deleg_v;1322 deleg_v = rfun->u.value->var->u.deleg_v; 1489 1323 1490 1324 if (deleg_v->sym->sc != sc_fun) { … … 1533 1367 } 1534 1368 1535 /** Run index operation. 1536 * 1537 * Evaluate operation per the indexing ('[', ']') operator. 1538 * 1539 * @param run Runner object 1540 * @param index Index operation 1541 * @param res Place to store result 1542 */ 1369 /** Run index operation. */ 1543 1370 static void run_index(run_t *run, stree_index_t *index, rdata_item_t **res) 1544 1371 { … … 1606 1433 } 1607 1434 1608 /** Run index operation on array. 1609 * 1610 * @param run Runner object 1611 * @param index Index operation 1612 * @param base Evaluated base expression 1613 * @param args Evaluated indices (list of rdata_item_t) 1614 * @param res Place to store result 1615 */ 1435 /** Run index operation on array. */ 1616 1436 static void run_index_array(run_t *run, stree_index_t *index, 1617 1437 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1705 1525 } 1706 1526 1707 /** Index an object (via its indexer). 1708 * 1709 * @param run Runner object 1710 * @param index Index operation 1711 * @param base Evaluated base expression 1712 * @param args Evaluated indices (list of rdata_item_t) 1713 * @param res Place to store result 1714 */ 1527 /** Index an object (via its indexer). */ 1715 1528 static void run_index_object(run_t *run, stree_index_t *index, 1716 1529 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1784 1597 } 1785 1598 1786 /** Run index operation on string. 1787 * 1788 * @param run Runner object 1789 * @param index Index operation 1790 * @param base Evaluated base expression 1791 * @param args Evaluated indices (list of rdata_item_t) 1792 * @param res Place to store result 1793 */ 1599 /** Run index operation on string. */ 1794 1600 static void run_index_string(run_t *run, stree_index_t *index, 1795 1601 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1884 1690 } 1885 1691 1886 /** Run assignment. 1887 * 1888 * Executes an assignment. @c NULL is always stored to @a res because 1889 * an assignment does not have a value. 1890 * 1891 * @param run Runner object 1892 * @param assign Assignment expression 1893 * @param res Place to store result 1894 */ 1692 /** Execute assignment. */ 1895 1693 static void run_assign(run_t *run, stree_assign_t *assign, rdata_item_t **res) 1896 1694 { … … 1929 1727 } 1930 1728 1931 /** Execute @c as conversion. 1932 * 1933 * @param run Runner object 1934 * @param as_op @c as conversion expression 1935 * @param res Place to store result 1936 */ 1729 /** Execute @c as conversion. */ 1937 1730 static void run_as(run_t *run, stree_as_t *as_op, rdata_item_t **res) 1938 1731 { … … 2001 1794 } 2002 1795 2003 /** Execute boxing operation. 2004 * 2005 * XXX We can scrap this special operation once we have constructors. 2006 * 2007 * @param run Runner object 2008 * @param box Boxing operation 2009 * @param res Place to store result 2010 */ 2011 static void run_box(run_t *run, stree_box_t *box, rdata_item_t **res) 2012 { 2013 rdata_item_t *rarg_i; 2014 rdata_item_t *rarg_vi; 2015 2016 stree_symbol_t *csi_sym; 2017 stree_csi_t *csi; 2018 builtin_t *bi; 2019 rdata_var_t *var; 2020 rdata_object_t *object; 2021 2022 sid_t mbr_name_sid; 2023 rdata_var_t *mbr_var; 2024 2025 #ifdef DEBUG_RUN_TRACE 2026 printf("Run boxing operation.\n"); 2027 #endif 2028 run_expr(run, box->arg, &rarg_i); 2029 if (run_is_bo(run)) { 2030 *res = NULL; 2031 return; 2032 } 2033 2034 run_cvt_value_item(run, rarg_i, &rarg_vi); 2035 assert(rarg_vi->ic == ic_value); 2036 2037 bi = run->program->builtin; 2038 2039 /* Just to keep the compiler happy. */ 2040 csi_sym = NULL; 2041 2042 switch (rarg_vi->u.value->var->vc) { 2043 case vc_bool: csi_sym = bi->boxed_bool; break; 2044 case vc_char: csi_sym = bi->boxed_char; break; 2045 case vc_int: csi_sym = bi->boxed_int; break; 2046 case vc_string: csi_sym = bi->boxed_string; break; 2047 2048 case vc_ref: 2049 case vc_deleg: 2050 case vc_array: 2051 case vc_object: 2052 case vc_resource: 2053 assert(b_false); 2054 } 2055 2056 csi = symbol_to_csi(csi_sym); 2057 assert(csi != NULL); 2058 2059 /* Construct object of the relevant boxed type. */ 2060 run_new_csi_inst(run, csi, res); 2061 2062 /* Set the 'Value' field */ 2063 2064 assert((*res)->ic == ic_value); 2065 assert((*res)->u.value->var->vc == vc_ref); 2066 var = (*res)->u.value->var->u.ref_v->vref; 2067 assert(var->vc == vc_object); 2068 object = var->u.object_v; 2069 2070 mbr_name_sid = strtab_get_sid("Value"); 2071 mbr_var = intmap_get(&object->fields, mbr_name_sid); 2072 assert(mbr_var != NULL); 2073 2074 rdata_var_write(mbr_var, rarg_vi->u.value); 2075 } 2076 2077 /** Create new CSI instance. 2078 * 2079 * Create a new object, instance of @a csi. 2080 * XXX This does not work with generics as @a csi cannot specify a generic 2081 * type. 2082 * 2083 * Initialize the fields with default values of their types, but do not 2084 * run any constructor. 2085 * 2086 * @param run Runner object 2087 * @param as_op @c as conversion expression 2088 * @param res Place to store result 2089 */ 1796 /** Create new CSI instance. */ 2090 1797 void run_new_csi_inst(run_t *run, stree_csi_t *csi, rdata_item_t **res) 2091 1798 { … … 2097 1804 2098 1805 rdata_var_t *mbr_var; 1806 2099 1807 list_node_t *node; 2100 tdata_item_t *field_ti;2101 1808 2102 1809 csi_sym = csi_to_symbol(csi); … … 2117 1824 2118 1825 /* Create object fields. */ 2119 while (csi != NULL) { 2120 node = list_first(&csi->members); 2121 while (node != NULL) { 2122 csimbr = list_node_data(node, stree_csimbr_t *); 2123 if (csimbr->cc == csimbr_var) { 2124 /* Compute field type. XXX Memoize. */ 2125 run_texpr(run->program, csi, 2126 csimbr->u.var->type, 2127 &field_ti); 2128 2129 /* Create and initialize field. */ 2130 run_var_new(run, field_ti, &mbr_var); 2131 2132 /* Add to field map. */ 2133 intmap_set(&obj->fields, 2134 csimbr->u.var->name->sid, 2135 mbr_var); 2136 } 2137 2138 node = list_next(&csi->members, node); 1826 node = list_first(&csi->members); 1827 while (node != NULL) { 1828 csimbr = list_node_data(node, stree_csimbr_t *); 1829 if (csimbr->cc == csimbr_var) { 1830 /* XXX Depends on member variable type. */ 1831 mbr_var = rdata_var_new(vc_int); 1832 mbr_var->u.int_v = rdata_int_new(); 1833 bigint_init(&mbr_var->u.int_v->value, 0); 1834 1835 intmap_set(&obj->fields, csimbr->u.var->name->sid, 1836 mbr_var); 2139 1837 } 2140 1838 2141 /* Continue with base CSI */ 2142 csi = csi->base_csi; 1839 node = list_next(&csi->members, node); 2143 1840 } 2144 1841 … … 2149 1846 /** Return boolean value of an item. 2150 1847 * 2151 * Try to interpret @a item as a boolean value. If it is not a boolean 2152 * value, generate an error. 2153 * 2154 * @param run Runner object 2155 * @param item Input item 2156 * @return Resulting boolean value 1848 * Tries to interpret @a item as a boolean value. If it is not a boolean 1849 * value, this generates an error. 2157 1850 */ 2158 1851 bool_t run_item_boolean_value(run_t *run, rdata_item_t *item)
Note:
See TracChangeset
for help on using the changeset viewer.
