Changeset fa36f29 in mainline for uspace/app/sbi/src/run.c
- Timestamp:
- 2010-02-27T17:59:14Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 94d484a
- Parents:
- 09ababb7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/run.c
r09ababb7 rfa36f29 51 51 static void run_if(run_t *run, stree_if_t *if_s); 52 52 static void run_while(run_t *run, stree_while_t *while_s); 53 54 static void run_value_item_to_var(rdata_item_t *item, rdata_var_t **var); 53 static void run_return(run_t *run, stree_return_t *return_s); 55 54 56 55 /** Initialize runner instance. */ 57 56 void run_init(run_t *run) 58 57 { 58 (void) run; 59 59 } 60 60 … … 62 62 void run_program(run_t *run, stree_program_t *prog) 63 63 { 64 stree_symbol_t *main_class_sym;65 64 stree_symbol_t *main_fun_sym; 66 stree_csi_t *main_class;67 65 stree_fun_t *main_fun; 68 66 stree_ident_t *fake_ident; 69 67 list_t main_args; 68 run_fun_ar_t *fun_ar; 69 rdata_item_t *res; 70 70 71 71 /* Note down link to program code. */ … … 75 75 run->thread_ar = run_thread_ar_new(); 76 76 list_init(&run->thread_ar->fun_ar); 77 run->thread_ar->bo_mode = bm_none; 77 78 78 79 /* 79 * Resolve class @c HelloWorld80 * Find entry point @c Main(). 80 81 */ 81 82 fake_ident = stree_ident_new(); 82 83 fake_ident->sid = strtab_get_sid("HelloWorld"); 84 main_class_sym = symbol_lookup_in_csi(prog, NULL, fake_ident); 85 main_class = symbol_to_csi(main_class_sym); 86 if (main_class == NULL) { 87 printf("Error: HelloWorld is not a CSI.\n"); 88 exit(1); 89 } 90 91 #ifdef DEBUG_RUN_TRACE 92 printf("Found class '"); symbol_print_fqn(prog, main_class_sym); 93 printf("'.\n"); 94 #endif 95 96 /* 97 * Resolve function @c main within the class. 98 */ 99 fake_ident->sid = strtab_get_sid("main"); 100 main_fun_sym = symbol_lookup_in_csi(prog, main_class, fake_ident); 83 fake_ident->sid = strtab_get_sid("Main"); 84 main_fun_sym = symbol_find_epoint(prog, fake_ident); 85 if (main_fun_sym == NULL) { 86 printf("Error: Entry point 'Main' not found.\n"); 87 exit(1); 88 } 89 101 90 main_fun = symbol_to_fun(main_fun_sym); 102 if (main_fun == NULL) { 103 printf("Error: HelloWorld.main is not a function.\n"); 104 exit(1); 105 } 91 assert(main_fun != NULL); 106 92 107 93 #ifdef DEBUG_RUN_TRACE … … 110 96 #endif 111 97 98 /* Run function @c main. */ 112 99 list_init(&main_args); 113 run_fun(run, main_fun, &main_args); 100 run_fun_ar_create(run, NULL, main_fun, &fun_ar); 101 run_fun_ar_set_args(run, fun_ar, &main_args); 102 run_fun(run, fun_ar, &res); 114 103 } 115 104 116 105 /** Run member function */ 117 void run_fun(run_t *run, stree_fun_t *fun, list_t *args)106 void run_fun(run_t *run, run_fun_ar_t *fun_ar, rdata_item_t **res) 118 107 { 119 108 stree_symbol_t *fun_sym; 120 run_fun_ar_t *fun_ar; 121 run_block_ar_t *block_ar; 122 list_node_t *rarg_n, *farg_n; 109 stree_fun_t *fun; 123 110 list_node_t *node; 124 rdata_item_t *rarg; 125 stree_fun_arg_t *farg; 126 rdata_var_t *var; 127 128 fun_sym = fun_to_symbol(fun); 111 112 fun_sym = fun_ar->fun_sym; 113 fun = symbol_to_fun(fun_sym); 114 assert(fun != NULL); 129 115 130 116 #ifdef DEBUG_RUN_TRACE … … 133 119 printf("'.\n"); 134 120 #endif 135 136 /* Create function activation record. */137 fun_ar = run_fun_ar_new();138 fun_ar->fun_sym = fun_sym;139 list_init(&fun_ar->block_ar);140 141 121 /* Add function AR to the stack. */ 142 122 list_append(&run->thread_ar->fun_ar, fun_ar); 143 144 /* Create special block activation record to hold function arguments. */145 block_ar = run_block_ar_new();146 intmap_init(&block_ar->vars);147 list_append(&fun_ar->block_ar, block_ar);148 149 /* Declare local variables to hold argument values. */150 rarg_n = list_first(args);151 farg_n = list_first(&fun->args);152 153 while (farg_n != NULL) {154 if (rarg_n == NULL) {155 printf("Error: Too few arguments to function '");156 symbol_print_fqn(run->program, fun_sym);157 printf("'.\n");158 exit(1);159 }160 161 rarg = list_node_data(rarg_n, rdata_item_t *);162 farg = list_node_data(farg_n, stree_fun_arg_t *);163 164 assert(rarg->ic == ic_value);165 166 /* Construct a variable from the argument value. */167 run_value_item_to_var(rarg, &var);168 169 /* Declare variable using name of formal argument. */170 intmap_set(&block_ar->vars, farg->name->sid, var);171 172 rarg_n = list_next(args, rarg_n);173 farg_n = list_next(&fun->args, farg_n);174 }175 176 /* Check for excess real parameters. */177 if (rarg_n != NULL) {178 printf("Error: Too many arguments to function '");179 symbol_print_fqn(run->program, fun_sym);180 printf("'.\n");181 exit(1);182 }183 123 184 124 /* Run main function block. */ … … 189 129 } 190 130 131 /* Handle bailout. */ 132 switch (run->thread_ar->bo_mode) { 133 case bm_stat: 134 printf("Error: Misplaced 'break' statement.\n"); 135 exit(1); 136 case bm_fun: 137 run->thread_ar->bo_mode = bm_none; 138 break; 139 default: 140 break; 141 } 142 191 143 #ifdef DEBUG_RUN_TRACE 192 144 printf("Done executing function '"); … … 196 148 run_print_fun_bt(run); 197 149 #endif 198 199 150 /* Remove function activation record from the stack. */ 200 151 node = list_last(&run->thread_ar->fun_ar); 201 152 assert(list_node_data(node, run_fun_ar_t *) == fun_ar); 202 153 list_remove(&run->thread_ar->fun_ar, node); 154 155 *res = fun_ar->retval; 203 156 } 204 157 … … 227 180 stat = list_node_data(node, stree_stat_t *); 228 181 run_stat(run, stat); 182 183 if (run->thread_ar->bo_mode != bm_none) 184 break; 185 229 186 node = list_next(&block->stats, node); 230 187 } … … 260 217 run_while(run, stat->u.while_s); 261 218 break; 219 case st_return: 220 run_return(run, stat->u.return_s); 221 break; 262 222 case st_for: 263 223 case st_raise: … … 361 321 run_block(run, while_s->body); 362 322 run_expr(run, while_s->cond, &rcond); 323 324 if (run->thread_ar->bo_mode != bm_none) 325 break; 363 326 } 364 327 … … 366 329 printf("While statement terminated.\n"); 367 330 #endif 331 } 332 333 /** Run @c return statement. */ 334 static void run_return(run_t *run, stree_return_t *return_s) 335 { 336 rdata_item_t *rexpr; 337 run_fun_ar_t *fun_ar; 338 339 #ifdef DEBUG_RUN_TRACE 340 printf("Executing return statement.\n"); 341 #endif 342 run_expr(run, return_s->expr, &rexpr); 343 344 /* Store expression result in function AR. */ 345 fun_ar = run_get_current_fun_ar(run); 346 fun_ar->retval = rexpr; 347 348 /* Force control to ascend and leave the function. */ 349 if (run->thread_ar->bo_mode == bm_none) 350 run->thread_ar->bo_mode = bm_fun; 368 351 } 369 352 … … 421 404 * (2) Initialize the variable with the provided value. 422 405 */ 423 staticvoid run_value_item_to_var(rdata_item_t *item, rdata_var_t **var)406 void run_value_item_to_var(rdata_item_t *item, rdata_var_t **var) 424 407 { 425 408 rdata_int_t *int_v; 426 409 rdata_string_t *string_v; 410 rdata_ref_t *ref_v; 427 411 rdata_var_t *in_var; 428 412 … … 445 429 string_v->value = item->u.value->var->u.string_v->value; 446 430 break; 431 case vc_ref: 432 *var = rdata_var_new(vc_ref); 433 ref_v = rdata_ref_new(); 434 435 (*var)->u.ref_v = ref_v; 436 ref_v->vref = item->u.value->var->u.ref_v->vref; 437 break; 447 438 default: 448 439 printf("Error: Unimplemented argument type.\n"); 449 440 exit(1); 450 441 442 } 443 } 444 445 /** Construct a function AR. */ 446 void run_fun_ar_create(run_t *run, rdata_var_t *obj, stree_fun_t *fun, 447 run_fun_ar_t **rfun_ar) 448 { 449 run_fun_ar_t *fun_ar; 450 451 (void) run; 452 453 /* Create function activation record. */ 454 fun_ar = run_fun_ar_new(); 455 fun_ar->obj = obj; 456 fun_ar->fun_sym = fun_to_symbol(fun); 457 list_init(&fun_ar->block_ar); 458 459 fun_ar->retval = NULL; 460 461 *rfun_ar = fun_ar; 462 } 463 464 /** Fill arguments in a function AR. */ 465 void run_fun_ar_set_args(run_t *run, run_fun_ar_t *fun_ar, list_t *args) 466 { 467 stree_fun_t *fun; 468 run_block_ar_t *block_ar; 469 list_node_t *rarg_n, *farg_n; 470 rdata_item_t *rarg; 471 stree_fun_arg_t *farg; 472 rdata_var_t *var; 473 474 /* AR should have been created with run_fun_ar_create(). */ 475 assert(fun_ar->fun_sym != NULL); 476 assert(list_is_empty(&fun_ar->block_ar)); 477 478 fun = symbol_to_fun(fun_ar->fun_sym); 479 assert(fun != NULL); 480 481 /* Create special block activation record to hold function arguments. */ 482 block_ar = run_block_ar_new(); 483 intmap_init(&block_ar->vars); 484 list_append(&fun_ar->block_ar, block_ar); 485 486 /* Declare local variables to hold argument values. */ 487 rarg_n = list_first(args); 488 farg_n = list_first(&fun->args); 489 490 while (farg_n != NULL) { 491 if (rarg_n == NULL) { 492 printf("Error: Too few arguments to function '"); 493 symbol_print_fqn(run->program, fun_ar->fun_sym); 494 printf("'.\n"); 495 exit(1); 496 } 497 498 rarg = list_node_data(rarg_n, rdata_item_t *); 499 farg = list_node_data(farg_n, stree_fun_arg_t *); 500 501 assert(rarg->ic == ic_value); 502 503 /* Construct a variable from the argument value. */ 504 run_value_item_to_var(rarg, &var); 505 506 /* Declare variable using name of formal argument. */ 507 intmap_set(&block_ar->vars, farg->name->sid, var); 508 509 rarg_n = list_next(args, rarg_n); 510 farg_n = list_next(&fun->args, farg_n); 511 } 512 513 /* Check for excess real parameters. */ 514 if (rarg_n != NULL) { 515 printf("Error: Too many arguments to function '"); 516 symbol_print_fqn(run->program, fun_ar->fun_sym); 517 printf("'.\n"); 518 exit(1); 451 519 } 452 520 }
Note:
See TracChangeset
for help on using the changeset viewer.