From 20a4197d3ff4d59e8454021383eb7a43abd45b58 Mon Sep 17 00:00:00 2001 From: mertcandav Date: Sat, 8 Feb 2025 15:52:48 +0300 Subject: [PATCH] compiler: fix code generation of trait virtual table for implicitly smart pointer types such as maps and channels --- src/julec/obj/cxx/object.jule | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/julec/obj/cxx/object.jule b/src/julec/obj/cxx/object.jule index 745cb824..da94838d 100644 --- a/src/julec/obj/cxx/object.jule +++ b/src/julec/obj/cxx/object.jule @@ -1143,16 +1143,35 @@ impl ObjectCoder { if ins.Source != nil { // Use the actual type for the allocation handling. mut act := &sema::Type{Kind: ins.Source.ActualKind()} + // We handling map and channel types as smart pointer, + // because this kind types implemented as smart pointers + // at machine code level. + // + // Smart pointers: + // If method uses pass-by-reference self parameter and + // source type is smart pointer, by Jule Memory Model, + // trait uses base smart pointer of the allocation. + // So cast to element type for correct handling. + // Then pass address of the temporary variable to receiver. if ptr && act.Sptr() != nil { - // Method uses pass-by-reference self parameter and - // source type is smart pointer. By Jule Memory Model, - // trait uses base smart pointer of the allocation. - // So cast to element type for correct handling. - // Then pass address of the temporary variable to receiver. self.write("((jule::Ptr<") self.tc.kind(self.Buf, act.Sptr().Elem) self.write(">*)&_self_)") ptr = false // Avoid ".alloc" suffix. We have a pointer already. + } else if ptr && act.Map() != nil { + self.write("((jule::Ptr<") + mp := act.Map() + mut mps := obj::FindStructGenericInstance(meta::Program.Runtime.Map, mp.Key, mp.Val) + self.tc.structureIns(self.Buf, mps) + self.write(">*)&_self_)") + ptr = false // Avoid ".alloc" suffix. We have a pointer already. + } else if ptr && act.Chan() != nil { + self.write("((jule::Ptr<") + ch := act.Chan() + mut chs := obj::FindStructGenericInstance(meta::Program.Runtime.Pchan, ch.Elem) + self.tc.structureIns(self.Buf, chs) + self.write(">*)&_self_)") + ptr = false // Avoid ".alloc" suffix. We have a pointer already. } else { // Function uses smart pointer self parameter. // By Jule Memory Model, trait uses base smart pointer