diff --git a/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Executors.cxx b/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Executors.cxx
index 1d48488abfa1ce89e887d6becaccb6de50ca88d6..9198da2be05ab6a9511be6320c7653b559c9c086 100644
--- a/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Executors.cxx
+++ b/bindings/pyroot_experimental/cppyy/CPyCppyy/src/Executors.cxx
@@ -70,21 +70,11 @@ CPPYY_IMPL_GILCALL(double,        D)
 CPPYY_IMPL_GILCALL(LongDouble_t,  LD)
 CPPYY_IMPL_GILCALL(void*,         R)
 
-/*
-// TODO: CallS may not have a use here; CallO is used instead for std::string
-static inline char* GILCallS(
-    Cppyy::TCppMethod_t method, Cppyy::TCppObject_t self, CPyCppyy::CallContext* ctxt)
-{
-    GILControl gc(ctxt);
-// TODO: make use of getting the string length returned ...
-    size_t len;
-    return Cppyy::CallS(method, self, ctxt->GetSize(), ctxt->GetArgs(), &len);
-}
-*/
-
 static inline Cppyy::TCppObject_t GILCallO(Cppyy::TCppMethod_t method,
     Cppyy::TCppObject_t self, CPyCppyy::CallContext* ctxt, Cppyy::TCppType_t klass)
 {
+    if (!ReleasesGIL(ctxt))
+        return Cppyy::CallO(method, self, ctxt->GetSize(), ctxt->GetArgs(), klass);
     GILControl gc(ctxt);
     return Cppyy::CallO(method, self, ctxt->GetSize(), ctxt->GetArgs(), klass);
 }
@@ -92,6 +82,8 @@ static inline Cppyy::TCppObject_t GILCallO(Cppyy::TCppMethod_t method,
 static inline Cppyy::TCppObject_t GILCallConstructor(
     Cppyy::TCppMethod_t method, Cppyy::TCppType_t klass, CPyCppyy::CallContext* ctxt)
 {
+    if (!ReleasesGIL(ctxt))
+        return Cppyy::CallConstructor(method, klass, ctxt->GetSize(), ctxt->GetArgs());
     GILControl gc(ctxt);
     return Cppyy::CallConstructor(method, klass, ctxt->GetSize(), ctxt->GetArgs());
 }