[Bf-blender-cvs] [fd0226f6148] functions: handle type extensions as references instead of pointers by default

Jacques Lucke noreply at git.blender.org
Wed Jul 24 19:12:19 CEST 2019


Commit: fd0226f6148167c1ffab5f8c823059c3fb2d4043
Author: Jacques Lucke
Date:   Wed Jul 24 17:52:22 2019 +0200
Branches: functions
https://developer.blender.org/rBfd0226f6148167c1ffab5f8c823059c3fb2d4043

handle type extensions as references instead of pointers by default

===================================================================

M	source/blender/functions/backends/llvm/fgraph_ir_generation.cpp
M	source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
M	source/blender/functions/backends/llvm/llvm_types.hpp
M	source/blender/functions/backends/tuple/tuple.cpp
M	source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
M	source/blender/functions/core/function.hpp
M	source/blender/functions/core/type.hpp
M	source/blender/functions/functions/auto_vectorization.cpp
M	source/blender/functions/functions/switch.cpp
M	source/blender/functions/functions/vectors.cpp
M	source/blender/simulations/bparticles/particle_function.cpp

===================================================================

diff --git a/source/blender/functions/backends/llvm/fgraph_ir_generation.cpp b/source/blender/functions/backends/llvm/fgraph_ir_generation.cpp
index f836b4c621b..34952834655 100644
--- a/source/blender/functions/backends/llvm/fgraph_ir_generation.cpp
+++ b/source/blender/functions/backends/llvm/fgraph_ir_generation.cpp
@@ -107,8 +107,7 @@ class BuildGraphIR : public LLVMBuildIRBody {
   {
     llvm::Value *value_to_forward = values.lookup(output);
     SharedType &type = m_graph->type_of_socket(output);
-    LLVMTypeInfo *type_info = type->extension<LLVMTypeInfo>();
-    BLI_assert(type_info);
+    LLVMTypeInfo &type_info = type->extension<LLVMTypeInfo>();
 
     Vector<DFGraphSocket> targets;
     for (DFGraphSocket target : m_graph->targets_of_output(output)) {
@@ -119,7 +118,7 @@ class BuildGraphIR : public LLVMBuildIRBody {
     }
 
     if (targets.size() == 0) {
-      type_info->build_free_ir(builder, value_to_forward);
+      type_info.build_free_ir(builder, value_to_forward);
     }
     else if (targets.size() == 1) {
       values.add(targets[0], value_to_forward);
@@ -128,7 +127,7 @@ class BuildGraphIR : public LLVMBuildIRBody {
       values.add(targets[0], value_to_forward);
       for (uint i = 1; i < targets.size(); i++) {
         DFGraphSocket target = targets[i];
-        llvm::Value *copied_value = type_info->build_copy_ir(builder, value_to_forward);
+        llvm::Value *copied_value = type_info.build_copy_ir(builder, value_to_forward);
         values.add(target, copied_value);
       }
     }
diff --git a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
index 19ebcd9fc33..6f6c3ab7920 100644
--- a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
@@ -66,8 +66,8 @@ static llvm::Function *insert_tuple_call_function(SharedFunction &fn, llvm::Modu
   for (uint i = 0; i < fn->input_amount(); i++) {
     llvm::Value *value_byte_addr = lookup_tuple_address(builder, fn_in_data, fn_in_offsets, i);
 
-    LLVMTypeInfo *type_info = get_type_info(fn->input_type(i));
-    llvm::Value *value = type_info->build_load_ir__relocate(builder, value_byte_addr);
+    LLVMTypeInfo &type_info = fn->input_type(i)->extension<LLVMTypeInfo>();
+    llvm::Value *value = type_info.build_load_ir__relocate(builder, value_byte_addr);
 
     input_values.append(value);
   }
@@ -81,8 +81,8 @@ static llvm::Function *insert_tuple_call_function(SharedFunction &fn, llvm::Modu
   for (uint i = 0; i < output_values.size(); i++) {
     llvm::Value *value_byte_addr = lookup_tuple_address(builder, fn_out_data, fn_out_offsets, i);
 
-    LLVMTypeInfo *type_info = get_type_info(fn->output_type(i));
-    type_info->build_store_ir__relocate(builder, output_values[i], value_byte_addr);
+    LLVMTypeInfo &type_info = fn->output_type(i)->extension<LLVMTypeInfo>();
+    type_info.build_store_ir__relocate(builder, output_values[i], value_byte_addr);
   }
 
   builder.CreateRetVoid();
diff --git a/source/blender/functions/backends/llvm/llvm_types.hpp b/source/blender/functions/backends/llvm/llvm_types.hpp
index 30929275fdd..4ebbd1700b4 100644
--- a/source/blender/functions/backends/llvm/llvm_types.hpp
+++ b/source/blender/functions/backends/llvm/llvm_types.hpp
@@ -139,16 +139,9 @@ class PointerLLVMTypeInfo : public LLVMTypeInfo {
   llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override;
 };
 
-inline LLVMTypeInfo *get_type_info(const SharedType &type)
-{
-  auto ext = type->extension<LLVMTypeInfo>();
-  BLI_assert(ext);
-  return ext;
-}
-
 inline llvm::Type *get_llvm_type(SharedType &type, llvm::LLVMContext &context)
 {
-  return get_type_info(type)->get_type(context);
+  return type->extension<LLVMTypeInfo>().get_type(context);
 }
 
 Vector<llvm::Type *> types_of_type_infos(const Vector<LLVMTypeInfo *> &type_infos,
diff --git a/source/blender/functions/backends/tuple/tuple.cpp b/source/blender/functions/backends/tuple/tuple.cpp
index 805ff2246dc..eecc46f571e 100644
--- a/source/blender/functions/backends/tuple/tuple.cpp
+++ b/source/blender/functions/backends/tuple/tuple.cpp
@@ -7,11 +7,11 @@ TupleMeta::TupleMeta(ArrayRef<SharedType> types) : m_types(types)
   m_all_trivially_destructible = true;
   m_size__data = 0;
   for (const SharedType &type : types) {
-    CPPTypeInfo *info = type->extension<CPPTypeInfo>();
+    CPPTypeInfo &info = type->extension<CPPTypeInfo>();
     m_offsets.append(m_size__data);
-    m_type_info.append(info);
-    m_size__data += info->size_of_type();
-    if (!info->trivially_destructible()) {
+    m_type_info.append(&info);
+    m_size__data += info.size_of_type();
+    if (!info.trivially_destructible()) {
       m_all_trivially_destructible = false;
     }
   }
diff --git a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
index f0ffaff8de2..5c4e745708b 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -49,8 +49,8 @@ class ExecuteFGraph : public TupleCallBody {
     uint offset;
     uint is_fn_output : 1;
 
-    SocketInfo(CPPTypeInfo *type, uint offset, bool is_fn_output)
-        : type(type), offset(offset), is_fn_output(is_fn_output)
+    SocketInfo(CPPTypeInfo &type, uint offset, bool is_fn_output)
+        : type(&type), offset(offset), is_fn_output(is_fn_output)
     {
     }
   };
@@ -88,17 +88,15 @@ class ExecuteFGraph : public TupleCallBody {
 
       if (body == nullptr) {
         for (auto type : fn->input_types()) {
-          CPPTypeInfo *type_info = type->extension<CPPTypeInfo>();
-          BLI_assert(type_info);
-          uint type_size = type_info->size_of_type();
+          CPPTypeInfo &type_info = type->extension<CPPTypeInfo>();
+          uint type_size = type_info.size_of_type();
           m_input_info.append(SocketInfo(type_info, m_inputs_buffer_size, false));
           m_inputs_buffer_size += type_size;
         }
 
         for (auto type : fn->output_types()) {
-          CPPTypeInfo *type_info = type->extension<CPPTypeInfo>();
-          BLI_assert(type_info);
-          uint type_size = type_info->size_of_type();
+          CPPTypeInfo &type_info = type->extension<CPPTypeInfo>();
+          uint type_size = type_info.size_of_type();
           m_output_info.append(SocketInfo(type_info, m_outputs_buffer_size, false));
           m_outputs_buffer_size += type_size;
         }
@@ -107,14 +105,14 @@ class ExecuteFGraph : public TupleCallBody {
         SharedTupleMeta &meta_in = body->meta_in();
         for (uint i = 0; i < fn->input_amount(); i++) {
           m_input_info.append(SocketInfo(
-              meta_in->type_infos()[i], m_inputs_buffer_size + meta_in->offsets()[i], false));
+              *meta_in->type_infos()[i], m_inputs_buffer_size + meta_in->offsets()[i], false));
         }
         m_inputs_buffer_size += meta_in->size_of_data();
 
         SharedTupleMeta &meta_out = body->meta_out();
         for (uint i = 0; i < fn->output_amount(); i++) {
           m_output_info.append(SocketInfo(
-              meta_out->type_infos()[i], m_outputs_buffer_size + meta_out->offsets()[i], false));
+              *meta_out->type_infos()[i], m_outputs_buffer_size + meta_out->offsets()[i], false));
         }
         m_outputs_buffer_size += meta_out->size_of_data();
       }
diff --git a/source/blender/functions/core/function.hpp b/source/blender/functions/core/function.hpp
index 80c1c547ea9..1d798de78d1 100644
--- a/source/blender/functions/core/function.hpp
+++ b/source/blender/functions/core/function.hpp
@@ -77,7 +77,8 @@ class Function final : public RefCountedBase {
   template<typename T> inline bool has_body() const;
 
   /**
-   * Return a type extension of type T if it exists in the function. Otherwise nullptr.
+   * Return a function body of type T.
+   * Asserts when the body type does not exist in this function.
    */
   template<typename T> inline T &body() const;
 
@@ -241,9 +242,7 @@ template<typename T> inline Vector<T *> Function::input_extensions() const
 {
   Vector<T *> extensions;
   for (auto &type : m_input_types) {
-    T *ext = type->extension<T>();
-    BLI_assert(ext);
-    extensions.append(ext);
+    extensions.append(&type->extension<T>());
   }
   return extensions;
 }
@@ -252,9 +251,7 @@ template<typename T> inline Vector<T *> Function::output_extensions() const
 {
   Vector<T *> extensions;
   for (auto &type : m_output_types) {
-    T *ext = type->extension<T>();
-    BLI_assert(ext);
-    extensions.append(ext);
+    extensions.append(&type->extension<T>());
   }
   return extensions;
 }
diff --git a/source/blender/functions/core/type.hpp b/source/blender/functions/core/type.hpp
index 7b7cc16558b..68651d49b97 100644
--- a/source/blender/functions/core/type.hpp
+++ b/source/blender/functions/core/type.hpp
@@ -40,6 +40,10 @@ class TypeExtension {
   void set_owner(Type *owner);
 
  public:
+  TypeExtension() = default;
+  TypeExtension(TypeExtension &other) = delete;
+  TypeExtension(TypeExtension &&other) = delete;
+
   virtual ~TypeExtension();
 
   Type *owner() const;
@@ -64,9 +68,10 @@ class Type final : public RefCountedBase {
   template<typename T> bool has_extension() const;
 
   /**
-   * Return the extension of type T or nullptr when the extension does not exist on this type.
+   * Return the extension of type T.
+   * Asserts when the extension does not exist.
    */
-  template<typename T> T *extension() const;
+  template<typename T> T &extension() const;
 
   /**
    * Add a new extension of type T to the type. It will be constructed using the args passed to
@@ -105,10 +110,11 @@ template<typename T> inline bool Type::has_extension() const
   return m_extensions[T::TYPE_EXTENSION_ID] != nullptr;
 }
 
-template<typename T> inline T *Type::extension() const
+template<typename T> inline T &Type::extension() const
 {
   STATIC_ASSERT_EXTENSION_TYPE(T);
-  return (T *)m_extensions[T::TYPE_EXTENSION_ID];
+  BLI_assert(this->has_extension<T>());
+  return *(T *)m_extensions[T::TYPE_EXTENSION_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list