Changes in uspace/app/sbi/src/run_expr.c [074444f:23de644] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/run_expr.c
r074444f r23de644 53 53 static void run_literal(run_t *run, stree_literal_t *literal, 54 54 rdata_item_t **res); 55 static void run_lit_bool(run_t *run, stree_lit_bool_t *lit_bool,56 rdata_item_t **res);57 static void run_lit_char(run_t *run, stree_lit_char_t *lit_char,58 rdata_item_t **res);59 55 static void run_lit_int(run_t *run, stree_lit_int_t *lit_int, 60 56 rdata_item_t **res); … … 68 64 69 65 static void run_binop(run_t *run, stree_binop_t *binop, rdata_item_t **res); 70 static void run_binop_bool(run_t *run, stree_binop_t *binop, rdata_value_t *v1,71 rdata_value_t *v2, rdata_item_t **res);72 static void run_binop_char(run_t *run, stree_binop_t *binop, rdata_value_t *v1,73 rdata_value_t *v2, rdata_item_t **res);74 66 static void run_binop_int(run_t *run, stree_binop_t *binop, rdata_value_t *v1, 75 67 rdata_value_t *v2, rdata_item_t **res); … … 323 315 printf("Run literal.\n"); 324 316 #endif 317 325 318 switch (literal->ltc) { 326 case ltc_bool:327 run_lit_bool(run, &literal->u.lit_bool, res);328 break;329 case ltc_char:330 run_lit_char(run, &literal->u.lit_char, res);331 break;332 319 case ltc_int: 333 320 run_lit_int(run, &literal->u.lit_int, res); … … 339 326 run_lit_string(run, &literal->u.lit_string, res); 340 327 break; 341 } 342 } 343 344 /** Evaluate Boolean literal. */ 345 static void run_lit_bool(run_t *run, stree_lit_bool_t *lit_bool, 346 rdata_item_t **res) 347 { 348 rdata_item_t *item; 349 rdata_value_t *value; 350 rdata_var_t *var; 351 rdata_bool_t *bool_v; 352 353 #ifdef DEBUG_RUN_TRACE 354 printf("Run Boolean literal.\n"); 355 #endif 356 (void) run; 357 358 item = rdata_item_new(ic_value); 359 value = rdata_value_new(); 360 var = rdata_var_new(vc_bool); 361 bool_v = rdata_bool_new(); 362 363 item->u.value = value; 364 value->var = var; 365 var->u.bool_v = bool_v; 366 bool_v->value = lit_bool->value; 367 368 *res = item; 369 } 370 371 /** Evaluate character literal. */ 372 static void run_lit_char(run_t *run, stree_lit_char_t *lit_char, 373 rdata_item_t **res) 374 { 375 rdata_item_t *item; 376 rdata_value_t *value; 377 rdata_var_t *var; 378 rdata_char_t *char_v; 379 380 #ifdef DEBUG_RUN_TRACE 381 printf("Run character literal.\n"); 382 #endif 383 (void) run; 384 385 item = rdata_item_new(ic_value); 386 value = rdata_value_new(); 387 var = rdata_var_new(vc_char); 388 char_v = rdata_char_new(); 389 390 item->u.value = value; 391 value->var = var; 392 var->u.char_v = char_v; 393 bigint_clone(&lit_char->value, &char_v->value); 394 395 *res = item; 328 default: 329 assert(b_false); 330 } 396 331 } 397 332 … … 551 486 552 487 switch (v1->var->vc) { 553 case vc_bool:554 run_binop_bool(run, binop, v1, v2, res);555 break;556 case vc_char:557 run_binop_char(run, binop, v1, v2, res);558 break;559 488 case vc_int: 560 489 run_binop_int(run, binop, v1, v2, res); … … 566 495 run_binop_ref(run, binop, v1, v2, res); 567 496 break; 568 case vc_deleg:569 case vc_array:570 case vc_object:571 case vc_resource:572 assert(b_false);573 }574 }575 576 /** Evaluate binary operation on bool arguments. */577 static void run_binop_bool(run_t *run, stree_binop_t *binop, rdata_value_t *v1,578 rdata_value_t *v2, rdata_item_t **res)579 {580 rdata_item_t *item;581 rdata_value_t *value;582 rdata_var_t *var;583 rdata_bool_t *bool_v;584 585 bool_t b1, b2;586 587 (void) run;588 589 item = rdata_item_new(ic_value);590 value = rdata_value_new();591 var = rdata_var_new(vc_bool);592 bool_v = rdata_bool_new();593 594 item->u.value = value;595 value->var = var;596 var->u.bool_v = bool_v;597 598 b1 = v1->var->u.bool_v->value;599 b2 = v2->var->u.bool_v->value;600 601 switch (binop->bc) {602 case bo_plus:603 case bo_minus:604 case bo_mult:605 assert(b_false);606 607 case bo_equal:608 bool_v->value = (b1 == b2);609 break;610 case bo_notequal:611 bool_v->value = (b1 != b2);612 break;613 case bo_lt:614 bool_v->value = (b1 == b_false) && (b2 == b_true);615 break;616 case bo_gt:617 bool_v->value = (b1 == b_true) && (b2 == b_false);618 break;619 case bo_lt_equal:620 bool_v->value = (b1 == b_false) || (b2 == b_true);621 break;622 case bo_gt_equal:623 bool_v->value = (b1 == b_true) || (b2 == b_false);624 break;625 }626 627 *res = item;628 }629 630 /** Evaluate binary operation on char arguments. */631 static void run_binop_char(run_t *run, stree_binop_t *binop, rdata_value_t *v1,632 rdata_value_t *v2, rdata_item_t **res)633 {634 rdata_item_t *item;635 rdata_value_t *value;636 rdata_var_t *var;637 rdata_bool_t *bool_v;638 639 bigint_t *c1, *c2;640 bigint_t diff;641 bool_t zf, nf;642 643 (void) run;644 645 item = rdata_item_new(ic_value);646 value = rdata_value_new();647 648 item->u.value = value;649 650 c1 = &v1->var->u.char_v->value;651 c2 = &v2->var->u.char_v->value;652 653 var = rdata_var_new(vc_bool);654 bool_v = rdata_bool_new();655 var->u.bool_v = bool_v;656 value->var = var;657 658 bigint_sub(c1, c2, &diff);659 zf = bigint_is_zero(&diff);660 nf = bigint_is_negative(&diff);661 662 switch (binop->bc) {663 case bo_plus:664 case bo_minus:665 case bo_mult:666 assert(b_false);667 668 case bo_equal:669 bool_v->value = zf;670 break;671 case bo_notequal:672 bool_v->value = !zf;673 break;674 case bo_lt:675 bool_v->value = (!zf && nf);676 break;677 case bo_gt:678 bool_v->value = (!zf && !nf);679 break;680 case bo_lt_equal:681 bool_v->value = (zf || nf);682 break;683 case bo_gt_equal:684 bool_v->value = !nf;685 break;686 497 default: 687 assert(b_false);688 }689 690 *res = item;498 printf("Unimplemented: Binary operation arguments of " 499 "type %d.\n", v1->var->vc); 500 exit(1); 501 } 691 502 } 692 503 … … 699 510 rdata_var_t *var; 700 511 rdata_int_t *int_v; 701 rdata_bool_t *bool_v;702 512 703 513 bigint_t *i1, *i2; … … 710 520 item = rdata_item_new(ic_value); 711 521 value = rdata_value_new(); 522 var = rdata_var_new(vc_int); 523 int_v = rdata_int_new(); 712 524 713 525 item->u.value = value; 526 value->var = var; 527 var->u.int_v = int_v; 714 528 715 529 i1 = &v1->var->u.int_v->value; … … 720 534 switch (binop->bc) { 721 535 case bo_plus: 722 int_v = rdata_int_new();723 536 bigint_add(i1, i2, &int_v->value); 724 537 break; 725 538 case bo_minus: 726 int_v = rdata_int_new();727 539 bigint_sub(i1, i2, &int_v->value); 728 540 break; 729 541 case bo_mult: 730 int_v = rdata_int_new();731 542 bigint_mul(i1, i2, &int_v->value); 732 543 break; … … 737 548 738 549 if (done) { 739 var = rdata_var_new(vc_int);740 var->u.int_v = int_v;741 value->var = var;742 550 *res = item; 743 551 return; 744 552 } 745 746 var = rdata_var_new(vc_bool);747 bool_v = rdata_bool_new();748 var->u.bool_v = bool_v;749 value->var = var;750 553 751 554 /* Relational operation. */ … … 755 558 nf = bigint_is_negative(&diff); 756 559 560 /* XXX We should have a real boolean type. */ 757 561 switch (binop->bc) { 758 562 case bo_equal: 759 b ool_v->value = zf;563 bigint_init(&int_v->value, zf ? 1 : 0); 760 564 break; 761 565 case bo_notequal: 762 b ool_v->value = !zf;566 bigint_init(&int_v->value, !zf ? 1 : 0); 763 567 break; 764 568 case bo_lt: 765 b ool_v->value = (!zf && nf);569 bigint_init(&int_v->value, (!zf && nf) ? 1 : 0); 766 570 break; 767 571 case bo_gt: 768 b ool_v->value = (!zf && !nf);572 bigint_init(&int_v->value, (!zf && !nf) ? 1 : 0); 769 573 break; 770 574 case bo_lt_equal: 771 b ool_v->value = (zf || nf);575 bigint_init(&int_v->value, (zf || nf) ? 1 : 0); 772 576 break; 773 577 case bo_gt_equal: 774 b ool_v->value = !nf;578 bigint_init(&int_v->value, !nf ? 1 : 0); 775 579 break; 776 580 default: … … 827 631 rdata_value_t *value; 828 632 rdata_var_t *var; 829 rdata_ bool_t *bool_v;633 rdata_int_t *int_v; 830 634 831 635 rdata_var_t *ref1, *ref2; … … 835 639 item = rdata_item_new(ic_value); 836 640 value = rdata_value_new(); 837 var = rdata_var_new(vc_ bool);838 bool_v = rdata_bool_new();641 var = rdata_var_new(vc_int); 642 int_v = rdata_int_new(); 839 643 840 644 item->u.value = value; 841 645 value->var = var; 842 var->u. bool_v = bool_v;646 var->u.int_v = int_v; 843 647 844 648 ref1 = v1->var->u.ref_v->vref; … … 846 650 847 651 switch (binop->bc) { 652 /* XXX We should have a real boolean type. */ 848 653 case bo_equal: 849 b ool_v->value = (ref1 == ref2);654 bigint_init(&int_v->value, (ref1 == ref2) ? 1 : 0); 850 655 break; 851 656 case bo_notequal: 852 b ool_v->value = (ref1 != ref2);657 bigint_init(&int_v->value, (ref1 != ref2) ? 1 : 0); 853 658 break; 854 659 default: … … 1175 980 access->member_name); 1176 981 1177 /* Member existence should be ensured by static type checking. */ 1178 assert(member != NULL); 982 if (member == NULL) { 983 printf("Error: CSI '"); 984 symbol_print_fqn(deleg_v->sym); 985 printf("' has no member named '%s'.\n", 986 strtab_get_str(access->member_name->sid)); 987 exit(1); 988 } 1179 989 1180 990 #ifdef DEBUG_RUN_TRACE … … 1665 1475 1666 1476 if (rc1 != EOK || rc2 != EOK) { 1667 #ifdef DEBUG_RUN_TRACE1668 1477 printf("Error: String index (value: %d) is out of range.\n", 1669 1478 arg_val); 1670 #endif 1671 /* Raise Error.OutOfBounds */ 1672 run_raise_exc(run, run->program->builtin->error_outofbounds); 1673 *res = run_recovery_item(run); 1674 return; 1479 exit(1); 1675 1480 } 1676 1481 … … 1680 1485 ritem->u.value = value; 1681 1486 1682 cvar = rdata_var_new(vc_ char);1683 cvar->u. char_v = rdata_char_new();1684 bigint_init(&cvar->u. char_v->value, cval);1487 cvar = rdata_var_new(vc_int); 1488 cvar->u.int_v = rdata_int_new(); 1489 bigint_init(&cvar->u.int_v->value, cval); 1685 1490 value->var = cvar; 1686 1491 … … 1846 1651 * Tries to interpret @a item as a boolean value. If it is not a boolean 1847 1652 * value, this generates an error. 1653 * 1654 * XXX Currently int supplants the role of a true boolean type. 1848 1655 */ 1849 1656 bool_t run_item_boolean_value(run_t *run, rdata_item_t *item) … … 1858 1665 var = vitem->u.value->var; 1859 1666 1860 assert(var->vc == vc_bool); 1861 return var->u.bool_v->value; 1862 } 1667 if (var->vc != vc_int) { 1668 printf("Error: Boolean (int) expression expected.\n"); 1669 exit(1); 1670 } 1671 1672 return !bigint_is_zero(&var->u.int_v->value); 1673 }
Note:
See TracChangeset
for help on using the changeset viewer.