From e5c8440fe4901d215a892016da39be4367df8b51 Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Fri, 10 Aug 2018 17:21:08 -0700 Subject: [PATCH] [libSyntax] Make RawSyntaxCacheNode retain its underlying RawSyntax node Previously RawSyntaxCacheNode was not increasing the RawSyntax refCount and accessing a cached node would fail if the node had been deleted in the meantime. We weren't hitting this so far, because all nodes were allocated using a bump allocator and thus the underlying memory never freed. --- lib/Syntax/SyntaxArena.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Syntax/SyntaxArena.cpp b/lib/Syntax/SyntaxArena.cpp index 65e59021952..9efcf2fce20 100644 --- a/lib/Syntax/SyntaxArena.cpp +++ b/lib/Syntax/SyntaxArena.cpp @@ -75,16 +75,16 @@ class RawSyntaxCacheNode : public llvm::FoldingSetNode { friend llvm::FoldingSetTrait; /// Associated RawSyntax. - RawSyntax *Obj; + RC Obj; /// FoldingSet node identifier of the associated RawSyntax. llvm::FoldingSetNodeIDRef IDRef; public: - RawSyntaxCacheNode(RawSyntax *Obj, const llvm::FoldingSetNodeIDRef IDRef) + RawSyntaxCacheNode(RC Obj, const llvm::FoldingSetNodeIDRef IDRef) : Obj(Obj), IDRef(IDRef) {} /// Retrieve assciated RawSyntax. - RawSyntax *get() { return Obj; } + RC get() { return Obj; } // Only allow allocation of Node using the allocator in SyntaxArena. void *operator new(size_t Bytes, SyntaxArena &Arena, @@ -156,7 +156,7 @@ RC RawSyntax::getToken(SyntaxArena &Arena, tok TokKind, auto Raw = RawSyntax::make(TokKind, Text, LeadingTrivia, TrailingTrivia, SourcePresence::Present, &Arena); auto IDRef = ID.Intern(Arena.getAllocator()); - auto CacheNode = new (Arena) RawSyntaxCacheNode(Raw.get(), IDRef); + auto CacheNode = new (Arena) RawSyntaxCacheNode(Raw, IDRef); CachedTokens.InsertNode(CacheNode, insertPos); return Raw; }