CxxWrap.jl
CxxWrap.jl copied to clipboard
crash when redefining wrapper module for template types
Hi, I am testing the NonTypeParam
template class. Redefining the ParametricTypes
module in the same Julia session crashes Julia.
Here is the error message:
WARNING: replacing module ParametricTypes.
existing type found : 0x7f352fda1930 <-> 0x7f3533503cd0
julia: /home/yiminliu/.julia/artifacts/fd5dfb5dee87c41c238d98bd7ff2fdd4f307e824/include/jlcxx/module.hpp:1070: int jlcxx::TypeWrapper<T>::apply_internal(FunctorT&&) [with AppliedT = parametric::NonTypeParam<int, 1>; FunctorT = parametric::WrapNonTypeParam; T = jlcxx::Parametric<jlcxx::TypeVar<1>, jlcxx::TypeVar<2> >]: Assertion `julia_type<AppliedT>() == app_box_dt' failed.
signal (6): Aborted
in expression starting at /home/yiminliu/projects/5_julia_projects/1_cxxwrap_dev/Foo.jl/template.jl:7
gsignal at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x7f35623c9728)
__assert_fail at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
apply_internal<parametric::NonTypeParam<int, 1>, parametric::WrapNonTypeParam> at /home/yiminliu/.julia/artifacts/fd5dfb5dee87c41c238d98bd7ff2fdd4f307e824/include/jlcxx/module.hpp:1070
apply<parametric::NonTypeParam<int, 1>, parametric::NonTypeParam<unsigned int, 2>, parametric::NonTypeParam<long int, 64>, parametric::WrapNonTypeParam> at /home/yiminliu/.julia/artifacts/fd5dfb5dee87c41c238d98bd7ff2fdd4f307e824/include/jlcxx/module.hpp:1029
define_julia_module at /home/yiminliu/projects/5_julia_projects/1_cxxwrap_dev/foo/template.cc:55
register_julia_module at /home/yiminliu/.julia/artifacts/fd5dfb5dee87c41c238d98bd7ff2fdd4f307e824/lib/libcxxwrap_julia.so (unknown line)
register_julia_module at /home/yiminliu/.julia/packages/CxxWrap/ZOkSN/src/CxxWrap.jl:399 [inlined]
readmodule at /home/yiminliu/.julia/packages/CxxWrap/ZOkSN/src/CxxWrap.jl:694
wrapmodule at /home/yiminliu/.julia/packages/CxxWrap/ZOkSN/src/CxxWrap.jl:698
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1690 [inlined]
do_call at /buildworker/worker/package_linux64/build/src/interpreter.c:117
eval_value at /buildworker/worker/package_linux64/build/src/interpreter.c:206
eval_stmt_value at /buildworker/worker/package_linux64/build/src/interpreter.c:157 [inlined]
eval_body at /buildworker/worker/package_linux64/build/src/interpreter.c:566
jl_interpret_toplevel_thunk at /buildworker/worker/package_linux64/build/src/interpreter.c:660
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:840
jl_eval_module_expr at /buildworker/worker/package_linux64/build/src/toplevel.c:197
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:666
jl_parse_eval_all at /buildworker/worker/package_linux64/build/src/ast.c:913
jl_load_rewrite at /buildworker/worker/package_linux64/build/src/toplevel.c:914
include at ./client.jl:457
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1690 [inlined]
do_call at /buildworker/worker/package_linux64/build/src/interpreter.c:117
eval_value at /buildworker/worker/package_linux64/build/src/interpreter.c:206
eval_stmt_value at /buildworker/worker/package_linux64/build/src/interpreter.c:157 [inlined]
eval_body at /buildworker/worker/package_linux64/build/src/interpreter.c:566
jl_interpret_toplevel_thunk at /buildworker/worker/package_linux64/build/src/interpreter.c:660
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:840
jl_parse_eval_all at /buildworker/worker/package_linux64/build/src/ast.c:913
jl_load_rewrite at /buildworker/worker/package_linux64/build/src/toplevel.c:914
include at ./Base.jl:380
include at ./Base.jl:368
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
exec_options at ./client.jl:296
_start at ./client.jl:506
jfptr__start_51675.clone_1 at /home/yiminliu/packages/julia-1.5.1/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
unknown function (ip: 0x401931)
unknown function (ip: 0x401533)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4015d4)
Allocations: 5848754 (Pool: 5846848; Big: 1906); GC: 4
Aborted
Here is the cpp file which contains code related to NonTypeParam
#include <type_traits>
#include "jlcxx/jlcxx.hpp"
namespace parametric
{
// Template containing a non-type parameter
template<typename T, T I>
struct NonTypeParam
{
typedef T type;
NonTypeParam(T v = I) : i(v)
{
}
T i = I;
};
// Helper to wrap NonTypeParam instances
struct WrapNonTypeParam
{
template<typename TypeWrapperT>
void operator()(TypeWrapperT&& wrapped)
{
typedef typename TypeWrapperT::type WrappedT;
wrapped.template constructor<typename WrappedT::type>();
// Access the module to add a free function
wrapped.module().method("get_nontype", [](const WrappedT& w) { return w.i; });
}
};
} // namespace parametric
namespace jlcxx
{
template<typename T, T Val>
struct BuildParameterList<parametric::NonTypeParam<T, Val>>
{
typedef ParameterList<T, std::integral_constant<T, Val>> type;
};
} // namespace jlcxx
JLCXX_MODULE define_julia_module(jlcxx::Module& types)
{
using namespace jlcxx;
using namespace parametric;
types.add_type<Parametric<jlcxx::TypeVar<1>, jlcxx::TypeVar<2>>>("NonTypeParam")
.apply<NonTypeParam<int, 1>, NonTypeParam<unsigned int, 2>,
NonTypeParam<long, 64>>(WrapNonTypeParam());
}
Here is the Julia file template.jl
# Wrap the functions defined in C++
module ParametricTypes
using CxxWrap
@wrapmodule joinpath(@__DIR__, "../build/lib/libtemplate.so")
function __init__()
@initcxx
end
end
The error occurred when including "template.jl" twice.
Is there anything that I missed in the .cpp or .jl file?
Thanks
This is Julia 1.5.1. Cxxwrap.jl 0.11.0. cmake 3.16.3 gcc 9.3 OS is Ubuntu 20.04 in WSL2
Yes, module reloading is not really supported anymore at this time, unfortunately. It would require revisiting quite a few basic structures at the core of CxxWrap to make this work properly.