--- /dev/null
+#
+# Pyrex - Builtin Definitions
+#
+
+from Symtab import BuiltinScope
+from TypeSlots import Signature
+
+builtin_function_table = [
+ # name, args, return, C API func, has py equiv = True
+ ('abs', "O", "O", "PyNumber_Absolute"),
+ #('chr', "", "", ""),
+ #('cmp', "", "", "", ""), # int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
+ #('compile', "", "", ""), # PyObject* Py_CompileString( char *str, char *filename, int start)
+ ('delattr', "OO", "r", "PyObject_DelAttr"),
+ ('dir', "O", "O", "PyObject_Dir"),
+ ('divmod', "OO", "O", "PyNumber_Divmod"),
+ #('eval', "", "", ""),
+ #('execfile', "", "", ""),
+ #('filter', "", "", ""),
+ ('getattr', "OO", "O", "PyObject_GetAttr"),
+ ('hasattr', "OO", "i", "PyObject_HasAttr"),
+ ('hash', "O", "i", "PyObject_Hash"),
+ #('hex', "", "", ""),
+ #('id', "", "", ""),
+ #('input', "", "", ""),
+ ('intern', "s", "O", "PyString_InternFromString"),
+ ('isinstance', "OO", "i", "PyObject_IsInstance"),
+ ('issubclass', "OO", "i", "PyObject_IsSubclass"),
+ ('iter', "O", "O", "PyObject_GetIter"),
+ ('len', "O", "Z", "PyObject_Length"),
+ #('map', "", "", ""),
+ #('max', "", "", ""),
+ #('min', "", "", ""),
+ #('oct', "", "", ""),
+ # Not worth doing open, when second argument would become mandatory
+ #('open', "ss", "O", "PyFile_FromString"),
+ #('ord', "", "", ""),
+ ('pow', "OOO", "O", "PyNumber_Power"),
+ #('range', "", "", ""),
+ #('raw_input', "", "", ""),
+ #('reduce', "", "", ""),
+ ('reload', "O", "O", "PyImport_ReloadModule"),
+ ('repr', "O", "O", "PyObject_Repr"),
+ #('round', "", "", ""),
+ ('setattr', "OOO", "r", "PyObject_SetAttr"),
+ #('sum', "", "", ""),
+ #('unichr', "", "", ""),
+ #('unicode', "", "", ""),
+ #('vars', "", "", ""),
+ #('zip', "", "", ""),
+ # Can't do these easily until we have builtin type entries.
+ #('typecheck', "OO", "i", "PyObject_TypeCheck", False),
+ #('issubtype', "OO", "i", "PyType_IsSubtype", False),
+]
+
+# Builtin types
+# bool
+# buffer
+# classmethod
+# dict
+# enumerate
+# file
+# float
+# int
+# list
+# long
+# object
+# property
+# slice
+# staticmethod
+# super
+# str
+# tuple
+# type
+# xrange
+
+builtin_scope = BuiltinScope()
+
+def declare_builtin_func(name, args, ret, cname, py_equiv = 1):
+ sig = Signature(args, ret)
+ type = sig.function_type()
+ builtin_scope.declare_builtin_cfunction(name, type, cname, py_equiv)
+
+def init_builtin_funcs():
+ for desc in builtin_function_table:
+ declare_builtin_func(*desc)
+
+def init_builtins():
+ init_builtin_funcs()
+
+init_builtins()
--- /dev/null
+"""Pyrex.Distutils.extension
+
+Provides a modified Extension class, that understands hou to describe
+Pyrex extension modules in setup scripts."""
+
+__revision__ = "$Id:$"
+
+import os, string, sys
+from types import *
+import distutils.extension as _Extension
+
+try:
+ import warnings
+except ImportError:
+ warnings = None
+
+class Extension(_Extension.Extension):
+ _Extension.Extension.__doc__ + \
+ """pyrex_include_dirs : [string]
+ list of directories to search for Pyrex header files (.pxd) (in
+ Unix form for portability)
+ pyrex_create_listing_file : boolean
+ write pyrex error messages to a listing (.lis) file.
+ pyrex_cplus : boolean
+ use the C++ compiler for compiling and linking.
+ pyrex_c_in_temp : boolean
+ put generated C files in temp directory.
+ pyrex_gen_pxi : boolean
+ generate .pxi file for public declarations
+ """
+
+ # When adding arguments to this constructor, be sure to update
+ # user_options.extend in build_ext.py.
+ def __init__ (self, name, sources,
+ include_dirs = None,
+ define_macros = None,
+ undef_macros = None,
+ library_dirs = None,
+ libraries = None,
+ runtime_library_dirs = None,
+ extra_objects = None,
+ extra_compile_args = None,
+ extra_link_args = None,
+ export_symbols = None,
+ swig_opts = None,
+ depends = None,
+ language = None,
+ pyrex_include_dirs = None,
+ pyrex_create_listing = 0,
+ pyrex_cplus = 0,
+ pyrex_c_in_temp = 0,
+ pyrex_gen_pxi = 0,
+ **kw):
+
+ _Extension.Extension.__init__(self, name, sources,
+ include_dirs = include_dirs,
+ define_macros = define_macros,
+ undef_macros = undef_macros,
+ library_dirs = library_dirs,
+ libraries = libraries,
+ runtime_library_dirs = runtime_library_dirs,
+ extra_objects = extra_objects,
+ extra_compile_args = extra_compile_args,
+ extra_link_args = extra_link_args,
+ export_symbols = export_symbols,
+ swig_opts = swig_opts,
+ depends = depends,
+ language = language,
+ **kw)
+
+ self.pyrex_include_dirs = pyrex_include_dirs or []
+ self.pyrex_create_listing = pyrex_create_listing
+ self.pyrex_cplus = pyrex_cplus
+ self.pyrex_c_in_temp = pyrex_c_in_temp
+ self.pyrex_gen_pxi = pyrex_gen_pxi
+
+# class Extension
+
+read_setup_file = _Extension.read_setup_file
--- /dev/null
+# July 2002, Graham Fawcett
+
+#
+
+# this hack was inspired by the way Thomas Heller got py2exe
+
+# to appear as a distutil command
+
+#
+
+# we replace distutils.command.build_ext with our own version
+
+# and keep the old one under the module name _build_ext,
+
+# so that *our* build_ext can make use of it.
+
+
+
+from build_ext import build_ext
+
+
+
--- /dev/null
+# Subclasses disutils.command.build_ext,
+# replacing it with a Pyrex version that compiles pyx->c
+# before calling the original build_ext command.
+# July 2002, Graham Fawcett
+# Modified by Darrell Gallion <dgallion1@yahoo.com>
+# to allow inclusion of .c files along with .pyx files.
+# Pyrex is (c) Greg Ewing.
+
+import distutils.command.build_ext
+#import Pyrex.Compiler.Main
+from Pyrex.Compiler.Main import CompilationOptions, default_options, compile
+from Pyrex.Compiler.Errors import PyrexError
+from distutils.dep_util import newer
+import os
+import sys
+
+def replace_suffix(path, new_suffix):
+ return os.path.splitext(path)[0] + new_suffix
+
+class build_ext (distutils.command.build_ext.build_ext):
+
+ description = "compile Pyrex scripts, then build C/C++ extensions (compile/link to build directory)"
+
+ def finalize_options (self):
+ distutils.command.build_ext.build_ext.finalize_options(self)
+
+ # The following hack should no longer be needed.
+ if 0:
+ # compiling with mingw32 gets an "initializer not a constant" error
+ # doesn't appear to happen with MSVC!
+ # so if we are compiling with mingw32,
+ # switch to C++ mode, to avoid the problem
+ if self.compiler == 'mingw32':
+ self.swig_cpp = 1
+
+ def swig_sources (self, sources, extension = None):
+ if not self.extensions:
+ return
+
+ # collect the names of the source (.pyx) files
+ pyx_sources = []
+ pyx_sources = [source for source in sources if source.endswith('.pyx')]
+ other_sources = [source for source in sources if not source.endswith('.pyx')]
+
+ #suffix = self.swig_cpp and '.cpp' or '.c'
+ suffix = '.c'
+ for pyx in pyx_sources:
+ # should I raise an exception if it doesn't exist?
+ if os.path.exists(pyx):
+ source = pyx
+ target = replace_suffix(source, suffix)
+ if newer(source, target) or self.force:
+ self.pyrex_compile(source)
+
+ return [replace_suffix(src, suffix) for src in pyx_sources] + other_sources
+
+ def pyrex_compile(self, source):
+ options = CompilationOptions(default_options,
+ include_path = self.include_dirs)
+ result = compile(source, options)
+ if result.num_errors <> 0:
+ sys.exit(1)
+
--- /dev/null
+#
+# Setup file for compiling _Filemodule_patched.c
+#
+
+from distutils.core import setup
+from distutils.extension import Extension
+
+setup(
+ ext_modules = [
+ Extension("_File", ["_Filemodule_patched.c"])
+ ]
+)