From d7f4093bd165f078e823d7e0dae7e2ccad9d88cf Mon Sep 17 00:00:00 2001 From: nobody Date: Mon, 4 Aug 2003 17:55:29 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'Version_1_30_1'. [SVN r19444] --- ...orting_all_declarations_from_a_header.html | 76 -- pyste/example/README | 5 - pyste/example/basic.h | 25 - pyste/example/basic.pyste | 2 - pyste/example/enums.h | 19 - pyste/example/enums.pyste | 8 - pyste/example/header_test.h | 26 - pyste/example/header_test.pyste | 1 - pyste/example/nested.h | 24 - pyste/example/nested.pyste | 1 - pyste/example/operators.h | 43 - pyste/example/operators.pyste | 1 - pyste/example/templates.h | 10 - pyste/example/templates.pyste | 9 - pyste/example/unions.h | 16 - pyste/example/unions.pyste | 2 - pyste/example/virtual.h | 23 - pyste/example/virtual.pyste | 1 - pyste/example/wrappertest.h | 39 - pyste/example/wrappertest.pyste | 15 - pyste/example/wrappertest_wrappers.h | 26 - pyste/src/.cvsignore | 1 - pyste/src/ClassExporter.py | 742 ------------------ pyste/src/CodeUnit.py | 78 -- pyste/src/CppParser.py | 94 --- pyste/src/EnumExporter.py | 30 - pyste/src/Exporter.py | 69 -- pyste/src/FunctionExporter.py | 85 -- pyste/src/GCCXMLParser.py | 403 ---------- pyste/src/HeaderExporter.py | 67 -- pyste/src/IncludeExporter.py | 19 - pyste/src/declarations.py | 464 ----------- pyste/src/enumerate.py | 7 - pyste/src/exporters.py | 3 - pyste/src/exporterutils.py | 26 - pyste/src/infos.py | 187 ----- pyste/src/policies.py | 75 -- pyste/src/pyste-profile.py | 17 - pyste/src/pyste.py | 154 ---- pyste/src/settings.py | 12 - pyste/tests/build_pyste_nt.bat | 19 - pyste/tests/example_basicUT.py | 27 - pyste/tests/example_enumsUT.py | 18 - pyste/tests/example_header_testUT.py | 15 - pyste/tests/example_nested.py | 15 - pyste/tests/example_operatorsUT.py | 25 - pyste/tests/example_templatesUT.py | 26 - pyste/tests/example_virtual.py | 31 - pyste/tests/example_wrappertestUT.py | 11 - pyste/tests/test_all.bat | 20 - 50 files changed, 3112 deletions(-) delete mode 100644 pyste/doc/exporting_all_declarations_from_a_header.html delete mode 100644 pyste/example/README delete mode 100644 pyste/example/basic.h delete mode 100644 pyste/example/basic.pyste delete mode 100644 pyste/example/enums.h delete mode 100644 pyste/example/enums.pyste delete mode 100644 pyste/example/header_test.h delete mode 100644 pyste/example/header_test.pyste delete mode 100644 pyste/example/nested.h delete mode 100644 pyste/example/nested.pyste delete mode 100644 pyste/example/operators.h delete mode 100644 pyste/example/operators.pyste delete mode 100644 pyste/example/templates.h delete mode 100644 pyste/example/templates.pyste delete mode 100644 pyste/example/unions.h delete mode 100644 pyste/example/unions.pyste delete mode 100644 pyste/example/virtual.h delete mode 100644 pyste/example/virtual.pyste delete mode 100644 pyste/example/wrappertest.h delete mode 100644 pyste/example/wrappertest.pyste delete mode 100644 pyste/example/wrappertest_wrappers.h delete mode 100644 pyste/src/.cvsignore delete mode 100644 pyste/src/ClassExporter.py delete mode 100644 pyste/src/CodeUnit.py delete mode 100644 pyste/src/CppParser.py delete mode 100644 pyste/src/EnumExporter.py delete mode 100644 pyste/src/Exporter.py delete mode 100644 pyste/src/FunctionExporter.py delete mode 100644 pyste/src/GCCXMLParser.py delete mode 100644 pyste/src/HeaderExporter.py delete mode 100644 pyste/src/IncludeExporter.py delete mode 100644 pyste/src/declarations.py delete mode 100644 pyste/src/enumerate.py delete mode 100644 pyste/src/exporters.py delete mode 100644 pyste/src/exporterutils.py delete mode 100644 pyste/src/infos.py delete mode 100644 pyste/src/policies.py delete mode 100644 pyste/src/pyste-profile.py delete mode 100644 pyste/src/pyste.py delete mode 100644 pyste/src/settings.py delete mode 100644 pyste/tests/build_pyste_nt.bat delete mode 100644 pyste/tests/example_basicUT.py delete mode 100644 pyste/tests/example_enumsUT.py delete mode 100644 pyste/tests/example_header_testUT.py delete mode 100644 pyste/tests/example_nested.py delete mode 100644 pyste/tests/example_operatorsUT.py delete mode 100644 pyste/tests/example_templatesUT.py delete mode 100644 pyste/tests/example_virtual.py delete mode 100644 pyste/tests/example_wrappertestUT.py delete mode 100644 pyste/tests/test_all.bat diff --git a/pyste/doc/exporting_all_declarations_from_a_header.html b/pyste/doc/exporting_all_declarations_from_a_header.html deleted file mode 100644 index 4f2418f5..00000000 --- a/pyste/doc/exporting_all_declarations_from_a_header.html +++ /dev/null @@ -1,76 +0,0 @@ - - - -Exporting All Declarations from a Header - - - - - - - - - -
- - Exporting All Declarations from a Header -
-
- - - - - - -
-

-Pyste also supports a mechanism to export all declarations found in a header -file. Suppose again our file, hello.h:

-
-    struct World
-    {
-        World(std::string msg): msg(msg) {} 
-        void set(std::string msg) { this->msg = msg; }
-        std::string greet() { return msg; }
-        std::string msg;
-    };
-
-    enum choice { red, blue };
-    
-    void show(choice c) { std::cout << "value: " << (int)c << std::endl; } 
-
-

-You can just use the AllFromHeader construct:

-
-    hello = AllFromHeader("hello.h")
-
-

-this will export all the declarations found in hello.h, which is equivalent -to write:

-
-    Class("World", "hello.h")
-    Enum("choice", "hello.h")
-    Function("show", "hello.h")
-
-

-Note that you can still use the functions rename, set_policy, exclude, etc. Just access -the members of the header object like this:

