[pypy-commit] pypy reflex-support: better typedef resolution (for CINT backend)
wlav
noreply at buildbot.pypy.org
Thu Jun 28 01:14:00 CEST 2012
Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: reflex-support
Changeset: r55869:727af670799e
Date: 2012-06-27 16:07 -0700
http://bitbucket.org/pypy/pypy/changeset/727af670799e/
Log: better typedef resolution (for CINT backend)
diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py
--- a/pypy/module/cppyy/converter.py
+++ b/pypy/module/cppyy/converter.py
@@ -741,7 +741,7 @@
# 2) match of decorated, unqualified type
compound = helper.compound(name)
- clean_name = helper.clean_type(name)
+ clean_name = capi.c_resolve_name(helper.clean_type(name))
try:
# array_index may be negative to indicate no size or no size found
array_size = helper.array_size(name)
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
@@ -209,15 +209,29 @@
/* name to opaque C++ scope representation -------------------------------- */
char* cppyy_resolve_name(const char* cppitem_name) {
- if (strcmp(cppitem_name, "") == 0)
+ std::string tname = cppitem_name;
+
+ // global namespace?
+ if (tname.empty())
return cppstring_to_cstring(cppitem_name);
- G__TypeInfo ti(cppitem_name);
- if (ti.IsValid()) {
- if (ti.Property() & G__BIT_ISENUM)
- return cppstring_to_cstring("unsigned int");
- return cppstring_to_cstring(ti.TrueName());
- }
- return cppstring_to_cstring(cppitem_name);
+
+ // special care needed for builtin arrays
+ std::string::size_type pos = tname.rfind("[");
+ G__TypeInfo ti(tname.substr(0, pos).c_str());
+
+ // if invalid (most likely unknown), simply return old name
+ if (!ti.IsValid())
+ return cppstring_to_cstring(cppitem_name);
+
+ // special case treatment of enum types as unsigned int (CINTism)
+ if (ti.Property() & G__BIT_ISENUM)
+ return cppstring_to_cstring("unsigned int");
+
+ // actual typedef resolution; add back array declartion portion, if needed
+ std::string rt = ti.TrueName();
+ if (pos != std::string::npos)
+ rt += tname.substr(pos, std::string::npos);
+ return cppstring_to_cstring(rt);
}
cppyy_scope_t cppyy_get_scope(const char* scope_name) {
More information about the pypy-commit
mailing list