From a71bb2bc6e9fb09de47d6ba88a02fc54d1ef3e65 Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Sat, 1 Oct 2022 19:18:08 +0200 Subject: [PATCH 1/9] fix naming of RClass when template of a shared_ptr --- Source/Modules/r.cxx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index c51198fed..581a9bee1 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -2092,9 +2092,21 @@ int R::functionWrapper(Node *n) { Node * parent = Getattr(n, "parentNode"); String * smartname = Getattr(parent, "feature:smartptr"); if (smartname) { - smartname = getRClassName(smartname, 1, 1); - Replaceall(tm, "$R_class", smartname); - Delete(smartname); + String * classtypeobj = NewString(Getattr(parent, "classtypeobj")); // this is the correct name, e.g. ClassName(int) + String * classtype = NewString(Getattr(parent, "classtype")); // this is the "wrong" name e.g. ClassName + + // we replace inside smartname ClassName with ClassName + String * smartname_fixed = NewString(smartname); + Replaceall(classtype, " ", ""); // classtype actually has spaces inside so we remove them + Replaceall(smartname_fixed, classtype, classtypeobj); + + String * smartname_fixed_rclass = getRClassName(smartname_fixed, 1, 1); + Replaceall(tm, "$R_class", smartname_fixed_rclass); + + Delete(classtypeobj); + Delete(classtype); + Delete(smartname_fixed); + Delete(smartname_fixed_rclass); } } if (debugMode) { From b15e058a27a3eda6d65585d930852421bdbeff21 Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Sun, 2 Oct 2022 19:44:49 +0200 Subject: [PATCH 2/9] typo in comment --- Source/Modules/r.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index 581a9bee1..3ea48ea7b 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -2095,7 +2095,7 @@ int R::functionWrapper(Node *n) { String * classtypeobj = NewString(Getattr(parent, "classtypeobj")); // this is the correct name, e.g. ClassName(int) String * classtype = NewString(Getattr(parent, "classtype")); // this is the "wrong" name e.g. ClassName - // we replace inside smartname ClassName with ClassName + // we replace inside smartname ClassName with ClassName(int) String * smartname_fixed = NewString(smartname); Replaceall(classtype, " ", ""); // classtype actually has spaces inside so we remove them Replaceall(smartname_fixed, classtype, classtypeobj); From ba96783d1164011d7c7d88380236747273333cb9 Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Fri, 7 Oct 2022 14:18:35 +0200 Subject: [PATCH 3/9] enable li_boost_shared_ptr in r-test-suite --- Examples/test-suite/li_boost_shared_ptr.i | 3 +- Examples/test-suite/r/Makefile.in | 3 +- .../test-suite/r/li_boost_shared_ptr_runme.R | 676 ++++++++++++++++++ Examples/test-suite/r/unittest.R | 1 + 4 files changed, 681 insertions(+), 2 deletions(-) create mode 100644 Examples/test-suite/r/li_boost_shared_ptr_runme.R diff --git a/Examples/test-suite/li_boost_shared_ptr.i b/Examples/test-suite/li_boost_shared_ptr.i index 001eacb78..48d5fc2f1 100644 --- a/Examples/test-suite/li_boost_shared_ptr.i +++ b/Examples/test-suite/li_boost_shared_ptr.i @@ -44,7 +44,7 @@ # define SWIG_SHARED_PTR_NAMESPACE SwigBoost #endif -#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD) || defined(SWIGOCTAVE) || defined(SWIGRUBY) +#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) || defined(SWIGD) || defined(SWIGOCTAVE) || defined(SWIGRUBY) || defined(SWIGR) #define SHARED_PTR_WRAPPERS_IMPLEMENTED #endif @@ -268,6 +268,7 @@ long use_count(const SwigBoost::shared_ptr& sptr) { long use_count(const SwigBoost::shared_ptr& sptr) { return sptr.use_count(); } + const SwigBoost::shared_ptr& ref_1() { static SwigBoost::shared_ptr sptr; return sptr; diff --git a/Examples/test-suite/r/Makefile.in b/Examples/test-suite/r/Makefile.in index 78cc4bb53..9d3e9e706 100644 --- a/Examples/test-suite/r/Makefile.in +++ b/Examples/test-suite/r/Makefile.in @@ -25,7 +25,8 @@ CPP_TEST_CASES += \ r_overload_array \ r_sexp \ r_overload_comma \ - r_use_isnull + r_use_isnull \ + li_boost_shared_ptr # These tests are failing because enums currently cannot handle # arithmetic expressions diff --git a/Examples/test-suite/r/li_boost_shared_ptr_runme.R b/Examples/test-suite/r/li_boost_shared_ptr_runme.R new file mode 100644 index 000000000..cdee3b9ad --- /dev/null +++ b/Examples/test-suite/r/li_boost_shared_ptr_runme.R @@ -0,0 +1,676 @@ +clargs <- commandArgs(trailing=TRUE) +source(file.path(clargs[1], "unittest.R")) +#source("unittest.R") + +dyn.load(paste("li_boost_shared_ptr", .Platform$dynlib.ext, sep="")) +source("li_boost_shared_ptr.R") +cacheMetaData(1) + +# simple shared_ptr usage - created in C++ + +invisible(debug_shared(TRUE)) +unittest(debug_shared(), TRUE) + + +# Expect 1 instance - the one global variable (GlobalValue) +unittest(Klass_getTotal_count(), 1) + +# Change loop count to run for a long time to monitor memory +unittest(shared_ptr_wrapper_count(), NOT_COUNTING()) + + +# +# test suite to be run in a loop +# + +testSuite_verifyCount <- function(expected, k) { + got = use_count(k) + unittest(expected, got); +} + +testSuite <- function() { + + # simple shared_ptr usage - created in C++ + { + k = Klass("me oh my") + val = k$getValue() + unittest("me oh my", val) + testSuite_verifyCount(1, k) + } + + # simple shared_ptr usage - not created in C++ + { + k = factorycreate() + val = k$getValue() + unittest("factorycreate", val) + testSuite_verifyCount(1, k) + } + + # pass by shared_ptr + { + k = Klass("me oh my") + kret = smartpointertest(k) + val = kret$getValue() + unittest("me oh my smartpointertest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } + + # pass by shared_ptr pointer + { + k = Klass("me oh my") + kret = smartpointerpointertest(k) + val = kret$getValue() + unittest("me oh my smartpointerpointertest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } + + # pass by shared_ptr reference + { + k = Klass("me oh my") + kret = smartpointerreftest(k) + val = kret$getValue() + unittest("me oh my smartpointerreftest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } + + if (FALSE) { + # pass by shared_ptr pointer reference + k = Klass("me oh my") + kret = smartpointerpointerreftest(k) # undefined class _p_p_SwigBoost__shared_ptrT_Space__Klass_t + val = kret$getValue() + unittest("me oh my smartpointerpointerreftest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } + + if (FALSE) { + # pass by shared_ptr pointer reference + k = Klass("me oh my"); + kret = smartpointerpointerreftest(k); # undefined class _p_p_SwigBoost__shared_ptrT_Space__Klass_t + val = kret$getValue() + unittest("me oh my smartpointerpointerreftest", val); + testSuite_verifyCount(2, k); + testSuite_verifyCount(2, kret); + } + + # const pass by shared_ptr + { + k = Klass("me oh my"); + kret = constsmartpointertest(k); + val = Klass_getValue(kret) # kret$getValue(); - method not defined + unittest("me oh my", val); + testSuite_verifyCount(2, k); + # testSuite_verifyCount(2, kret); # -> use_count not defined on _p_SwigBoost__shared_ptrT_Space__Klass_const_t + } + + # pass by value + { + k = Klass("me oh my"); + kret = valuetest(k); + val = kret$getValue(); + unittest("me oh my valuetest", val); + testSuite_verifyCount(1, k); + # testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + } + + # pass by pointer + { + k = Klass("me oh my"); + kret = pointertest(k); + val = kret$getValue(); + unittest("me oh my pointertest", val); + testSuite_verifyCount(1, k); + # testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + } + + # pass by reference + { + k = Klass("me oh my"); + kret = reftest(k); + val = kret$getValue(); + unittest("me oh my reftest", val); + testSuite_verifyCount(1, k); + #testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + } + + # pass by pointer reference + if (FALSE) { + k = Klass("me oh my"); + kret = pointerreftest(k); # -> class not defined _p_p_Space__Klass + val = kret$getValue(); + unittest("me oh my pointerreftest", val); + testSuite_verifyCount(1, k); + testSuite_verifyCount(1, kret); + } + + # null tests + { + k = NULL + + if (!is.null(smartpointertest(k))) { + stop("return was not null"); + } + + if (!is.null(smartpointerpointertest(k))) { + stop("return was not null"); + } + + if (!is.null(smartpointerreftest(k))) { + stop("return was not null"); + } + + if (!is.null(smartpointerpointerreftest(k))) { + stop("return was not null"); + } + + if (nullsmartpointerpointertest(k) != "null pointer") { + stop("not null smartpointer pointer"); + } + + bNotCatched = F + try({ + valuetest(k); + bNotCatched = T + }, silent = T) + if (bNotCatched) { + stop("Failed to catch null pointer"); + } + + if (!is.null(pointertest(k))) { + stop("return was not null"); + } + + bNotCatched = F + try({ + reftest(k); + bNotCatched = T + }, silent = T) + if (bNotCatched) { + stop("Failed to catch null pointer"); + } + } + + # $owner + { + k = pointerownertest(); + val = k$getValue(); + unittest("pointerownertest", val); + # testSuite_verifyCount(1, k); # -> use_count not defined for _p_Space__Klass + } + + { + k = smartpointerpointerownertest(); + val = k$getValue(); + unittest("smartpointerpointerownertest", val); + testSuite_verifyCount(1, k); + } + + # + # ###################### Derived classes ###################### + # + + # derived pass by shared_ptr + { + k = KlassDerived("me oh my"); + kret = derivedsmartptrtest(k); + val = kret$getValue(); + unittest("me oh my derivedsmartptrtest-Derived", val); + testSuite_verifyCount(2, k); + testSuite_verifyCount(2, kret); + # testSuite_verifyCount(4, k); # includes two extra references for upcasts + # testSuite_verifyCount(4, kret); + } + + # derived pass by shared_ptr pointer + { + k = KlassDerived("me oh my"); + kret = derivedsmartptrpointertest(k); + val = kret$getValue(); + unittest("me oh my derivedsmartptrpointertest-Derived", val); + testSuite_verifyCount(2, k); + testSuite_verifyCount(2, kret); + # testSuite_verifyCount(4, k); # includes two extra references for upcasts in the proxy classes + # testSuite_verifyCount(4, kret); + } + + # derived pass by shared_ptr ref + { + k = KlassDerived("me oh my"); + kret = derivedsmartptrreftest(k); + val = kret$getValue(); + unittest("me oh my derivedsmartptrreftest-Derived", val); + testSuite_verifyCount(2, k); + testSuite_verifyCount(2, kret); + #testSuite_verifyCount(4, k); # includes two extra references for upcasts in the proxy classes + #testSuite_verifyCount(4, kret); + } + + # derived pass by shared_ptr pointer ref + if (FALSE) { + k = KlassDerived("me oh my"); + kret = derivedsmartptrpointerreftest(k); # undefined class _p_p_SwigBoost__shared_ptrT_Space__KlassDerived_t + val = kret$getValue(); + unittest("me oh my derivedsmartptrpointerreftest-Derived", val); + testSuite_verifyCount(4, k); # includes two extra references for upcasts in the proxy classes + testSuite_verifyCount(4, kret); + } + + # derived pass by pointer + { + k = KlassDerived("me oh my"); + kret = derivedpointertest(k); + val = kret$getValue(); + unittest("me oh my derivedpointertest-Derived", val); + testSuite_verifyCount(1, k); + # testSuite_verifyCount(1, kret); -> use_count not defined for _p_Space__KlassDerived + + # testSuite_verifyCount(2, k); # includes an extra reference for the upcast in the proxy class + # testSuite_verifyCount(2, kret); + } + + # derived pass by ref + { + k = KlassDerived("me oh my"); + kret = derivedreftest(k); + val = kret$getValue(); + unittest("me oh my derivedreftest-Derived", val); + testSuite_verifyCount(1, k); + #testSuite_verifyCount(1, kret); --> use_count not defined for _p_Space__KlassDerived + + #testSuite_verifyCount(2, k); # includes an extra reference for the upcast in the proxy class + #testSuite_verifyCount(2, kret); + } + + + # + # ###################### Derived and base class mixed ###################### + # + + # pass by shared_ptr (mixed) + { + k = KlassDerived("me oh my"); + kret = smartpointertest(k); + val = kret$getValue(); + unittest("me oh my smartpointertest-Derived", val); + testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class + testSuite_verifyCount(3, kret); + } + + # pass by shared_ptr pointer (mixed) + { + k = KlassDerived("me oh my"); + kret = smartpointerpointertest(k); + val = kret$getValue(); + unittest("me oh my smartpointerpointertest-Derived", val); + testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class + testSuite_verifyCount(3, kret); + } + + # pass by shared_ptr reference (mixed) + { + k = KlassDerived("me oh my"); + kret = smartpointerreftest(k); + val = kret$getValue(); + unittest("me oh my smartpointerreftest-Derived", val); + testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class + testSuite_verifyCount(3, kret); + } + + # pass by shared_ptr pointer reference (mixed) + if (FALSE) { + k = KlassDerived("me oh my"); + kret = smartpointerpointerreftest(k); # -> undefined _p_p_SwigBoost__shared_ptrT_Space__Klass_t + val = kret$getValue(); + unittest("me oh my smartpointerpointerreftest-Derived", val); + testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class + testSuite_verifyCount(3, kret); + } + + # pass by value (mixed) + { + k = KlassDerived("me oh my"); + kret = valuetest(k); + val = kret$getValue(); + unittest("me oh my valuetest", val); # note slicing + testSuite_verifyCount(2, k); # an extra reference for the upcast in the proxy class + # testSuite_verifyCount(1, kret); # -> use count undefined for _p_Space__Klass + } + + # pass by pointer (mixed) + { + k = KlassDerived("me oh my"); + kret = pointertest(k); + val = kret$getValue(); + unittest("me oh my pointertest-Derived", val); + testSuite_verifyCount(2, k); # an extra reference for the upcast in the proxy class + # testSuite_verifyCount(1, kret); # -> use count undefined for _p_Space__Klass + } + + # pass by ref (mixed) + { + k = KlassDerived("me oh my"); + kret = reftest(k); + val = kret$getValue(); + unittest("me oh my reftest-Derived", val); + testSuite_verifyCount(2, k); # an extra reference for the upcast in the proxy class + # testSuite_verifyCount(1, kret); # -> use count undefined for _p_Space__Klass + } + + # 3rd derived class + { + k = Klass3rdDerived("me oh my"); + val = k$getValue(); + unittest("me oh my-3rdDerived", val); + testSuite_verifyCount(1, k); + #testSuite_verifyCount(3, k); # 3 classes in inheritance chain == 3 swigCPtr values + + val = test3rdupcast(k); + unittest("me oh my-3rdDerived", val); + testSuite_verifyCount(2, k); + #testSuite_verifyCount(3, k); + } + + + # + # ################ Member variables #################### + # + + # smart pointer by value + { + m = MemberVariables(); + k = Klass("smart member value"); + MemberVariables_SmartMemberValue_set(self = m, s_SmartMemberValue = k) + + val = k$getValue(); + unittest("smart member value", val); + testSuite_verifyCount(2, k); + + kmember = MemberVariables_SmartMemberPointer_get(self = m) + val = kmember$getValue(); + unittest("smart member value", val); + testSuite_verifyCount(3, kmember); + testSuite_verifyCount(3, k); + + delete_MemberVariables(m) + testSuite_verifyCount(2, kmember); # these should be -1 wrt to the previous test ? + testSuite_verifyCount(2, k); + } + + # smart pointer by pointer + { + m = MemberVariables(); + k = Klass("smart member pointer"); + MemberVariables_SmartMemberPointer_set(self = m , s_SmartMemberPointer = k); + val = k$getValue(); + unittest("smart member pointer", val); + testSuite_verifyCount(1, k); + + kmember = MemberVariables_SmartMemberPointer_get(self = m) + val = kmember$getValue(); + unittest("smart member pointer", val); + testSuite_verifyCount(2, kmember); + testSuite_verifyCount(2, k); + + delete_MemberVariables(m); + testSuite_verifyCount(2, kmember); + testSuite_verifyCount(2, k); + } + + # smart pointer by reference + { + m = MemberVariables(); + k = Klass("smart member reference"); + MemberVariables_SmartMemberReference_set(self = m , s_SmartMemberReference = k); # m$setSmartMemberReference(k); + val = k$getValue(); + unittest("smart member reference", val); + testSuite_verifyCount(2, k); + + kmember = MemberVariables_SmartMemberPointer_get(self = m) + val = kmember$getValue(); + unittest("smart member reference", val); + testSuite_verifyCount(3, kmember); + testSuite_verifyCount(3, k); + + # The C++ reference refers to SmartMemberValue... + kmemberVal = MemberVariables_SmartMemberReference_get(self = m) + val = kmember$getValue(); + unittest("smart member reference", val); + testSuite_verifyCount(4, kmemberVal); + testSuite_verifyCount(4, kmember); + testSuite_verifyCount(4, k); + + delete_MemberVariables(m); + testSuite_verifyCount(3, kmemberVal); # should be one less than the previous one + testSuite_verifyCount(3, kmember); + testSuite_verifyCount(3, k); + } + + # plain by value + { + m = MemberVariables(); + k = Klass("plain member value"); + MemberVariables_MemberValue_set(self = m, s_MemberValue = k); # m$setMemberValue(k); + val = k$getValue(); + unittest("plain member value", val); + testSuite_verifyCount(1, k); + + kmember = MemberVariables_MemberValue_get(m); # m$getMemberValue(); + val = kmember$getValue(); + unittest("plain member value", val); + # testSuite_verifyCount(1, kmember); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + + delete_MemberVariables(m); # m.delete(); + # testSuite_verifyCount(1, kmember); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + } + + # plain by pointer + { + m = MemberVariables(); + k = Klass("plain member pointer"); + MemberVariables_MemberPointer_set(self = m, s_MemberPointer = k); # m$setMemberPointer(k); + val = k$getValue(); + unittest("plain member pointer", val); + testSuite_verifyCount(1, k); + + kmember = MemberVariables_MemberPointer_get(self = m); # m$getMemberPointer(); + val = kmember$getValue(); + unittest("plain member pointer", val); + # testSuite_verifyCount(1, kmember); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + + delete_MemberVariables(m); # m.delete(); + # testSuite_verifyCount(1, kmember); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + } + + # plain by reference + { + m = MemberVariables(); + k = Klass("plain member reference"); + MemberVariables_MemberReference_set(self = m, s_MemberReference = k); # m$setMemberReference(k); + val = k$getValue(); + unittest("plain member reference", val); + testSuite_verifyCount(1, k); + + kmember = MemberVariables_MemberReference_get(self = m); #m$getMemberReference(); + val = kmember$getValue(); + unittest("plain member reference", val); + # testSuite_verifyCount(1, kmember); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + + delete_MemberVariables(m); # m.delete(); + # testSuite_verifyCount(1, kmember); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + } + + # null member variables + { + m = MemberVariables(); + + # shared_ptr by value + k = MemberVariables_SmartMemberValue_get(self = m); # k = m$getSmartMemberValue(); + if (!is.null(k)) + stop("expected null"); + + MemberVariables_SmartMemberValue_set(self = m, s_SmartMemberValue = NULL); #m$setSmartMemberValue(null); + k = MemberVariables_SmartMemberValue_get(self = m); #m$getSmartMemberValue(); + if (!is.null(k)) + stop("expected null"); + #testSuite_verifyCount(0, k); + + # plain by value + bNotCatched = F + try({ + MemberVariables_MemberValue_set(self = m, s_MemberValue = NULL) + bNotCatched = T + }, silent = T) + if (bNotCatched) { + stop("Failed to catch null pointer") + } + + } + + + # + # ################ Global variables #################### + # + + # smart pointer + { + kglobal = GlobalSmartValue_get(); + if (!is.null(kglobal)) + stop("expected null"); + + k = Klass("smart global value"); + GlobalSmartValue_set(k); + testSuite_verifyCount(2, k); + + kglobal = GlobalSmartValue_get(); + val = kglobal$getValue(); + unittest("smart global value", val); + testSuite_verifyCount(3, kglobal); + testSuite_verifyCount(3, k); + unittest("smart global value", GlobalSmartValue_get()$getValue()); + + GlobalSmartValue_set(NULL); + } + + # plain value + { + k = Klass("global value"); + GlobalValue_set(k); + testSuite_verifyCount(1, k); + + kglobal = GlobalValue_get(); + val = kglobal$getValue(); + unittest("global value", val); + # testSuite_verifyCount(1, kglobal); # -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + unittest("global value", GlobalValue_get()$getValue()); + + bNotCatched = F + try({ + GlobalValue_set(NULL) + bNotCatched = T + }, silent = T) + if (bNotCatched) { + stop("Failed to catch null pointer") + } + } + + # plain pointer + { + kglobal = GlobalPointer_get(); + if (!is.null(kglobal)) + stop("expected null"); + + k = Klass("global pointer"); + GlobalPointer_set(k); + testSuite_verifyCount(1, k); + + kglobal = GlobalPointer_get(); + val = kglobal$getValue(); + unittest("global pointer", val); + # testSuite_verifyCount(1, kglobal); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + GlobalPointer_set(NULL); + } + + # plain reference + { + k = Klass("global reference"); + GlobalReference_set(k); + testSuite_verifyCount(1, k); + + kglobal = GlobalReference_get(); + val = kglobal$getValue(); + unittest("global reference", val); + # testSuite_verifyCount(1, kglobal); # -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, k); + + bNotCatched = F + try({ + GlobalReference_set(NULL) + bNotCatched = T + }, silent = T) + if (bNotCatched) { + stop("Failed to catch null pointer") + } + } + + + + + + + # + # ###################### Templates ###################### + # + { + pid = PairIntDouble(10, 20.2); + if (BaseIntDouble_baseVal1_get(pid) != 20 || BaseIntDouble_baseVal2_get(pid) != 40.4) + stop("Base values wrong"); + if (PairIntDouble_val1_get(pid) != 10 || PairIntDouble_val2_get(pid) != 20.2) + stop("Derived Values wrong"); + } + +} + + +# actually do the tests +for (i in 1:10) { + print(paste("Start Loop: ", i)) + testSuite() + print(paste("End Loop: ", i)) +} + + +# wait for the GC to collect unused objects + +for (i in 1:10) { + invisible(gc(verbose = F, full = T)) + + if (Klass_getTotal_count() == 1) { + break + } + + print(paste("Still waiting for GC to collect ", Klass_getTotal_count()-1, " objects, ", i)) + Sys.sleep(1) +} + +# Expect +unittest(shared_ptr_wrapper_count(), NOT_COUNTING()) + +# Expect 1 instance - the one global variable (GlobalValue) +# -> documented bug - gc does not work on some objects - https://www.swig.org/Doc4.0/SWIGDocumentation.html#R_nn2 +if (FALSE) { + unittest(Klass_getTotal_count(), 1) +} + + +q(save="no") diff --git a/Examples/test-suite/r/unittest.R b/Examples/test-suite/r/unittest.R index 481be8ecc..7f56a579f 100644 --- a/Examples/test-suite/r/unittest.R +++ b/Examples/test-suite/r/unittest.R @@ -3,6 +3,7 @@ unittest <- function (x,y) { print("PASS") } else { print("FAIL") + print(paste(x, " != ", y)) stop("Test failed") } } From b885c22f1110b4d41d296ef593c4233f54d955ca Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Sat, 8 Oct 2022 16:19:02 +0200 Subject: [PATCH 4/9] fixes from code review --- Examples/test-suite/r/Makefile.in | 3 +-- Source/Modules/r.cxx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Examples/test-suite/r/Makefile.in b/Examples/test-suite/r/Makefile.in index 9d3e9e706..78cc4bb53 100644 --- a/Examples/test-suite/r/Makefile.in +++ b/Examples/test-suite/r/Makefile.in @@ -25,8 +25,7 @@ CPP_TEST_CASES += \ r_overload_array \ r_sexp \ r_overload_comma \ - r_use_isnull \ - li_boost_shared_ptr + r_use_isnull # These tests are failing because enums currently cannot handle # arithmetic expressions diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index 3ea48ea7b..18a9aa56d 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -2092,7 +2092,7 @@ int R::functionWrapper(Node *n) { Node * parent = Getattr(n, "parentNode"); String * smartname = Getattr(parent, "feature:smartptr"); if (smartname) { - String * classtypeobj = NewString(Getattr(parent, "classtypeobj")); // this is the correct name, e.g. ClassName(int) + String * classtypeobj = Getattr(parent, "classtypeobj"); // this is the correct name, e.g. ClassName(int) String * classtype = NewString(Getattr(parent, "classtype")); // this is the "wrong" name e.g. ClassName // we replace inside smartname ClassName with ClassName(int) @@ -2103,7 +2103,6 @@ int R::functionWrapper(Node *n) { String * smartname_fixed_rclass = getRClassName(smartname_fixed, 1, 1); Replaceall(tm, "$R_class", smartname_fixed_rclass); - Delete(classtypeobj); Delete(classtype); Delete(smartname_fixed); Delete(smartname_fixed_rclass); From 0d0e369aaff8e7e3311453c533425dab704fc69a Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Tue, 11 Oct 2022 20:30:12 +0200 Subject: [PATCH 5/9] switched implementation reference from java to python --- .../test-suite/r/li_boost_shared_ptr_runme.R | 228 +++++++++--------- 1 file changed, 114 insertions(+), 114 deletions(-) diff --git a/Examples/test-suite/r/li_boost_shared_ptr_runme.R b/Examples/test-suite/r/li_boost_shared_ptr_runme.R index cdee3b9ad..6df8984fc 100644 --- a/Examples/test-suite/r/li_boost_shared_ptr_runme.R +++ b/Examples/test-suite/r/li_boost_shared_ptr_runme.R @@ -30,6 +30,10 @@ testSuite_verifyCount <- function(expected, k) { testSuite <- function() { + # + # Reference Implementation is li_boost_shared_ptr_runme.py + # + # simple shared_ptr usage - created in C++ { k = Klass("me oh my") @@ -106,6 +110,26 @@ testSuite <- function() { # testSuite_verifyCount(2, kret); # -> use_count not defined on _p_SwigBoost__shared_ptrT_Space__Klass_const_t } + # const pass by shared_ptr pointer + { + k = Klass("me oh my") + kret = constsmartpointerpointertest(k) + val = Klass_getValue(kret) + unittest("me oh my", val) + testSuite_verifyCount(2, k) + # testSuite_verifyCount(2, kret) # -> use_count not defined on _p_SwigBoost__shared_ptrT_Space__Klass_const_t + } + + # const pass by shared_ptr reference + { + k = Klass("me oh my") + kret = constsmartpointerreftest(k) + val = Klass_getValue(kret) + unittest("me oh my", val) + testSuite_verifyCount(2, k) + # testSuite_verifyCount(2, kret) # -> use_count not defined for _p_SwigBoost__shared_ptrT_Space__Klass_const_t + } + # pass by value { k = Klass("me oh my"); @@ -191,6 +215,23 @@ testSuite <- function() { if (bNotCatched) { stop("Failed to catch null pointer"); } + + # test null pointers emitted from C++ + + k = sp_pointer_null() + if (!is.null(k)) { + stop("return was not null") + } + + k = null_sp_pointer() + if (!is.null(k)) { + stop("return was not null") + } + + k = sp_value_null() + if (!is.null(k)) { + stop("return was not null") + } } # $owner @@ -209,10 +250,10 @@ testSuite <- function() { } # - # ###################### Derived classes ###################### + # ###################### Derived and base class mixed ###################### # - # derived pass by shared_ptr + # pass by shared_ptr (mixed) { k = KlassDerived("me oh my"); kret = derivedsmartptrtest(k); @@ -220,11 +261,9 @@ testSuite <- function() { unittest("me oh my derivedsmartptrtest-Derived", val); testSuite_verifyCount(2, k); testSuite_verifyCount(2, kret); - # testSuite_verifyCount(4, k); # includes two extra references for upcasts - # testSuite_verifyCount(4, kret); } - # derived pass by shared_ptr pointer + # pass by shared_ptr pointer (mixed) { k = KlassDerived("me oh my"); kret = derivedsmartptrpointertest(k); @@ -232,11 +271,9 @@ testSuite <- function() { unittest("me oh my derivedsmartptrpointertest-Derived", val); testSuite_verifyCount(2, k); testSuite_verifyCount(2, kret); - # testSuite_verifyCount(4, k); # includes two extra references for upcasts in the proxy classes - # testSuite_verifyCount(4, kret); } - # derived pass by shared_ptr ref + # pass by shared_ptr ref (mixed) { k = KlassDerived("me oh my"); kret = derivedsmartptrreftest(k); @@ -244,21 +281,32 @@ testSuite <- function() { unittest("me oh my derivedsmartptrreftest-Derived", val); testSuite_verifyCount(2, k); testSuite_verifyCount(2, kret); - #testSuite_verifyCount(4, k); # includes two extra references for upcasts in the proxy classes - #testSuite_verifyCount(4, kret); } - # derived pass by shared_ptr pointer ref + # pass by shared_ptr pointer reference (mixed) if (FALSE) { k = KlassDerived("me oh my"); - kret = derivedsmartptrpointerreftest(k); # undefined class _p_p_SwigBoost__shared_ptrT_Space__KlassDerived_t + kret = smartpointerpointerreftest(k); # undefined class _p_p_SwigBoost__shared_ptrT_Space__Klass_t val = kret$getValue(); unittest("me oh my derivedsmartptrpointerreftest-Derived", val); - testSuite_verifyCount(4, k); # includes two extra references for upcasts in the proxy classes - testSuite_verifyCount(4, kret); + testSuite_verifyCount(2, k); # includes two extra references for upcasts in the proxy classes + testSuite_verifyCount(2, kret); } - # derived pass by pointer + # pass by value (mixed) + { + k = KlassDerived("me oh my") + kret = valuetest(k) + val = kret$getValue() + unittest("me oh my valuetest", val) # note slicing + testSuite_verifyCount(2, k) + # testSuite_verifyCount(2, kret) --> use count not defined for _p_Space__Klass + + # testSuite_verifyCount(1, k) # this is the python expected reference counting + # testSuite_verifyCount(1, kret) + } + + # pass by pointer (mixed) { k = KlassDerived("me oh my"); kret = derivedpointertest(k); @@ -266,87 +314,6 @@ testSuite <- function() { unittest("me oh my derivedpointertest-Derived", val); testSuite_verifyCount(1, k); # testSuite_verifyCount(1, kret); -> use_count not defined for _p_Space__KlassDerived - - # testSuite_verifyCount(2, k); # includes an extra reference for the upcast in the proxy class - # testSuite_verifyCount(2, kret); - } - - # derived pass by ref - { - k = KlassDerived("me oh my"); - kret = derivedreftest(k); - val = kret$getValue(); - unittest("me oh my derivedreftest-Derived", val); - testSuite_verifyCount(1, k); - #testSuite_verifyCount(1, kret); --> use_count not defined for _p_Space__KlassDerived - - #testSuite_verifyCount(2, k); # includes an extra reference for the upcast in the proxy class - #testSuite_verifyCount(2, kret); - } - - - # - # ###################### Derived and base class mixed ###################### - # - - # pass by shared_ptr (mixed) - { - k = KlassDerived("me oh my"); - kret = smartpointertest(k); - val = kret$getValue(); - unittest("me oh my smartpointertest-Derived", val); - testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class - testSuite_verifyCount(3, kret); - } - - # pass by shared_ptr pointer (mixed) - { - k = KlassDerived("me oh my"); - kret = smartpointerpointertest(k); - val = kret$getValue(); - unittest("me oh my smartpointerpointertest-Derived", val); - testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class - testSuite_verifyCount(3, kret); - } - - # pass by shared_ptr reference (mixed) - { - k = KlassDerived("me oh my"); - kret = smartpointerreftest(k); - val = kret$getValue(); - unittest("me oh my smartpointerreftest-Derived", val); - testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class - testSuite_verifyCount(3, kret); - } - - # pass by shared_ptr pointer reference (mixed) - if (FALSE) { - k = KlassDerived("me oh my"); - kret = smartpointerpointerreftest(k); # -> undefined _p_p_SwigBoost__shared_ptrT_Space__Klass_t - val = kret$getValue(); - unittest("me oh my smartpointerpointerreftest-Derived", val); - testSuite_verifyCount(3, k); # an extra reference for the upcast in the proxy class - testSuite_verifyCount(3, kret); - } - - # pass by value (mixed) - { - k = KlassDerived("me oh my"); - kret = valuetest(k); - val = kret$getValue(); - unittest("me oh my valuetest", val); # note slicing - testSuite_verifyCount(2, k); # an extra reference for the upcast in the proxy class - # testSuite_verifyCount(1, kret); # -> use count undefined for _p_Space__Klass - } - - # pass by pointer (mixed) - { - k = KlassDerived("me oh my"); - kret = pointertest(k); - val = kret$getValue(); - unittest("me oh my pointertest-Derived", val); - testSuite_verifyCount(2, k); # an extra reference for the upcast in the proxy class - # testSuite_verifyCount(1, kret); # -> use count undefined for _p_Space__Klass } # pass by ref (mixed) @@ -355,25 +322,62 @@ testSuite <- function() { kret = reftest(k); val = kret$getValue(); unittest("me oh my reftest-Derived", val); - testSuite_verifyCount(2, k); # an extra reference for the upcast in the proxy class - # testSuite_verifyCount(1, kret); # -> use count undefined for _p_Space__Klass + testSuite_verifyCount(2, k); + #testSuite_verifyCount(2, kret); --> use_count not defined for _p_Space__KlassDerived + + #testSuite_verifyCount(1, k); # --> this is the python expected counting + #testSuite_verifyCount(1, kret); + } + + # + # ################# Overloading tests ################## + # + + # Base class + { + k = Klass("me oh my"); + + unittest(overload_rawbyval(k), "rawbyval") + unittest(overload_rawbyref(k), "rawbyref") + unittest(overload_rawbyptr(k), "rawbyptr") + # unittest(overload_rawbyptrref(k), "rawbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass_t + + unittest(overload_smartbyval(k), "smartbyval") + unittest(overload_smartbyref(k), "smartbyref") + unittest(overload_smartbyptr(k), "smartbyptr") + # unittest(overload_smartbyptrref(k), "smartbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass_t + } + + # Derived class + { + k = KlassDerived("me oh my") + + unittest(overload_rawbyval(k), "rawbyval") + unittest(overload_rawbyref(k), "rawbyref") + unittest(overload_rawbyptr(k), "rawbyptr") + # unittest(overload_rawbyptrref(k), "rawbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__KlassDerived_t + + unittest(overload_smartbyval(k), "smartbyval") + unittest(overload_smartbyref(k), "smartbyref") + unittest(overload_smartbyptr(k), "smartbyptr") + # unittest(overload_smartbyptrref(k), "smartbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__KlassDerived_t } # 3rd derived class { - k = Klass3rdDerived("me oh my"); - val = k$getValue(); - unittest("me oh my-3rdDerived", val); - testSuite_verifyCount(1, k); - #testSuite_verifyCount(3, k); # 3 classes in inheritance chain == 3 swigCPtr values + k = Klass3rdDerived("me oh my") - val = test3rdupcast(k); - unittest("me oh my-3rdDerived", val); - testSuite_verifyCount(2, k); - #testSuite_verifyCount(3, k); + unittest(overload_rawbyval(k), "rawbyval") + unittest(overload_rawbyref(k), "rawbyref") + unittest(overload_rawbyptr(k), "rawbyptr") + # unittest(overload_rawbyptrref(k), "rawbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass3rdDerived_t + + unittest(overload_smartbyval(k), "smartbyval") + unittest(overload_smartbyref(k), "smartbyref") + unittest(overload_smartbyptr(k), "smartbyptr") + # unittest(overload_smartbyptrref(k), "smartbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass3rdDerived_t } - # # ################ Member variables #################### # @@ -395,7 +399,7 @@ testSuite <- function() { testSuite_verifyCount(3, k); delete_MemberVariables(m) - testSuite_verifyCount(2, kmember); # these should be -1 wrt to the previous test ? + testSuite_verifyCount(2, kmember); testSuite_verifyCount(2, k); } @@ -443,7 +447,7 @@ testSuite <- function() { testSuite_verifyCount(4, k); delete_MemberVariables(m); - testSuite_verifyCount(3, kmemberVal); # should be one less than the previous one + testSuite_verifyCount(3, kmemberVal); testSuite_verifyCount(3, kmember); testSuite_verifyCount(3, k); } @@ -624,10 +628,6 @@ testSuite <- function() { } - - - - # # ###################### Templates ###################### # From deb86641653aef6a283ee468f41256862401f7eb Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Fri, 14 Oct 2022 20:53:53 +0200 Subject: [PATCH 6/9] enable test for pointerreftest fixed by 752b7e8 --- Examples/test-suite/r/li_boost_shared_ptr_runme.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Examples/test-suite/r/li_boost_shared_ptr_runme.R b/Examples/test-suite/r/li_boost_shared_ptr_runme.R index 6df8984fc..059adf1da 100644 --- a/Examples/test-suite/r/li_boost_shared_ptr_runme.R +++ b/Examples/test-suite/r/li_boost_shared_ptr_runme.R @@ -161,13 +161,13 @@ testSuite <- function() { } # pass by pointer reference - if (FALSE) { + { k = Klass("me oh my"); kret = pointerreftest(k); # -> class not defined _p_p_Space__Klass val = kret$getValue(); unittest("me oh my pointerreftest", val); testSuite_verifyCount(1, k); - testSuite_verifyCount(1, kret); + # testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass } # null tests From 0fec14ba34c6fdfcf369ee5fe7a364937ad22866 Mon Sep 17 00:00:00 2001 From: AndLLA <44858649+AndLLA@users.noreply.github.com> Date: Sun, 16 Oct 2022 20:49:00 +0200 Subject: [PATCH 7/9] align implementation of smartname to r class name --- Source/Modules/r.cxx | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index 18a9aa56d..3d9cab0d4 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -2091,21 +2091,16 @@ int R::functionWrapper(Node *n) { if (constructor) { Node * parent = Getattr(n, "parentNode"); String * smartname = Getattr(parent, "feature:smartptr"); - if (smartname) { - String * classtypeobj = Getattr(parent, "classtypeobj"); // this is the correct name, e.g. ClassName(int) - String * classtype = NewString(Getattr(parent, "classtype")); // this is the "wrong" name e.g. ClassName - - // we replace inside smartname ClassName with ClassName(int) - String * smartname_fixed = NewString(smartname); - Replaceall(classtype, " ", ""); // classtype actually has spaces inside so we remove them - Replaceall(smartname_fixed, classtype, classtypeobj); - - String * smartname_fixed_rclass = getRClassName(smartname_fixed, 1, 1); - Replaceall(tm, "$R_class", smartname_fixed_rclass); - - Delete(classtype); - Delete(smartname_fixed); - Delete(smartname_fixed_rclass); + if (smartname) { // SmartName handling - has to be aligned to the other implementation in this file + SwigType *spt = Swig_cparse_type(smartname); + String *smart = SwigType_typedef_resolve_all(spt); + String *smart_rname = SwigType_manglestr(smart); + String *smart_rname_p = NewStringf("_p%s", smart_rname); + Replaceall(tm, "$R_class", smart_rname_p); + Delete(spt); + Delete(smart); + Delete(smart_rname); + Delete(smart_rname_p); } } if (debugMode) { @@ -2334,7 +2329,7 @@ void R::registerClass(Node *n) { Printf(s_classes, "setClass('%s', contains = %s)\n", sname, base); Delete(base); String *smartptr = Getattr(n, "feature:smartptr"); - if (smartptr) { + if (smartptr) {// SmartName handling - has to be aligned to the other implementation in this file List *l = Getattr(n, "bases"); SwigType *spt = Swig_cparse_type(smartptr); String *smart = SwigType_typedef_resolve_all(spt); From 6c4dcbb8fe62cd8802bb683eb9fc14b32e8459c3 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 24 Oct 2022 08:38:17 +0100 Subject: [PATCH 8/9] R shared_ptr fixes Fix problems in shared_ptr wrappers where the class names were not consistent when using the shared_ptr template or the actual underlying type. Move $R_class substitution to typemaps. Issue #2386 --- CHANGES.current | 5 ++ .../test-suite/r/li_boost_shared_ptr_runme.R | 66 +++++++++---------- Lib/r/boost_shared_ptr.i | 19 ++++++ Source/Modules/r.cxx | 40 ----------- 4 files changed, 57 insertions(+), 73 deletions(-) diff --git a/CHANGES.current b/CHANGES.current index 2ad66dd59..c82d1221b 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,11 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-10-24: wsfulton, AndLLA + [R] #2386 Fix problems in shared_ptr wrappers where the class names + were not consistent when using the shared_ptr template or the actual + underlying type. + 2022-10-24: wsfulton [R] Add support for special variable replacement in the $typemap() special variable macro for R specific typemaps (rtype, rtypecheck, diff --git a/Examples/test-suite/r/li_boost_shared_ptr_runme.R b/Examples/test-suite/r/li_boost_shared_ptr_runme.R index 059adf1da..d1e343cb3 100644 --- a/Examples/test-suite/r/li_boost_shared_ptr_runme.R +++ b/Examples/test-suite/r/li_boost_shared_ptr_runme.R @@ -83,7 +83,7 @@ testSuite <- function() { if (FALSE) { # pass by shared_ptr pointer reference k = Klass("me oh my") - kret = smartpointerpointerreftest(k) # undefined class _p_p_SwigBoost__shared_ptrT_Space__Klass_t + kret = smartpointerpointerreftest(k) val = kret$getValue() unittest("me oh my smartpointerpointerreftest", val) testSuite_verifyCount(2, k) @@ -93,7 +93,7 @@ testSuite <- function() { if (FALSE) { # pass by shared_ptr pointer reference k = Klass("me oh my"); - kret = smartpointerpointerreftest(k); # undefined class _p_p_SwigBoost__shared_ptrT_Space__Klass_t + kret = smartpointerpointerreftest(k); val = kret$getValue() unittest("me oh my smartpointerpointerreftest", val); testSuite_verifyCount(2, k); @@ -104,10 +104,10 @@ testSuite <- function() { { k = Klass("me oh my"); kret = constsmartpointertest(k); - val = Klass_getValue(kret) # kret$getValue(); - method not defined + val = Klass_getValue(kret); unittest("me oh my", val); testSuite_verifyCount(2, k); - # testSuite_verifyCount(2, kret); # -> use_count not defined on _p_SwigBoost__shared_ptrT_Space__Klass_const_t + testSuite_verifyCount(2, kret); } # const pass by shared_ptr pointer @@ -117,7 +117,7 @@ testSuite <- function() { val = Klass_getValue(kret) unittest("me oh my", val) testSuite_verifyCount(2, k) - # testSuite_verifyCount(2, kret) # -> use_count not defined on _p_SwigBoost__shared_ptrT_Space__Klass_const_t + testSuite_verifyCount(2, kret) } # const pass by shared_ptr reference @@ -127,7 +127,7 @@ testSuite <- function() { val = Klass_getValue(kret) unittest("me oh my", val) testSuite_verifyCount(2, k) - # testSuite_verifyCount(2, kret) # -> use_count not defined for _p_SwigBoost__shared_ptrT_Space__Klass_const_t + testSuite_verifyCount(2, kret) } # pass by value @@ -137,7 +137,7 @@ testSuite <- function() { val = kret$getValue(); unittest("me oh my valuetest", val); testSuite_verifyCount(1, k); - # testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + testSuite_verifyCount(1, kret); } # pass by pointer @@ -147,7 +147,7 @@ testSuite <- function() { val = kret$getValue(); unittest("me oh my pointertest", val); testSuite_verifyCount(1, k); - # testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + testSuite_verifyCount(1, kret); } # pass by reference @@ -157,17 +157,17 @@ testSuite <- function() { val = kret$getValue(); unittest("me oh my reftest", val); testSuite_verifyCount(1, k); - #testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + testSuite_verifyCount(1, kret); } # pass by pointer reference { k = Klass("me oh my"); - kret = pointerreftest(k); # -> class not defined _p_p_Space__Klass + kret = pointerreftest(k); val = kret$getValue(); unittest("me oh my pointerreftest", val); testSuite_verifyCount(1, k); - # testSuite_verifyCount(1, kret); # -> use_count not defined on _p_Space__Klass + testSuite_verifyCount(1, kret); } # null tests @@ -239,7 +239,7 @@ testSuite <- function() { k = pointerownertest(); val = k$getValue(); unittest("pointerownertest", val); - # testSuite_verifyCount(1, k); # -> use_count not defined for _p_Space__Klass + testSuite_verifyCount(1, k); } { @@ -286,7 +286,7 @@ testSuite <- function() { # pass by shared_ptr pointer reference (mixed) if (FALSE) { k = KlassDerived("me oh my"); - kret = smartpointerpointerreftest(k); # undefined class _p_p_SwigBoost__shared_ptrT_Space__Klass_t + kret = smartpointerpointerreftest(k); val = kret$getValue(); unittest("me oh my derivedsmartptrpointerreftest-Derived", val); testSuite_verifyCount(2, k); # includes two extra references for upcasts in the proxy classes @@ -313,7 +313,7 @@ testSuite <- function() { val = kret$getValue(); unittest("me oh my derivedpointertest-Derived", val); testSuite_verifyCount(1, k); - # testSuite_verifyCount(1, kret); -> use_count not defined for _p_Space__KlassDerived + testSuite_verifyCount(1, kret); } # pass by ref (mixed) @@ -340,12 +340,12 @@ testSuite <- function() { unittest(overload_rawbyval(k), "rawbyval") unittest(overload_rawbyref(k), "rawbyref") unittest(overload_rawbyptr(k), "rawbyptr") - # unittest(overload_rawbyptrref(k), "rawbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass_t + unittest(overload_rawbyptrref(k), "rawbyptrref") unittest(overload_smartbyval(k), "smartbyval") unittest(overload_smartbyref(k), "smartbyref") unittest(overload_smartbyptr(k), "smartbyptr") - # unittest(overload_smartbyptrref(k), "smartbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass_t + unittest(overload_smartbyptrref(k), "smartbyptrref") } # Derived class @@ -355,12 +355,12 @@ testSuite <- function() { unittest(overload_rawbyval(k), "rawbyval") unittest(overload_rawbyref(k), "rawbyref") unittest(overload_rawbyptr(k), "rawbyptr") - # unittest(overload_rawbyptrref(k), "rawbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__KlassDerived_t + unittest(overload_rawbyptrref(k), "rawbyptrref") unittest(overload_smartbyval(k), "smartbyval") unittest(overload_smartbyref(k), "smartbyref") unittest(overload_smartbyptr(k), "smartbyptr") - # unittest(overload_smartbyptrref(k), "smartbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__KlassDerived_t + unittest(overload_smartbyptrref(k), "smartbyptrref") } # 3rd derived class @@ -370,12 +370,12 @@ testSuite <- function() { unittest(overload_rawbyval(k), "rawbyval") unittest(overload_rawbyref(k), "rawbyref") unittest(overload_rawbyptr(k), "rawbyptr") - # unittest(overload_rawbyptrref(k), "rawbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass3rdDerived_t + unittest(overload_rawbyptrref(k), "rawbyptrref") unittest(overload_smartbyval(k), "smartbyval") unittest(overload_smartbyref(k), "smartbyref") unittest(overload_smartbyptr(k), "smartbyptr") - # unittest(overload_smartbyptrref(k), "smartbyptrref") --> undefined for _p_SwigBoost__shared_ptrT_Space__Klass3rdDerived_t + unittest(overload_smartbyptrref(k), "smartbyptrref") } # @@ -573,7 +573,7 @@ testSuite <- function() { kglobal = GlobalValue_get(); val = kglobal$getValue(); unittest("global value", val); - # testSuite_verifyCount(1, kglobal); # -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, kglobal); testSuite_verifyCount(1, k); unittest("global value", GlobalValue_get()$getValue()); @@ -600,7 +600,7 @@ testSuite <- function() { kglobal = GlobalPointer_get(); val = kglobal$getValue(); unittest("global pointer", val); - # testSuite_verifyCount(1, kglobal); -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, kglobal); testSuite_verifyCount(1, k); GlobalPointer_set(NULL); } @@ -614,7 +614,7 @@ testSuite <- function() { kglobal = GlobalReference_get(); val = kglobal$getValue(); unittest("global reference", val); - # testSuite_verifyCount(1, kglobal); # -> use_count undefined for _p_Space__Klass + testSuite_verifyCount(1, kglobal); testSuite_verifyCount(1, k); bNotCatched = F @@ -652,16 +652,16 @@ for (i in 1:10) { # wait for the GC to collect unused objects -for (i in 1:10) { - invisible(gc(verbose = F, full = T)) - - if (Klass_getTotal_count() == 1) { - break - } - - print(paste("Still waiting for GC to collect ", Klass_getTotal_count()-1, " objects, ", i)) - Sys.sleep(1) -} +#for (i in 1:10) { +# invisible(gc(verbose = F, full = T)) +# +# if (Klass_getTotal_count() == 1) { +# break +# } +# +# print(paste("Still waiting for GC to collect ", Klass_getTotal_count()-1, " objects, ", i)) +# Sys.sleep(1) +#} # Expect unittest(shared_ptr_wrapper_count(), NOT_COUNTING()) diff --git a/Lib/r/boost_shared_ptr.i b/Lib/r/boost_shared_ptr.i index 87c89b5f9..13f041fbb 100644 --- a/Lib/r/boost_shared_ptr.i +++ b/Lib/r/boost_shared_ptr.i @@ -394,6 +394,25 @@ #error "typemaps for $1_type not available" %} +%typemap(rtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& + "$typemap(rtype, TYPE)" + +%typemap(scoercein) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& + %{ if (inherits($input, "ExternalReference")) $input = slot($input,"ref"); %} + +%typemap(scoerceout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& + %{ $result <- if (is.null($result)) $result + else new("$typemap(rtype, TYPE)", ref=$result); %} + %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; diff --git a/Source/Modules/r.cxx b/Source/Modules/r.cxx index 3d9cab0d4..e1fd422dd 100644 --- a/Source/Modules/r.cxx +++ b/Source/Modules/r.cxx @@ -2088,21 +2088,6 @@ int R::functionWrapper(Node *n) { /*If the user gave us something to convert the result in */ if ((tm = Swig_typemap_lookup("scoerceout", n, Swig_cresult_name(), sfun))) { Replaceall(tm,"$result","ans"); - if (constructor) { - Node * parent = Getattr(n, "parentNode"); - String * smartname = Getattr(parent, "feature:smartptr"); - if (smartname) { // SmartName handling - has to be aligned to the other implementation in this file - SwigType *spt = Swig_cparse_type(smartname); - String *smart = SwigType_typedef_resolve_all(spt); - String *smart_rname = SwigType_manglestr(smart); - String *smart_rname_p = NewStringf("_p%s", smart_rname); - Replaceall(tm, "$R_class", smart_rname_p); - Delete(spt); - Delete(smart); - Delete(smart_rname); - Delete(smart_rname_p); - } - } if (debugMode) { Printf(stdout, "Calling replace B: %s, %s, %s\n", Getattr(n, "type"), Getattr(n, "sym:name"), getNSpace()); } @@ -2328,31 +2313,6 @@ void R::registerClass(Node *n) { Printf(s_classes, "setClass('%s', contains = %s)\n", sname, base); Delete(base); - String *smartptr = Getattr(n, "feature:smartptr"); - if (smartptr) {// SmartName handling - has to be aligned to the other implementation in this file - List *l = Getattr(n, "bases"); - SwigType *spt = Swig_cparse_type(smartptr); - String *smart = SwigType_typedef_resolve_all(spt); - String *smart_rname = SwigType_manglestr(smart); - Printf(s_classes, "setClass('_p%s', contains = c('%s'", smart_rname, sname); - Delete(spt); - Delete(smart); - Delete(smart_rname); - for(int i = 0; i < Len(l); i++) { - Node * b = Getitem(l, i); - smartptr = Getattr(b, "feature:smartptr"); - if (smartptr) { - spt = Swig_cparse_type(smartptr); - smart = SwigType_typedef_resolve_all(spt); - smart_rname = SwigType_manglestr(smart); - Printf(s_classes, ", '_p%s'", smart_rname); - Delete(spt); - Delete(smart); - Delete(smart_rname); - } - } - Printf(s_classes, "))\n"); - } } } From d238d109c95f2245f2f68b53d054bd28d7e95fb0 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 24 Oct 2022 19:35:04 +0100 Subject: [PATCH 9/9] Whitespace cleanup in R testcase --- .../test-suite/r/li_boost_shared_ptr_runme.R | 128 +++++++++--------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/Examples/test-suite/r/li_boost_shared_ptr_runme.R b/Examples/test-suite/r/li_boost_shared_ptr_runme.R index d1e343cb3..ecdc7f1ab 100644 --- a/Examples/test-suite/r/li_boost_shared_ptr_runme.R +++ b/Examples/test-suite/r/li_boost_shared_ptr_runme.R @@ -24,8 +24,8 @@ unittest(shared_ptr_wrapper_count(), NOT_COUNTING()) # testSuite_verifyCount <- function(expected, k) { - got = use_count(k) - unittest(expected, got); + got = use_count(k) + unittest(expected, got); } testSuite <- function() { @@ -34,7 +34,7 @@ testSuite <- function() { # Reference Implementation is li_boost_shared_ptr_runme.py # - # simple shared_ptr usage - created in C++ + # simple shared_ptr usage - created in C++ { k = Klass("me oh my") val = k$getValue() @@ -42,73 +42,73 @@ testSuite <- function() { testSuite_verifyCount(1, k) } - # simple shared_ptr usage - not created in C++ - { - k = factorycreate() - val = k$getValue() - unittest("factorycreate", val) - testSuite_verifyCount(1, k) - } + # simple shared_ptr usage - not created in C++ + { + k = factorycreate() + val = k$getValue() + unittest("factorycreate", val) + testSuite_verifyCount(1, k) + } - # pass by shared_ptr - { - k = Klass("me oh my") - kret = smartpointertest(k) - val = kret$getValue() - unittest("me oh my smartpointertest", val) - testSuite_verifyCount(2, k) - testSuite_verifyCount(2, kret) - } + # pass by shared_ptr + { + k = Klass("me oh my") + kret = smartpointertest(k) + val = kret$getValue() + unittest("me oh my smartpointertest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } - # pass by shared_ptr pointer - { - k = Klass("me oh my") - kret = smartpointerpointertest(k) - val = kret$getValue() - unittest("me oh my smartpointerpointertest", val) - testSuite_verifyCount(2, k) - testSuite_verifyCount(2, kret) - } + # pass by shared_ptr pointer + { + k = Klass("me oh my") + kret = smartpointerpointertest(k) + val = kret$getValue() + unittest("me oh my smartpointerpointertest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } - # pass by shared_ptr reference - { - k = Klass("me oh my") - kret = smartpointerreftest(k) - val = kret$getValue() - unittest("me oh my smartpointerreftest", val) - testSuite_verifyCount(2, k) - testSuite_verifyCount(2, kret) - } + # pass by shared_ptr reference + { + k = Klass("me oh my") + kret = smartpointerreftest(k) + val = kret$getValue() + unittest("me oh my smartpointerreftest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } - if (FALSE) { - # pass by shared_ptr pointer reference - k = Klass("me oh my") - kret = smartpointerpointerreftest(k) - val = kret$getValue() - unittest("me oh my smartpointerpointerreftest", val) - testSuite_verifyCount(2, k) - testSuite_verifyCount(2, kret) - } + if (FALSE) { + # pass by shared_ptr pointer reference + k = Klass("me oh my") + kret = smartpointerpointerreftest(k) + val = kret$getValue() + unittest("me oh my smartpointerpointerreftest", val) + testSuite_verifyCount(2, k) + testSuite_verifyCount(2, kret) + } - if (FALSE) { - # pass by shared_ptr pointer reference - k = Klass("me oh my"); - kret = smartpointerpointerreftest(k); - val = kret$getValue() - unittest("me oh my smartpointerpointerreftest", val); - testSuite_verifyCount(2, k); - testSuite_verifyCount(2, kret); - } + if (FALSE) { + # pass by shared_ptr pointer reference + k = Klass("me oh my"); + kret = smartpointerpointerreftest(k); + val = kret$getValue() + unittest("me oh my smartpointerpointerreftest", val); + testSuite_verifyCount(2, k); + testSuite_verifyCount(2, kret); + } - # const pass by shared_ptr - { - k = Klass("me oh my"); - kret = constsmartpointertest(k); - val = Klass_getValue(kret); - unittest("me oh my", val); - testSuite_verifyCount(2, k); - testSuite_verifyCount(2, kret); - } + # const pass by shared_ptr + { + k = Klass("me oh my"); + kret = constsmartpointertest(k); + val = Klass_getValue(kret); + unittest("me oh my", val); + testSuite_verifyCount(2, k); + testSuite_verifyCount(2, kret); + } # const pass by shared_ptr pointer {