/* * 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