Commit: 05e3ee5ae6ae9dac2e53afb6b712f433ac7d864c
Author: Jacques Lucke
Date:   Sat Apr 6 18:05:34 2019 +0200
Branches: functions
https://developer.blender.org/rB05e3ee5ae6ae9dac2e53afb6b712f433ac7d864c

automatically destruct stack allocated tuples in c++

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

M       source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
M       source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
M       source/blender/functions/backends/tuple_call/tuple.hpp
M       source/blender/functions/backends/tuple_call/tuple_call-c.cpp
M       source/blender/functions/functions/auto_vectorization.cpp

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

diff --git a/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp 
b/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
index 5bfc9f844a9..fe268108b18 100644
--- a/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
@@ -150,9 +150,9 @@ namespace FN {
                        /* Allocate temporary stack buffer for tuple input and 
output. */
                        auto &meta_in = m_tuple_call->meta_in();
                        auto &meta_out = m_tuple_call->meta_out();
-                       llvm::Value *tuple_in_data_ptr = 
builder.CreateAllocaBytes_BytePtr(meta_in->total_data_size());
+                       llvm::Value *tuple_in_data_ptr = 
builder.CreateAllocaBytes_BytePtr(meta_in->size_of_data());
                        tuple_in_data_ptr->setName("tuple_in_data");
-                       llvm::Value *tuple_out_data_ptr = 
builder.CreateAllocaBytes_BytePtr(meta_out->total_data_size());
+                       llvm::Value *tuple_out_data_ptr = 
builder.CreateAllocaBytes_BytePtr(meta_out->size_of_data());
                        tuple_out_data_ptr->setName("tuple_out_data");
 
                        /* Write input values into buffer. */
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 6241207dd94..46d77c5208d 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -124,9 +124,9 @@ namespace FN {
                                BLI_assert(body != nullptr);
 
                                m_tuple_offsets.append(m_combined_tuples_size);
-                               m_combined_tuples_size += 
body->meta_in()->total_size();
+                               m_combined_tuples_size += 
body->meta_in()->size_of_full_tuple();
                                m_tuple_offsets.append(m_combined_tuples_size);
-                               m_combined_tuples_size += 
body->meta_out()->total_size();
+                               m_combined_tuples_size += 
body->meta_out()->size_of_full_tuple();
 
                                NodeTupleIndices indices;
                                indices.in = tuple_indices.size() * 2 + 0;
@@ -278,7 +278,7 @@ namespace FN {
                                        {
                                                auto meta = 
SharedTupleMeta::FromPointer(task.data.init_tuple.meta);
                                                void *ptr = (char *)buffer + 
m_tuple_offsets[task.data.init_tuple.index];
-                                               Tuple::NewInBuffer(meta, ptr);
+                                               Tuple::ConstructInBuffer(meta, 
ptr);
                                                meta.extract_ptr();
                                                break;
                                        }
@@ -410,9 +410,6 @@ namespace FN {
                                ctx.stack().pop();
 
                                Tuple::copy_element(tmp_out, socket.index(), 
out, out_index);
-
-                               FN_TUPLE_STACK_FREE(tmp_in);
-                               FN_TUPLE_STACK_FREE(tmp_out);
                        }
                }
        };
@@ -539,9 +536,6 @@ namespace FN {
                                                        fn_out, output_index,
                                                        temp_storage, 
socket_indices.lookup(output_socket));
                                        }
-
-                                       FN_TUPLE_STACK_FREE(fn_in);
-                                       FN_TUPLE_STACK_FREE(fn_out);
                                }
                                else if (fn->has_body<TupleCallBody>()) {
                                        auto *body = 
node->function()->body<TupleCallBody>();
@@ -570,9 +564,6 @@ namespace FN {
                                                                temp_storage, 
temp_index);
                                                }
                                        }
