[clang] ce96fdd - [clang][bytecode] Keep the last chunk in InterpStack::clear() (#144487)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 17 03:38:04 PDT 2025
Author: Timm Baeder
Date: 2025-06-17T12:38:02+02:00
New Revision: ce96fdde54c379fa3893f3f07d8233df9e16b9e2
URL: https://github.com/llvm/llvm-project/commit/ce96fdde54c379fa3893f3f07d8233df9e16b9e2
DIFF: https://github.com/llvm/llvm-project/commit/ce96fdde54c379fa3893f3f07d8233df9e16b9e2.diff
LOG: [clang][bytecode] Keep the last chunk in InterpStack::clear() (#144487)
We call clear when checking for potential constant expressions, but that
used to free all the chunks. Keep the last one so we don't have to
re-allocate it.
Added:
Modified:
clang/lib/AST/ByteCode/InterpStack.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/InterpStack.cpp b/clang/lib/AST/ByteCode/InterpStack.cpp
index b183335dd5884..6b748d62b83bd 100644
--- a/clang/lib/AST/ByteCode/InterpStack.cpp
+++ b/clang/lib/AST/ByteCode/InterpStack.cpp
@@ -19,9 +19,7 @@
using namespace clang;
using namespace clang::interp;
-InterpStack::~InterpStack() { clear(); }
-
-void InterpStack::clear() {
+InterpStack::~InterpStack() {
if (Chunk && Chunk->Next)
std::free(Chunk->Next);
if (Chunk)
@@ -33,6 +31,21 @@ void InterpStack::clear() {
#endif
}
+// We keep the last chunk around to reuse.
+void InterpStack::clear() {
+ if (!Chunk)
+ return;
+
+ if (Chunk->Next)
+ std::free(Chunk->Next);
+
+ assert(Chunk);
+ StackSize = 0;
+#ifndef NDEBUG
+ ItemTypes.clear();
+#endif
+}
+
void InterpStack::clearTo(size_t NewSize) {
assert(NewSize <= size());
size_t ToShrink = size() - NewSize;
More information about the cfe-commits
mailing list