@@ -179,6 +179,7 @@ class BenchProgram {
179179 // std::map<int,std::list<std::list<int>>> caseCluster;
180180 std::vector<std::pair<std::string,size_t >> scoreInfo;
181181 // std::map<std::pair<size_t,size_t>,size_t> conditionCases;
182+ std::map<std::string,std::map<std::string,std::map<size_t ,std::string>>> mutationInfo;
182183 std::vector<File> infos;
183184 public:
184185 SwitchInfo (std::string workdir):fileName(workdir+" /switch-info.json" ) {}
@@ -218,6 +219,33 @@ class BenchProgram {
218219 }
219220 cJSON_AddItemToObject (json,std::string (" priority" ).c_str (),scoreArray);
220221
222+ // Save mutation infos
223+ cJSON *mutationArray=cJSON_CreateArray ();
224+ for (std::map<std::string,std::map<std::string,std::map<size_t ,std::string>>>::iterator it=mutationInfo.begin ();it!=mutationInfo.end ();it++){
225+ cJSON *mutationObject=cJSON_CreateObject ();
226+ cJSON_AddStringToObject (mutationObject,std::string (" file" ).c_str (),it->first .c_str ());
227+
228+ cJSON *funcArray=cJSON_CreateArray ();
229+ for (std::map<std::string,std::map<size_t ,std::string>>::iterator it2=it->second .begin ();it2!=it->second .end ();it2++){
230+ cJSON *funcObject=cJSON_CreateObject ();
231+ cJSON_AddStringToObject (funcObject,std::string (" function" ).c_str (),it2->first .c_str ());
232+
233+ cJSON *varArray=cJSON_CreateArray ();
234+ for (std::map<size_t ,std::string>::iterator it3=it2->second .begin ();it3!=it2->second .end ();it3++){
235+ cJSON *varObject=cJSON_CreateObject ();
236+ cJSON_AddNumberToObject (varObject,std::string (" number" ).c_str (),it3->first );
237+ cJSON_AddStringToObject (varObject,std::string (" variable" ).c_str (),it3->second .c_str ());
238+
239+ cJSON_AddItemToArray (varArray,varObject);
240+ }
241+ cJSON_AddItemToObject (funcObject,std::string (" variables" ).c_str (),varArray);
242+ cJSON_AddItemToArray (funcArray,funcObject);
243+ }
244+ cJSON_AddItemToObject (mutationObject,std::string (" functions" ).c_str (),funcArray);
245+ cJSON_AddItemToArray (mutationArray,mutationObject);
246+ }
247+ cJSON_AddItemToObject (json,std::string (" mutation_info" ).c_str (),mutationArray);
248+
221249 // Save each patch rules
222250 cJSON *ruleArray=cJSON_CreateArray ();
223251 for (std::vector<File>::iterator it=infos.begin ();it!=infos.end ();it++){
@@ -323,23 +351,21 @@ class BenchProgram {
323351
324352 TestCache *cache;
325353
354+ std::map<std::string,std::string> build_dir_save;
355+ std::map<std::string,std::vector<std::string>> build_args_save;
356+
326357 void Init (const std::string &workDirPath, bool no_clean_up);
327358
328- bool buildFull (const std::string &subDir, time_t timeout_limit = 0 , bool force_reconf = false ,std::vector<long long > compile_macro=std::vector<long long >(),std::vector<std::string> files=std::vector<std::string>());
359+ bool buildFull (const std::string &subDir, time_t timeout_limit = 0 , bool force_reconf = false ,std::vector<long long > compile_macro=std::vector<long long >(),std::vector<std::string> files=std::vector<std::string>(),
360+ std::vector<long long> writer_macro=std::vector<long long>());
329361
330362 void getCompileMisc (const std::string &src_file, std::string &build_dir, std::vector<std::string> &build_args);
331363
332364 EnvMapTy ori_env_map;
333365
334- void pushEnvMap (const EnvMapTy &envMap);
335-
336- void popEnvMap (const EnvMapTy &envMap);
337366
338367 std::string ori_path_for_wrap_path;
339368
340- void pushWrapPath (const std::string &wrapPath, const std::string &cc_path);
341-
342- void popWrapPath ();
343369
344370 void deleteLibraryFile (const std::map<std::string, std::string> &fileCodeMap);
345371public:
@@ -370,8 +396,16 @@ class BenchProgram {
370396
371397 void addExistingSrcClone (const std::string &subDir, bool built);
372398
399+ void pushEnvMap (const EnvMapTy &envMap);
400+
401+ void popEnvMap (const EnvMapTy &envMap);
402+
403+ void pushWrapPath (const std::string &wrapPath, const std::string &cc_path);
404+
405+ void popWrapPath ();
406+
373407 std::unique_ptr<clang::ASTUnit> buildClangASTUnit (const std::string &src_file,
374- const std::string &code);
408+ const std::string &code,std::vector< long long > macros=std::vector< long long >() );
375409
376410 // bool runDG(std::vector<ASTLocTy> criteriaLocation);
377411 bool runDG (std::vector<std::string> files,std::map<std::string,std::set<unsigned >> lines);
@@ -381,10 +415,14 @@ class BenchProgram {
381415
382416 void saveFixedFiles (std::map<std::string, std::string> &fileCodeMap,std::string output_name);
383417
384- bool buildWithRepairedCode (const std::string &wrapScript, const EnvMapTy &envMap,
385- std::map<std::string, std::string> &fileCodeMap,std::map<long long ,std::string> macroWithCode,
386- std::map<std::string,std::vector<long long >> macroFile,
387- std::string output_name=" " );
418+ void applyRepairedCode (std::map<std::string, std::string> &fileCodeMap,EnvMapTy &envMap,std::string wrapScript);
419+ void rollbackOriginalCode (std::map<std::string, std::string> &fileCodeMap,EnvMapTy &envMap);
420+
421+ std::vector<long long > buildWithRepairedCode (const std::string &wrapScript, const EnvMapTy &envMap,
422+ const std::map<std::string, std::string> &fileCodeMap,const std::map<long long ,std::string> ¯oWithCode,
423+ const std::map<std::string,std::vector<long long >> ¯oFile,
424+ std::string output_name=" " ,
425+ std::vector<long long > macros=std::vector<long long >());
388426
389427 TestCaseSetTy testSet (const std::string &subDir, const TestCaseSetTy &case_set,
390428 const EnvMapTy &envMap, size_t totalSwitch=0 ,size_t chooseSwitch=0 ,size_t chooseCase=0 ,size_t pid=0 ,bool pass_basic_src_dir = false );
0 commit comments