Changeset fa36f29 in mainline for uspace/app/sbi/src/run.c


Ignore:
Timestamp:
2010-02-27T17:59:14Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
94d484a
Parents:
09ababb7
Message:

Update SBI to rev. 75.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/sbi/src/run.c

    r09ababb7 rfa36f29  
    5151static void run_if(run_t *run, stree_if_t *if_s);
    5252static 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);
     53static void run_return(run_t *run, stree_return_t *return_s);
    5554
    5655/** Initialize runner instance. */
    5756void run_init(run_t *run)
    5857{
     58        (void) run;
    5959}
    6060
     
    6262void run_program(run_t *run, stree_program_t *prog)
    6363{
    64         stree_symbol_t *main_class_sym;
    6564        stree_symbol_t *main_fun_sym;
    66         stree_csi_t *main_class;
    6765        stree_fun_t *main_fun;
    6866        stree_ident_t *fake_ident;
    6967        list_t main_args;
     68        run_fun_ar_t *fun_ar;
     69        rdata_item_t *res;
    7070
    7171        /* Note down link to program code. */
     
    7575        run->thread_ar = run_thread_ar_new();
    7676        list_init(&run->thread_ar->fun_ar);
     77        run->thread_ar->bo_mode = bm_none;
    7778
    7879        /*
    79          * Resolve class @c HelloWorld
     80         * Find entry point @c Main().
    8081         */
    8182        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
    10190        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);
    10692
    10793#ifdef DEBUG_RUN_TRACE
     
    11096#endif
    11197
     98        /* Run function @c main. */
    11299        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);
    114103}
    115104
    116105/** Run member function */
    117 void run_fun(run_t *run, stree_fun_t *fun, list_t *args)
     106void run_fun(run_t *run, run_fun_ar_t *fun_ar, rdata_item_t **res)
    118107{
    119108        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;
    123110        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);
    129115
    130116#ifdef DEBUG_RUN_TRACE
     
    133119        printf("'.\n");
    134120#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 
    141121        /* Add function AR to the stack. */
    142122        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         }
    183123
    184124        /* Run main function block. */
     
    189129        }
    190130
     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
    191143#ifdef DEBUG_RUN_TRACE
    192144        printf("Done executing function '");
     
    196148        run_print_fun_bt(run);
    197149#endif
    198 
    199150        /* Remove function activation record from the stack. */
    200151        node = list_last(&run->thread_ar->fun_ar);
    201152        assert(list_node_data(node, run_fun_ar_t *) == fun_ar);
    202153        list_remove(&run->thread_ar->fun_ar, node);
     154
     155        *res = fun_ar->retval;
    203156}
    204157
     
    227180                stat = list_node_data(node, stree_stat_t *);
    228181                run_stat(run, stat);
     182
     183                if (run->thread_ar->bo_mode != bm_none)
     184                        break;
     185
    229186                node = list_next(&block->stats, node);
    230187        }
     
    260217                run_while(run, stat->u.while_s);
    261218                break;
     219        case st_return:
     220                run_return(run, stat->u.return_s);
     221                break;
    262222        case st_for:
    263223        case st_raise:
     
    361321                run_block(run, while_s->body);
    362322                run_expr(run, while_s->cond, &rcond);
     323
     324                if (run->thread_ar->bo_mode != bm_none)
     325                        break;
    363326        }
    364327
     
    366329        printf("While statement terminated.\n");
    367330#endif
     331}
     332
     333/** Run @c return statement. */
     334static 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;
    368351}
    369352
     
    421404 * (2) Initialize the variable with the provided value.
    422405 */
    423 static void run_value_item_to_var(rdata_item_t *item, rdata_var_t **var)
     406void run_value_item_to_var(rdata_item_t *item, rdata_var_t **var)
    424407{
    425408        rdata_int_t *int_v;
    426409        rdata_string_t *string_v;
     410        rdata_ref_t *ref_v;
    427411        rdata_var_t *in_var;
    428412
     
    445429                string_v->value = item->u.value->var->u.string_v->value;
    446430                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;
    447438        default:
    448439                printf("Error: Unimplemented argument type.\n");
    449440                exit(1);
    450441
     442        }
     443}
     444
     445/** Construct a function AR. */
     446void 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. */
     465void 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);
    451519        }
    452520}
Note: See TracChangeset for help on using the changeset viewer.