-
-                                       FN_TUPLE_STACK_FREE(fn_in);
-                                       FN_TUPLE_STACK_FREE(fn_out);
                                }
                                else {
                                        BLI_assert(false);
diff --git a/source/blender/functions/backends/tuple_call/tuple.hpp 
b/source/blender/functions/backends/tuple_call/tuple.hpp
index 92b83bcd170..46934ef9339 100644
--- a/source/blender/functions/backends/tuple_call/tuple.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple.hpp
@@ -9,20 +9,23 @@ namespace FN {
                SmallTypeVector m_types;
                SmallVector<CPPTypeInfo *> m_type_info;
                SmallVector<uint> m_offsets;
-               uint m_total_size;
+               uint m_size__data;
+               uint m_size__data_and_init;
 
        public:
                TupleMeta(const SmallTypeVector &types = {})
                        : m_types(types)
                {
-                       m_total_size = 0;
+                       m_size__data = 0;
                        for (const SharedType &type : types) {
                                CPPTypeInfo *info = 
type->extension<CPPTypeInfo>();
-                               m_offsets.append(m_total_size);
+                               m_offsets.append(m_size__data);
                                m_type_info.append(info);
-                               m_total_size += info->size_of_type();
+                               m_size__data += info->size_of_type();
                        }
-                       m_offsets.append(m_total_size);
+                       m_offsets.append(m_size__data);
+
+                       m_size__data_and_init = m_size__data + 
this->element_amount();
                }
 
                const SmallTypeVector &types() const
@@ -40,12 +43,22 @@ namespace FN {
                        return m_offsets;
                }
 
-               uint total_data_size() const
+               uint size_of_data() const
+               {
+                       return m_size__data;
+               }
+
+               uint size_of_init() const
                {
-                       return m_total_size;
+                       return m_size__data_and_init - m_size__data;
                }
 
-               inline uint total_size() const;
+               uint size_of_data_and_init() const
+               {
+                       return m_size__data_and_init;
+               }
+
+               inline uint size_of_full_tuple() const;
 
                uint element_amount() const
                {
@@ -67,7 +80,7 @@ namespace FN {
                {
                        m_initialized = (bool *)MEM_calloc_arrayN(
                                m_meta->element_amount(), sizeof(bool), 
__func__);
-                       m_data = MEM_mallocN(m_meta->total_data_size(), 
__func__);
+                       m_data = MEM_mallocN(m_meta->size_of_data(), __func__);
                        m_owns_mem = true;
                }
 
@@ -89,14 +102,21 @@ namespace FN {
                        }
                }
 
-               static Tuple &NewInBuffer(
+               Tuple(
+                       SharedTupleMeta &meta,
+                       void *buffer)
+                       : Tuple(
+                               meta,
+                               buffer,
+                               (bool *)buffer + meta->size_of_data(),
+                               false,
+                               false) {}
+
+               static Tuple &ConstructInBuffer(
                        SharedTupleMeta &meta,
                        void *buffer)
                {
-                       void *tuple_ptr = buffer;
-                       void *data_ptr = (char *)buffer + sizeof(Tuple);
-                       void *init_ptr = (char *)data_ptr + 
meta->total_data_size();
-                       Tuple *tuple = new(tuple_ptr) Tuple(meta, data_ptr, 
(bool *)init_ptr, false);
+                       Tuple *tuple = new(buffer) Tuple(meta, (char *)buffer + 
sizeof(Tuple));
                        return *tuple;
                }
 
@@ -379,17 +399,14 @@ namespace FN {
                SharedTupleMeta m_meta;
        };
 
-       inline uint TupleMeta::total_size() const
+       inline uint TupleMeta::size_of_full_tuple() const
        {
-               return sizeof(Tuple) + this->total_data_size() + 
this->element_amount();
+               return sizeof(Tuple) + this->size_of_data_and_init();
        }
 
 } /* namespace FN */
 
 #define FN_TUPLE_STACK_ALLOC(name, meta_expr) \
        SharedTupleMeta &name##_meta = (meta_expr); \
-       void *name##_buffer = alloca(name##_meta->total_size()); \
-       Tuple &name = Tuple::NewInBuffer(name##_meta, name##_buffer);
-
-#define FN_TUPLE_STACK_FREE(name) \
-       name.~Tuple();
+       void *name##_buffer = alloca(name##_meta->size_of_data_and_init()); \
+       Tuple name(name##_meta, name##_buffer);
diff --git a/source/blender/functions/backends/tuple_call/tuple_call-c.cpp 
b/source/blender/functions/backends/tuple_call/tuple_call-c.cpp
index f6058755b01..a31e036df26 100644
--- a/source/blender/functions/backends/tuple_call/tuple_call-c.cpp
+++ b/source/blender/functions/backends/tuple_call/tuple_call-c.cpp
@@ -50,7 +50,7 @@ void FN_tuple_free(FnTuple tuple)
 uint fn_tuple_stack_prepare_size(FnTupleCallBody body_)
 {
        TupleCallBody *body = unwrap(body_);
-       return body->meta_in()->total_size() + body->meta_out()->total_size();
+       return body->meta_in()->size_of_full_tuple() + 
body->meta_out()->size_of_full_tuple();
 }
 
 void fn_tuple_prepare_stack(
@@ -62,9 +62,9 @@ void fn_tuple_prepare_stack(
        TupleCallBody *body = unwrap(body_);
        char *buf = (char *)buffer;
        char *buf_in = buf + 0;
-       char *buf_out = buf + body->meta_in()->total_size();
-       Tuple::NewInBuffer(body->meta_in(), buf_in);
-       Tuple::NewInBuffer(body->meta_out(), buf_out);
+       char *buf_out = buf + body->meta_in()->size_of_full_tuple();
+       Tuple::ConstructInBuffer(body->meta_in(), buf_in);
+       Tuple::ConstructInBuffer(body->meta_out(), buf_out);
        *fn_in_ = wrap((Tuple *)buf_in);
        *fn_out_ = wrap((Tuple *)buf_out);
 }
diff --git a/source/blender/functions/functions/auto_vectorization.cpp 
b/source/blender/functions/functions/auto_vectorization.cpp
index 31cb2501d8c..9c3c426dd36 100644
--- a/source/blender/functions/functions/auto_vectorization.cpp
+++ b/source/blender/functions/functions/auto_vectorization.cpp
@@ -43,8 +43,8 @@ namespace FN { namespace Functions {
                                m_max_len_in_size = 0;
                                m_max_len_out_size = 0;
                                for (TupleCallBody *body : m_get_length_bodies) 
{
-                                       m_max_len_in_size = 
std::max(m_max_len_in_size, body->meta_in()->total_size());
-                                       m_max_len_out_size = 
std::max(m_max_len_out_size, body->meta_out()->total_size());
+                                       m_max_len_in_size = 
std::max(m_max_len_in_size, body->meta_in()->size_of_full_tuple());
+                                       m_max_len_out_size = 
std::max(m_max_len_out_size, body->meta_out()->size_of_full_tuple());
                                }
 
                                for (auto output : main->signature().outputs()) 
{
@@ -89,9 +89,6 @@ namespace FN { namespace Functions {
                                        this->append_to_output(main_out, 
fn_out, i, ctx);
                                }
                        }
-
-                       FN_TUPLE_STACK_FREE(main_in);
-                       FN_TUPLE_STACK_FREE(main_out);
                }
 
        private:
@@ -104,8 +101,8 @@ namespace FN { namespace Functions {
                                uint index = m_list_inputs[i];
                                TupleCallBody *body = m_get_length_bodies[i];
 
-                               Tuple &len_in = 
Tuple::NewInBuffer(body->meta_in(), buf_in);
-                               Tuple &len_out = 
Tuple::NewInBuffer(body->meta_out(), buf_out);
+                               Tuple &len_in = 
Tuple::ConstructInBuffer(body->meta_in(), buf_in);
+                               Tuple &len_out = 
Tuple::ConstructInBuffer(body->meta_out(), buf_out);
 
                                Tuple::copy_element(fn_in, index, len_in, 0);
 
@@ -139,9 +136,6 @@ namespace FN { namespace Functions {
                        body->call__setup_stack(get_element_in, 
get_element_out, ctx);
 
                        Tuple::relocate_element(get_element_out, 0, main_in, 
index);
-
-                       FN_TUPLE_STACK_FREE(get_element_in);
-                       FN_TUPLE_STACK_FREE(get_element_out);
                }
 
                void initialize_empty_lists(Tuple &fn_out, ExecutionContext 
&ctx) const
@@ -161,9 +155,6 @@ namespace FN { namespace Functions {
                        body->call__setup_stack(create_list_in, 
create_list_out, ctx);
 
                        Tuple::relocate_element(create_list_out, 0, fn_out, 
index);
-
-                       FN_TUPLE_STACK_FREE(create_list_in);
-                       FN_TUPLE_STACK_FREE(create_list_out);
                }
 
                void append_to_output(Tuple &main_out, Tuple &fn_out, uint 
index, ExecutionContext &ctx) const
@@ -179,9 +170,6 @@ namespace FN { namespace Functions {
                        body->call__setup_stack(append_in, append_out, ctx);
 
                        Tuple::relocate_element(append_out, index, fn_out, 
index);
-
-                       FN_TUPLE_STACK_FREE(append_in);
-                       FN_TUPLE_STACK_FREE(append_out);
                }
        };

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to