Changes in uspace/app/sbi/src/run_expr.c [caad59a:38aaacc2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/run_expr.c
rcaad59a r38aaacc2 27 27 */ 28 28 29 /** @file Run ner (executes the code). */29 /** @file Run expressions. */ 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 112 /** Evaluate expression. */ 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 */ 113 123 void run_expr(run_t *run, stree_expr_t *expr, rdata_item_t **res) 114 124 { … … 151 161 run_as(run, expr->u.as_op, res); 152 162 break; 163 case ec_box: 164 run_box(run, expr->u.box, res); 165 break; 153 166 } 154 167 … … 160 173 } 161 174 162 /** Evaluate name reference expression. */ 175 /** Evaluate name reference expression. 176 * 177 * @param run Runner object 178 * @param nameref Name reference 179 * @param res Place to store result 180 */ 163 181 static void run_nameref(run_t *run, stree_nameref_t *nameref, 164 182 rdata_item_t **res) … … 247 265 assert(csi != NULL); 248 266 249 if (sym->outer_csi != csi) { 267 if (symbol_search_csi(run->program, csi, nameref->name) 268 == NULL) { 250 269 /* Function is not in the current object. */ 251 270 printf("Error: Cannot access non-static member " … … 283 302 assert(obj != NULL); 284 303 285 if (sym->outer_csi != csi) { 304 if (symbol_search_csi(run->program, csi, nameref->name) 305 == NULL) { 286 306 /* Variable is not in the current object. */ 287 307 printf("Error: Cannot access non-static member " … … 316 336 } 317 337 318 /** Evaluate literal. */ 338 /** Evaluate literal. 339 * 340 * @param run Runner object 341 * @param literal Literal 342 * @param res Place to store result 343 */ 319 344 static void run_literal(run_t *run, stree_literal_t *literal, 320 345 rdata_item_t **res) … … 342 367 } 343 368 344 /** Evaluate Boolean literal. */ 369 /** Evaluate Boolean literal. 370 * 371 * @param run Runner object 372 * @param lit_bool Boolean literal 373 * @param res Place to store result 374 */ 345 375 static void run_lit_bool(run_t *run, stree_lit_bool_t *lit_bool, 346 376 rdata_item_t **res) … … 396 426 } 397 427 398 /** Evaluate integer literal. */ 428 /** Evaluate integer literal. 429 * 430 * @param run Runner object 431 * @param lit_int Integer literal 432 * @param res Place to store result 433 */ 399 434 static void run_lit_int(run_t *run, stree_lit_int_t *lit_int, 400 435 rdata_item_t **res) … … 423 458 } 424 459 425 /** Evaluate reference literal (@c nil). */ 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 */ 426 466 static void run_lit_ref(run_t *run, stree_lit_ref_t *lit_ref, 427 467 rdata_item_t **res) … … 451 491 } 452 492 453 /** Evaluate string literal. */ 493 /** Evaluate string literal. 494 * 495 * @param run Runner object 496 * @param lit_string String literal 497 * @param res Place to store result 498 */ 454 499 static void run_lit_string(run_t *run, stree_lit_string_t *lit_string, 455 500 rdata_item_t **res) … … 478 523 } 479 524 480 /** Evaluate @c self reference. */ 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 */ 481 531 static void run_self_ref(run_t *run, stree_self_ref_t *self_ref, 482 532 rdata_item_t **res) … … 494 544 } 495 545 496 /** Evaluate binary operation. */ 546 /** Evaluate binary operation. 547 * 548 * @param run Runner object 549 * @param binop Binary operation 550 * @param res Place to store result 551 */ 497 552 static void run_binop(run_t *run, stree_binop_t *binop, rdata_item_t **res) 498 553 { … … 574 629 } 575 630 576 /** Evaluate binary operation on bool arguments. */ 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 */ 577 639 static void run_binop_bool(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 578 640 rdata_value_t *v2, rdata_item_t **res) … … 628 690 } 629 691 630 /** Evaluate binary operation on char arguments. */ 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 */ 631 700 static void run_binop_char(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 632 701 rdata_value_t *v2, rdata_item_t **res) … … 691 760 } 692 761 693 /** Evaluate binary operation on int arguments. */ 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 */ 694 770 static void run_binop_int(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 695 771 rdata_value_t *v2, rdata_item_t **res) … … 781 857 } 782 858 783 /** Evaluate binary operation on string arguments. */ 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 */ 784 867 static void run_binop_string(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 785 868 rdata_value_t *v2, rdata_item_t **res) … … 790 873 rdata_string_t *string_v; 791 874 792 c har *s1, *s2;875 const char *s1, *s2; 793 876 794 877 (void) run; … … 820 903 } 821 904 822 /** Evaluate binary operation on ref arguments. */ 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 */ 823 913 static void run_binop_ref(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 824 914 rdata_value_t *v2, rdata_item_t **res) … … 862 952 863 953 864 /** Evaluate unary operation. */ 954 /** Evaluate unary operation. 955 * 956 * @param run Runner object 957 * @param unop Unary operation 958 * @param res Place to store result 959 */ 865 960 static void run_unop(run_t *run, stree_unop_t *unop, rdata_item_t **res) 866 961 { … … 898 993 } 899 994 900 /** Evaluate unary operation on int argument. */ 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 */ 901 1002 static void run_unop_int(run_t *run, stree_unop_t *unop, rdata_value_t *val, 902 1003 rdata_item_t **res) … … 932 1033 933 1034 934 /** Evaluate @c new operation. */ 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 */ 935 1044 static void run_new(run_t *run, stree_new_t *new_op, rdata_item_t **res) 936 1045 { … … 958 1067 } 959 1068 960 /** Create new array. */ 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 */ 961 1076 static void run_new_array(run_t *run, stree_new_t *new_op, 962 1077 tdata_item_t *titem, rdata_item_t **res) … … 1046 1161 /* Create member variables */ 1047 1162 for (i = 0; i < length; ++i) { 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); 1163 /* Create and initialize element. */ 1164 run_var_new(run, tarray->base_ti, &elem_var); 1052 1165 1053 1166 array->element[i] = elem_var; … … 1062 1175 } 1063 1176 1064 /** Create new object. */ 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 */ 1065 1184 static void run_new_object(run_t *run, stree_new_t *new_op, 1066 1185 tdata_item_t *titem, rdata_item_t **res) … … 1081 1200 } 1082 1201 1083 /** Evaluate member acccess. */ 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 */ 1084 1210 static void run_access(run_t *run, stree_access_t *access, rdata_item_t **res) 1085 1211 { … … 1103 1229 } 1104 1230 1105 /** Evaluate member acccess (with base already evaluated). */ 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 */ 1106 1238 static void run_access_item(run_t *run, stree_access_t *access, 1107 1239 rdata_item_t *arg, rdata_item_t **res) … … 1131 1263 } 1132 1264 1133 /** Evaluate reference acccess. */ 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 */ 1134 1272 static void run_access_ref(run_t *run, stree_access_t *access, 1135 1273 rdata_item_t *arg, rdata_item_t **res) … … 1149 1287 } 1150 1288 1151 /** Evaluate delegate-member acccess. */ 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 */ 1152 1296 static void run_access_deleg(run_t *run, stree_access_t *access, 1153 1297 rdata_item_t *arg, rdata_item_t **res) … … 1192 1336 } 1193 1337 1194 /** Evaluate object member acccess. */ 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 */ 1195 1345 static void run_access_object(run_t *run, stree_access_t *access, 1196 1346 rdata_item_t *arg, rdata_item_t **res) … … 1240 1390 printf("Error: Accessing object member which is nested CSI.\n"); 1241 1391 exit(1); 1392 case sc_deleg: 1393 printf("Error: Accessing object member which is a delegate.\n"); 1394 exit(1); 1242 1395 case sc_fun: 1243 /* Construct delegate. */1396 /* Construct anonymous delegate. */ 1244 1397 ritem = rdata_item_new(ic_value); 1245 1398 value = rdata_value_new(); … … 1281 1434 addr_prop->u.named->prop_d = deleg_p; 1282 1435 break; 1283 default:1284 ritem = NULL;1285 1436 } 1286 1437 … … 1288 1439 } 1289 1440 1290 /** Call a function. */ 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 */ 1291 1449 static void run_call(run_t *run, stree_call_t *call, rdata_item_t **res) 1292 1450 { 1293 rdata_item_t *r fun;1451 rdata_item_t *rdeleg, *rdeleg_vi; 1294 1452 rdata_deleg_t *deleg_v; 1295 1453 list_t arg_vals; … … 1304 1462 printf("Run call operation.\n"); 1305 1463 #endif 1306 run_expr(run, call->fun, &r fun);1464 run_expr(run, call->fun, &rdeleg); 1307 1465 if (run_is_bo(run)) { 1308 1466 *res = NULL; … … 1315 1473 } 1316 1474 1317 if (rfun->ic != ic_value || rfun->u.value->var->vc != vc_deleg) { 1318 printf("Unimplemented: Call expression of this type.\n"); 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"); 1319 1482 exit(1); 1320 1483 } 1321 1484 1322 deleg_v = r fun->u.value->var->u.deleg_v;1485 deleg_v = rdeleg_vi->u.value->var->u.deleg_v; 1323 1486 1324 1487 if (deleg_v->sym->sc != sc_fun) { … … 1367 1530 } 1368 1531 1369 /** Run index operation. */ 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 */ 1370 1540 static void run_index(run_t *run, stree_index_t *index, rdata_item_t **res) 1371 1541 { … … 1433 1603 } 1434 1604 1435 /** Run index operation on array. */ 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 */ 1436 1613 static void run_index_array(run_t *run, stree_index_t *index, 1437 1614 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1525 1702 } 1526 1703 1527 /** Index an object (via its indexer). */ 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 */ 1528 1712 static void run_index_object(run_t *run, stree_index_t *index, 1529 1713 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1597 1781 } 1598 1782 1599 /** Run index operation on string. */ 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 */ 1600 1791 static void run_index_string(run_t *run, stree_index_t *index, 1601 1792 rdata_item_t *base, list_t *args, rdata_item_t **res) … … 1690 1881 } 1691 1882 1692 /** Execute assignment. */ 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 */ 1693 1892 static void run_assign(run_t *run, stree_assign_t *assign, rdata_item_t **res) 1694 1893 { … … 1727 1926 } 1728 1927 1729 /** Execute @c as conversion. */ 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 */ 1730 1934 static void run_as(run_t *run, stree_as_t *as_op, rdata_item_t **res) 1731 1935 { … … 1794 1998 } 1795 1999 1796 /** Create new CSI instance. */ 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 */ 1797 2087 void run_new_csi_inst(run_t *run, stree_csi_t *csi, rdata_item_t **res) 1798 2088 { … … 1804 2094 1805 2095 rdata_var_t *mbr_var; 1806 1807 2096 list_node_t *node; 2097 tdata_item_t *field_ti; 1808 2098 1809 2099 csi_sym = csi_to_symbol(csi); … … 1824 2114 1825 2115 /* Create object fields. */ 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); 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); 1837 2136 } 1838 2137 1839 node = list_next(&csi->members, node); 2138 /* Continue with base CSI */ 2139 csi = csi->base_csi; 1840 2140 } 1841 2141 … … 1846 2146 /** Return boolean value of an item. 1847 2147 * 1848 * Tries to interpret @a item as a boolean value. If it is not a boolean 1849 * value, this generates an error. 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 1850 2154 */ 1851 2155 bool_t run_item_boolean_value(run_t *run, rdata_item_t *item)
Note:
See TracChangeset
for help on using the changeset viewer.