Clean the AST alloc interface #2111
Open
+90
−130
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
A previous PR introduced generic
alloc
andalloc_iter
methods, instead of needing a myriad ofxxx_move
functions for each and every AST component type. However, this poses a risk of memory leak because this method allocates in the generic bumpalo arena, which doesn't run destructors.This commit makes this approach safer by using a marker trait which forbids some AST components from being allocated through this method, when they need to be dropped. Anecdotally,
alloc_iter
is renamed toalloc_many
and a specialized versionalloc_singleton
is added to eliminate a lot ofalloc.alloc_many(iter::once(x))
.In a second time, all the legacy
xxx_move
variants or the like are removed, and replaced withalloc
andalloc_many
whenever possible, making the interface ofAstAlloc
quite smaller.