Skip to content

Commit 260ea7e

Browse files
authored
julia 1.11: add some workarounds for jl_array changes (#137)
* julia 1.11: add some workarounds for jl_array changes * Array: avoid using arrayset and array_ptr_set * arrayset: simplify code with jl_array_ptr_1d_push this avoids the arrayset and manually dealing with the write barrier
1 parent 4888607 commit 260ea7e

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

include/jlcxx/array.hpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@
77
namespace jlcxx
88
{
99

10+
/// wrapper for julia jl_array_data for different julia versions
11+
template <typename T>
12+
T* jlcxx_array_data(jl_array_t* arr) {
13+
#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) >= 111
14+
return jl_array_data(arr, T);
15+
#else
16+
return static_cast<T*>(jl_array_data(arr));
17+
#endif
18+
}
19+
1020
template<typename PointedT, typename CppT>
1121
struct ValueExtractor
1222
{
@@ -121,9 +131,8 @@ class Array
121131
void push_back(VT&& val)
122132
{
123133
JL_GC_PUSH1(&m_array);
124-
const size_t pos = jl_array_len(m_array);
125-
jl_array_grow_end(m_array, 1);
126-
jl_arrayset(m_array, box<ValueT>(val), pos);
134+
jl_value_t* jval = box<ValueT>(val);
135+
jl_array_ptr_1d_push(m_array, jval);
127136
JL_GC_POP();
128137
}
129138

@@ -165,7 +174,6 @@ template<typename ValueT, int Dim = 1>
165174
class ArrayRef
166175
{
167176
public:
168-
169177
using julia_t = typename detail::ArrayElementType<ValueT>::type;
170178

171179
ArrayRef(jl_array_t* arr) : m_array(arr)
@@ -191,22 +199,22 @@ class ArrayRef
191199

192200
iterator begin()
193201
{
194-
return iterator(static_cast<julia_t*>(jl_array_data(wrapped())));
202+
return iterator(jlcxx_array_data<julia_t>(wrapped()));
195203
}
196204

197205
const_iterator begin() const
198206
{
199-
return const_iterator(static_cast<julia_t*>(jl_array_data(wrapped())));
207+
return const_iterator(jlcxx_array_data<julia_t>(wrapped()));
200208
}
201209

202210
iterator end()
203211
{
204-
return iterator(static_cast<julia_t*>(jl_array_data(wrapped())) + jl_array_len(wrapped()));
212+
return iterator(jlcxx_array_data<julia_t>(wrapped()) + jl_array_len(wrapped()));
205213
}
206214

207215
const_iterator end() const
208216
{
209-
return const_iterator(static_cast<julia_t*>(jl_array_data(wrapped())) + jl_array_len(wrapped()));
217+
return const_iterator(jlcxx_array_data<julia_t>(wrapped()) + jl_array_len(wrapped()));
210218
}
211219

212220
void push_back(const ValueT& val)
@@ -217,18 +225,18 @@ class ArrayRef
217225
JL_GC_PUSH1(&arr_ptr);
218226
const size_t pos = size();
219227
jl_array_grow_end(arr_ptr, 1);
220-
jl_arrayset(arr_ptr, box<ValueT>(val), pos);
228+
data()[pos] = val;
221229
JL_GC_POP();
222230
}
223231

224232
const julia_t* data() const
225233
{
226-
return (julia_t*)jl_array_data(wrapped());
234+
return jlcxx_array_data<julia_t>(wrapped());
227235
}
228236

229237
julia_t* data()
230238
{
231-
return (julia_t*)jl_array_data(wrapped());
239+
return jlcxx_array_data<julia_t>(wrapped());
232240
}
233241

234242
std::size_t size() const

0 commit comments

Comments
 (0)