1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include "FunctionInstance.h" 7 8 #include <new> 9 10 #include "DisassembledCode.h" 11 #include "Function.h" 12 #include "FunctionID.h" 13 #include "ImageDebugInfo.h" 14 #include "LocatableFile.h" 15 16 17 FunctionInstance::FunctionInstance(ImageDebugInfo* imageDebugInfo, 18 FunctionDebugInfo* functionDebugInfo) 19 : 20 fImageDebugInfo(imageDebugInfo), 21 fFunction(NULL), 22 fFunctionDebugInfo(functionDebugInfo), 23 fSourceCode(NULL), 24 fSourceCodeState(FUNCTION_SOURCE_NOT_LOADED) 25 { 26 fFunctionDebugInfo->AcquireReference(); 27 // TODO: What about fImageDebugInfo? We must be careful regarding cyclic 28 // references. 29 } 30 31 32 FunctionInstance::~FunctionInstance() 33 { 34 SetFunction(NULL); 35 SetSourceCode(NULL, FUNCTION_SOURCE_NOT_LOADED); 36 fFunctionDebugInfo->ReleaseReference(); 37 } 38 39 40 FunctionID* 41 FunctionInstance::GetFunctionID() const 42 { 43 if (LocatableFile* file = SourceFile()) { 44 BString path; 45 file->GetPath(path); 46 return new(std::nothrow) SourceFunctionID(path, Name()); 47 } 48 49 return new(std::nothrow) ImageFunctionID( 50 GetImageDebugInfo()->GetImageInfo().Name(), Name()); 51 } 52 53 54 void 55 FunctionInstance::SetFunction(Function* function) 56 { 57 if (fFunction != NULL) 58 fFunction->ReleaseReference(); 59 60 fFunction = function; 61 62 if (fFunction != NULL) 63 fFunction->AcquireReference(); 64 } 65 66 67 void 68 FunctionInstance::SetSourceCode(DisassembledCode* source, 69 function_source_state state) 70 { 71 if (source == fSourceCode && state == fSourceCodeState) 72 return; 73 74 if (fSourceCode != NULL) 75 fSourceCode->ReleaseReference(); 76 77 fSourceCode = source; 78 fSourceCodeState = state; 79 80 if (fSourceCode != NULL) 81 fSourceCode->AcquireReference(); 82 83 if (fFunction != NULL) 84 fFunction->NotifySourceCodeChanged(); 85 } 86