From dcf4119b2fd8c0ac02e2daa6a70e242207651c4b Mon Sep 17 00:00:00 2001 From: Wim Lavrijsen <wlav@pc3-wlav.lbl.gov> Date: Fri, 17 May 2013 12:58:43 -0700 Subject: [PATCH] Cling workaround: special case to resolve string <-> basic_string<char> --- bindings/pyroot/src/Converters.cxx | 2 +- bindings/pyroot/src/RootWrapper.cxx | 11 +++++++++-- bindings/pyroot/src/TConstructorHolder.cxx | 4 +++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/bindings/pyroot/src/Converters.cxx b/bindings/pyroot/src/Converters.cxx index 7d944867160..5dcdff56f30 100644 --- a/bindings/pyroot/src/Converters.cxx +++ b/bindings/pyroot/src/Converters.cxx @@ -504,7 +504,7 @@ Bool_t PyROOT::TCStringConverter::SetArg( // set the value and declare success if ( func ) - gInterpreter->CallFunc_SetArg( func, reinterpret_cast< Long_t >( fBuffer.c_str() ) ); + gInterpreter->CallFunc_SetArg( func, (Long_t)fBuffer.c_str() ); return kTRUE; } diff --git a/bindings/pyroot/src/RootWrapper.cxx b/bindings/pyroot/src/RootWrapper.cxx index 2cec9a9efef..ec58a48a409 100644 --- a/bindings/pyroot/src/RootWrapper.cxx +++ b/bindings/pyroot/src/RootWrapper.cxx @@ -230,8 +230,15 @@ int PyROOT::BuildRootClassDict( const TScopeAdapter& klass, PyObject* pyclass ) // special case trackers Bool_t setupSetItem = kFALSE; - Bool_t isConstructor = - TClassEdit::ShortType( mtName.c_str(), TClassEdit::kDropAlloc ) == clName; + // CLING WORKAROUND -- + Bool_t isConstructor = kFALSE; + if ( clName == "string" ) { + isConstructor = mtName == "basic_string<char>"; + } else { + // -- CLING WORKAROUND + isConstructor = + TClassEdit::ShortType( mtName.c_str(), TClassEdit::kDropAlloc ) == clName; + } // filter empty names (happens for namespaces, is bug?) if ( mtName == "" ) diff --git a/bindings/pyroot/src/TConstructorHolder.cxx b/bindings/pyroot/src/TConstructorHolder.cxx index 2c72d8bdffa..aa99743c8db 100644 --- a/bindings/pyroot/src/TConstructorHolder.cxx +++ b/bindings/pyroot/src/TConstructorHolder.cxx @@ -86,8 +86,10 @@ PyObject* PyROOT::TConstructorHolder::operator()( // CLING WORKAROUND -- // Due to #100389, the constructor may not be a valid method. This happens if // there is no (default) contructor, so just return a right-size bit of memory. - if ( ! address ) + if ( ! address ) { + PyErr_Clear(); address = (Long_t)klass->New(); + } // -- END CLING WORKAROUND // done with filtered args -- GitLab