[pypy-commit] pypy reflex-support: cling fixes

wlav noreply at buildbot.pypy.org
Wed Jul 16 21:16:58 CEST 2014


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r72456:0de503991f11
Date: 2014-07-16 12:16 -0700
http://bitbucket.org/pypy/pypy/changeset/0de503991f11/

Log:	cling fixes

diff --git a/pypy/module/cppyy/capi/builtin_capi.py b/pypy/module/cppyy/capi/builtin_capi.py
--- a/pypy/module/cppyy/capi/builtin_capi.py
+++ b/pypy/module/cppyy/capi/builtin_capi.py
@@ -3,6 +3,7 @@
 
 import reflex_capi as backend
 #import cint_capi as backend
+#import cling_capi as backend
 
 from pypy.module.cppyy.capi.capi_types import C_SCOPE, C_TYPE, C_OBJECT,\
    C_METHOD, C_INDEX, C_INDEX_ARRAY, WLAVC_INDEX,\
diff --git a/pypy/module/cppyy/capi/cling_capi.py b/pypy/module/cppyy/capi/cling_capi.py
--- a/pypy/module/cppyy/capi/cling_capi.py
+++ b/pypy/module/cppyy/capi/cling_capi.py
@@ -14,12 +14,13 @@
 (config_stat, incdir) = commands.getstatusoutput("root-config --incdir")
 
 if os.environ.get("ROOTSYS"):
-    if config_stat != 0:     # presumably Reflex-only
-        rootincpath = [os.path.join(os.environ["ROOTSYS"], "interpreter/cling/include"),
-                       os.path.join(os.environ["ROOTSYS"], "interpreter/llvm/inst/include")]
+    rootincpath = [os.path.join(os.environ["ROOTSYS"], "interpreter/cling/include"),
+                   os.path.join(os.environ["ROOTSYS"], "interpreter/llvm/inst/include")]
+    if config_stat != 0:
+        rootincpath.append(os.path.join(os.environ["ROOTSYS"], "include"))
         rootlibpath = [os.path.join(os.environ["ROOTSYS"], "lib64"), os.path.join(os.environ["ROOTSYS"], "lib")]
     else:
-        rootincpath = [incdir]
+        rootincpath.append(incdir)
         rootlibpath = commands.getoutput("root-config --libdir").split()
 else:
     if config_stat == 0:
@@ -45,7 +46,7 @@
     includes=["clingcwrapper.h"],
     library_dirs=rootlibpath,
     libraries=["Cling"],
-    compile_extra=["-fno-strict-aliasing"],
+    compile_extra=["-fno-strict-aliasing", "-std=c++11"],
     use_cpp_linker=True,
 )
 
diff --git a/pypy/module/cppyy/src/clingcwrapper.cxx b/pypy/module/cppyy/src/clingcwrapper.cxx
--- a/pypy/module/cppyy/src/clingcwrapper.cxx
+++ b/pypy/module/cppyy/src/clingcwrapper.cxx
@@ -21,7 +21,7 @@
 #include "cling/Interpreter/DynamicLibraryManager.h"
 #include "cling/Interpreter/Interpreter.h"
 #include "cling/Interpreter/LookupHelper.h"
-#include "cling/Interpreter/StoredValueRef.h"
+#include "cling/Interpreter/Value.h"
 #include "cling/MetaProcessor/MetaProcessor.h"
 
 #include "llvm/ADT/SmallVector.h"
