[clang] 1c35f3b - [clang][Interp][NFC] Unify emit() implementations

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 29 03:51:25 PDT 2022


Author: Timm Bäder
Date: 2022-09-29T12:50:55+02:00
New Revision: 1c35f3b93aff7c39832f42f470c45fd24c3a779c

URL: https://github.com/llvm/llvm-project/commit/1c35f3b93aff7c39832f42f470c45fd24c3a779c
DIFF: https://github.com/llvm/llvm-project/commit/1c35f3b93aff7c39832f42f470c45fd24c3a779c.diff

LOG: [clang][Interp][NFC] Unify emit() implementations

Instead of two overloads, use a if constexpr to differentiate between
pointer and non-pointer parameters

Added: 
    

Modified: 
    clang/lib/AST/Interp/ByteCodeEmitter.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeEmitter.cpp b/clang/lib/AST/Interp/ByteCodeEmitter.cpp
index 42a3ab7837f9..20e054ab87df 100644
--- a/clang/lib/AST/Interp/ByteCodeEmitter.cpp
+++ b/clang/lib/AST/Interp/ByteCodeEmitter.cpp
@@ -129,30 +129,28 @@ bool ByteCodeEmitter::bail(const SourceLocation &Loc) {
 /// Helper to write bytecode and bail out if 32-bit offsets become invalid.
 /// Pointers will be automatically marshalled as 32-bit IDs.
 template <typename T>
-static std::enable_if_t<!std::is_pointer<T>::value, void>
-emit(Program &P, std::vector<char> &Code, const T &Val, bool &Success) {
-  size_t Size = sizeof(Val);
-  if (Code.size() + Size > std::numeric_limits<unsigned>::max()) {
-    Success = false;
-    return;
-  }
+static void emit(Program &P, std::vector<char> &Code, const T &Val,
+                 bool &Success) {
+  size_t Size;
 
-  const char *Data = reinterpret_cast<const char *>(&Val);
-  Code.insert(Code.end(), Data, Data + Size);
-}
+  if constexpr (std::is_pointer_v<T>)
+    Size = sizeof(uint32_t);
+  else
+    Size = sizeof(T);
 
-template <typename T>
-static std::enable_if_t<std::is_pointer<T>::value, void>
-emit(Program &P, std::vector<char> &Code, const T &Val, bool &Success) {
-  size_t Size = sizeof(uint32_t);
   if (Code.size() + Size > std::numeric_limits<unsigned>::max()) {
     Success = false;
     return;
   }
 
-  uint32_t ID = P.getOrCreateNativePointer(Val);
-  const char *Data = reinterpret_cast<const char *>(&ID);
-  Code.insert(Code.end(), Data, Data + Size);
+  if constexpr (!std::is_pointer_v<T>) {
+    const char *Data = reinterpret_cast<const char *>(&Val);
+    Code.insert(Code.end(), Data, Data + Size);
+  } else {
+    uint32_t ID = P.getOrCreateNativePointer(Val);
+    const char *Data = reinterpret_cast<const char *>(&ID);
+    Code.insert(Code.end(), Data, Data + Size);
+  }
 }
 
 template <typename... Tys>


        


More information about the cfe-commits mailing list