Skip to content

Commit

Permalink
Use RAII to unmap or close the lexer states' files automatically
Browse files Browse the repository at this point in the history
  • Loading branch information
Rangi42 committed Mar 22, 2024
1 parent 507439b commit 6a5518e
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
12 changes: 11 additions & 1 deletion include/asm/lexer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,17 @@ struct LexerState {
std::deque<Expansion> expansions; // Front is the innermost current expansion

std::variant<std::monostate, MmappedLexerState, ViewedLexerState, BufferedLexerState> content;

LexerState() = default;
LexerState(LexerState &&) = default;
LexerState(LexerState const &) = delete;

// This destructor unmaps or closes the content file if applicable.
// As such, lexer states should not be copyable.
~LexerState();

LexerState &operator=(LexerState &&) = default;
LexerState &operator=(LexerState const &) = delete;
};

extern LexerState *lexerState;
Expand Down Expand Up @@ -117,7 +128,6 @@ void lexer_OpenFileView(
LexerState &state, char const *path, char const *buf, size_t size, uint32_t lineNo
);
void lexer_RestartRept(uint32_t lineNo);
void lexer_CleanupState(LexerState &state);
void lexer_Init();
void lexer_SetMode(LexerMode mode);
void lexer_ToggleStringExpansion(bool enable);
Expand Down
1 change: 0 additions & 1 deletion src/asm/fstack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ bool yywrap() {
return true;
}

lexer_CleanupState(contextStack.top().lexerState);
contextStack.pop();
lexer_SetState(&contextStack.top().lexerState);

Expand Down
8 changes: 4 additions & 4 deletions src/asm/lexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ void lexer_RestartRept(uint32_t lineNo) {
lexerState->lineNo = lineNo;
}

void lexer_CleanupState(LexerState &state) {
LexerState::~LexerState() {
// A big chunk of the lexer state soundness is the file stack ("fstack").
// Each context in the fstack has its own *unique* lexer state; thus, we always guarantee
// that lexer states lifetimes are always properly managed, since they're handled solely
Expand All @@ -471,12 +471,12 @@ void lexer_CleanupState(LexerState &state) {
// This assertion checks that this doesn't happen again.
// It could be argued that deleting a state that's scheduled for EOF could simply clear
// `lexerStateEOL`, but there's currently no situation in which this should happen.
assert(&state != lexerStateEOL);
assert(this != lexerStateEOL);

if (auto *mmap = std::get_if<MmappedLexerState>(&state.content); mmap) {
if (auto *mmap = std::get_if<MmappedLexerState>(&content); mmap) {
if (!mmap->isReferenced)
munmap(mmap->ptr, mmap->size);
} else if (auto *cbuf = std::get_if<BufferedLexerState>(&state.content); cbuf) {
} else if (auto *cbuf = std::get_if<BufferedLexerState>(&content); cbuf) {
close(cbuf->fd);
}
}
Expand Down

0 comments on commit 6a5518e

Please sign in to comment.