[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