CxxWrap.jl icon indicating copy to clipboard operation
CxxWrap.jl copied to clipboard

crash when redefining wrapper module for template types

Open DeanLym opened this issue 4 years ago • 2 comments

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

DeanLym avatar Sep 23 '20 21:09 DeanLym

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

DeanLym avatar Sep 23 '20 21:09 DeanLym

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.

barche avatar Oct 13 '20 19:10 barche