xref: /haiku/src/kits/debugger/debug_info/FunctionInstance.cpp (revision cbe0a0c436162d78cc3f92a305b64918c839d079)
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