2
#include "Commands/CDirectiveConditional.h"
3
#include "Core/Common.h"
4
#include "Archs/ARM/Arm.h"
7
extern CArmArchitecture Arm;
9
CDirectiveConditional::CDirectiveConditional(ConditionType type)
15
previousResult = false;
18
CDirectiveConditional::CDirectiveConditional(ConditionType type, const std::wstring& name)
19
: CDirectiveConditional(type)
21
label = Global.symbolTable.getLabel(name,Global.FileInfo.FileNum,Global.Section);
23
Logger::printError(Logger::Error,L"Invalid label name \"%s\"",name);
26
CDirectiveConditional::CDirectiveConditional(ConditionType type, const Expression& exp)
27
: CDirectiveConditional(type)
29
this->expression = exp;
32
CDirectiveConditional::~CDirectiveConditional()
38
void CDirectiveConditional::setContent(CAssemblerCommand* ifBlock, CAssemblerCommand* elseBlock)
40
this->ifBlock = ifBlock;
41
this->elseBlock = elseBlock;
44
bool CDirectiveConditional::evaluate()
47
if (expression.isLoaded())
49
if (expression.evaluateInteger(value) == false)
51
Logger::queueError(Logger::Error,L"Invalid conditional expression");
58
case ConditionType::IF:
60
case ConditionType::IFDEF:
61
return label->isDefined();
62
case ConditionType::IFNDEF:
63
return !label->isDefined();
66
Logger::queueError(Logger::Error,L"Invalid conditional type");
70
bool CDirectiveConditional::Validate()
72
bool result = evaluate();
73
bool returnValue = result != previousResult;
74
previousResult = result;
78
ifBlock->applyFileInfo();
79
if (ifBlock->Validate())
81
} else if (elseBlock != NULL)
83
elseBlock->applyFileInfo();
84
if (elseBlock->Validate())
91
void CDirectiveConditional::Encode() const
96
} else if (elseBlock != NULL)
102
void CDirectiveConditional::writeTempData(TempData& tempData) const
106
ifBlock->applyFileInfo();
107
ifBlock->writeTempData(tempData);
108
} else if (elseBlock != NULL)
110
elseBlock->applyFileInfo();
111
elseBlock->writeTempData(tempData);
115
void CDirectiveConditional::writeSymData(SymbolData& symData) const
119
ifBlock->writeSymData(symData);
120
} else if (elseBlock != NULL)
122
elseBlock->writeSymData(symData);