@@ -42,7 +42,7 @@ void execute(program_state* prog)
4242statement * stmt ;
4343
4444while (* prog -> pc < prog -> stmt_list -> size ) {
45- stmt = GET_STMT ( prog -> stmt_list , * prog -> pc ) ;
45+ stmt = & prog -> stmt_list -> a [ * prog -> pc ] ;
4646//print_statement(stmt);
4747
4848switch (stmt -> type ) {
@@ -119,7 +119,7 @@ void execute(program_state* prog)
119119
120120case END_COMPOUND_STMT :
121121pop_scope (prog );//freeing all bindings with cur_parent
122- prog -> cur_parent = GET_STMT ( prog -> stmt_list , stmt -> parent ) -> parent ;
122+ prog -> cur_parent = prog -> stmt_list -> a [ stmt -> parent ]. parent ;
123123break ;
124124
125125case CASE_STMT :
@@ -215,7 +215,7 @@ var_value execute_expr(program_state* prog, expression* e)
215215var_value * var ;
216216
217217function * old_func , * func ;
218- cvector_void * old_stmt_list ;
218+ cvector_statement * old_stmt_list ;
219219size_t * old_pc ;
220220
221221var_value result , left , right ;
@@ -630,7 +630,7 @@ void execute_expr_list(program_state* prog, function* callee, expression* e)
630630void execute_goto (program_state * prog , statement * stmt )
631631{
632632int ancestor ;
633- statement * target = GET_STMT ( prog -> stmt_list , stmt -> jump_to ) ;
633+ statement * target = & prog -> stmt_list -> a [ stmt -> jump_to ] ;
634634if (stmt -> parent != target -> parent ) {
635635if (is_ancestor (prog , stmt -> parent , target -> parent )) {
636636apply_scope (prog , stmt -> jump_to , target -> parent , stmt -> parent );
@@ -644,7 +644,7 @@ void execute_goto(program_state* prog, statement* stmt)
644644} else {
645645if (stmt -> jump_to > * prog -> pc ) {
646646binding * b ;
647- target = GET_STMT ( prog -> stmt_list , stmt -> parent ) ;
647+ target = & prog -> stmt_list -> a [ stmt -> parent ] ;
648648for (int i = 0 ; i < target -> bindings -> size ; ++ i ) {
649649b = GET_BINDING (target -> bindings , i );
650650if (b -> decl_stmt > * prog -> pc ) {
@@ -704,7 +704,7 @@ void clear_bindings(program_state* prog)
704704binding * b ;
705705
706706while (prog -> cur_parent >= 0 ) {
707- stmt = GET_STMT ( prog -> stmt_list , prog -> cur_parent ) ;
707+ stmt = & prog -> stmt_list -> a [ prog -> cur_parent ] ;
708708for (int i = 0 ; i < stmt -> bindings -> size ; ++ i ) {
709709b = GET_BINDING (stmt -> bindings , i );
710710if (b -> decl_stmt > * prog -> pc )
@@ -738,7 +738,7 @@ int is_ancestor(program_state* prog, int parent, int child)
738738statement * stmt ;
739739int tmp = child ;
740740do {
741- stmt = GET_STMT ( prog -> stmt_list , tmp ) ;
741+ stmt = & prog -> stmt_list -> a [ tmp ] ;
742742tmp = stmt -> parent ;
743743} while (tmp >= 0 && tmp != parent );
744744
@@ -749,7 +749,7 @@ int is_ancestor(program_state* prog, int parent, int child)
749749//to jump_to statement
750750void apply_scope (program_state * prog , int jump_to , int child , int parent )
751751{
752- statement * stmt = GET_STMT ( prog -> stmt_list , child ) ;
752+ statement * stmt = & prog -> stmt_list -> a [ child ] ;
753753binding * b ;
754754
755755if (child != parent )
@@ -777,14 +777,14 @@ void remove_scope(program_state* prog, int jump_to, int child, int parent)
777777binding * b ;
778778
779779while (child != parent ) {
780- stmt = GET_STMT ( prog -> stmt_list , child ) ;
780+ stmt = & prog -> stmt_list -> a [ child ] ;
781781child = stmt -> parent ;
782782pop_scope (prog );
783783}
784784
785785prog -> cur_parent = parent ;
786786
787- stmt = GET_STMT ( prog -> stmt_list , parent ) ;
787+ stmt = & prog -> stmt_list -> a [ parent ] ;
788788
789789for (int i = 0 ; i < stmt -> bindings -> size ; ++ i ) {
790790b = GET_BINDING (stmt -> bindings , i );
@@ -802,10 +802,11 @@ int find_lowest_common_ancestor(program_state* prog, int parent1, int parent2)
802802//I can't think of a better way right now so just brute forcing it
803803//parent stmt/block with highest index is lowest common ancestor
804804int max = 0 ;
805- stmt1 = GET_STMT (prog -> stmt_list , parent1 );
806- stmt2 = GET_STMT (prog -> stmt_list , parent2 );
807- for (statement * s1 = stmt1 ; s1 != (statement * )prog -> stmt_list -> a ; s1 = GET_STMT (prog -> stmt_list , s1 -> parent )) {
808- for (statement * s2 = stmt1 ; s2 != (statement * )prog -> stmt_list -> a ; s2 = GET_STMT (prog -> stmt_list , s2 -> parent )) {
805+ stmt1 = & prog -> stmt_list -> a [parent1 ];
806+ stmt2 = & prog -> stmt_list -> a [parent2 ];
807+ for (statement * s1 = stmt1 ; s1 != prog -> stmt_list -> a ; s1 = & prog -> stmt_list -> a [s1 -> parent ]) {
808+ // TODO typo? stmt2? also convert all these pointers to indices?
809+ for (statement * s2 = stmt1 ; s2 != prog -> stmt_list -> a ; s2 = & prog -> stmt_list -> a [s2 -> parent ]) {
809810if (s1 -> parent == s2 -> parent ) {
810811max = (s1 -> parent > max ) ? s1 -> parent : max ;
811812}
0 commit comments