diff --git a/include/asm/lexer.hpp b/include/asm/lexer.hpp index cb42ae09..42401216 100644 --- a/include/asm/lexer.hpp +++ b/include/asm/lexer.hpp @@ -46,6 +46,14 @@ struct ContentSpan { size_t size; }; +struct ViewedContent { + ContentSpan span; + size_t offset = 0; + + ViewedContent(ContentSpan const &span_) : span(span_) {} + ViewedContent(std::shared_ptr ptr, size_t size) : span({.ptr = ptr, .size = size}) {} +}; + struct BufferedContent { int fd; size_t index = 0; // Read index into the buffer @@ -56,20 +64,6 @@ struct BufferedContent { ~BufferedContent(); }; -struct MmappedContent { - ContentSpan span; - size_t offset = 0; - - MmappedContent(std::shared_ptr ptr, size_t size) : span({.ptr = ptr, .size = size}) {} -}; - -struct ViewedContent { - ContentSpan span; - size_t offset = 0; - - ViewedContent(ContentSpan const &span_) : span(span_) {} -}; - struct LexerState { std::string path; @@ -92,7 +86,7 @@ struct LexerState { bool expandStrings; std::deque expansions; // Front is the innermost current expansion - std::variant content; + std::variant content; ~LexerState(); diff --git a/src/asm/lexer.cpp b/src/asm/lexer.cpp index 4ed97fce..7d9d15b5 100644 --- a/src/asm/lexer.cpp +++ b/src/asm/lexer.cpp @@ -425,7 +425,7 @@ bool LexerState::setFileAsNextState(std::string const &filePath, bool updateStat if (mappingAddr != MAP_FAILED) { close(fd); - content.emplace( + content.emplace( std::shared_ptr( (char *)mappingAddr, MunmapDeleter((size_t)statBuf.st_size) ), @@ -468,9 +468,7 @@ void LexerState::setViewAsNextState(char const *name, ContentSpan const &span, u } void lexer_RestartRept(uint32_t lineNo) { - if (auto *mmap = std::get_if(&lexerState->content); mmap) { - mmap->offset = 0; - } else if (auto *view = std::get_if(&lexerState->content); view) { + if (auto *view = std::get_if(&lexerState->content); view) { view->offset = 0; } lexerState->clear(lineNo); @@ -672,11 +670,7 @@ static int peekInternal(uint8_t distance) { LEXER_BUF_SIZE ); - if (auto *mmap = std::get_if(&lexerState->content); mmap) { - if (size_t idx = mmap->offset + distance; idx < mmap->span.size) - return (uint8_t)mmap->span.ptr[idx]; - return EOF; - } else if (auto *view = std::get_if(&lexerState->content); view) { + if (auto *view = std::get_if(&lexerState->content); view) { if (size_t idx = view->offset + distance; idx < view->span.size) return (uint8_t)view->span.ptr[idx]; return EOF; @@ -796,9 +790,7 @@ restart: } else { // Advance within the file contents lexerState->colNo++; - if (auto *mmap = std::get_if(&lexerState->content); mmap) { - mmap->offset++; - } else if (auto *view = std::get_if(&lexerState->content); view) { + if (auto *view = std::get_if(&lexerState->content); view) { view->offset++; } else { assert(std::holds_alternative(lexerState->content)); @@ -2179,17 +2171,22 @@ static Capture startCapture() { lexerState->captureSize = 0; uint32_t lineNo = lexer_GetLineNo(); - if (auto *mmap = std::get_if(&lexerState->content); - mmap && lexerState->expansions.empty()) { - return {.lineNo = lineNo, .span = {.ptr = std::shared_ptr(mmap->span.ptr, &mmap->span.ptr[mmap->offset]), .size = 0}}; - } else if (auto *view = std::get_if(&lexerState->content); - view && lexerState->expansions.empty()) { - return {.lineNo = lineNo, .span = {.ptr = std::shared_ptr(view->span.ptr, &view->span.ptr[view->offset]), .size = 0}}; + if (auto *view = std::get_if(&lexerState->content); + view && lexerState->expansions.empty()) { + return { + .lineNo = lineNo, + .span = { + .ptr = std::shared_ptr(view->span.ptr, &view->span.ptr[view->offset]), + .size = 0, + } + }; } else { assert(lexerState->captureBuf == nullptr); lexerState->captureBuf = std::make_shared>(); // `.span.ptr == nullptr`; indicates to retrieve the capture buffer when done capturing - return {.lineNo = lineNo, .span = {.ptr = nullptr, .size = 0}}; + return { + .lineNo = lineNo, .span = {.ptr = nullptr, .size = 0} + }; } }