[pypy-commit] pypy reflex-support: CINT backend robustness

wlav noreply at buildbot.pypy.org
Thu Mar 8 01:44:39 CET 2012


Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r53264:df4c236903ce
Date: 2012-03-06 00:12 -0800
http://bitbucket.org/pypy/pypy/changeset/df4c236903ce/

Log:	CINT backend robustness

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
@@ -31,6 +31,25 @@
 with rffi.scoped_str2charp('libMathCore.so') as ll_libname:
     _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
 
+with rffi.scoped_str2charp('libRIO.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libHist.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libGraf.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libGraf3d.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libGpad.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libTree.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libMatrix.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libNet.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+with rffi.scoped_str2charp('libThread.so') as ll_libname:
+    _coredll = rdynload.dlopen(ll_libname, rdynload.RTLD_GLOBAL | rdynload.RTLD_NOW)
+
 eci = ExternalCompilationInfo(
     separate_module_files=[srcpath.join("cintcwrapper.cxx")],
     include_dirs=[incpath] + rootincpath,
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
@@ -58,10 +58,10 @@
 };
 static ClassRefsInit _classrefs_init;
 
-typedef std::vector<TFunction*> GlobalFuncs_t;
+typedef std::vector<TFunction> GlobalFuncs_t;
 static GlobalFuncs_t g_globalfuncs;
 
-typedef std::vector<TGlobal*> GlobalVars_t;
+typedef std::vector<TGlobal> GlobalVars_t;
 static GlobalVars_t g_globalvars;
 
 
@@ -134,7 +134,7 @@
     TClassRef cr = type_from_handle(handle);
     if (cr.GetClass())
         return (TFunction*)cr->GetListOfMethods()->At(method_index);
-    return g_globalfuncs[method_index];
+    return &g_globalfuncs[method_index];
 }
 
 
@@ -421,17 +421,23 @@
         return cr->GetListOfMethods()->GetSize();
     else if (strcmp(cr.GetClassName(), "") == 0) {
     // NOTE: the updated list of global funcs grows with 5 "G__ateval"'s just
-    // because it is being updated => infinite loop :(
+    // because it is being updated => infinite loop! Apply offset to correct ...
+        static int ateval_offset = 0;
         TCollection* funcs = gROOT->GetListOfGlobalFunctions(kTRUE);
-	if (g_globalfuncs.size() != (GlobalFuncs_t::size_type)funcs->GetSize()) {
+        ateval_offset += 5;
+	if (g_globalfuncs.size() <= (GlobalFuncs_t::size_type)funcs->GetSize() - ateval_offset) {
             g_globalfuncs.clear();
 	    g_globalfuncs.reserve(funcs->GetSize());
 
             TIter ifunc(funcs);
 
             TFunction* func = 0;
-            while ((func = (TFunction*)ifunc.Next()))
-                g_globalfuncs.push_back(func);
+            while ((func = (TFunction*)ifunc.Next())) {
+                if (strcmp(func->GetName(), "G__ateval") == 0)
+                    ateval_offset += 1;
+                else
+                    g_globalfuncs.push_back(*func);
+            }
         }
 	return (int)g_globalfuncs.size();
     }
@@ -504,7 +510,8 @@
 
             TGlobal* var = 0;
             while ((var = (TGlobal*)ivar.Next()))
-                g_globalvars.push_back(var);
+                g_globalvars.push_back(*var);
+
         }
 	return (int)g_globalvars.size();
     }
@@ -517,8 +524,8 @@
         TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At(data_member_index);
         return cppstring_to_cstring(m->GetName());
     }
-    TGlobal* gbl = g_globalvars[data_member_index];
-    return cppstring_to_cstring(gbl->GetName());
+    TGlobal& gbl = g_globalvars[data_member_index];
+    return cppstring_to_cstring(gbl.GetName());
 }
 
 char* cppyy_data_member_type(cppyy_scope_t handle, int data_member_index) {
@@ -535,8 +542,8 @@
         }
         return cppstring_to_cstring(fullType);
     }
-    TGlobal* gbl = g_globalvars[data_member_index];
-    return cppstring_to_cstring(gbl->GetFullTypeName());
+    TGlobal& gbl = g_globalvars[data_member_index];
+    return cppstring_to_cstring(gbl.GetFullTypeName());
 }
 
 size_t cppyy_data_member_offset(cppyy_scope_t handle, int data_member_index) {
@@ -545,8 +552,8 @@
         TDataMember* m = (TDataMember*)cr->GetListOfDataMembers()->At(data_member_index);
         return (size_t)m->GetOffsetCint();
     }
-    TGlobal* gbl = g_globalvars[data_member_index];
-    return (size_t)gbl->GetAddress();
+    TGlobal& gbl = g_globalvars[data_member_index];
+    return (size_t)gbl.GetAddress();
 }
 
 


More information about the pypy-commit mailing list