HelenOS sources

root/uspace/app/sbi/src/run_t.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 * Copyright (c) 2010 Jiri Svoboda
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - The name of the author may not be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef RUN_T_H_
#define RUN_T_H_

#include "intmap_t.h"
#include "list_t.h"

/** Block activation record
 *
 * One block AR is created for each block that we enter. A variable declaration
 * statement inserts the variable here. Upon exiting the block we pop from the
 * stack, thus all the variables declared in that block are forgotten.
 */
typedef struct run_block_ar {
        /** Variables in this block */
        intmap_t vars; /* of rdata_var_t */
} run_block_ar_t;

/** Procedure activation record
 *
 * A procedure can be a member function, a named property or an indexed
 * property. A procedure activation record is created whenever a procedure
 * is invoked.
 */
typedef struct run_proc_ar {
        /** Object on which the procedure is being invoked or @c NULL. */
        struct rdata_var *obj;

        /** Procedure being invoked */
        struct stree_proc *proc;

        /** Block activation records */
        list_t block_ar; /* of run_block_ar_t */

        /** Procedure return value or @c NULL if not set. */
        struct rdata_item *retval;
} run_proc_ar_t;

/** Bailout mode
 *
 * Determines whether control is bailing out of a statement, function, etc.
 */
typedef enum {
        /** Normal execution */
        bm_none,

        /** Break from statement */
        bm_stat,

        /** Return from procedure */
        bm_proc,

        /** Exception */
        bm_exc,

        /** Unrecoverable runtime error */
        bm_error
} run_bailout_mode_t;

/** Thread activation record
 *
 * We can walk the list of function ARs to get a function call backtrace.
 */
typedef struct run_thread_ar {
        /** Function activation records */
        list_t proc_ar; /* of run_proc_ar_t */

        /** Bailout mode */
        run_bailout_mode_t bo_mode;

        /** Exception cspan */
        struct cspan *exc_cspan;

        /** Exception payload */
        struct rdata_value *exc_payload;

        /** @c b_true if a run-time error occured. */
        bool_t error;
} run_thread_ar_t;

/** Runner state object */
typedef struct run {
        /** Code of the program being executed */
        struct stree_program *program;

        /** Thread-private state */
        run_thread_ar_t *thread_ar;

        /** Global state */
        struct rdata_var *gdata;
} run_t;

#endif

/* [<][>][^][v][top][bottom][index][help] */
HelenOS homepage, sources at GitHub