@@ -157,7 +157,8 @@
 cppyy_scope_t cppyy_get_scope(const char* scope_name) {
     const cling::LookupHelper& lh = gCppyy_Cling->getLookupHelper();
     const Type* type = 0;
-    const Decl* decl = lh.findScope(scope_name, &type, /* intantiateTemplate= */ true);
+    const Decl* decl = lh.findScope(scope_name,
+        cling::LookupHelper::NoDiagnostics, &type, /* intantiateTemplate= */ true);
     if (!decl) {
         //std::string buf = TClassEdit::InsertStd(name);
         //decl = lh.findScope(buf, &type, /* intantiateTemplate= */ true);
@@ -190,8 +191,8 @@
 
 // TODO: expect the below to live in libCling.so
 static CPPYY_Cling_Wrapper_t make_wrapper(const FunctionDecl* fdecl);
-static void exec_with_valref_return(void* address, cling::StoredValueRef* ret, const FunctionDecl*);
-static long long sv_to_long_long(const cling::StoredValueRef& svref);
+static void exec_with_valref_return(void* address, cling::Value*, const FunctionDecl*);
+static long long sv_to_long_long(const cling::Value& val);
 // -- TODO: expect the above to live in libCling.so
 
 
@@ -200,7 +201,7 @@
     if (s_wrappers.find(method) == s_wrappers.end()) {
         make_wrapper((FunctionDecl*)method);
     }
-    cling::StoredValueRef ret;
+    cling::Value ret;
     //    std::vector<void*> arguments = build_args(nargs, args);
     //    CPPYY_Cling_Wrapper_t cb = (CPPYY_Cling_Wrapper_t)method;
     exec_with_valref_return((void*)self, &ret, (FunctionDecl*)method);
@@ -362,7 +363,7 @@
     // R__LOCKGUARD2(gInterpreterMutex);
     std::cout << " NOW LOADING: " << lib_name << std::endl;
 
-    cling::StoredValueRef call_res;
+    cling::Value call_res;
     cling::Interpreter::CompilationResult comp_res = cling::Interpreter::kSuccess;
     std::ostringstream line;
     line << "#include \"" << lib_name << ".h\"";
@@ -377,8 +378,8 @@
     //     UpdateListOfLoadedSharedLibraries();
     // }
     switch (res) {
-    case cling::DynamicLibraryManager::kLoadLibSuccess: return (void*)1;
-    case cling::DynamicLibraryManager::kLoadLibExists:  return (void*)2;
+    case cling::DynamicLibraryManager::kLoadLibSuccess:       return (void*)1;
+    case cling::DynamicLibraryManager::kLoadLibAlreadyLoaded: return (void*)2;
     default: break;
     };
     return (void*)1;
@@ -389,68 +390,130 @@
 
 // TODO: expect the below to live in libCling.so
 
-template <typename T>
-T sv_to_long_long_u_or_not(const cling::StoredValueRef& svref) {
-    const cling::Value& valref = svref.get();
-    QualType QT = valref.getClangType();
-    if (QT.isNull()) {
-        print_error("sv_to_long_long_u_or_not", "null type!");
-        return 0;
-    }
-    llvm::GenericValue gv = valref.getGV();
-    if (QT->isMemberPointerType()) {
-        const MemberPointerType* MPT =
-            QT->getAs<MemberPointerType>();
-        if (MPT->isMemberDataPointer()) {
-            return (T) (ptrdiff_t) gv.PointerVal;
-        }
-        return (T) gv.PointerVal;
-    }
-    if (QT->isPointerType() || QT->isArrayType() || QT->isRecordType() ||
-        QT->isReferenceType()) {
-        return (T) gv.PointerVal;
-    }
-    if (const EnumType* ET = llvm::dyn_cast<EnumType>(&*QT)) {
-        if (ET->getDecl()->getIntegerType()->hasSignedIntegerRepresentation())
-            return (T) gv.IntVal.getSExtValue();
-        else
-            return (T) gv.IntVal.getZExtValue();
-    }
-    if (const BuiltinType* BT = llvm::dyn_cast<BuiltinType>(&*QT)) {
-      if (BT->isSignedInteger()) {
-          return gv.IntVal.getSExtValue();
-      } else if (BT->isUnsignedInteger()) {
-          return (T) gv.IntVal.getZExtValue();
-      } else {
-          switch (BT->getKind()) {
-          case BuiltinType::Float:
-              return (T) gv.FloatVal;
-          case BuiltinType::Double:
-              return (T) gv.DoubleVal;
-          case BuiltinType::LongDouble:
-              // FIXME: Implement this!
-              break;
-          case BuiltinType::NullPtr:
-              // C++11 nullptr
-              return 0;
-          default: break;
-          }
+template <typename returnType>
+returnType sv_to(const cling::Value& val)
+{
+   QualType QT = val.getType();
+   if (QT->isMemberPointerType()) {
+      const MemberPointerType* MPT = QT->getAs<MemberPointerType>();
+      if (MPT->isMemberDataPointer()) {
+         return (returnType) (ptrdiff_t)val.getPtr();
       }
-    }
-    print_error("sv_to_long_long_u_or_not", "cannot handle this type!");
-    QT->dump();
-    return 0;
-}
+      return (returnType) (long) val.getPtr();
+   }
+   if (QT->isPointerType() || QT->isArrayType() || QT->isRecordType() ||
+         QT->isReferenceType()) {
+      return (returnType) (long) val.getPtr();
+   }
+   if (const EnumType* ET = dyn_cast<EnumType>(&*QT)) {
+      if (ET->getDecl()->getIntegerType()->hasSignedIntegerRepresentation())
+         return (returnType) val.getLL();
+      else
+         return (returnType) val.getULL();
+   }
+   if (const BuiltinType* BT =
+            dyn_cast<BuiltinType>(&*QT)) {
+      //
+      //  WARNING!!!
+      //
+      //  This switch is organized in order-of-declaration
+      //  so that the produced assembly code is optimal.
+      //  Do not reorder!
+      //
+      switch (BT->getKind()) {
+         case BuiltinType::Void:
+            // CINT used to expect a result of 0.
+            return (returnType) 0;
+            break;
+            //
+            //  Unsigned Types
+            //
+         case BuiltinType::Bool:
+         case BuiltinType::Char_U: // char on targets where it is unsigned
+         case BuiltinType::UChar:
+            return (returnType) val.getULL();
+            break;
 
-static long long sv_to_long_long(const cling::StoredValueRef& svref) {
-    return sv_to_long_long_u_or_not<long long>(svref);
+         case BuiltinType::WChar_U:
+            // wchar_t on targets where it is unsigned
+            // The standard doesn't allow to specify signednedd of wchar_t
+            // thus this maps simply to wchar_t.
+            return (returnType) (wchar_t) val.getULL();
+            break;
+
+         case BuiltinType::Char16:
+         case BuiltinType::Char32:
+         case BuiltinType::UShort:
+         case BuiltinType::UInt:
+         case BuiltinType::ULong:
+         case BuiltinType::ULongLong:
+            return (returnType) val.getULL();
+            break;
+
+         case BuiltinType::UInt128:
+            // __uint128_t
+            break;
+
+            //
+            //  Signed Types
+            //
+         case BuiltinType::Char_S: // char on targets where it is signed
+         case BuiltinType::SChar:
+            return (returnType) val.getLL();
+            break;
+
+         case BuiltinType::WChar_S:
+               // wchar_t on targets where it is signed
+               // The standard doesn't allow to specify signednedd of wchar_t
+               // thus this maps simply to wchar_t.
+            return (returnType) (wchar_t) val.getLL();
+            break;
+
+         case BuiltinType::Short:
+         case BuiltinType::Int:
+         case BuiltinType::Long:
+         case BuiltinType::LongLong:
+            return (returnType) val.getLL();
+            break;
+
+         case BuiltinType::Int128:
+            break;
+
+         case BuiltinType::Half:
+            // half in OpenCL, __fp16 in ARM NEON
+            break;
+
+         case BuiltinType::Float:
+            return (returnType) val.getFloat();
+            break;
+         case BuiltinType::Double:
+            return (returnType) val.getDouble();
+            break;
+         case BuiltinType::LongDouble:
+            return (returnType) val.getLongDouble();
+            break;
+
+         case BuiltinType::NullPtr:
+            return (returnType) 0;
+            break;
+
+         default:
+            break;
+      }
+   }
+   print_error("sv_to", "invalid type");
+   QT->dump();
+   return 0;
 }
 
 static
-unsigned long long sv_to_ulong_long(const cling::StoredValueRef& svref) {
-   return sv_to_long_long_u_or_not<unsigned long long>(svref);
+long long sv_to_long_long(const cling::Value& val) {
+   return sv_to<long long>(val);
 }
-
+static
+unsigned long long sv_to_ulong_long(const cling::Value& val) {
+   return sv_to<unsigned long long>(val);
+}
 
 namespace {
 
@@ -772,230 +835,168 @@
     (*wrapper)(address, (int)0/*num_args*/, (void**)vp_ary.data(), ret);
 }
 
+static void
+exec_with_valref_return(void* address, cling::Value* ret) const
+{
+   if (!ret) {
+      exec(address, 0);
+      return;
+   }
+   std::cout << " USING DECL: " << fdecl << std::endl;
+   const FunctionDecl* FD = fMethod->GetMethodDecl();
+   ASTContext& Context = FD->getASTContext();
 
-static void exec_with_valref_return(void* address, cling::StoredValueRef* ret, const FunctionDecl* fdecl) {
-    if (!ret) {
-        exec(address, 0, fdecl);
-        return;
-    }
-    std::cout << " USING DECL: " << fdecl << std::endl;
-    fdecl->dump();
-    ASTContext& Context = fdecl->getASTContext();
+   if (const CXXConstructorDecl* CD = dyn_cast<CXXConstructorDecl>(FD)) {
+      const TypeDecl* TD = dyn_cast<TypeDecl>(CD->getDeclContext());
+      QualType ClassTy(TD->getTypeForDecl(), 0);
+      QualType QT = Context.getLValueReferenceType(ClassTy);
+      *ret = cling::Value(QT, fInterp);
+      // Store the new()'ed address in getPtr()
+      exec(address, &ret->getPtr());
+      return;
+   }
+   QualType QT = FD->getReturnType().getCanonicalType();
+   if (QT->isReferenceType()) {
+      *ret = cling::Value(QT, 0);
+      exec(address, &ret->getPtr());
+      return;
+   }
+   else if (QT->isMemberPointerType()) {
+      const MemberPointerType* MPT = QT->getAs<MemberPointerType>();
+      if (MPT->isMemberDataPointer()) {
+         // A member data pointer is a actually a struct with one
+         // member of ptrdiff_t, the offset from the base of the object
+         // storage to the storage for the designated data member.
+         // But that's not relevant: we use it as a non-builtin, allocated
+         // type.
+         *ret = cling::Value(QT, fInterp);
+         exec(address, ret->getPtr());
+         return;
+      }
+      // We are a function member pointer.
+      *ret = cling::Value(QT, fInterp);
+      exec(address, &ret->getPtr());
+      return;
+   }
+   else if (QT->isPointerType() || QT->isArrayType()) {
+      // Note: ArrayType is an illegal function return value type.
+      *ret = cling::Value(QT, 0);
+      exec(address, &ret->getPtr());
+      return;
+   }
+   else if (QT->isRecordType()) {
+      *ret = cling::Value(QT, fInterp);
+      exec(address, ret->getPtr());
+      return;
+   }
+   else if (const EnumType* ET = dyn_cast<EnumType>(&*QT)) {
+      // Note: We may need to worry about the underlying type
+      //       of the enum here.
+      (void) ET;
+      *ret = cling::Value(QT, 0);
+      execWithLL<int>(address, QT, ret);
+      return;
+   }
+   else if (const BuiltinType* BT = dyn_cast<BuiltinType>(&*QT)) {
+      *ret = cling::Value(QT, 0);
+      switch (BT->getKind()) {
+         case BuiltinType::Void:
+            exec(address, 0);
+            break;
 
-    if (const CXXConstructorDecl* CD = llvm::dyn_cast<CXXConstructorDecl>(fdecl)) {
-        const TypeDecl* TD = llvm::dyn_cast<TypeDecl>(CD->getDeclContext());
-        QualType ClassTy(TD->getTypeForDecl(), 0);
-        QualType QT = Context.getLValueReferenceType(ClassTy);
-        llvm::GenericValue gv;
-        exec(address, &gv.PointerVal, fdecl);
-        *ret = cling::StoredValueRef::bitwiseCopy(
-            *gCppyy_Cling, cling::Value(gv, QT));
-        return;
-    }
-    QualType QT = fdecl->getResultType().getCanonicalType();
-    if (QT->isReferenceType()) {
-        llvm::GenericValue gv;
-        exec(address, &gv.PointerVal, fdecl);
-        *ret = cling::StoredValueRef::bitwiseCopy(
-            *gCppyy_Cling, cling::Value(gv, QT));
-        return;
-    }
-    else if (QT->isMemberPointerType()) {
-        const MemberPointerType* MPT =
-            QT->getAs<MemberPointerType>();
-        if (MPT->isMemberDataPointer()) {
-            // A member data pointer is a actually a struct with one
-            // member of ptrdiff_t, the offset from the base of the object
-            // storage to the storage for the designated data member.
-            llvm::GenericValue gv;
-            exec(address, &gv.PointerVal, fdecl);
-            *ret = cling::StoredValueRef::bitwiseCopy(
-                *gCppyy_Cling, cling::Value(gv, QT));
-            return;
-        }
-        // We are a function member pointer.
-        llvm::GenericValue gv;
-        exec(address, &gv.PointerVal, fdecl);
-        *ret = cling::StoredValueRef::bitwiseCopy(
-            *gCppyy_Cling, cling::Value(gv, QT));
-        return;
-    }
-    else if (QT->isPointerType() || QT->isArrayType()) {
-        // Note: ArrayType is an illegal function return value type.
-        llvm::GenericValue gv;
-        exec(address, &gv.PointerVal, fdecl);
-        *ret = cling::StoredValueRef::bitwiseCopy(
-            *gCppyy_Cling, cling::Value(gv, QT));
-        return;
-    }
-    else if (QT->isRecordType()) {
-        uint64_t size = Context.getTypeSizeInChars(QT).getQuantity();
-        void* p = ::operator new(size);
-        exec(address, p, fdecl);
-        *ret = cling::StoredValueRef::bitwiseCopy(
-            *gCppyy_Cling, cling::Value(llvm::PTOGV(p), QT));
-        return;
-    }
-    else if (const EnumType* ET = llvm::dyn_cast<EnumType>(&*QT)) {
-        // Note: We may need to worry about the underlying type
-        //       of the enum here.
-        (void) ET;
-        uint64_t numBits = Context.getTypeSize(QT);
-        int retVal = 0;
-        exec(address, &retVal, fdecl);
-        llvm::GenericValue gv;
-        gv.IntVal = llvm::APInt(numBits, (uint64_t)retVal, true /*isSigned*/);
-        *ret =  cling::StoredValueRef::bitwiseCopy(
-            *gCppyy_Cling, cling::Value(gv, QT));
-        return;
-    }
-    else if (const BuiltinType* BT = llvm::dyn_cast<BuiltinType>(&*QT)) {
-        llvm::GenericValue gv;
+            //
+            //  Unsigned Types
+            //
+         case BuiltinType::Bool:
+            execWithULL<bool>(address, QT, ret);
+            break;
+         case BuiltinType::Char_U: // char on targets where it is unsigned
+         case BuiltinType::UChar:
+            execWithULL<char>(address, QT, ret);
+            break;
+         case BuiltinType::WChar_U:
+            // wchar_t on targets where it is unsigned.
+            // The standard doesn't allow to specify signednedd of wchar_t
+            // thus this maps simply to wchar_t.
+            execWithULL<wchar_t>(address, QT, ret);
+            break;
+         case BuiltinType::Char16:
+            print_error("exec_with_valref_return", "invalid type: char16_t");
+            break;
+         case BuiltinType::Char32:
+            print_error("exec_with_valref_return", "invalid type char32_t");
+            break;
+         case BuiltinType::UShort:
+            execWithULL<unsigned short>(address, QT, ret);
+            break;
+         case BuiltinType::UInt:
+            execWithULL<unsigned int>(address, QT, ret);
+            break;
+         case BuiltinType::ULong:
+            execWithULL<unsigned long>(address, QT, ret);
+            break;
+         case BuiltinType::ULongLong:
+            execWithULL<unsigned long long>(address, QT, ret);
+            break;
+         case BuiltinType::UInt128:
+            print_error("exec_with_valref_return", "invalid type __uint128_t");
+            break;
 
-        uint64_t numBits = Context.getTypeSize(QT);
-        switch (BT->getKind()) {
-        //
-        //  builtin types
-        //
-        case BuiltinType::Void: {
-            exec(address, 0, fdecl);
-            return;
-        }
-        //
-        //  unsigned integral types
-        //
-        case BuiltinType::Bool: {
-            bool retVal = false;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t)retVal, false /*isSigned*/);
+            //
+            //  Signed Types
+            //
+         case BuiltinType::Char_S: // char on targets where it is signed
+         case BuiltinType::SChar:
+            execWithLL<signed char>(address, QT, ret);
             break;
-        }
-        case BuiltinType::Char_U: {
-            // char on targets where it is unsigned
-            char retVal = '\0';
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        case BuiltinType::UChar: {
-            unsigned char retVal = '\0';
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        case BuiltinType::WChar_U: {
-            // wchar_t on targets where it is unsigned.
-            // The standard doesn't allow to specify signedness of wchar_t
-            // thus this maps simply to wchar_t.
-            wchar_t retVal = L'\0';
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        case BuiltinType::UShort: {
-            unsigned short retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        case BuiltinType::UInt: {
-            unsigned int retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        case BuiltinType::ULong: {
-            // unsigned long
-            unsigned long retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        case BuiltinType::ULongLong: {
-            // unsigned long long
-            unsigned long long retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, false /*isSigned*/);
-            break;
-        }
-        //
-        //  signed integral types
-        //
-        case BuiltinType::Char_S: {
-            // char on targets where it is signed
-            char retVal = '\0';
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
-            break;
-        }
-        case BuiltinType::SChar: {
-            // signed char
-            signed char retVal = '\0';
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
-            break;
-        }
-        case BuiltinType::WChar_S: {
+         case BuiltinType::WChar_S:
             // wchar_t on targets where it is signed.
             // The standard doesn't allow to specify signednedd of wchar_t
             // thus this maps simply to wchar_t.
-            wchar_t retVal = L'\0';
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
+            execWithLL<wchar_t>(address, QT, ret);
             break;
-        }
-        case BuiltinType::Short: {
-            // short
-            short retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
+         case BuiltinType::Short:
+            execWithLL<short>(address, QT, ret);
             break;
-        }
-        case BuiltinType::Int: {
-            // int
-            int retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
+         case BuiltinType::Int:
+            execWithLL<int>(address, QT, ret);
             break;
-        }
-        case BuiltinType::Long: {
-            long retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
+         case BuiltinType::Long:
+            execWithLL<long>(address, QT, ret);
             break;
-        }
-        case BuiltinType::LongLong: {
-            long long retVal = 0;
-            exec(address, &retVal, fdecl);
-            gv.IntVal = llvm::APInt(numBits, (uint64_t) retVal, true /*isSigned*/);
+        case BuiltinType::LongLong:
+            execWithLL<long long>(address, QT, ret);
             break;
-        }
-        case BuiltinType::Float: {
-            exec(address, &gv.FloatVal, fdecl);
+         case BuiltinType::Int128:
+            print_error("exec_with_valref_return", "invalid type __int128_t");
             break;
-        }
-        case BuiltinType::Double: {
-            exec(address, &gv.DoubleVal, fdecl);
+         case BuiltinType::Half:
+            // half in OpenCL, __fp16 in ARM NEON
+            print_error("exec_with_valref_return", "invalid type Half");
             break;
-        }
-        case BuiltinType::Char16:
-        case BuiltinType::Char32:
-        case BuiltinType::Half:
-        case BuiltinType::Int128:
-        case BuiltinType::UInt128:
-        case BuiltinType::LongDouble: 
-        case BuiltinType::NullPtr:
-        default: {
-            print_error("exec_with_valref", "unsupported return type");
-            return;
-        }
-        }
-
-        *ret = cling::StoredValueRef::bitwiseCopy(*gCppyy_Cling, cling::Value(gv, QT));
-        return;
-    }
-
-    std::cout << "exec_with_valref: some error occurred ... " << std::endl;
+         case BuiltinType::Float:
+            exec(address, &ret->getFloat());
+            break;
+         case BuiltinType::Double:
+            exec(address, &ret->getDouble());
+            break;
+         case BuiltinType::LongDouble:
+            exec(address, &ret->getLongDouble());
+            break;
+            //
+            //  Language-Specific Types
+            //
+         case BuiltinType::NullPtr:
+            // C++11 nullptr
+            print_error("exec_with_valref_return", "invalid type nullptr");
+            break;
+         default:
+            break;
+      }
+      return;
+   }
+   print_error("exec_with_valref_return", "unrecognized return type");
+   QT->dump();
 }
 
 


More information about the pypy-commit mailing list