[SyntaxParse] Prevent memory leak in Syntax parsing

Essentially re-applying b09f87594a
This commit is contained in:
Rintaro Ishizaki
2019-10-15 12:09:19 -07:00
parent 984f262a93
commit aeec682c90
25 changed files with 375 additions and 198 deletions

View File

@@ -19,15 +19,20 @@ using namespace llvm;
ParsedRawSyntaxNode
ParsedRawSyntaxNode::makeDeferred(SyntaxKind k,
ArrayRef<ParsedRawSyntaxNode> deferredNodes,
MutableArrayRef<ParsedRawSyntaxNode> deferredNodes,
SyntaxParsingContext &ctx) {
if (deferredNodes.empty()) {
return ParsedRawSyntaxNode(k, {});
}
ParsedRawSyntaxNode *newPtr =
ctx.getScratchAlloc().Allocate<ParsedRawSyntaxNode>(deferredNodes.size());
std::uninitialized_copy(deferredNodes.begin(), deferredNodes.end(), newPtr);
return ParsedRawSyntaxNode(k, makeArrayRef(newPtr, deferredNodes.size()));
// uninitialized move;
auto ptr = newPtr;
for (auto &node : deferredNodes)
:: new (static_cast<void *>(ptr++)) ParsedRawSyntaxNode(std::move(node));
return ParsedRawSyntaxNode(k, makeMutableArrayRef(newPtr, deferredNodes.size()));
}
ParsedRawSyntaxNode