[Bf-blender-cvs] [213d807a08c] functions: deduplicate some code
Jacques Lucke
noreply at git.blender.org
Fri Sep 6 16:55:54 CEST 2019
Commit: 213d807a08c1aa391b4ac8579c7c0b0df4850d4a
Author: Jacques Lucke
Date: Fri Sep 6 14:14:33 2019 +0200
Branches: functions
https://developer.blender.org/rB213d807a08c1aa391b4ac8579c7c0b0df4850d4a
deduplicate some code
===================================================================
M source/blender/functions/backends/llvm/llvm_type_info.hpp
===================================================================
diff --git a/source/blender/functions/backends/llvm/llvm_type_info.hpp b/source/blender/functions/backends/llvm/llvm_type_info.hpp
index 21c9cbfc545..a8cb4f861e5 100644
--- a/source/blender/functions/backends/llvm/llvm_type_info.hpp
+++ b/source/blender/functions/backends/llvm/llvm_type_info.hpp
@@ -151,30 +151,7 @@ class ReferencedPointerLLVMTypeInfo : public LLVMTypeInfo {
}
};
-/**
- * Use this when the type is reference counted. Furthermore, the type has to be immutable when
- * object is owned by more than one.
- */
-template<typename T> class SharedImmutablePointerLLVMTypeInfo : public LLVMTypeInfo {
- private:
- static T *copy_by_incrementing_refcount(T *value)
- {
- if (value == nullptr) {
- return nullptr;
- }
- else {
- value->incref();
- return value;
- }
- }
-
- static void free_by_decrementing_refcount(T *value)
- {
- if (value != nullptr) {
- value->decref();
- }
- }
-
+template<typename T> class OwnedPointerLLVMTypeInfo : public LLVMTypeInfo {
public:
llvm::Type *get_type(llvm::LLVMContext &context) const override
{
@@ -183,18 +160,13 @@ template<typename T> class SharedImmutablePointerLLVMTypeInfo : public LLVMTypeI
llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const override
{
- return builder.CreateCallPointer((void *)copy_by_incrementing_refcount,
- {value},
- builder.getAnyPtrTy(),
- "copy by incrementing refcount");
+ return builder.CreateCallPointer(
+ (void *)T::copy_value, {value}, builder.getAnyPtrTy(), "copy value");
}
void build_free_ir(CodeBuilder &builder, llvm::Value *value) const override
{
- builder.CreateCallPointer((void *)free_by_decrementing_refcount,
- {value},
- builder.getVoidTy(),
- "free by decrementing refcount");
+ builder.CreateCallPointer((void *)T::free_value, {value}, builder.getVoidTy(), "free value");
}
void build_store_ir__copy(CodeBuilder &builder,
@@ -232,75 +204,54 @@ template<typename T> class SharedImmutablePointerLLVMTypeInfo : public LLVMTypeI
};
/**
- * The type has to implement a clone() method.
+ * Use this when the type is reference counted. Furthermore, the type has to be immutable when
+ * object is owned by more than one.
*/
-template<typename T> class UniqueVirtualPointerLLVMTypeInfo : public LLVMTypeInfo {
- private:
- static T *copy_value(const T *value)
+template<typename T>
+class SharedImmutablePointerLLVMTypeInfo
+ : public OwnedPointerLLVMTypeInfo<SharedImmutablePointerLLVMTypeInfo<T>> {
+ public:
+ static T *copy_value(T *value)
{
if (value == nullptr) {
return nullptr;
}
else {
- return value->clone();
+ value->incref();
+ return value;
}
}
static void free_value(T *value)
{
if (value != nullptr) {
- delete value;
+ value->decref();
}
}
+};
+/**
+ * The type has to implement a clone() method.
+ */
+template<typename T>
+class UniqueVirtualPointerLLVMTypeInfo
+ : public OwnedPointerLLVMTypeInfo<UniqueVirtualPointerLLVMTypeInfo<T>> {
public:
- llvm::Type *get_type(llvm::LLVMContext &context) const override
- {
- return llvm::Type::getInt8PtrTy(context);
- }
-
- llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const override
- {
- return builder.CreateCallPointer(
- (void *)copy_value, {value}, builder.getAnyPtrTy(), "copy pointer");
- }
-
- void build_free_ir(CodeBuilder &builder, llvm::Value *value) const override
- {
- builder.CreateCallPointer((void *)free_value, {value}, builder.getVoidTy(), "free pointer");
- }
-
- void build_store_ir__copy(CodeBuilder &builder,
- llvm::Value *value,
- llvm::Value *address) const override
- {
- auto *copied_value = this->build_copy_ir(builder, value);
- this->build_store_ir__relocate(builder, copied_value, address);
- }
-
- void build_store_ir__relocate(CodeBuilder &builder,
- llvm::Value *value,
- llvm::Value *address) const override
- {
- auto *addr = builder.CastToAnyPtrPtr(address);
- builder.CreateStore(value, addr);
- }
-
- llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
+ static T *copy_value(const T *value)
{
- auto *addr = builder.CastToAnyPtrPtr(address);
- auto *value = builder.CreateLoad(addr);
- auto *copied_value = this->build_copy_ir(builder, value);
- return copied_value;
+ if (value == nullptr) {
+ return nullptr;
+ }
+ else {
+ return value->clone();
+ }
}
- llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override
+ static void free_value(T *value)
{
- auto *addr = builder.CastToAnyPtrPtr(address);
- auto *value = builder.CreateLoad(addr);
- auto *nullptr_value = builder.getAnyPtr((void *)nullptr);
- builder.CreateStore(nullptr_value, addr);
- return value;
+ if (value != nullptr) {
+ delete value;
+ }
}
};
More information about the Bf-blender-cvs
mailing list