[pypy-commit] pypy reflex-support: fragile tests now work with CINT backend

wlav noreply at buildbot.pypy.org
Wed Aug 31 23:10:38 CEST 2011


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r46963:2b8e6b34a9d3
Date: 2011-08-31 14:11 -0700
http://bitbucket.org/pypy/pypy/changeset/2b8e6b34a9d3/

Log:	fragile tests now work with CINT backend

diff --git a/pypy/module/cppyy/capi/cint_capi.py b/pypy/module/cppyy/capi/cint_capi.py
--- a/pypy/module/cppyy/capi/cint_capi.py
+++ b/pypy/module/cppyy/capi/cint_capi.py
@@ -2,7 +2,7 @@
 
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
 from pypy.rpython.lltypesystem import rffi
-from pypy.rlib import rdynload
+from pypy.rlib import libffi, rdynload
 
 __all__ = ['eci', 'c_load_dictionary']
 
@@ -34,7 +34,14 @@
     use_cpp_linker=True,
 )
 
-c_load_dictionary = rffi.llexternal(
+_c_load_dictionary = rffi.llexternal(
     "cppyy_load_dictionary",
     [rffi.CCHARP], rdynload.DLLHANDLE,
     compilation_info=eci)
+
+def c_load_dictionary(name):
+    result = _c_load_dictionary(name)
+    if not result:
+        err = rdynload.dlerror()
+        raise rdynload.DLOpenError(err)
+    return libffi.CDLL(name)       # should return handle to already open file
diff --git a/pypy/module/cppyy/src/cintcwrapper.cxx b/pypy/module/cppyy/src/cintcwrapper.cxx
--- a/pypy/module/cppyy/src/cintcwrapper.cxx
+++ b/pypy/module/cppyy/src/cintcwrapper.cxx
@@ -27,7 +27,8 @@
 
 /*  CINT internals (won't work on Windwos) ------------------------------- */
 extern long G__store_struct_offset;
-extern "C" void* G__GetShlHandle();
+extern "C" void* G__SetShlHandle(char*);
+
 
 /* data for life time management ------------------------------------------ */
 typedef std::vector<TClassRef> ClassRefs_t;
@@ -103,6 +104,9 @@
     if (!cr.GetClass())
         return (cppyy_typehandle_t)NULL;
 
+    if (!cr->GetClassInfo())
+        return (cppyy_typehandle_t)NULL;
+
     if (!G__TypeInfo(class_name).IsValid())
         return (cppyy_typehandle_t)NULL;
 
@@ -463,7 +467,7 @@
 }
 
 void* cppyy_load_dictionary(const char* lib_name) {
-    if (gSystem->Load(lib_name))
-       return (void*)G__GetShlHandle();
-    return (void*)0;
+   if (0 <= gSystem->Load(lib_name))
+      return (void*)1;
+   return (void*)0;
 }
diff --git a/pypy/module/cppyy/test/Makefile b/pypy/module/cppyy/test/Makefile
--- a/pypy/module/cppyy/test/Makefile
+++ b/pypy/module/cppyy/test/Makefile
@@ -41,6 +41,12 @@
 #
 # rootcint -f advancedcpp_cint.cxx -c advancedcpp.h advancedcpp_LinkDef.h
 # g++ -I$ROOTSYS/include advancedcpp_cint.cxx advancedcpp.cxx -shared -o advancedcppDict.so -rdynamic
+#
+# rootcint -f fragile_cint.cxx -c fragile.h fragile_LinkDef.h
+# g++ -I$ROOTSYS/include fragile_cint.cxx fragile.cxx -shared -o fragileDict.so -rdynamic
+#
+# rootcint -f stltypes_cint.cxx -c stltypes.h stltypes_LinkDef.h
+# g++ -I$ROOTSYS/include stltypes_cint.cxx stltypes.cxx -shared -o stltypesDict.so -rdynamic
 
 # TODO: methptrgetter causes these tests to crash, so don't use it for now
 stltypesDict.so: stltypes.cxx stltypes.h stltypes.xml
diff --git a/pypy/module/cppyy/test/fragile_LinkDef.h b/pypy/module/cppyy/test/fragile_LinkDef.h
new file mode 100644
--- /dev/null
+++ b/pypy/module/cppyy/test/fragile_LinkDef.h
@@ -0,0 +1,16 @@
+#ifdef __CINT__
+
+#pragma link off all globals;
+#pragma link off all classes;
+#pragma link off all functions;
+
+#pragma link C++ namespace fragile;
+
+#pragma link C++ class fragile::A;
+#pragma link C++ class fragile::B;
+#pragma link C++ class fragile::C;
+#pragma link C++ class fragile::D;
+#pragma link C++ class fragile::E;
+#pragma link C++ class fragile::F;
+
+#endif


More information about the pypy-commit mailing list