-
-    rename(hello.World.greet, "Greet")
-    exclude(hello.World.set, "Set")
-
- - - - - - -
-
-
- - diff --git a/pyste/example/README b/pyste/example/README deleted file mode 100644 index 868345b0..00000000 --- a/pyste/example/README +++ /dev/null @@ -1,5 +0,0 @@ -To use this examples, just execute the command-line: - -pyste --module= .pyste - -For more information, please refer to the documentation. diff --git a/pyste/example/basic.h b/pyste/example/basic.h deleted file mode 100644 index a618c192..00000000 --- a/pyste/example/basic.h +++ /dev/null @@ -1,25 +0,0 @@ -namespace basic { - -struct C -{ - virtual int f(int x = 10) - { - return x*2; - } - - int foo(int x=1){ - return x+1; - } -}; - -int call_f(C& c) -{ - return c.f(); -} - -int call_f(C& c, int x) -{ - return c.f(x); -} - -} diff --git a/pyste/example/basic.pyste b/pyste/example/basic.pyste deleted file mode 100644 index 90978d19..00000000 --- a/pyste/example/basic.pyste +++ /dev/null @@ -1,2 +0,0 @@ -Class('basic::C', 'basic.h') -Function('basic::call_f', 'basic.h') diff --git a/pyste/example/enums.h b/pyste/example/enums.h deleted file mode 100644 index 398b66c0..00000000 --- a/pyste/example/enums.h +++ /dev/null @@ -1,19 +0,0 @@ -namespace enums { - -enum color { red, blue }; - -struct X -{ - enum choices - { - good = 1, - bad = 2 - }; - - int set(choices c) - { - return (int)c; - } -}; - -} diff --git a/pyste/example/enums.pyste b/pyste/example/enums.pyste deleted file mode 100644 index a6cc740a..00000000 --- a/pyste/example/enums.pyste +++ /dev/null @@ -1,8 +0,0 @@ -color = Enum('enums::color', 'enums.h') -rename(color.red, 'Red') -rename(color.blue, 'Blue') -X = Class('enums::X', 'enums.h') -rename(X.choices.bad, 'Bad') -rename(X.choices.good, 'Good') -rename(X.choices, 'Choices') - diff --git a/pyste/example/header_test.h b/pyste/example/header_test.h deleted file mode 100644 index 85cb5ee0..00000000 --- a/pyste/example/header_test.h +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include - -namespace header_test { - -enum choice { red, blue }; - -std::string choice_str(choice c) -{ - std::map choice_map; - choice_map[red] = "red"; - choice_map[blue] = "blue"; - return choice_map[c]; -} - -struct C -{ - choice c; - - std::string get() - { - return choice_str(c); - } -}; - -} diff --git a/pyste/example/header_test.pyste b/pyste/example/header_test.pyste deleted file mode 100644 index b0e752ff..00000000 --- a/pyste/example/header_test.pyste +++ /dev/null @@ -1 +0,0 @@ -AllFromHeader('header_test.h') diff --git a/pyste/example/nested.h b/pyste/example/nested.h deleted file mode 100644 index c4025dd3..00000000 --- a/pyste/example/nested.h +++ /dev/null @@ -1,24 +0,0 @@ -namespace nested { - -struct X -{ - struct Y - { - int valueY; - static int staticYValue; - struct Z - { - int valueZ; - }; - }; - - static int staticXValue; - int valueX; -}; - -int X::staticXValue = 10; -int X::Y::staticYValue = 20; - -typedef X Root; - -} diff --git a/pyste/example/nested.pyste b/pyste/example/nested.pyste deleted file mode 100644 index 48bb26b5..00000000 --- a/pyste/example/nested.pyste +++ /dev/null @@ -1 +0,0 @@ -Class('nested::Root', 'nested.h') diff --git a/pyste/example/operators.h b/pyste/example/operators.h deleted file mode 100644 index 286401a0..00000000 --- a/pyste/example/operators.h +++ /dev/null @@ -1,43 +0,0 @@ -#include - -namespace operators { - -struct C -{ - static double x; - double value; - - const C operator+(const C other) const - { - C c; - c.value = value + other.value; - return c; - } - operator int() const - { - return value; - } - - double operator()() - { - return C::x; - } - - double operator()(double other) - { - return C::x + other; - } - - -}; - -double C::x = 10; - -const C operator*(const C& lhs, const C& rhs) -{ - C c; - c.value = lhs.value * rhs.value; - return c; -} - -} diff --git a/pyste/example/operators.pyste b/pyste/example/operators.pyste deleted file mode 100644 index ed0f5083..00000000 --- a/pyste/example/operators.pyste +++ /dev/null @@ -1 +0,0 @@ -Class('operators::C', 'operators.h') diff --git a/pyste/example/templates.h b/pyste/example/templates.h deleted file mode 100644 index 6c68fb43..00000000 --- a/pyste/example/templates.h +++ /dev/null @@ -1,10 +0,0 @@ -namespace templates { - -template -struct Point -{ - X x; - Y y; -}; - -} diff --git a/pyste/example/templates.pyste b/pyste/example/templates.pyste deleted file mode 100644 index ed22c714..00000000 --- a/pyste/example/templates.pyste +++ /dev/null @@ -1,9 +0,0 @@ -Point = Template('templates::Point', 'templates.h') -rename(Point.x, 'i') -rename(Point.y, 'j') -IPoint = Point('int double') -FPoint = Point('double int', 'FPoint') -rename(IPoint, 'IPoint') -rename(IPoint.x, 'x') -rename(IPoint.y, 'y') - diff --git a/pyste/example/unions.h b/pyste/example/unions.h deleted file mode 100644 index 06287dec..00000000 --- a/pyste/example/unions.h +++ /dev/null @@ -1,16 +0,0 @@ -namespace unions { - -class UnionTest -{ -public: - union // unions are not supported for now - { - int i; - short s1; - short s2; - } mBad; - - int mGood; -}; - -} diff --git a/pyste/example/unions.pyste b/pyste/example/unions.pyste deleted file mode 100644 index 726ab6a2..00000000 --- a/pyste/example/unions.pyste +++ /dev/null @@ -1,2 +0,0 @@ -UnionTest = Class('unions::UnionTest', 'unions.h') -exclude(UnionTest.mBad) diff --git a/pyste/example/virtual.h b/pyste/example/virtual.h deleted file mode 100644 index e31183b4..00000000 --- a/pyste/example/virtual.h +++ /dev/null @@ -1,23 +0,0 @@ - -struct C -{ -public: - virtual int f() - { - return f_abs(); - } - - const char* get_name() - { - return name(); - } - -protected: - virtual int f_abs() = 0; - -private: - virtual const char* name() { return "C"; } -}; - -int call_f(C& c) { return c.f(); } - diff --git a/pyste/example/virtual.pyste b/pyste/example/virtual.pyste deleted file mode 100644 index cd9b8669..00000000 --- a/pyste/example/virtual.pyste +++ /dev/null @@ -1 +0,0 @@ -Class('C', 'virtual.h') diff --git a/pyste/example/wrappertest.h b/pyste/example/wrappertest.h deleted file mode 100644 index c5ef4f56..00000000 --- a/pyste/example/wrappertest.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef WRAPPER_TEST -#define WRAPPER_TEST - - -#include - -namespace wrappertest { - -std::vector Range(int count) -{ - std::vector v; - v.reserve(count); - for (int i = 0; i < count; ++i){ - v.push_back(i); - } - return v; -} - - -struct C -{ - C() {} - - std::vector Mul(int value) - { - std::vector res; - res.reserve(value); - std::vector::const_iterator it; - std::vector v(Range(value)); - for (it = v.begin(); it != v.end(); ++it){ - res.push_back(*it * value); - } - return res; - } -}; - -} -#endif - diff --git a/pyste/example/wrappertest.pyste b/pyste/example/wrappertest.pyste deleted file mode 100644 index fd210c7e..00000000 --- a/pyste/example/wrappertest.pyste +++ /dev/null @@ -1,15 +0,0 @@ -Include('wrappertest_wrappers.h') - -f = Function('wrappertest::Range', 'wrappertest.h') -set_wrapper(f, 'RangeWrapper') - -mul = Wrapper('MulWrapper', -''' -list MulWrapper(wrappertest::C& c, int value){ - return VectorToList(c.Mul(value)); -} -''' -) - -C = Class('wrappertest::C', 'wrappertest.h') -set_wrapper(C.Mul, mul) diff --git a/pyste/example/wrappertest_wrappers.h b/pyste/example/wrappertest_wrappers.h deleted file mode 100644 index 42e05d2c..00000000 --- a/pyste/example/wrappertest_wrappers.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef WRAPPER_TEST_WRAPPERS -#define WRAPPER_TEST_WRAPPERS - -#include -#include -#include "wrappertest.h" - -using namespace boost::python; - -template -list VectorToList(const std::vector & v) -{ - list res; - std::vector::const_iterator it; - for(it = v.begin(); it != v.end(); ++it){ - res.append(*it); - } - Py_XINCREF(res.ptr()); - return res; -} - -list RangeWrapper(int count){ - return VectorToList(wrappertest::Range(count)); -} - -#endif diff --git a/pyste/src/.cvsignore b/pyste/src/.cvsignore deleted file mode 100644 index 0d20b648..00000000 --- a/pyste/src/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.pyc diff --git a/pyste/src/ClassExporter.py b/pyste/src/ClassExporter.py deleted file mode 100644 index 44be258e..00000000 --- a/pyste/src/ClassExporter.py +++ /dev/null @@ -1,742 +0,0 @@ -import exporters -from Exporter import Exporter -from declarations import * -from enumerate import enumerate -from settings import * -from CodeUnit import CodeUnit -from EnumExporter import EnumExporter - - -#============================================================================== -# ClassExporter -#============================================================================== -class ClassExporter(Exporter): - 'Generates boost.python code to export a class declaration' - - - def __init__(self, info, parser_tail=None): - Exporter.__init__(self, info, parser_tail) - # sections of code - self.sections = {} - # template: each item in the list is an item into the class_<...> - # section. - self.sections['template'] = [] - # constructor: each item in the list is a parameter to the class_ - # constructor, like class_(...) - self.sections['constructor'] = [] - # inside: everything within the class_<> statement - self.sections['inside'] = [] - # scope: items outside the class statement but within its scope. - # scope* s = new scope(class<>()); - # ... - # delete s; - self.sections['scope'] = [] - # declarations: outside the BOOST_PYTHON_MODULE macro - self.sections['declaration'] = [] - self.sections['include'] = [] - # a list of Constructor instances - self.constructors = [] - self.wrapper_generator = None - # a list of code units, generated by nested declarations - self.nested_codeunits = [] - - - def ScopeName(self): - return _ID(self.class_.FullName()) + '_scope' - - - def Name(self): - return self.class_.FullName() - - - def SetDeclarations(self, declarations): - Exporter.SetDeclarations(self, declarations) - decl = self.GetDeclaration(self.info.name) - if isinstance(decl, Typedef): - self.class_ = self.GetDeclaration(decl.type.name) - if not self.info.rename: - self.info.rename = decl.name - else: - self.class_ = decl - self.public_members = \ - [x for x in self.class_.members if x.visibility == Scope.public] - - - def Order(self): - '''Return the TOTAL number of bases that this class has, including the - bases' bases. Do this because base classes must be instantialized - before the derived classes in the module definition. - ''' - - def BasesCount(classname): - decl = self.GetDeclaration(classname) - bases = [x.name for x in decl.bases] - total = 0 - for base in bases: - total += BasesCount(base) - return len(bases) + total - - return BasesCount(self.class_.FullName()) - - - def Export(self, codeunit, exported_names): - self.ExportBasics() - self.ExportBases(exported_names) - self.ExportConstructors() - self.ExportVariables() - self.ExportMethods() - self.ExportVirtualMethods() - self.ExportOperators() - self.ExportNestedClasses(exported_names) - self.ExportNestedEnums() - self.Write(codeunit) - - - def Write(self, codeunit): - indent = self.INDENT - boost_ns = namespaces.python - pyste_ns = namespaces.pyste - code = '' - # begin a scope for this class if needed - nested_codeunits = self.nested_codeunits - needs_scope = self.sections['scope'] or nested_codeunits - if needs_scope: - scope_name = self.ScopeName() - code += indent + boost_ns + 'scope* %s = new %sscope(\n' %\ - (scope_name, boost_ns) - # export the template section - template_params = ', '.join(self.sections['template']) - code += indent + boost_ns + 'class_< %s >' % template_params - # export the constructor section - constructor_params = ', '.join(self.sections['constructor']) - code += '(%s)\n' % constructor_params - # export the inside section - in_indent = indent*2 - for line in self.sections['inside']: - code += in_indent + line + '\n' - # write the scope section and end it - if not needs_scope: - code += indent + ';\n' - else: - code += indent + ');\n' - for line in self.sections['scope']: - code += indent + line + '\n' - # write the contents of the nested classes - for nested_unit in nested_codeunits: - code += '\n' + nested_unit.Section('module') - # close the scope - code += indent + 'delete %s;\n' % scope_name - - # write the code to the module section in the codeunit - codeunit.Write('module', code + '\n') - - # write the declarations to the codeunit - declarations = '\n'.join(self.sections['declaration']) - for nested_unit in nested_codeunits: - declarations += nested_unit.Section('declaration') - if declarations: - codeunit.Write('declaration', declarations + '\n') - - # write the includes to the codeunit - includes = '\n'.join(self.sections['include']) - for nested_unit in nested_codeunits: - includes += nested_unit.Section('include') - if includes: - codeunit.Write('include', includes) - - - def Add(self, section, item): - 'Add the item into the corresponding section' - self.sections[section].append(item) - - - def ExportBasics(self): - 'Export the name of the class and its class_ statement' - self.Add('template', self.class_.FullName()) - name = self.info.rename or self.class_.name - self.Add('constructor', '"%s"' % name) - - - def ExportBases(self, exported_names): - 'Expose the bases of the class into the template section' - bases = self.class_.bases - bases_list = [] - for base in bases: - if base.visibility == Scope.public and base.name in exported_names: - bases_list.append(base.name) - if bases_list: - code = namespaces.python + 'bases< %s > ' % \ - (', '.join(bases_list)) - self.Add('template', code) - - - def ExportConstructors(self): - '''Exports all the public contructors of the class, plus indicates if the - class is noncopyable. - ''' - py_ns = namespaces.python - indent = self.INDENT - - def init_code(cons): - 'return the init<>() code for the given contructor' - param_list = [p.FullName() for p in cons.parameters] - min_params_list = param_list[:cons.minArgs] - max_params_list = param_list[cons.minArgs:] - min_params = ', '.join(min_params_list) - max_params = ', '.join(max_params_list) - init = py_ns + 'init< ' - init += min_params - if max_params: - if min_params: - init += ', ' - init += py_ns + ('optional< %s >' % max_params) - init += ' >()' - return init - - constructors = [x for x in self.public_members if isinstance(x, Constructor)] - self.constructors = constructors[:] - # don't export the copy constructor if the class is abstract - if self.class_.abstract: - for cons in constructors: - if cons.IsCopy(): - constructors.remove(cons) - break - if not constructors: - # declare no_init - self.Add('constructor', py_ns + 'no_init') - else: - # write the constructor with less parameters to the constructor section - smaller = None - for cons in constructors: - if smaller is None or len(cons.parameters) < len(smaller.parameters): - smaller = cons - assert smaller is not None - self.Add('constructor', init_code(smaller)) - constructors.remove(smaller) - # write the rest to the inside section, using def() - for cons in constructors: - code = '.def(%s)' % init_code(cons) - self.Add('inside', code) - # check if the class is copyable - if not self.class_.HasCopyConstructor() or self.class_.abstract: - self.Add('template', namespaces.boost + 'noncopyable') - - - def ExportVariables(self): - 'Export the variables of the class, both static and simple variables' - vars = [x for x in self.public_members if isinstance(x, Variable)] - for var in vars: - if self.info[var.name].exclude: - continue - name = self.info[var.name].rename or var.name - fullname = var.FullName() - if var.static: - code = '%s->attr("%s") = %s;' % (self.ScopeName(), name, fullname) - self.Add('scope', code) - else: - if var.type.const: - def_ = '.def_readonly' - else: - def_ = '.def_readwrite' - code = '%s("%s", &%s)' % (def_, name, fullname) - self.Add('inside', code) - - - printed_policy_warnings = {} - - def CheckPolicy(self, m): - 'Warns the user if this method needs a policy' - def IsString(type): - return type.const and type.name == 'char' and isinstance(type, PointerType) - needs_policy = isinstance(m.result, (ReferenceType, PointerType)) - if IsString(m.result): - needs_policy = False - has_policy = self.info[m.name].policy is not None - if needs_policy and not has_policy: - warning = '---> Error: Method "%s" needs a policy.' % m.FullName() - if warning not in self.printed_policy_warnings: - print warning - print - self.printed_policy_warnings[warning] = 1 - - - def ExportMethods(self): - 'Export all the non-virtual methods of this class' - - def OverloadName(m): - 'Returns the name of the overloads struct for the given method' - return _ID(m.FullName()) + ('_overloads_%i_%i' % (m.minArgs, m.maxArgs)) - - declared = {} - def DeclareOverloads(m): - 'Declares the macro for the generation of the overloads' - if not m.virtual: - func = m.name - code = 'BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(%s, %s, %i, %i)\n' - code = code % (OverloadName(m), func, m.minArgs, m.maxArgs) - if code not in declared: - declared[code] = True - self.Add('declaration', code) - - - def Pointer(m): - 'returns the correct pointer declaration for the method m' - # check if this method has a wrapper set for him - wrapper = self.info[method.name].wrapper - if wrapper: - return '&' + wrapper.FullName() - # return normal pointers to the methods of the class - is_unique = self.class_.IsUnique(m.name) - if is_unique: - return '&' + method.FullName() - else: - return method.PointerDeclaration() - - def IsExportable(m): - 'Returns true if the given method is exportable by this routine' - ignore = (Constructor, ClassOperator, Destructor) - return isinstance(m, Method) and not isinstance(m, ignore) and not m.virtual - - methods = [x for x in self.public_members if IsExportable(x)] - - for method in methods: - if self.info[method.name].exclude: - continue # skip this method - - name = self.info[method.name].rename or method.name - - # warn the user if this method needs a policy and doesn't have one - self.CheckPolicy(method) - - # check for policies - policy = self.info[method.name].policy or '' - if policy: - policy = ', %s%s()' % (namespaces.python, policy.Code()) - # check for overloads - overload = '' - if method.minArgs != method.maxArgs: - # add the overloads for this method - overload_name = OverloadName(method) - DeclareOverloads(method) - overload = ', %s%s()' % (namespaces.pyste, overload_name) - - # build the .def string to export the method - pointer = Pointer(method) - code = '.def("%s", %s' % (name, pointer) - code += policy - code += overload - code += ')' - self.Add('inside', code) - # static method - if method.static: - code = '.staticmethod("%s")' % name - self.Add('inside', code) - # add wrapper code if this method has one - wrapper = self.info[method.name].wrapper - if wrapper and wrapper.code: - self.Add('declaration', wrapper.code) - - - def ExportVirtualMethods(self): - # check if this class has any virtual methods - has_virtual_methods = False - for member in self.class_.members: - if type(member) == Method and member.virtual: - has_virtual_methods = True - break - - if has_virtual_methods: - generator = _VirtualWrapperGenerator(self.class_, self.info) - self.Add('template', generator.FullName()) - for definition in generator.GenerateDefinitions(): - self.Add('inside', definition) - self.Add('declaration', generator.GenerateVirtualWrapper(self.INDENT)) - - - # operators natively supported by boost - BOOST_SUPPORTED_OPERATORS = '+ - * / % ^ & ! ~ | < > == != <= >= << >> && || += -='\ - '*= /= %= ^= &= |= <<= >>='.split() - # create a map for faster lookup - BOOST_SUPPORTED_OPERATORS = dict(zip(BOOST_SUPPORTED_OPERATORS, range(len(BOOST_SUPPORTED_OPERATORS)))) - - # a dict of operators that are not directly supported by boost, but can be exposed - # simply as a function with a special signature - BOOST_RENAME_OPERATORS = { - '()' : '__call__', - } - - # converters which has a special name in python - SPECIAL_CONVERTERS = { - 'double' : '__float__', - 'float' : '__float__', - 'int' : '__int__', - 'long' : '__long__', - } - - - def ExportOperators(self): - 'Export all member operators and free operators related to this class' - - def GetFreeOperators(): - 'Get all the free (global) operators related to this class' - operators = [] - for decl in self.declarations: - if isinstance(decl, Operator): - # check if one of the params is this class - for param in decl.parameters: - if param.name == self.class_.FullName(): - operators.append(decl) - break - return operators - - def GetOperand(param): - 'Returns the operand of this parameter (either "self", or "other")' - if param.name == self.class_.FullName(): - return namespaces.python + 'self' - else: - return namespaces.python + ('other< %s >()' % param.name) - - - def HandleSpecialOperator(operator): - # gatter information about the operator and its parameters - result_name = operator.result.name - param1_name = '' - if operator.parameters: - param1_name = operator.parameters[0].name - - # check for str - ostream = 'basic_ostream' - is_str = result_name.find(ostream) != -1 and param1_name.find(ostream) != -1 - if is_str: - namespace = namespaces.python + 'self_ns::' - self_ = namespaces.python + 'self' - return '.def(%sstr(%s))' % (namespace, self_) - - # is not a special operator - return None - - - - frees = GetFreeOperators() - members = [x for x in self.public_members if type(x) == ClassOperator] - all_operators = frees + members - operators = [x for x in all_operators if not self.info['operator'][x.name].exclude] - - for operator in operators: - # gatter information about the operator, for use later - wrapper = self.info['operator'][operator.name].wrapper - if wrapper: - pointer = '&' + wrapper.FullName() - if wrapper.code: - self.Add('declaration', wrapper.code) - elif isinstance(operator, ClassOperator) and self.class_.IsUnique(operator.name): - pointer = '&' + operator.FullName() - else: - pointer = operator.PointerDeclaration() - rename = self.info['operator'][operator.name].rename - - # check if this operator will be exported as a method - export_as_method = wrapper or rename or operator.name in self.BOOST_RENAME_OPERATORS - - # check if this operator has a special representation in boost - special_code = HandleSpecialOperator(operator) - has_special_representation = special_code is not None - - if export_as_method: - # export this operator as a normal method, renaming or using the given wrapper - if not rename: - if wrapper: - rename = wrapper.name - else: - rename = self.BOOST_RENAME_OPERATORS[operator.name] - policy = '' - policy_obj = self.info['operator'][operator.name].policy - if policy_obj: - policy = ', %s()' % policy_obj.Code() - self.Add('inside', '.def("%s", %s%s)' % (rename, pointer, policy)) - - elif has_special_representation: - self.Add('inside', special_code) - - elif operator.name in self.BOOST_SUPPORTED_OPERATORS: - # export this operator using boost's facilities - op = operator - is_unary = isinstance(op, Operator) and len(op.parameters) == 1 or\ - isinstance(op, ClassOperator) and len(op.parameters) == 0 - if is_unary: - self.Add('inside', '.def( %s%sself )' % \ - (operator.name, namespaces.python)) - else: - # binary operator - if len(operator.parameters) == 2: - left_operand = GetOperand(operator.parameters[0]) - right_operand = GetOperand(operator.parameters[1]) - else: - left_operand = namespaces.python + 'self' - right_operand = GetOperand(operator.parameters[0]) - self.Add('inside', '.def( %s %s %s )' % \ - (left_operand, operator.name, right_operand)) - - # export the converters. - # export them as simple functions with a pre-determined name - - converters = [x for x in self.public_members if type(x) == ConverterOperator] - - def ConverterMethodName(converter): - result_fullname = converter.result.name - if result_fullname in self.SPECIAL_CONVERTERS: - return self.SPECIAL_CONVERTERS[result_fullname] - else: - # extract the last name from the full name - result_name = _ID(result_fullname.split('::')[-1]) - return 'to_' + result_name - - for converter in converters: - info = self.info['operator'][converter.result.name] - # check if this operator should be excluded - if info.exclude: - continue - - special_code = HandleSpecialOperator(converter) - if info.rename or not special_code: - # export as method - name = info.rename or ConverterMethodName(converter) - if self.class_.IsUnique(converter.name): - pointer = '&' + converter.FullName() - else: - pointer = converter.PointerDeclaration() - policy_code = '' - if info.policy: - policy_code = ', %s()' % info.policy.Code() - self.Add('inside', '.def("%s", %s%s)' % (name, pointer, policy_code)) - - elif special_code: - self.Add('inside', special_code) - - - - def ExportNestedClasses(self, exported_names): - nested_classes = [x for x in self.public_members if isinstance(x, NestedClass)] - for nested_class in nested_classes: - nested_info = self.info[nested_class.name] - nested_info.include = self.info.include - nested_info.name = nested_class.FullName() - exporter = ClassExporter(nested_info) - exporter.SetDeclarations(self.declarations + [nested_class]) - codeunit = CodeUnit(None) - exporter.Export(codeunit, exported_names) - self.nested_codeunits.append(codeunit) - - - def ExportNestedEnums(self): - nested_enums = [x for x in self.public_members if isinstance(x, ClassEnumeration)] - for enum in nested_enums: - enum_info = self.info[enum.name] - enum_info.include = self.info.include - enum_info.name = enum.FullName() - exporter = EnumExporter(enum_info) - exporter.SetDeclarations(self.declarations + [enum]) - codeunit = CodeUnit(None) - exporter.Export(codeunit, None) - self.nested_codeunits.append(codeunit) - - - - -def _ID(name): - 'Returns the name as a valid identifier' - for invalidchar in ('::', '<', '>', ' ', ','): - name = name.replace(invalidchar, '_') - # avoid duplications of '_' chars - names = [x for x in name.split('_') if x] - return '_'.join(names) - - -#============================================================================== -# Virtual Wrapper utils -#============================================================================== - -def _ParamsInfo(m, count=None): - if count is None: - count = len(m.parameters) - param_names = ['p%i' % i for i in range(count)] - param_types = [x.FullName() for x in m.parameters[:count]] - params = ['%s %s' % (t, n) for t, n in zip(param_types, param_names)] - #for i, p in enumerate(m.parameters[:count]): - # if p.default is not None: - # #params[i] += '=%s' % p.default - # params[i] += '=%s' % (p.name + '()') - params = ', '.join(params) - return params, param_names, param_types - - -class _VirtualWrapperGenerator(object): - 'Generates code to export the virtual methods of the given class' - - def __init__(self, class_, info): - self.class_ = class_ - self.info = info - self.wrapper_name = _ID(class_.FullName()) + '_Wrapper' - - - def DefaultImplementationNames(self, method): - '''Returns a list of default implementations for this method, one for each - number of default arguments. Always returns at least one name, and return from - the one with most arguments to the one with the least. - ''' - base_name = 'default_' + method.name - minArgs = method.minArgs - maxArgs = method.maxArgs - if minArgs == maxArgs: - return [base_name] - else: - return [base_name + ('_%i' % i) for i in range(minArgs, maxArgs+1)] - - - def Declaration(self, method, indent): - '''Returns a string with the declarations of the virtual wrapper and - its default implementations. This string must be put inside the Wrapper - body. - ''' - pyste = namespaces.pyste - python = namespaces.python - rename = self.info[method.name].rename or method.name - result = method.result.FullName() - return_str = 'return ' - if result == 'void': - return_str = '' - params, param_names, param_types = _ParamsInfo(method) - constantness = '' - if method.const: - constantness = ' const' - - # call_method callback - decl = indent + '%s %s(%s)%s {\n' % (result, method.name, params, constantness) - param_names_str = ', '.join(param_names) - if param_names_str: - param_names_str = ', ' + param_names_str - decl += indent*2 + '%s%scall_method< %s >(self, "%s"%s);\n' %\ - (return_str, python, result, rename, param_names_str) - decl += indent + '}\n' - - # default implementations (with overloading) - # only for classes that are not abstract, and public methods - if not method.abstract and method.visibility == Scope.public: - minArgs = method.minArgs - maxArgs = method.maxArgs - impl_names = self.DefaultImplementationNames(method) - for impl_name, argNum in zip(impl_names, range(minArgs, maxArgs+1)): - params, param_names, param_types = _ParamsInfo(method, argNum) - decl += '\n' - decl += indent + '%s %s(%s)%s {\n' % (result, impl_name, params, constantness) - decl += indent*2 + '%s%s::%s(%s);\n' % \ - (return_str, self.class_.FullName(), method.name, ', '.join(param_names)) - decl += indent + '}\n' - return decl - - - def MethodDefinition(self, method): - '''Returns a list of lines, which should be put inside the class_ - statement to export this method.''' - # dont define abstract methods - pyste = namespaces.pyste - rename = self.info[method.name].rename or method.name - default_names = self.DefaultImplementationNames(method) - class_name = self.class_.FullName() - wrapper_name = pyste + self.wrapper_name - result = method.result.FullName() - is_method_unique = self.class_.IsUnique(method.name) - constantness = '' - if method.const: - constantness = ' const' - - # create a list of default-impl pointers - minArgs = method.minArgs - maxArgs = method.maxArgs - if is_method_unique: - default_pointers = ['&%s::%s' % (wrapper_name, x) for x in default_names] - else: - default_pointers = [] - for impl_name, argNum in zip(default_names, range(minArgs, maxArgs+1)): - param_list = [x.FullName() for x in method.parameters[:argNum]] - params = ', '.join(param_list) - signature = '%s (%s::*)(%s)%s' % (result, wrapper_name, params, constantness) - default_pointer = '(%s)%s::%s' % (signature, wrapper_name, impl_name) - default_pointers.append(default_pointer) - - # get the pointer of the method - if is_method_unique: - pointer = '&' + method.FullName() - else: - pointer = method.PointerDeclaration() - - # generate the defs - definitions = [] - # basic def - definitions.append('.def("%s", %s, %s)' % (rename, pointer, default_pointers[-1])) - for default_pointer in default_pointers[:-1]: - definitions.append('.def("%s", %s)' % (rename, default_pointer)) - return definitions - - - def FullName(self): - return namespaces.pyste + self.wrapper_name - - - def VirtualMethods(self): - def IsVirtual(m): - return type(m) == Method and m.virtual - return [m for m in self.class_.members if IsVirtual(m)] - - - - def Constructors(self): - def IsValid(m): - return isinstance(m, Constructor) and m.visibility == Scope.public - return [m for m in self.class_.members if IsValid(m)] - - - def GenerateDefinitions(self): - defs = [] - for method in self.VirtualMethods(): - exclude = self.info[method.name].exclude - # generate definitions only for public methods and non-abstract methods - if method.visibility == Scope.public and not method.abstract and not exclude: - defs.extend(self.MethodDefinition(method)) - return defs - - - def GenerateVirtualWrapper(self, indent): - 'Return the wrapper for this class' - - # generate the class code - class_name = self.class_.FullName() - code = 'struct %s: %s\n' % (self.wrapper_name, class_name) - code += '{\n' - # generate constructors (with the overloads for each one) - for cons in self.Constructors(): # only public constructors - minArgs = cons.minArgs - maxArgs = cons.maxArgs - # from the min number of arguments to the max number, generate - # all version of the given constructor - cons_code = '' - for argNum in range(minArgs, maxArgs+1): - params, param_names, param_types = _ParamsInfo(cons, argNum) - if params: - params = ', ' + params - cons_code += indent + '%s(PyObject* self_%s):\n' % \ - (self.wrapper_name, params) - cons_code += indent*2 + '%s(%s), self(self_) {}\n\n' % \ - (class_name, ', '.join(param_names)) - code += cons_code - # generate the body - body = [] - for method in self.VirtualMethods(): - if not self.info[method.name].exclude: - body.append(self.Declaration(method, indent)) - body = '\n'.join(body) - code += body + '\n' - # add the self member - code += indent + 'PyObject* self;\n' - code += '};\n' - return code diff --git a/pyste/src/CodeUnit.py b/pyste/src/CodeUnit.py deleted file mode 100644 index ac123f99..00000000 --- a/pyste/src/CodeUnit.py +++ /dev/null @@ -1,78 +0,0 @@ -from settings import * - -#============================================================================== -# RemoveDuplicatedLines -#============================================================================== -def RemoveDuplicatedLines(text): - includes = text.splitlines() - d = dict([(include, 0) for include in includes]) - return '\n'.join(d.keys()) - - -#============================================================================== -# CodeUnit -#============================================================================== -class CodeUnit: - ''' - Represents a cpp file, where other objects can write in one of the - predefined sections. - The avaiable sections are: - include - The include area of the cpp file - declaration - The part before the module definition - module - Inside the BOOST_PYTHON_MODULE macro - ''' - - USING_BOOST_NS = True - - def __init__(self, modulename): - self.modulename = modulename - # define the avaiable sections - self.code = {} - self.code['include'] = '' - self.code['declaration'] = '' - self.code['module'] = '' - - - def Write(self, section, code): - 'write the given code in the section of the code unit' - if section not in self.code: - raise RuntimeError, 'Invalid CodeUnit section: %s' % section - self.code[section] += code - - - def Section(self, section): - return self.code[section] - - - def Save(self, filename): - 'Writes this code unit to the filename' - space = '\n\n' - fout = file(filename, 'w') - # includes - includes = RemoveDuplicatedLines(self.code['include']) - fout.write('\n' + self._leftEquals('Includes')) - fout.write('#include \n') - fout.write(includes) - fout.write(space) - # using - if self.USING_BOOST_NS: - fout.write(self._leftEquals('Using')) - fout.write('using namespace boost::python;\n\n') - # declarations - if self.code['declaration']: - pyste_namespace = namespaces.pyste[:-2] - fout.write(self._leftEquals('Declarations')) - fout.write('namespace %s {\n\n\n' % pyste_namespace) - fout.write(self.code['declaration']) - fout.write('\n\n}// namespace %s\n' % pyste_namespace) - fout.write(space) - # module - fout.write(self._leftEquals('Module')) - fout.write('BOOST_PYTHON_MODULE(%s)\n{\n' % self.modulename) - fout.write(self.code['module']) - fout.write('}\n') - - - def _leftEquals(self, s): - s = '// %s ' % s - return s + ('='*(80-len(s))) + '\n' diff --git a/pyste/src/CppParser.py b/pyste/src/CppParser.py deleted file mode 100644 index 4a4c4310..00000000 --- a/pyste/src/CppParser.py +++ /dev/null @@ -1,94 +0,0 @@ -from GCCXMLParser import ParseDeclarations -import tempfile -import shutil -import os -import os.path -import settings - -class CppParserError(Exception): pass - - -class CppParser: - 'Parses a header file and returns a list of declarations' - - def __init__(self, includes=None, defines=None): - 'includes and defines ar the directives given to gcc' - if includes is None: - includes = [] - if defines is None: - defines = [] - self.includes = includes - self.defines = defines - - - def _includeparams(self, filename): - includes = self.includes[:] - filedir = os.path.dirname(filename) - if not filedir: - filedir = '.' - includes.insert(0, filedir) - includes = ['-I "%s"' % x for x in includes] - return ' '.join(includes) - - - def _defineparams(self): - defines = ['-D "%s"' % x for x in self.defines] - return ' '.join(defines) - - - def FindFileName(self, include): - if os.path.isfile(include): - return include - for path in self.includes: - filename = os.path.join(path, include) - if os.path.isfile(filename): - return filename - name = os.path.basename(include) - raise RuntimeError, 'Header file "%s" not found!' % name - - - def parse(self, include, symbols=None, tail=None): - '''Parses the given filename, and returns (declaration, header). The - header returned is normally the same as the given to this method, - except if tail is not None: in this case, the header is copied to a temp - filename and the tail code is appended to it before being passed on to gcc. - This temp filename is then returned. - ''' - filename = self.FindFileName(include) - # copy file to temp folder, if needed - if tail: - tempfilename = tempfile.mktemp('.h') - infilename = tempfilename - shutil.copyfile(filename, infilename) - f = file(infilename, 'a') - f.write('\n\n'+tail) - f.close() - else: - infilename = filename - xmlfile = tempfile.mktemp('.xml') - try: - # get the params - includes = self._includeparams(filename) - defines = self._defineparams() - # call gccxml - cmd = 'gccxml %s %s %s -fxml=%s' \ - % (includes, defines, infilename, xmlfile) - if symbols: - cmd += ' -fxml-start=' + ','.join(symbols) - status = os.system(cmd) - if status != 0 or not os.path.isfile(xmlfile): - raise CppParserError, 'Error executing gccxml' - # parse the resulting xml - declarations = ParseDeclarations(xmlfile) - # return the declarations - return declarations, infilename - finally: - if settings.DEBUG and os.path.isfile(xmlfile): - filename = os.path.basename(include) - shutil.copy(xmlfile, os.path.splitext(filename)[0] + '.xml') - # delete the temporary files - try: - os.remove(xmlfile) - if tail: - os.remove(tempfilename) - except OSError: pass diff --git a/pyste/src/EnumExporter.py b/pyste/src/EnumExporter.py deleted file mode 100644 index fda4d721..00000000 --- a/pyste/src/EnumExporter.py +++ /dev/null @@ -1,30 +0,0 @@ -from Exporter import Exporter -from settings import * - -#============================================================================== -# EnumExporter -#============================================================================== -class EnumExporter(Exporter): - 'Exports enumerators' - - def __init__(self, info): - Exporter.__init__(self, info) - - - def SetDeclarations(self, declarations): - Exporter.SetDeclarations(self, declarations) - self.enum = self.GetDeclaration(self.info.name) - - - def Export(self, codeunit, expoted_names): - indent = self.INDENT - in_indent = self.INDENT*2 - rename = self.info.rename or self.enum.name - full_name = self.enum.FullName() - code = indent + namespaces.python + 'enum_< %s >("%s")\n' % (full_name, rename) - for name in self.enum.values: - rename = self.info[name].rename or name - value_fullname = self.enum.ValueFullName(name) - code += in_indent + '.value("%s", %s)\n' % (rename, value_fullname) - code += indent + ';\n\n' - codeunit.Write('module', code) diff --git a/pyste/src/Exporter.py b/pyste/src/Exporter.py deleted file mode 100644 index 02259582..00000000 --- a/pyste/src/Exporter.py +++ /dev/null @@ -1,69 +0,0 @@ -import os.path - -#============================================================================== -# Exporter -#============================================================================== -class Exporter: - 'Base class for objects capable to generate boost.python code.' - - INDENT = ' ' * 4 - - def __init__(self, info, parser_tail=None): - self.info = info - self.parser_tail = parser_tail - - - def Parse(self, parser): - self.parser = parser - header = self.info.include - tail = self.parser_tail - declarations, parser_header = parser.parse(header, tail=tail) - self.parser_header = parser_header - self.SetDeclarations(declarations) - - - def SetDeclarations(self, declarations): - self.declarations = declarations - - - def GenerateCode(self, codeunit, exported_names): - self.WriteInclude(codeunit) - self.Export(codeunit, exported_names) - - - def WriteInclude(self, codeunit): - codeunit.Write('include', '#include <%s>\n' % self.info.include) - - - def Export(self, codeunit, exported_names): - 'subclasses must override this to do the real work' - pass - - - def Name(self): - '''Returns the name of this Exporter. The name will be added to the - list of names exported, which may have a use for other exporters. - ''' - return None - - - def GetDeclarations(self, fullname): - decls = [x for x in self.declarations if x.FullName() == fullname] - if not decls: - raise RuntimeError, 'no %s declaration found!' % fullname - return decls - - - def GetDeclaration(self, fullname): - decls = self.GetDeclarations(fullname) - assert len(decls) == 1 - return decls[0] - - - def Order(self): - '''Returns a number that indicates to which order this exporter - belongs. The exporters will be called from the lowest order to the - highest order. - This function will only be called after Parse has been called. - ''' - return None # don't care diff --git a/pyste/src/FunctionExporter.py b/pyste/src/FunctionExporter.py deleted file mode 100644 index 60735ca0..00000000 --- a/pyste/src/FunctionExporter.py +++ /dev/null @@ -1,85 +0,0 @@ -from Exporter import Exporter -from policies import * -from declarations import * -from settings import * - - -class FunctionExporter(Exporter): - 'Generates boost.python code to export the given function.' - - def __init__(self, info, tail=None): - Exporter.__init__(self, info, tail) - - - def Export(self, codeunit, exported_names): - decls = self.GetDeclarations(self.info.name) - for decl in decls: - self.CheckPolicy(decl) - self.ExportDeclaration(decl, len(decls) == 1, codeunit) - self.GenerateOverloads(decls, codeunit) - - - def Name(self): - return self.info.name - - - def CheckPolicy(self, func): - 'Warns the user if this function needs a policy' - def IsString(type): - return type.const and type.name == 'char' and isinstance(type, PointerType) - needs_policy = isinstance(func.result, (ReferenceType, PointerType)) - if IsString(func.result): - needs_policy = False - if needs_policy and self.info.policy is None: - print '---> Error: Function "%s" needs a policy.' % func.FullName() - print - - def ExportDeclaration(self, decl, unique, codeunit): - name = self.info.rename or decl.name - defs = namespaces.python + 'def("%s", ' % name - wrapper = self.info.wrapper - if wrapper: - pointer = '&' + wrapper.FullName() - elif not unique: - pointer = decl.PointerDeclaration() - else: - pointer = '&' + decl.FullName() - defs += pointer - defs += self.PolicyCode() - overload = self.OverloadName(decl) - if overload: - defs += ', %s()' % (namespaces.pyste + overload) - defs += ');' - codeunit.Write('module', self.INDENT + defs + '\n') - # add the code of the wrapper - if wrapper and wrapper.code: - codeunit.Write('declaration', code + '\n') - - - def OverloadName(self, decl): - if decl.minArgs != decl.maxArgs: - return '%s_overloads_%i_%i' % \ - (decl.name, decl.minArgs, decl.maxArgs) - else: - return '' - - - def GenerateOverloads(self, declarations, codeunit): - codes = {} - for decl in declarations: - overload = self.OverloadName(decl) - if overload and overload not in codes: - code = 'BOOST_PYTHON_FUNCTION_OVERLOADS(%s, %s, %i, %i)' %\ - (overload, decl.FullName(), decl.minArgs, decl.maxArgs) - codeunit.Write('declaration', code + '\n') - codes[overload] = None - - - def PolicyCode(self): - policy = self.info.policy - if policy is not None: - assert isinstance(policy, Policy) - return ', %s()' % policy.Code() - else: - return '' - diff --git a/pyste/src/GCCXMLParser.py b/pyste/src/GCCXMLParser.py deleted file mode 100644 index 6c57a512..00000000 --- a/pyste/src/GCCXMLParser.py +++ /dev/null @@ -1,403 +0,0 @@ -from declarations import * -from elementtree.ElementTree import ElementTree -from xml.parsers.expat import ExpatError -from copy import deepcopy - - -class InvalidXMLError(Exception): pass - -class ParserError(Exception): pass - -class InvalidContextError(ParserError): pass - - -class GCCXMLParser(object): - 'Parse a GCC_XML file and extract the top-level declarations.' - - interested_tags = {'Class':0, 'Function':0, 'Variable':0, 'Enumeration':0} - - def Parse(self, filename): - self.elements = self.GetElementsFromXML(filename) - # high level declarations - self.declarations = [] - # parse the elements - for id in self.elements: - element, decl = self.elements[id] - if decl is None: - try: - self.ParseElement(id, element) - except InvalidContextError: - pass # ignore those nodes with invalid context - # (workaround gccxml bug) - - - def Declarations(self): - return self.declarations - - - def AddDecl(self, decl): - self.declarations.append(decl) - - - def ParseElement(self, id, element): - method = 'Parse' + element.tag - if hasattr(self, method): - func = getattr(self, method) - func(id, element) - - - def GetElementsFromXML(self,filename): - 'Extracts a dictionary of elements from the gcc_xml file.' - - tree = ElementTree() - try: - tree.parse(filename) - except ExpatError: - raise InvalidXMLError, 'Not a XML file: %s' % filename - - root = tree.getroot() - if root.tag != 'GCC_XML': - raise InvalidXMLError, 'Not a valid GCC_XML file' - - # build a dictionary of id -> element, None - elementlist = root.getchildren() - elements = {} - for element in elementlist: - id = element.get('id') - if id: - elements[id] = element, None - return elements - - - def GetDecl(self, id): - if id not in self.elements: - if id == '_0': - raise InvalidContextError, 'Invalid context found in the xml file.' - else: - msg = 'ID not found in elements: %s' % id - raise ParserError, msg - - elem, decl = self.elements[id] - if decl is None: - self.ParseElement(id, elem) - elem, decl = self.elements[id] - if decl is None: - raise ParserError, 'Could not parse element: %s' % elem.tag - return decl - - - def GetType(self, id): - const = False - volatile = False - if id[-1] == 'v': - volatile = True - id = id[:-1] - if id[-1] == 'c': - const = True - id = id[:-1] - decl = self.GetDecl(id) - if isinstance(decl, Type): - res = deepcopy(decl) - if const: - res.const = const - if volatile: - res.volatile = volatile - else: - res = Type(decl.FullName(), const) - res.volatile = volatile - return res - - - def GetLocation(self, location): - file, line = location.split(':') - file = self.GetDecl(file) - return file, int(line) - - - def Update(self, id, decl): - element, _ = self.elements[id] - self.elements[id] = element, decl - - - def ParseNamespace(self, id, element): - namespace = element.get('name') - context = element.get('context') - if context: - outerns = self.GetDecl(context) - if not outerns.endswith('::'): - outerns += '::' - namespace = outerns + namespace - if namespace.startswith('::'): - namespace = namespace[2:] - self.Update(id, namespace) - - - def ParseFile(self, id, element): - filename = element.get('name') - self.Update(id, filename) - - - def ParseVariable(self, id, element): - # in gcc_xml, a static Field is declared as a Variable, so we check - # this and call the Field parser if apply. - context = self.GetDecl(element.get('context')) - if isinstance(context, Class): - self.ParseField(id, element) - elem, decl = self.elements[id] - decl.static = True - else: - namespace = context - name = element.get('name') - type_ = self.GetType(element.get('type')) - location = self.GetLocation(element.get('location')) - variable = Variable(type_, name, namespace) - variable.location = location - self.AddDecl(variable) - self.Update(id, variable) - - - def GetArguments(self, element): - args = [] - for child in element: - if child.tag == 'Argument': - type_ = self.GetType(child.get('type')) - type_.default = child.get('default') - args.append(type_) - return args - - - def ParseFunction(self, id, element, functionType=Function): - '''functionType is used because a Operator is identical to a normal - function, only the type of the function changes.''' - name = element.get('name') - returns = self.GetType(element.get('returns')) - namespace = self.GetDecl(element.get('context')) - location = self.GetLocation(element.get('location')) - params = self.GetArguments(element) - function = functionType(name, namespace, returns, params) - function.location = location - self.AddDecl(function) - self.Update(id, function) - - - def ParseOperatorFunction(self, id, element): - self.ParseFunction(id, element, Operator) - - - def GetBases(self, bases): - 'Parses the string "bases" from the xml into a list of Base instances.' - - if bases is None: - return [] - bases = bases.split() - baseobjs = [] - for base in bases: - # get the visibility - split = base.split(':') - if len(split) == 2: - visib = split[0] - base = split[1] - else: - visib = Scope.public - decl = self.GetDecl(base) - baseobj = Base(decl.FullName(), visib) - baseobjs.append(baseobj) - return baseobjs - - - def GetMembers(self, members): - # members must be a string with the ids of the members - if members is None: - return [] - memberobjs = [] - for member in members.split(): - memberobjs.append(self.GetDecl(member)) - return memberobjs - - - def ParseClass(self, id, element): - name = element.get('name') - abstract = bool(int(element.get('abstract', '0'))) - bases = self.GetBases(element.get('bases')) - location = self.GetLocation(element.get('location')) - context = self.GetDecl(element.get('context')) - if isinstance(context, str): - class_ = Class(name, context, [], abstract, bases) - self.AddDecl(class_) - else: - # a nested class - visib = element.get('access', Scope.public) - class_ = NestedClass( - name, context.FullName(), visib, [], abstract, bases) - # we have to add the declaration of the class before trying - # to parse its members, to avoid recursion. - class_.location = location - self.Update(id, class_) - # now we can get the members - class_.members = self.GetMembers(element.get('members')) - - - def ParseStruct(self, id, element): - self.ParseClass(id, element) - - - def ParseFundamentalType(self, id, element): - name = element.get('name') - type_ = FundamentalType(name) - self.Update(id, type_) - - - def ParseArrayType(self, id, element): - type_ = self.GetType(element.get('type')) - min = element.get('min') - max = element.get('max') - array = ArrayType(type_.name, min, max, type_.const) - self.Update(id, array) - - - def ParseReferenceType(self, id, element): - type_ = self.GetType(element.get('type')) - expand = not isinstance(type_, FunctionType) - ref = ReferenceType(type_.name, type_.const, None, expand) - self.Update(id, ref) - - - def ParsePointerType(self, id, element): - type_ = self.GetType(element.get('type')) - expand = not isinstance(type_, FunctionType) - ref = PointerType(type_.name, type_.const, None, expand) - self.Update(id, ref) - - - def ParseFunctionType(self, id, element): - result = self.GetType(element.get('returns')) - args = self.GetArguments(element) - func = FunctionType(result, args) - self.Update(id, func) - - - def ParseMethodType(self, id, element): - class_ = self.GetDecl(element.get('basetype')).FullName() - result = self.GetType(element.get('returns')) - args = self.GetArguments(element) - method = MethodType(result, args, class_) - self.Update(id, method) - - - def ParseField(self, id, element): - name = element.get('name') - visib = element.get('access', Scope.public) - classname = self.GetDecl(element.get('context')).FullName() - type_ = self.GetType(element.get('type')) - static = bool(int(element.get('extern', '0'))) - location = self.GetLocation(element.get('location')) - var = ClassVariable(type_, name, classname, visib, static) - var.location = location - self.Update(id, var) - - - def ParseMethod(self, id, element, methodType=Method): - name = element.get('name') - result = self.GetType(element.get('returns')) - classname = self.GetDecl(element.get('context')).FullName() - visib = element.get('access', Scope.public) - static = bool(int(element.get('static', '0'))) - virtual = bool(int(element.get('virtual', '0'))) - abstract = bool(int(element.get('pure_virtual', '0'))) - const = bool(int(element.get('const', '0'))) - location = self.GetLocation(element.get('location')) - params = self.GetArguments(element) - method = methodType( - name, classname, result, params, visib, virtual, abstract, static, const) - method.location = location - self.Update(id, method) - - - def ParseOperatorMethod(self, id, element): - self.ParseMethod(id, element, ClassOperator) - - - def ParseConstructor(self, id, element): - name = element.get('name') - visib = element.get('access', Scope.public) - classname = self.GetDecl(element.get('context')).FullName() - location = self.GetLocation(element.get('location')) - params = self.GetArguments(element) - ctor = Constructor(name, classname, params, visib) - ctor.location = location - self.Update(id, ctor) - - - def ParseDestructor(self, id, element): - name = element.get('name') - visib = element.get('access', Scope.public) - classname = self.GetDecl(element.get('context')).FullName() - virtual = bool(int(element.get('virtual', '0'))) - location = self.GetLocation(element.get('location')) - des = Destructor(name, classname, visib, virtual) - des.location = location - self.Update(id, des) - - - def ParseConverter(self, id, element): - self.ParseMethod(id, element, ConverterOperator) - - - def ParseTypedef(self, id, element): - name = element.get('name') - type = self.GetType(element.get('type')) - context = self.GetDecl(element.get('context')) - if isinstance(context, Class): - context = context.FullName() - typedef = Typedef(type, name, context) - self.Update(id, typedef) - self.AddDecl(typedef) - - - def ParseEnumeration(self, id, element): - name = element.get('name') - location = self.GetLocation(element.get('location')) - context = self.GetDecl(element.get('context')) - if isinstance(context, str): - enum = Enumeration(name, context) - self.AddDecl(enum) # in this case, is a top level decl - else: - visib = element.get('access', Scope.public) - enum = ClassEnumeration(name, context.FullName(), visib) - - enum.location = location - for child in element: - if child.tag == 'EnumValue': - name = child.get('name') - value = int(child.get('init')) - enum.values[name] = value - self.Update(id, enum) - - - def ParseUnimplemented(self, id, element): - 'No idea of what this is' - self.Update(id, Declaration('', '')) - - - def ParseUnion(self, id, element): - name = element.get('name') - context = self.GetDecl(element.get('context')) - location = self.GetLocation(element.get('location')) - if isinstance(context, str): - # a free union - union = Union(name, context) - self.AddDecl(union) - else: - visib = element.get('access', Scope.public) - union = ClassUnion(name, context.FullName(), visib) - union.location = location - self.Update(id, union) - - - -def ParseDeclarations(filename): - 'Returns a list of the top declarations found in the gcc_xml file.' - - parser = GCCXMLParser() - parser.Parse(filename) - return parser.Declarations() diff --git a/pyste/src/HeaderExporter.py b/pyste/src/HeaderExporter.py deleted file mode 100644 index 9234e8af..00000000 --- a/pyste/src/HeaderExporter.py +++ /dev/null @@ -1,67 +0,0 @@ -from Exporter import Exporter -from ClassExporter import ClassExporter -from FunctionExporter import FunctionExporter -from EnumExporter import EnumExporter -from infos import * -from declarations import * -import os.path -import exporters - -#============================================================================== -# HeaderExporter -#============================================================================== -class HeaderExporter(Exporter): - 'Exports all declarations found in the given header' - - def __init__(self, info, parser_tail=None): - Exporter.__init__(self, info, parser_tail) - - - def WriteInclude(self, codeunit): - pass - - - def SetDeclarations(self, declarations): - def IsInternalName(name): - '''Returns true if the given name looks like a internal compiler - structure''' - return name.startswith('__') - - Exporter.SetDeclarations(self, declarations) - header = os.path.normpath(self.parser_header) - for decl in declarations: - # check if this declaration is in the header - location = os.path.normpath(decl.location[0]) - if location != header or IsInternalName(decl.name): - continue - # ok, check the type of the declaration and export it accordingly - self.HandleDeclaration(decl) - - - def HandleDeclaration(self, decl): - '''Dispatch the declaration to the appropriate method, that must create - a suitable info object for a Exporter, create a Exporter, set its - declarations and append it to the list of exporters. - ''' - dispatch_table = { - Class : ClassExporter, - Enumeration : EnumExporter, - Function : FunctionExporter, - } - - for decl_type, exporter_type in dispatch_table.items(): - if type(decl) == decl_type: - self.HandleExporter(decl, exporter_type) - break - - - def HandleExporter(self, decl, exporter_type): - info = self.info[decl.name] - info.name = decl.FullName() - info.include = self.info.include - exporter = exporter_type(info) - exporter.SetDeclarations(self.declarations) - exporters.exporters.append(exporter) - - - diff --git a/pyste/src/IncludeExporter.py b/pyste/src/IncludeExporter.py deleted file mode 100644 index 2a7b0602..00000000 --- a/pyste/src/IncludeExporter.py +++ /dev/null @@ -1,19 +0,0 @@ -import os.path -from Exporter import Exporter - -#============================================================================== -# IncludeExporter -#============================================================================== -class IncludeExporter(Exporter): - '''Writes an include declaration to the module. Useful to add extra code - for use in the Wrappers. - This class just reimplements the Parse method to do nothing: the - WriteInclude in Exporter already does the work for us. - ''' - - def __init__(self, info, parser_tail=None): - Exporter.__init__(self, info, parser_tail) - - def Parse(self, parser): - pass - diff --git a/pyste/src/declarations.py b/pyste/src/declarations.py deleted file mode 100644 index 73e69d5f..00000000 --- a/pyste/src/declarations.py +++ /dev/null @@ -1,464 +0,0 @@ -''' -Module declarations - - Defines classes that represent declarations found in C++ header files. - -''' - -class Declaration(object): - 'Represents a basic declaration.' - - def __init__(self, name, namespace): - # the declaration name - self.name = name - # all the namespaces, separated by '::' = 'boost::inner' - self.namespace = namespace - # tuple (filename, line) - self.location = '', -1 - - - def FullName(self): - 'Returns the full qualified name: "boost::inner::Test"' - namespace = self.namespace or '' - #if not namespace: - # namespace = '' - if namespace and not namespace.endswith('::'): - namespace += '::' - return namespace + self.name - - - def __repr__(self): - return '' % (self.FullName(), id(self)) - - - def __str__(self): - return 'Declaration of %s' % self.FullName() - - - -class Class(Declaration): - 'The declaration of a class or struct.' - - def __init__(self, name, namespace, members, abstract, bases): - Declaration.__init__(self, name, namespace) - # list of members - self.members = members - # whatever the class has any abstract methods - self.abstract = abstract - # instances of Base - self.bases = bases - self._members_count = {} - - - def __iter__(self): - return iter(self.members) - - - def IsAbstract(self): - 'Returns True if any method of this class is abstract' - for member in self.members: - if isinstance(member, Method): - if member.abstract: - return True - return False - - - def RawName(self): - 'Returns the raw name of a template class. name = Foo, raw = Foo' - lesspos = self.name.find('<') - if lesspos != -1: - return self.name[:lesspos] - else: - return self.name - - - def Constructors(self, publics_only=True): - constructors = [] - for member in self: - if isinstance(member, Constructor): - if publics_only and member.visibility != Scope.public: - continue - constructors.append(member) - return constructors - - - def HasCopyConstructor(self): - for cons in self.Constructors(): - if cons.IsCopy(): - return True - return False - - - def HasDefaultConstructor(self): - for cons in self.Constructors(): - if cons.IsDefault(): - return True - return False - - - def IsUnique(self, member_name): - if not self._members_count: - for m in self: - self._members_count[m.name] = self._members_count.get(m.name, 0) + 1 - try: - return self._members_count[member_name] == 1 - except KeyError: - print self._members_count - print 'Key', member_name - - - -class NestedClass(Class): - 'The declaration of a class/struct inside another class/struct.' - - def __init__(self, name, class_, visib, members, abstract, bases): - Class.__init__(self, name, None, members, abstract, bases) - self.class_ = class_ - self.visibility = visib - - - def FullName(self): - return '%s::%s' % (self.class_, self.name) - - - -class Base: - 'Represents a base class of another class.' - - def __init__(self, name, visibility=None): - # class_ is the full name of the base class - self.name = name - # visibility of the derivation - if visibility is None: - visibility = Scope.public - self.visibility = visibility - - - -class Scope: - public = 'public' - private = 'private' - protected = 'protected' - - - -class Function(Declaration): - 'The declaration of a function.' - - def __init__(self, name, namespace, result, params): - Declaration.__init__(self, name, namespace) - # the result type: instance of Type, or None (constructors) - self.result = result - # the parameters: instances of Type - self.parameters = params - - - def PointerDeclaration(self): - 'returns a declaration of a pointer to this function' - result = self.result.FullName() - params = ', '.join([x.FullName() for x in self.parameters]) - return '(%s (*)(%s))&%s' % (result, params, self.FullName()) - - - def _MinArgs(self): - min = 0 - for arg in self.parameters: - if arg.default is None: - min += 1 - return min - - minArgs = property(_MinArgs) - - - def _MaxArgs(self): - return len(self.parameters) - - maxArgs = property(_MaxArgs) - - - -class Operator(Function): - 'The declaration of a custom operator.' - def FullName(self): - namespace = self.namespace or '' - if not namespace.endswith('::'): - namespace += '::' - return namespace + 'operator' + self.name - - - -class Method(Function): - 'The declaration of a method.' - - def __init__(self, name, class_, result, params, visib, virtual, abstract, static, const): - Function.__init__(self, name, None, result, params) - self.visibility = visib - self.virtual = virtual - self.abstract = abstract - self.static = static - self.class_ = class_ - self.const = const - - - def FullName(self): - return self.class_ + '::' + self.name - - - def PointerDeclaration(self): - 'returns a declaration of a pointer to this function' - result = self.result.FullName() - params = ', '.join([x.FullName() for x in self.parameters]) - const = '' - if self.const: - const = 'const' - return '(%s (%s::*)(%s) %s)&%s' %\ - (result, self.class_, params, const, self.FullName()) - - -class Constructor(Method): - 'A constructor of a class.' - - def __init__(self, name, class_, params, visib): - Method.__init__(self, name, class_, None, params, visib, False, False, False, False) - - - def IsDefault(self): - return len(self.parameters) == 0 - - - def IsCopy(self): - if len(self.parameters) != 1: - return False - param = self.parameters[0] - class_as_param = self.parameters[0].name == self.class_ - param_reference = isinstance(param, ReferenceType) - return param_reference and class_as_param and param.const - - -class Destructor(Method): - 'The destructor of a class.' - - def __init__(self, name, class_, visib, virtual): - Method.__init__(self, name, class_, None, [], visib, virtual, False, False, False) - - def FullName(self): - return self.class_ + '::~' + self.name - - - -class ClassOperator(Method): - 'The declaration of a custom operator in a class.' - - def FullName(self): - return self.class_ + '::operator ' + self.name - - - -class ConverterOperator(ClassOperator): - 'An operator in the form "operator OtherClass()".' - - def FullName(self): - return self.class_ + '::operator ' + self.result.name - - - -class Type(Declaration): - 'Represents a type.' - - def __init__(self, name, const=False, default=None): - Declaration.__init__(self, name, None) - # whatever the type is constant or not - self.const = const - # used when the Type is a function argument - self.default = default - self.volatile = False - - def __repr__(self): - if self.const: - const = 'const ' - else: - const = '' - return '' - - - def FullName(self): - if self.const: - const = 'const ' - else: - const = '' - return const + self.name - - - -class ArrayType(Type): - 'Represents an array.' - - def __init__(self, name, min, max, const=False): - 'min and max can be None.' - Type.__init__(self, name, const) - self.min = min - self.max = max - - - -class ReferenceType(Type): - 'A reference type.' - - def __init__(self, name, const=False, default=None, expandRef=True): - Type.__init__(self, name, const, default) - self.expand = expandRef - - - def FullName(self): - 'expand is False for function pointers' - expand = ' &' - if not self.expand: - expand = '' - return Type.FullName(self) + expand - - - -class PointerType(Type): - 'A pointer type.' - - def __init__(self, name, const=False, default=None, expandPointer=False): - Type.__init__(self, name, const, default) - self.expand = expandPointer - - - def FullName(self): - 'expand is False for function pointer' - expand = ' *' - if not self.expand: - expand = '' - return Type.FullName(self) + expand - - - -class FundamentalType(Type): - 'One of the fundamental types (int, void...).' - - def __init__(self, name, const=False): - Type.__init__(self, name, const) - - - -class FunctionType(Type): - 'A pointer to a function.' - - def __init__(self, result, params): - Type.__init__(self, '', False) - self.result = result - self.parameters = params - self.name = self.FullName() - - - def FullName(self): - full = '%s (*)' % self.result.FullName() - params = [x.FullName() for x in self.parameters] - full += '(%s)' % ', '.join(params) - return full - - - -class MethodType(FunctionType): - 'A pointer to a member function of a class.' - - def __init__(self, result, params, class_): - Type.__init__(self, '', False) - self.result = result - self.parameters = params - self.class_ = class_ - self.name = self.FullName() - - def FullName(self): - full = '%s (%s::*)' % (self.result.FullName(), self.class_) - params = [x.FullName() for x in self.parameters] - full += '(%s)' % ', '.join(params) - return full - - - -class Variable(Declaration): - 'Represents a global variable.' - - def __init__(self, type, name, namespace): - Declaration.__init__(self, name, namespace) - # instance of Type - self.type = type - - - -class ClassVariable(Variable): - 'Represents a class variable.' - - def __init__(self, type, name, class_, visib, static): - Variable.__init__(self, type, name, None) - self.visibility = visib - self.static = static - self.class_ = class_ - - - def FullName(self): - return self.class_ + '::' + self.name - - - -class Enumeration(Declaration): - - def __init__(self, name, namespace): - Declaration.__init__(self, name, namespace) - self.values = {} # dict of str => int - - def ValueFullName(self, name): - assert name in self.values - namespace = self.namespace - if namespace: - namespace += '::' - return namespace + name - - - -class ClassEnumeration(Enumeration): - - def __init__(self, name, class_, visib): - Enumeration.__init__(self, name, None) - self.class_ = class_ - self.visibility = visib - - - def FullName(self): - return '%s::%s' % (self.class_, self.name) - - - def ValueFullName(self, name): - assert name in self.values - return '%s::%s' % (self.class_, name) - - - -class Typedef(Declaration): - - def __init__(self, type, name, namespace): - Declaration.__init__(self, name, namespace) - self.type = type - self.visibility = Scope.public - - -class Union(Declaration): - 'Shallow declaration, because Unions are not supported yet' - def __init__(self, name, namespace): - Declaration.__init__(self, name, namespace) - - -class ClassUnion(Union): - - def __init__(self, name, class_, visib): - Union.__init__(self, name, None) - self.class_ = class_ - self.visibility = visib - - def FullName(self): - return '%s::%s' % (self.class_, self.name) - - diff --git a/pyste/src/enumerate.py b/pyste/src/enumerate.py deleted file mode 100644 index 099e42ba..00000000 --- a/pyste/src/enumerate.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import generators - -def enumerate(seq): - i = 0 - for x in seq: - yield i, x - i += 1 diff --git a/pyste/src/exporters.py b/pyste/src/exporters.py deleted file mode 100644 index 65536780..00000000 --- a/pyste/src/exporters.py +++ /dev/null @@ -1,3 +0,0 @@ - -# a list of Exporter instances -exporters = [] diff --git a/pyste/src/exporterutils.py b/pyste/src/exporterutils.py deleted file mode 100644 index 5134a1e5..00000000 --- a/pyste/src/exporterutils.py +++ /dev/null @@ -1,26 +0,0 @@ -''' -Various helpers for interface files. -''' - -from settings import * - -#============================================================================== -# FunctionWrapper -#============================================================================== -class FunctionWrapper(object): - '''Holds information about a wrapper for a function or a method. It is in 2 - parts: the name of the Wrapper, and its code. The code is placed in the - declaration section of the module, while the name is used to def' the - function or method (with the pyste namespace prepend to it). If code is None, - the name is left unchanged. - ''' - - def __init__(self, name, code=None): - self.name = name - self.code = code - - def FullName(self): - if self.code: - return namespaces.pyste + self.name - else: - return self.name diff --git a/pyste/src/infos.py b/pyste/src/infos.py deleted file mode 100644 index ce8334c5..00000000 --- a/pyste/src/infos.py +++ /dev/null @@ -1,187 +0,0 @@ -import os.path -import copy -import exporters -from ClassExporter import ClassExporter -from FunctionExporter import FunctionExporter -from IncludeExporter import IncludeExporter -from EnumExporter import EnumExporter -from HeaderExporter import HeaderExporter -from exporterutils import FunctionWrapper - - -#============================================================================== -# DeclarationInfo -#============================================================================== -class DeclarationInfo: - - def __init__(self, otherInfo=None): - self.__infos = {} - self.__attributes = {} - if otherInfo is not None: - self.__infos = copy.deepcopy(otherInfo.__infos) - self.__attributes = copy.deepcopy(otherInfo.__attributes) - - - def __getitem__(self, name): - 'Used to access sub-infos' - if name.startswith('__'): - raise AttributeError - default = DeclarationInfo() - default._Attribute('name', name) - return self.__infos.setdefault(name, default) - - - def __getattr__(self, name): - return self[name] - - - def _Attribute(self, name, value=None): - if value is None: - # get value - return self.__attributes.get(name) - else: - # set value - self.__attributes[name] = value - - -#============================================================================== -# FunctionInfo -#============================================================================== -class FunctionInfo(DeclarationInfo): - - def __init__(self, name, include, tail=None, otherOption=None): - DeclarationInfo.__init__(self, otherOption) - self._Attribute('name', name) - self._Attribute('include', include) - # create a FunctionExporter - exporter = FunctionExporter(InfoWrapper(self), tail) - exporters.exporters.append(exporter) - - -#============================================================================== -# ClassInfo -#============================================================================== -class ClassInfo(DeclarationInfo): - - def __init__(self, name, include, tail=None, otherInfo=None): - DeclarationInfo.__init__(self, otherInfo) - self._Attribute('name', name) - self._Attribute('include', include) - # create a ClassExporter - exporter = ClassExporter(InfoWrapper(self), tail) - exporters.exporters.append(exporter) - - -#============================================================================== -# IncludeInfo -#============================================================================== -class IncludeInfo(DeclarationInfo): - - def __init__(self, include): - DeclarationInfo.__init__(self) - self._Attribute('include', include) - exporter = IncludeExporter(InfoWrapper(self)) - exporters.exporters.append(exporter) - - -#============================================================================== -# templates -#============================================================================== -def GenerateName(name, type_list): - name = name.replace('::', '_') - names = [name] + type_list - return '_'.join(names) - - -class ClassTemplateInfo(DeclarationInfo): - - def __init__(self, name, include): - DeclarationInfo.__init__(self) - self._Attribute('name', name) - self._Attribute('include', include) - - - def Instantiate(self, type_list, rename=None): - if not rename: - rename = GenerateName(self._Attribute('name'), type_list) - # generate code to instantiate the template - types = ', '.join(type_list) - tail = 'typedef %s< %s > %s;\n' % (self._Attribute('name'), types, rename) - tail += 'void __instantiate_%s()\n' % rename - tail += '{ sizeof(%s); }\n\n' % rename - # create a ClassInfo - class_ = ClassInfo(rename, self._Attribute('include'), tail, self) - return class_ - - - def __call__(self, types, rename=None): - if isinstance(types, str): - types = types.split() - return self.Instantiate(types, rename) - -#============================================================================== -# EnumInfo -#============================================================================== -class EnumInfo(DeclarationInfo): - - def __init__(self, name, include): - DeclarationInfo.__init__(self) - self._Attribute('name', name) - self._Attribute('include', include) - exporter = EnumExporter(InfoWrapper(self)) - exporters.exporters.append(exporter) - - -#============================================================================== -# HeaderInfo -#============================================================================== -class HeaderInfo(DeclarationInfo): - - def __init__(self, include): - DeclarationInfo.__init__(self) - self._Attribute('include', include) - exporter = HeaderExporter(InfoWrapper(self)) - exporters.exporters.append(exporter) - - -#============================================================================== -# InfoWrapper -#============================================================================== -class InfoWrapper: - 'Provides a nicer interface for a info' - - def __init__(self, info): - self.__dict__['_info'] = info # so __setattr__ is not called - - def __getitem__(self, name): - return InfoWrapper(self._info[name]) - - def __getattr__(self, name): - return self._info._Attribute(name) - - def __setattr__(self, name, value): - self._info._Attribute(name, value) - - -#============================================================================== -# Functions -#============================================================================== -def exclude(option): - option._Attribute('exclude', True) - -def set_policy(option, policy): - option._Attribute('policy', policy) - -def rename(option, name): - option._Attribute('rename', name) - -def set_wrapper(option, wrapper): - if isinstance(wrapper, str): - wrapper = FunctionWrapper(wrapper) - option._Attribute('wrapper', wrapper) - -def instantiate(template, types, rename=None): - if isinstance(types, str): - types = types.split() - return template.Instantiate(types, rename) - diff --git a/pyste/src/policies.py b/pyste/src/policies.py deleted file mode 100644 index 977e7f92..00000000 --- a/pyste/src/policies.py +++ /dev/null @@ -1,75 +0,0 @@ - - -class Policy: - 'Represents one of the call policies of boost.python.' - - def __init__(self): - raise RuntimeError, "Can't create an instance of the class Policy" - - - def Code(self): - 'Returns the string corresponding to a instancialization of the policy.' - pass - - - def _next(self): - if self.next is not None: - return ', %s >' % self.next.Code() - else: - return ' >' - - - -class return_internal_reference(Policy): - 'Ties the return value to one of the parameters.' - - def __init__(self, param=1, next=None): - ''' - param is the position of the parameter, or None for "self". - next indicates the next policy, or None. - ''' - self.param = param - self.next=next - - - def Code(self): - c = 'return_internal_reference< %i' % self.param - c += self._next() - return c - - - -class with_custodian_and_ward(Policy): - 'Ties lifetime of two arguments of a function.' - - def __init__(self, custodian, ward, next=None): - self.custodian = custodian - self.ward = ward - self.next = next - - def Code(self): - c = 'with_custodian_and_ward< %i, %i' % (self.custodian, self.ward) - c += self._next() - return c - - - -class return_value_policy(Policy): - 'Policy to convert return values.' - - def __init__(self, which, next=None): - self.which = which - self.next = next - - - def Code(self): - c = 'return_value_policy< %s' % self.which - c += self._next() - return c - - -# values for return_value_policy -reference_existing_object = 'reference_existing_object' -copy_const_reference = 'copy_const_reference' -copy_non_const_reference = 'copy_non_const_reference' -manage_new_object = 'manage_new_object' diff --git a/pyste/src/pyste-profile.py b/pyste/src/pyste-profile.py deleted file mode 100644 index d7afff45..00000000 --- a/pyste/src/pyste-profile.py +++ /dev/null @@ -1,17 +0,0 @@ -import profile -import pstats -import pyste - -import psyco -import elementtree.XMLTreeBuilder as XMLTreeBuilder -import GCCXMLParser - - -if __name__ == '__main__': - #psyco.bind(XMLTreeBuilder.fixtext) - #psyco.bind(XMLTreeBuilder.fixname) - #psyco.bind(XMLTreeBuilder.TreeBuilder) - #psyco.bind(GCCXMLParser.GCCXMLParser) - profile.run('pyste.Main()', 'profile') - p = pstats.Stats('profile') - p.strip_dirs().sort_stats(-1).print_stats() diff --git a/pyste/src/pyste.py b/pyste/src/pyste.py deleted file mode 100644 index 090c7fd9..00000000 --- a/pyste/src/pyste.py +++ /dev/null @@ -1,154 +0,0 @@ -''' -Usage: - pyste [options] --module= interface-files - -where options are: - -I add an include path - -D define symbol - --no-using do not declare "using namespace boost"; - use explicit declarations instead - --pyste-ns= set the namespace where new types will be declared; - default is "pyste" -''' - -import sys -import os -import getopt -import exporters -import CodeUnit -import infos -import exporterutils -import settings -from policies import * -from CppParser import CppParser, CppParserError -from Exporter import Exporter -from FunctionExporter import FunctionExporter -from ClassExporter import ClassExporter -from IncludeExporter import IncludeExporter -from HeaderExporter import HeaderExporter - - -def GetDefaultIncludes(): - if 'INCLUDE' in os.environ: - include = os.environ['INCLUDE'] - return include.split(os.pathsep) - else: - return [] - - -def ParseArguments(): - - def Usage(): - print __doc__ - sys.exit(1) - - options, files = getopt.getopt(sys.argv[1:], 'I:D:', ['module=', 'out=', 'no-using', 'pyste-ns=', 'debug']) - includes = GetDefaultIncludes() - defines = [] - module = None - out = None - for opt, value in options: - if opt == '-I': - includes.append(value) - elif opt == '-D': - defines.append(value) - elif opt == '--module': - module = value - elif opt == '--out': - out = value - elif opt == '--no-using': - settings.namespaces.python = 'boost::python::' - CodeUnit.CodeUnit.USING_BOOST_NS = False - elif opt == '--pyste-ns': - settings.namespaces.pyste = value + '::' - elif opt == '--debug': - settings.DEBUG = True - else: - print 'Unknown option:', opt - Usage() - - if not files or not module: - Usage() - if not out: - out = module + '.cpp' - return includes, defines, module, out, files - - -def CreateContext(): - 'create the context where a interface file can be executed' - context = {} - # infos - context['Function'] = infos.FunctionInfo - context['Class'] = infos.ClassInfo - context['Include'] = infos.IncludeInfo - context['Template'] = infos.ClassTemplateInfo - context['Enum'] = infos.EnumInfo - context['AllFromHeader'] = infos.HeaderInfo - # functions - context['rename'] = infos.rename - context['set_policy'] = infos.set_policy - context['exclude'] = infos.exclude - context['set_wrapper'] = infos.set_wrapper - # policies - context['return_internal_reference'] = return_internal_reference - context['with_custodian_and_ward'] = with_custodian_and_ward - context['return_value_policy'] = return_value_policy - context['reference_existing_object'] = reference_existing_object - context['copy_const_reference'] = copy_const_reference - context['copy_non_const_reference'] = copy_non_const_reference - context['manage_new_object'] = manage_new_object - # utils - context['Wrapper'] = exporterutils.FunctionWrapper - return context - - -def Main(): - includes, defines, module, out, interfaces = ParseArguments() - # execute the interface files - for interface in interfaces: - context = CreateContext() - execfile(interface, context) - # parse all the C++ code - parser = CppParser(includes, defines) - exports = exporters.exporters[:] - for export in exports: - try: - export.Parse(parser) - except CppParserError, e: - print '\n' - print '***', e, ': exitting' - return 2 - print - # sort the exporters by its order - exports = [(x.Order(), x) for x in exporters.exporters] - exports.sort() - exports = [x for _, x in exports] - # now generate the wrapper code - codeunit = CodeUnit.CodeUnit(module) - exported_names = [] - for export in exports: - export.GenerateCode(codeunit, exported_names) - exported_names.append(export.Name()) - codeunit.Save(out) - print 'Module %s generated' % module - return 0 - - -def UsePsyco(): - 'Tries to use psyco if it is installed' - try: - import psyco - import elementtree.XMLTreeBuilder as XMLTreeBuilder - import GCCXMLParser - - psyco.bind(XMLTreeBuilder.fixtext) - psyco.bind(XMLTreeBuilder.fixname) - psyco.bind(XMLTreeBuilder.TreeBuilder) - psyco.bind(GCCXMLParser.GCCXMLParser) - except ImportError: pass - - -if __name__ == '__main__': - UsePsyco() - status = Main() - sys.exit(status) diff --git a/pyste/src/settings.py b/pyste/src/settings.py deleted file mode 100644 index e5adfc25..00000000 --- a/pyste/src/settings.py +++ /dev/null @@ -1,12 +0,0 @@ - -#============================================================================== -# Global information -#============================================================================== - -DEBUG = False - -class namespaces: - boost = 'boost::' - pyste = '' - python = '' # default is to not use boost::python namespace explicitly, so - # use the "using namespace" statement instead diff --git a/pyste/tests/build_pyste_nt.bat b/pyste/tests/build_pyste_nt.bat deleted file mode 100644 index 7f9d5817..00000000 --- a/pyste/tests/build_pyste_nt.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -setlocal -set MODULE_NAME=%1 -set PYSTE_FILE=%2 -set BOOST_ROOT=d:/programming/libraries/boost-cvs -set PYTHON_ROOT=c:/python -set STLPORT_ROOT=d:/programming/libraries/stlport-4.5.3 -set PYSTE_FILE_DIR=%@PATH[%PYSTE_FILE] - -python ../src/pyste.py -I%PYSTE_FILE_DIR --out=%MODULE_NAME.cpp --module=%MODULE_NAME %PYSTE_FILE - -icl /nologo /LD /GR /GX -I%PYSTE_FILE_DIR -I%STLPORT_ROOT/stlport -I%BOOST_ROOT/boost -I%PYTHON_ROOT/include %MODULE_NAME.cpp /link /libpath:%PYTHON_ROOT/libs /libpath:%BOOST_ROOT/lib /libpath:%STLPORT_ROOT/lib boost_python.lib - -rm %MODULE_NAME.cpp -rm %MODULE_NAME.exp -rm %MODULE_NAME.lib -rm %MODULE_NAME.obj - -endlocal diff --git a/pyste/tests/example_basicUT.py b/pyste/tests/example_basicUT.py deleted file mode 100644 index 813b4f02..00000000 --- a/pyste/tests/example_basicUT.py +++ /dev/null @@ -1,27 +0,0 @@ -import unittest -import os - -class BasicExampleTest(unittest.TestCase): - - def testIt(self): - from basic import C, call_f - - class D(C): - def f(self, x=10): - return x+1 - - d = D() - c = C() - - self.assertEqual(c.f(), 20) - self.assertEqual(c.f(3), 6) - self.assertEqual(d.f(), 11) - self.assertEqual(d.f(3), 4) - self.assertEqual(call_f(c), 20) - self.assertEqual(call_f(c, 4), 8) - self.assertEqual(call_f(d), 11) - self.assertEqual(call_f(d, 3), 4) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/example_enumsUT.py b/pyste/tests/example_enumsUT.py deleted file mode 100644 index 01e3bdd8..00000000 --- a/pyste/tests/example_enumsUT.py +++ /dev/null @@ -1,18 +0,0 @@ -import unittest -from enums import * - -class EnumsTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(int(color.Red), 0) - self.assertEqual(int(color.Blue), 1) - - self.assertEqual(int(X.Choices.Good), 1) - self.assertEqual(int(X.Choices.Bad), 2) - x = X() - self.assertEqual(x.set(x.Choices.Good), 1) - self.assertEqual(x.set(x.Choices.Bad), 2) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/example_header_testUT.py b/pyste/tests/example_header_testUT.py deleted file mode 100644 index 1f57a9bf..00000000 --- a/pyste/tests/example_header_testUT.py +++ /dev/null @@ -1,15 +0,0 @@ -import unittest -from header_test import * - -class HeaderTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(choice.red, 0) - self.assertEqual(choice.blue, 1) - self.assertEqual(choice_str(choice.blue), 'blue') - self.assertEqual(choice_str(choice.red), 'red') - c = C() - c.c = choice.blue - self.assertEqual(c.get(), 'blue') - c.c = choice.red - self.assertEqual(c.get(), 'red') diff --git a/pyste/tests/example_nested.py b/pyste/tests/example_nested.py deleted file mode 100644 index 7c1685bc..00000000 --- a/pyste/tests/example_nested.py +++ /dev/null @@ -1,15 +0,0 @@ -import unittest -from nested import * - -class NestedTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(Root.staticXValue, 10) - self.assertEqual(Root.Y.staticYValue, 20) - z = Root.Y.Z() - z.valueZ = 3 - self.assertEqual(z.valueZ, 3) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/example_operatorsUT.py b/pyste/tests/example_operatorsUT.py deleted file mode 100644 index 345a3a17..00000000 --- a/pyste/tests/example_operatorsUT.py +++ /dev/null @@ -1,25 +0,0 @@ -import unittest -from operators import * - -class OperatorTest(unittest.TestCase): - - def testIt(self): - c = C() - c.value = 3.0 - d = C() - d.value = 2.0 - self.assertEqual(c.x, 10) - self.assertEqual(C.x, 10) - self.assertEqual(C.x, 10) - self.assertEqual((c * d).value, 6.0) - self.assertEqual((c + d).value, 5.0) - self.assertEqual(int(c), 3) - self.assertEqual(int(d), 2) - self.assertEqual(c(), 10) - self.assertEqual(d(), 10) - self.assertEqual(c(3.0), 13.0) - self.assertEqual(d(6.0), 16.0) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/example_templatesUT.py b/pyste/tests/example_templatesUT.py deleted file mode 100644 index fe897c1b..00000000 --- a/pyste/tests/example_templatesUT.py +++ /dev/null @@ -1,26 +0,0 @@ -import unittest -from templates import * - -class TemplatesTest(unittest.TestCase): - - def testIt(self): - fp = FPoint() - fp.i = 3.0 - fp.j = 4 - ip = IPoint() - ip.x = 10 - ip.y = 3.0 - - self.assertEqual(fp.i, 3.0) - self.assertEqual(fp.j, 4) - self.assertEqual(ip.x, 10) - self.assertEqual(ip.y, 3.0) - self.assertEqual(type(fp.i), float) - self.assertEqual(type(fp.j), int) - self.assertEqual(type(ip.x), int) - self.assertEqual(type(ip.y), float) - - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/example_virtual.py b/pyste/tests/example_virtual.py deleted file mode 100644 index 66b25c24..00000000 --- a/pyste/tests/example_virtual.py +++ /dev/null @@ -1,31 +0,0 @@ -import unittest -from virtual import * - -class VirtualTest(unittest.TestCase): - - def testIt(self): - - class D(C): - def f_abs(self): - return 3 - - class E(C): - def f(self): - return 10 - def name(self): - return 'E' - - d = D() - e = E() - - self.assertEqual(d.f(), 3) - self.assertEqual(call_f(d), 3) - self.assertEqual(e.f(), 10) - self.assertEqual(call_f(e), 10) - self.assertEqual(d.get_name(), 'C') - self.assertEqual(e.get_name(), 'E') - - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/example_wrappertestUT.py b/pyste/tests/example_wrappertestUT.py deleted file mode 100644 index ebffed2d..00000000 --- a/pyste/tests/example_wrappertestUT.py +++ /dev/null @@ -1,11 +0,0 @@ -import unittest -from wrappertest import * - -class WrapperTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(Range(10), range(10)) - self.assertEqual(C().Mul(10), [x*10 for x in range(10)]) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/test_all.bat b/pyste/tests/test_all.bat deleted file mode 100644 index 89685f0d..00000000 --- a/pyste/tests/test_all.bat +++ /dev/null @@ -1,20 +0,0 @@ -@echo off -call build_pyste_nt basic ../example/basic.pyste -call build_pyste_nt enums ../example/enums.pyste -call build_pyste_nt header_test ../example/header_test.pyste -call build_pyste_nt nested ../example/nested.pyste -call build_pyste_nt operators ../example/operators.pyste -call build_pyste_nt templates ../example/templates.pyste -call build_pyste_nt virtual ../example/virtual.pyste -call build_pyste_nt wrappertest ../example/wrappertest.pyste -call build_pyste_nt unions ../example/unions.pyste - - -runtests.py - -if errorlevel != 0 goto end - -rm *.dll -rm *.pyc - -:end