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(); } }