Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deepcopy of objects doesn't work #2776

Closed
tanay-man opened this issue Jul 15, 2024 · 2 comments · Fixed by #2784
Closed

Deepcopy of objects doesn't work #2776

tanay-man opened this issue Jul 15, 2024 · 2 comments · Fixed by #2784

Comments

@tanay-man
Copy link
Contributor

Example:

from lpython import i32

class coord:
    def __init__(self:"coord", x:i32, y:i32):
        self.x: i32 = x 
        self.y: i32 = y

p1: coord = coord(1, 2)
p2: coord = p1
Output
Traceback (most recent call last):
  Binary file "/home/tanay/lcompilers/lpython/src/bin/lpython", in _start()
  File "./csu/../csu/libc-start.c", line 392, in __libc_start_main_impl()
  File "./csu/../sysdeps/nptl/libc_start_call_main.h", line 58, in __libc_start_call_main()
  File "/home/tanay/lcompilers/lpython/src/bin/lpython.cpp", line 2244, in ??
    err = compile_python_using_llvm(arg_file, tmp_o, runtime_library_dir,
  File "/home/tanay/lcompilers/lpython/src/bin/lpython.cpp", line 1117, in ??
    res = fe.get_llvm3(*asr, pass_manager, diagnostics, infile);
  File "/home/tanay/lcompilers/lpython/src/lpython/python_evaluator.cpp", line 450, in LCompilers::PythonCompiler::get_llvm3(LCompilers::ASR::TranslationUnit_t&, LCompilers::PassManager&, LCompilers::diag::Diagnostics&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
    run_fn, global_underscore_name, infile);
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 10168, in LCompilers::asr_to_llvm(LCompilers::ASR::TranslationUnit_t&, LCompilers::diag::Diagnostics&, llvm::LLVMContext&, Allocator&, LCompilers::PassManager&, LCompilers::CompilerOptions&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
    v.visit_asr((ASR::asr_t&)asr);
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5367, in LCompilers::ASR::BaseVisitor<LCompilers::ASRToLLVMVisitor>::visit_asr(LCompilers::ASR::asr_t const&)
    void visit_asr(const asr_t &b) { visit_asr_t(b, self()); }
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5343, in ??
    case asrType::unit: { v.visit_unit((const unit_t &)x); return; }
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5368, in LCompilers::ASR::BaseVisitor<LCompilers::ASRToLLVMVisitor>::visit_unit(LCompilers::ASR::unit_t const&)
    void visit_unit(const unit_t &b) { visit_unit_t(b, self()); }
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5064, in ??
    case unitType::TranslationUnit: { v.visit_TranslationUnit((const TranslationUnit_t &)x); return; }
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 936, in LCompilers::ASRToLLVMVisitor::visit_TranslationUnit(LCompilers::ASR::TranslationUnit_t const&)
    visit_symbol(*mod);
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5370, in LCompilers::ASR::BaseVisitor<LCompilers::ASRToLLVMVisitor>::visit_symbol(LCompilers::ASR::symbol_t const&)
    void visit_symbol(const symbol_t &b) { visit_symbol_t(b, self()); }
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5073, in ??
    case symbolType::Module: { v.visit_Module((const Module_t &)x); return; }
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 3141, in LCompilers::ASRToLLVMVisitor::visit_Module(LCompilers::ASR::Module_t const&)
    visit_procedures(x);
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 4186, in void LCompilers::ASRToLLVMVisitor::visit_procedures<LCompilers::ASR::Module_t>(LCompilers::ASR::Module_t const&)
    visit_Function(*s);
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 3940, in LCompilers::ASRToLLVMVisitor::visit_Function(LCompilers::ASR::Function_t const&)
    generate_function(x);
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 4138, in LCompilers::ASRToLLVMVisitor::generate_function(LCompilers::ASR::Function_t const&)
    this->visit_stmt(*x.m_body[i]);
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5387, in LCompilers::ASR::BaseVisitor<LCompilers::ASRToLLVMVisitor>::visit_stmt(LCompilers::ASR::stmt_t const&)
    void visit_stmt(const stmt_t &b) { visit_stmt_t(b, self()); }
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 5098, in ??
    case stmtType::Assignment: { v.visit_Assignment((const Assignment_t &)x); return; }
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/asr_to_llvm.cpp", line 4867, in LCompilers::ASRToLLVMVisitor::visit_Assignment(LCompilers::ASR::Assignment_t const&)
    llvm_utils->deepcopy(value_struct, target_struct,
  File "/home/tanay/lcompilers/lpython/src/libasr/codegen/llvm_utils.cpp", line 1969, in LCompilers::LLVMUtils::deepcopy(llvm::Value*, llvm::Value*, LCompilers::ASR::ttype_t*, llvm::Module*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > > > > >&)
    if( !LLVM::is_llvm_struct(ASRUtils::symbol_type(item.second)) &&
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr_utils.h", line 312, in ??
    return ASRUtils::expr_type(
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr_utils.h", line 286, in ??
    return ASR::expr_type0(f);
  File "/home/tanay/lcompilers/lpython/src/libasr/../libasr/asr.h", line 52456, in ??
    switch (f->type) {
  Binary file "/lib/x86_64-linux-gnu/libc.so.6", in __GI___sigaction()
Segfault: Signal SIGSEGV (segmentation fault) received
@tanay-man
Copy link
Contributor Author

tanay-man commented Jul 15, 2024

@certik , @Thirumalai-Shaktivel according to cpython this shouldn't create a deepcopy but just a reference. Should this be modified to align with cpython behaviour?
Ex:

from lpython import i32

class coord:
    def __init__(self:"coord", x:i32):
        self.x: i32 = x 

p1: coord = coord(1)
p2: coord = p1
p2.x = 2
print(p1.x)
print(p2.x)

Lpython output :

(lp) tanay@tanay-man:~/lcompilers/lpython$ lpython  ../constructor.py 
1
2

Cpython output:

(lp) tanay@tanay-man:~/lcompilers/lpython$ python  ../constructor.py 
2
2

@certik
Copy link
Contributor

certik commented Jul 19, 2024

This has been discussed in #1746 (comment). We either do not allow p2 = p1 at all, or we must ensure p1 is not used after the assignment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants