Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r55487:cf60751f1e6a Date: 2012-06-07 11:32 -0700 http://bitbucket.org/pypy/pypy/changeset/cf60751f1e6a/
Log: add automatic class loader based on .rootmap files; and its test diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -25,6 +25,7 @@ ^pypy/module/cppyy/src/.+\.errors$ ^pypy/module/cppyy/test/.+_rflx\.cpp$ ^pypy/module/cppyy/test/.+\.so$ +^pypy/module/cppyy/test/.+\.rootmap$ ^pypy/module/cppyy/test/.+\.exe$ ^pypy/module/cppyy/test/.+_cint.h$ ^pypy/doc/.+\.html$ diff --git a/pypy/module/cppyy/src/reflexcwrapper.cxx b/pypy/module/cppyy/src/reflexcwrapper.cxx --- a/pypy/module/cppyy/src/reflexcwrapper.cxx +++ b/pypy/module/cppyy/src/reflexcwrapper.cxx @@ -10,6 +10,10 @@ #include "Reflex/PropertyList.h" #include "Reflex/TypeTemplate.h" +#define private public +#include "Reflex/PluginService.h" +#undef private + #include <string> #include <sstream> #include <utility> @@ -61,6 +65,8 @@ cppyy_scope_t cppyy_get_scope(const char* scope_name) { Reflex::Scope s = Reflex::Scope::ByName(scope_name); + if (!s) Reflex::PluginService::Instance().LoadFactoryLib(scope_name); + s = Reflex::Scope::ByName(scope_name); if (s.IsEnum()) // pretend to be builtin by returning 0 return (cppyy_type_t)0; return (cppyy_type_t)s.Id(); 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 @@ -35,7 +35,7 @@ g++ -o $@ $^ -shared -lReflex $(cppflags) $(cppflags2) %_rflx.cpp: %.h %.xml - $(genreflex) $< $(genreflexflags) --selection=$*.xml + $(genreflex) $< $(genreflexflags) --selection=$*.xml --rootmap=$*Dict.rootmap --rootmap-lib=$*Dict.so else %Dict.so: %_cint.cxx %.cxx g++ -o $@ $^ -shared $(cppflags) $(cppflags2) @@ -53,4 +53,4 @@ .PHONY: clean clean: - -rm -f $(dicts) + -rm -f $(dicts) $(subst .so,.rootmap,$(dicts)) diff --git a/pypy/module/cppyy/test/test_aclassloader.py b/pypy/module/cppyy/test/test_aclassloader.py new file mode 100644 --- /dev/null +++ b/pypy/module/cppyy/test/test_aclassloader.py @@ -0,0 +1,26 @@ +import py, os, sys +from pypy.conftest import gettestobjspace + + +currpath = py.path.local(__file__).dirpath() + +def setup_module(mod): + if sys.platform == 'win32': + py.test.skip("win32 not supported so far") + err = os.system("cd '%s' && make example01Dict.so" % currpath) + if err: + raise OSError("'make' failed (see stderr)") + + +class AppTestACLASSLOADER: + def setup_class(cls): + cls.space = gettestobjspace(usemodules=['cppyy']) + + def test01_class_autoloading(self): + """Test whether a class can be found through .rootmap.""" + import cppyy + example01_class = cppyy.gbl.example01 + assert example01_class + cl2 = cppyy.gbl.example01 + assert cl2 + assert example01_class is cl2 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit