[clang][Interp][NFC] Simplify InterpFrame constructor
authorTimm Bäder <tbaeder@redhat.com>
Wed, 12 Oct 2022 07:07:27 +0000 (09:07 +0200)
committerTimm Bäder <tbaeder@redhat.com>
Wed, 18 Jan 2023 17:14:23 +0000 (18:14 +0100)
Try to decrease the block depth here a bit.

clang/lib/AST/Interp/InterpFrame.cpp

index 9acfbe3..da228d0 100644 (file)
@@ -24,19 +24,22 @@ InterpFrame::InterpFrame(InterpState &S, const Function *Func,
     : Caller(Caller), S(S), Func(Func), RetPC(RetPC),
       ArgSize(Func ? Func->getArgSize() : 0),
       Args(static_cast<char *>(S.Stk.top())), FrameOffset(S.Stk.size()) {
-  if (Func) {
-    if (unsigned FrameSize = Func->getFrameSize()) {
-      Locals = std::make_unique<char[]>(FrameSize);
-      for (auto &Scope : Func->scopes()) {
-        for (auto &Local : Scope.locals()) {
-          Block *B = new (localBlock(Local.Offset)) Block(Local.Desc);
-          B->invokeCtor();
-          InlineDescriptor *ID = localInlineDesc(Local.Offset);
-          ID->Desc = Local.Desc;
-          ID->IsActive = true;
-          ID->Offset = sizeof(InlineDescriptor);
-        }
-      }
+  if (!Func)
+    return;
+
+  unsigned FrameSize = Func->getFrameSize();
+  if (FrameSize == 0)
+    return;
+
+  Locals = std::make_unique<char[]>(FrameSize);
+  for (auto &Scope : Func->scopes()) {
+    for (auto &Local : Scope.locals()) {
+      Block *B = new (localBlock(Local.Offset)) Block(Local.Desc);
+      B->invokeCtor();
+      InlineDescriptor *ID = localInlineDesc(Local.Offset);
+      ID->Desc = Local.Desc;
+      ID->IsActive = true;
+      ID->Offset = sizeof(InlineDescriptor);
     }
   }
 }