diff --git a/include/jlcxx/array.hpp b/include/jlcxx/array.hpp index 3dbc118..b713d2e 100644 --- a/include/jlcxx/array.hpp +++ b/include/jlcxx/array.hpp @@ -7,6 +7,16 @@ namespace jlcxx { +/// wrapper for julia jl_array_data for different julia versions +template +T* jlcxx_array_data(jl_array_t* arr) { +#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) >= 111 + return jl_array_data(arr, T); +#else + return static_cast(jl_array_data(arr)); +#endif +} + template struct ValueExtractor { @@ -123,11 +133,10 @@ class Array JL_GC_PUSH1(&m_array); const size_t pos = jl_array_len(m_array); jl_array_grow_end(m_array, 1); -#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) >= 111 - jl_array_ptr_set(m_array, pos, box(val)); -#else - jl_arrayset(m_array, box(val), pos); -#endif + jl_value_t** data = jlcxx_array_data(m_array); + jl_value_t* jval = box(val); + data[pos] = jval; + jl_gc_wb(m_array, jval); JL_GC_POP(); } @@ -172,14 +181,6 @@ class ArrayRef using julia_t = typename detail::ArrayElementType::type; private: - /// wrapper for julia jl_array_data for different julia versions - static julia_t* jlcxx_array_data(jl_array_t* arr) { -#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) >= 111 - return jl_array_data(arr, julia_t); -#else - return static_cast(jl_array_data(arr)); -#endif - } public: ArrayRef(jl_array_t* arr) : m_array(arr) @@ -205,22 +206,22 @@ class ArrayRef iterator begin() { - return iterator(jlcxx_array_data(wrapped())); + return iterator(jlcxx_array_data(wrapped())); } const_iterator begin() const { - return const_iterator(jlcxx_array_data(wrapped())); + return const_iterator(jlcxx_array_data(wrapped())); } iterator end() { - return iterator(jlcxx_array_data(wrapped()) + jl_array_len(wrapped())); + return iterator(jlcxx_array_data(wrapped()) + jl_array_len(wrapped())); } const_iterator end() const { - return const_iterator(jlcxx_array_data(wrapped()) + jl_array_len(wrapped())); + return const_iterator(jlcxx_array_data(wrapped()) + jl_array_len(wrapped())); } void push_back(const ValueT& val) @@ -237,12 +238,12 @@ class ArrayRef const julia_t* data() const { - return jlcxx_array_data(wrapped()); + return jlcxx_array_data(wrapped()); } julia_t* data() { - return jlcxx_array_data(wrapped()); + return jlcxx_array_data(wrapped()); } std::size_t size() const