Changes in uspace/app/sbi/src/run_expr.c [38aaacc2:caad59a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/run_expr.c
r38aaacc2 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) … … 1390 1240 printf("Error: Accessing object member which is nested CSI.\n"); 1391 1241 exit(1); 1392 case sc_deleg:1393 printf("Error: Accessing object member which is a delegate.\n");1394 exit(1);1395 1242 case sc_fun: 1396 /* Construct anonymousdelegate. */1243 /* Construct delegate. */ 1397 1244 ritem = rdata_item_new(ic_value); 1398 1245 value = rdata_value_new(); … … 1434 1281 addr_prop->u.named->prop_d = deleg_p; 1435 1282 break; 1283 default: 1284 ritem = NULL; 1436 1285 } 1437 1286 … … 1439 1288 } 1440 1289 1441 /** Call a function. 1442 * 1443 * Call a function and return the result in @a res. 1444 * 1445 * @param run Runner object 1446 * @param call Call operation 1447 * @param res Place to store result 1448 */ 1290 /** Call a function. */ 1449 1291 static void run_call(run_t *run, stree_call_t *call, rdata_item_t **res) 1450 1292 { 1451 rdata_item_t *r deleg, *rdeleg_vi;1293 rdata_item_t *rfun; 1452 1294 rdata_deleg_t *deleg_v; 1453 1295 list_t arg_vals; … … 1462 1304 printf("Run call operation.\n"); 1463 1305 #endif 1464 run_expr(run, call->fun, &r deleg);1306 run_expr(run, call->fun, &rfun); 1465 1307 if (run_is_bo(run)) { 1466 1308 *res = NULL; … … 1473 1315 } 1474 1316 1475 run_cvt_value_item(run, rdeleg, &rdeleg_vi); 1476 assert(rdeleg_vi->ic == ic_value); 1477 1478 if (rdeleg_vi->u.value->var->vc != vc_deleg) { 1479 printf("Unimplemented: Call expression of this type ("); 1480 rdata_item_print(rdeleg_vi); 1481 printf(").\n"); 1317 if (rfun->ic != ic_value || rfun->u.value->var->vc != vc_deleg) { 1318 printf("Unimplemented: Call expression of this type.\n"); 1482 1319 exit(1); 1483 1320 } 1484 1321 1485 deleg_v = r deleg_vi->u.value->var->u.deleg_v;1322 deleg_v = rfun->u.value->var->u.deleg_v; 1486 1323 1487 1324 if (deleg_v->sym->sc != sc_fun) { … … 1530 1367 } 1531 1368 1532 /** Run index operation. 1533 * 1534 * Evaluate operation per the indexing ('[', ']') operator. 1535 * 1536 * @param run Runner object 1537 * @param index Index operation 1538 * @param res Place to store result 1539 */ 1369 /** Run index operation. */ 1540 1370 static void run_index(run_t *run, stree_index_t *index, rdata_item_t **res) 1541 1371 { … … 1603 1433 } 1604 1434 1605 /** Run index operation on array. 1606 * 1607 * @param run Runner object 1608 * @param index Index operation 1609 * @param base Evaluated base expression 1610 * @param args Evaluated indices (list of rdata_item_t) 1611 * @param res Place to store result 1612 */ 1435 /** Run index operation on array. */ 1613 1436 static void run_index_array(run_t *run, stree_index_t *index, 1614 1437 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1702 1525 } 1703 1526 1704 /** Index an object (via its indexer). 1705 * 1706 * @param run Runner object 1707 * @param index Index operation 1708 * @param base Evaluated base expression 1709 * @param args Evaluated indices (list of rdata_item_t) 1710 * @param res Place to store result 1711 */ 1527 /** Index an object (via its indexer). */ 1712 1528 static void run_index_object(run_t *run, stree_index_t *index, 1713 1529 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1781 1597 } 1782 1598 1783 /** Run index operation on string. 1784 * 1785 * @param run Runner object 1786 * @param index Index operation 1787 * @param base Evaluated base expression 1788 * @param args Evaluated indices (list of rdata_item_t) 1789 * @param res Place to store result 1790 */ 1599 /** Run index operation on string. */ 1791 1600 static void run_index_string(run_t *run, stree_index_t *index, 1792 1601 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1881 1690 } 1882 1691 1883 /** Run assignment. 1884 * 1885 * Executes an assignment. @c NULL is always stored to @a res because 1886 * an assignment does not have a value. 1887 * 1888 * @param run Runner object 1889 * @param assign Assignment expression 1890 * @param res Place to store result 1891 */ 1692 /** Execute assignment. */ 1892 1693 static void run_assign(run_t *run, stree_assign_t *assign, rdata_item_t **res) 1893 1694 { … … 1926 1727 } 1927 1728 1928 /** Execute @c as conversion. 1929 * 1930 * @param run Runner object 1931 * @param as_op @c as conversion expression 1932 * @param res Place to store result 1933 */ 1729 /** Execute @c as conversion. */ 1934 1730 static void run_as(run_t *run, stree_as_t *as_op, rdata_item_t **res) 1935 1731 { … … 1998 1794 } 1999 1795 2000 /** Execute boxing operation. 2001 * 2002 * XXX We can scrap this special operation once we have constructors. 2003 * 2004 * @param run Runner object 2005 * @param box Boxing operation 2006 * @param res Place to store result 2007 */ 2008 static void run_box(run_t *run, stree_box_t *box, rdata_item_t **res) 2009 { 2010 rdata_item_t *rarg_i; 2011 rdata_item_t *rarg_vi; 2012 2013 stree_symbol_t *csi_sym; 2014 stree_csi_t *csi; 2015 builtin_t *bi; 2016 rdata_var_t *var; 2017 rdata_object_t *object; 2018 2019 sid_t mbr_name_sid; 2020 rdata_var_t *mbr_var; 2021 2022 #ifdef DEBUG_RUN_TRACE 2023 printf("Run boxing operation.\n"); 2024 #endif 2025 run_expr(run, box->arg, &rarg_i); 2026 if (run_is_bo(run)) { 2027 *res = NULL; 2028 return; 2029 } 2030 2031 run_cvt_value_item(run, rarg_i, &rarg_vi); 2032 assert(rarg_vi->ic == ic_value); 2033 2034 bi = run->program->builtin; 2035 2036 /* Just to keep the compiler happy. */ 2037 csi_sym = NULL; 2038 2039 switch (rarg_vi->u.value->var->vc) { 2040 case vc_bool: csi_sym = bi->boxed_bool; break; 2041 case vc_char: csi_sym = bi->boxed_char; break; 2042 case vc_int: csi_sym = bi->boxed_int; break; 2043 case vc_string: csi_sym = bi->boxed_string; break; 2044 2045 case vc_ref: 2046 case vc_deleg: 2047 case vc_array: 2048 case vc_object: 2049 case vc_resource: 2050 assert(b_false); 2051 } 2052 2053 csi = symbol_to_csi(csi_sym); 2054 assert(csi != NULL); 2055 2056 /* Construct object of the relevant boxed type. */ 2057 run_new_csi_inst(run, csi, res); 2058 2059 /* Set the 'Value' field */ 2060 2061 assert((*res)->ic == ic_value); 2062 assert((*res)->u.value->var->vc == vc_ref); 2063 var = (*res)->u.value->var->u.ref_v->vref; 2064 assert(var->vc == vc_object); 2065 object = var->u.object_v; 2066 2067 mbr_name_sid = strtab_get_sid("Value"); 2068 mbr_var = intmap_get(&object->fields, mbr_name_sid); 2069 assert(mbr_var != NULL); 2070 2071 rdata_var_write(mbr_var, rarg_vi->u.value); 2072 } 2073 2074 /** Create new CSI instance. 2075 * 2076 * Create a new object, instance of @a csi. 2077 * XXX This does not work with generics as @a csi cannot specify a generic 2078 * type. 2079 * 2080 * Initialize the fields with default values of their types, but do not 2081 * run any constructor. 2082 * 2083 * @param run Runner object 2084 * @param as_op @c as conversion expression 2085 * @param res Place to store result 2086 */ 1796 /** Create new CSI instance. */ 2087 1797 void run_new_csi_inst(run_t *run, stree_csi_t *csi, rdata_item_t **res) 2088 1798 { … … 2094 1804 2095 1805 rdata_var_t *mbr_var; 1806 2096 1807 list_node_t *node; 2097 tdata_item_t *field_ti;2098 1808 2099 1809 csi_sym = csi_to_symbol(csi); … … 2114 1824 2115 1825 /* Create object fields. */ 2116 while (csi != NULL) { 2117 node = list_first(&csi->members); 2118 while (node != NULL) { 2119 csimbr = list_node_data(node, stree_csimbr_t *); 2120 if (csimbr->cc == csimbr_var) { 2121 /* Compute field type. XXX Memoize. */ 2122 run_texpr(run->program, csi, 2123 csimbr->u.var->type, 2124 &field_ti); 2125 2126 /* Create and initialize field. */ 2127 run_var_new(run, field_ti, &mbr_var); 2128 2129 /* Add to field map. */ 2130 intmap_set(&obj->fields, 2131 csimbr->u.var->name->sid, 2132 mbr_var); 2133 } 2134 2135 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); 2136 1837 } 2137 1838 2138 /* Continue with base CSI */ 2139 csi = csi->base_csi; 1839 node = list_next(&csi->members, node); 2140 1840 } 2141 1841 … … 2146 1846 /** Return boolean value of an item. 2147 1847 * 2148 * Try to interpret @a item as a boolean value. If it is not a boolean 2149 * value, generate an error. 2150 * 2151 * @param run Runner object 2152 * @param item Input item 2153 * @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. 2154 1850 */ 2155 1851 bool_t run_item_boolean_value(run_t *run, rdata_item_t *item)
Note:
See TracChangeset
for help on using the changeset viewer.