Beispiel #1
0
void 
_parser::remove_statement(void)
{
	LOCK_OBJECT(std::recursive_mutex, _parser_lock);

	remove_statement(_position);
}
void RemoveLoopLabelLocStmtsPass::do_procedure_definition(ProcedureDefinition *proc_def){
    if(proc_def){

       list<LabelLocationStatement*>* label_loc_stmts = collect_objects<LabelLocationStatement>(proc_def->get_body());

       while(label_loc_stmts->size() > 0){	
	   remove_statement(label_loc_stmts->front());
	   label_loc_stmts->pop_front();
       }

       delete label_loc_stmts;
    }
}
void process_worklist(){

    while(!worklist->empty()){
	IfStatement *if_stmt = worklist->front();
	list<VariableSymbol*>* used_vars_in_if_stmt_condition_expr = collect_used_symbols(if_stmt->get_condition());

	list<Statement*>* then_stmt_list = form_child_stmt_list(if_stmt->get_then_part());
	list<Statement*>* else_stmt_list = form_child_stmt_list(if_stmt->get_else_part());

	list<VariableSymbol*>* modified_vars_in_then_stmt = new list<VariableSymbol*>;
	list<VariableSymbol*>* used_vars_in_then_stmt = new list<VariableSymbol*>;

	for(list<Statement*>::iterator iter = then_stmt_list->begin();
	    iter != then_stmt_list->end(); iter++){

            Iter<ArrayReferenceExpression> array_ref_iter = object_iterator<ArrayReferenceExpression>(*iter);
            if(array_ref_iter.is_valid()){
   	       push_back_items_into_list(collect_used_symbols(*iter), used_vars_in_then_stmt);
	       push_back_items_into_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt);
	       continue;
	    }

	    if(is_items_in_list(collect_used_symbols(*iter), modified_vars_in_then_stmt)){
   	       push_back_items_into_list(collect_used_symbols(*iter), used_vars_in_then_stmt);
	       push_back_items_into_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt);
	       continue;
	    }

	    if(is_items_in_list(collect_defined_symbols(*iter), used_vars_in_then_stmt)){
   	       push_back_items_into_list(collect_used_symbols(*iter), used_vars_in_then_stmt);
	       push_back_items_into_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt);
	       continue;
            }

	    if(is_items_in_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt)){
   	       push_back_items_into_list(collect_used_symbols(*iter), used_vars_in_then_stmt);
	       push_back_items_into_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt);
	       continue;
            }

	    if(is_items_in_list(collect_defined_symbols(*iter), used_vars_in_if_stmt_condition_expr)){
   	       push_back_items_into_list(collect_used_symbols(*iter), used_vars_in_then_stmt);
	       push_back_items_into_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt);
	       continue;
	    }
	    
  	    list<VariableSymbol*>* modified_vars_in_else_stmt = new list<VariableSymbol*>;
	    list<VariableSymbol*>* used_vars_in_else_stmt = new list<VariableSymbol*>;

	    for(list<Statement*>::iterator iter2 = else_stmt_list->begin();
	        iter2 != else_stmt_list->end(); iter2++){
 
                Iter<ArrayReferenceExpression> array_ref_iter = object_iterator<ArrayReferenceExpression>(*iter2);
                if(array_ref_iter.is_valid()){
   	           push_back_items_into_list(collect_used_symbols(*iter2), used_vars_in_else_stmt);
	           push_back_items_into_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt);
	           continue;
	        }

   	        if(is_items_in_list(collect_used_symbols(*iter2), modified_vars_in_else_stmt)){
   	           push_back_items_into_list(collect_used_symbols(*iter2), used_vars_in_else_stmt);
	           push_back_items_into_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt);
	           continue;
		}
	    
	        if(is_items_in_list(collect_defined_symbols(*iter2), used_vars_in_else_stmt)){
   	           push_back_items_into_list(collect_used_symbols(*iter2), used_vars_in_else_stmt);
	           push_back_items_into_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt);
	           continue;
		}
	    
	        if(is_items_in_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt)){
   	           push_back_items_into_list(collect_used_symbols(*iter2), used_vars_in_else_stmt);
	           push_back_items_into_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt);
	           continue;
		}
	    
  	        if(is_items_in_list(collect_defined_symbols(*iter2), used_vars_in_if_stmt_condition_expr)){
   	           push_back_items_into_list(collect_used_symbols(*iter2), used_vars_in_else_stmt);
	           push_back_items_into_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt);
	           continue;
		}

	        if(is_equal(*iter, *iter2)){
		
		   Statement *replacement = to<Statement>(deep_suif_clone(*iter));
		   insert_statement_before(if_stmt, replacement);

		   remove_statement(*iter);
		   remove_statement(*iter2);	   

		   remove_from_list(*iter2, else_stmt_list);
		   break;
		}

   	        push_back_items_into_list(collect_used_symbols(*iter2), used_vars_in_else_stmt);
	        push_back_items_into_list(collect_defined_symbols(*iter2), modified_vars_in_else_stmt);
	    }

   	    push_back_items_into_list(collect_used_symbols(*iter), used_vars_in_then_stmt);
	    push_back_items_into_list(collect_defined_symbols(*iter), modified_vars_in_then_stmt);

	}

	worklist->pop_front();
    }

}