bool CDirectiveArea::Validate() { size_t oldAreaSize = areaSize; size_t oldContentSize = contentSize; position = g_fileManager->getVirtualAddress(); if (sizeExpression.evaluateInteger(areaSize) == false) { Logger::queueError(Logger::Error,L"Invalid size expression"); return false; } if (fillExpression.isLoaded()) { if (fillExpression.evaluateInteger(fillValue) == false) { Logger::queueError(Logger::Error,L"Invalid fill expression"); return false; } } content->applyFileInfo(); bool result = content->Validate(); contentSize = g_fileManager->getVirtualAddress()-position; // restore info of this command applyFileInfo(); if (areaSize < contentSize) { Logger::queueError(Logger::Error,L"Area overflowed"); } if (fillExpression.isLoaded()) g_fileManager->advanceMemory(areaSize-contentSize); if (areaSize != oldAreaSize || contentSize != oldContentSize) result = true; return result; }
bool MipsMacroCommand::Validate() { int64_t memoryPos = g_fileManager->getVirtualAddress(); content->applyFileInfo(); bool result = content->Validate(); int64_t newMemoryPos = g_fileManager->getVirtualAddress(); applyFileInfo(); if (IgnoreLoadDelay == false && Mips.GetDelaySlot() == true && (newMemoryPos-memoryPos) > 4 && (macroFlags & MIPSM_DONTWARNDELAYSLOT) == 0) { Logger::queueError(Logger::Warning,L"Macro with multiple opcodes used inside a delay slot"); } if (newMemoryPos == memoryPos) Logger::queueError(Logger::Warning,L"Empty macro content"); return result; }