summaryrefslogtreecommitdiffstats
path: root/debian/pyrex/pyrex-0.9.9/Pyrex/Compiler/Code.py
diff options
context:
space:
mode:
Diffstat (limited to 'debian/pyrex/pyrex-0.9.9/Pyrex/Compiler/Code.py')
-rw-r--r--debian/pyrex/pyrex-0.9.9/Pyrex/Compiler/Code.py546
1 files changed, 0 insertions, 546 deletions
diff --git a/debian/pyrex/pyrex-0.9.9/Pyrex/Compiler/Code.py b/debian/pyrex/pyrex-0.9.9/Pyrex/Compiler/Code.py
deleted file mode 100644
index a47692bb..00000000
--- a/debian/pyrex/pyrex-0.9.9/Pyrex/Compiler/Code.py
+++ /dev/null
@@ -1,546 +0,0 @@
-##########################################################################
-#
-# Pyrex - Code output module
-#
-##########################################################################
-
-import os, re
-import Naming
-from Pyrex.Utils import open_new_file
-from PyrexTypes import py_object_type, c_char_array_type, typecast
-
-identifier_pattern = re.compile(r"[A-Za-z_][A-Za-z0-9_]*$")
-max_intern_length = 30
-
-class CCodeWriter:
- # f file output file
- # level int indentation level
- # bol bool beginning of line?
- # marker string comment to emit before next line
-
- def __init__(self, f):
- #self.f = open_new_file(outfile_name)
- self.f = f
- self.level = 0
- self.bol = 1
- self.marker = None
-
- def putln(self, code = ""):
- if self.marker and self.bol:
- self.emit_marker()
- if code:
- self.put(code)
- self.f.write("\n");
- self.bol = 1
-
- def emit_marker(self):
- self.f.write("\n");
- self.indent()
- self.f.write("/* %s */\n" % self.marker)
- self.marker = None
-
- def put(self, code):
- dl = code.count("{") - code.count("}")
- if dl < 0:
- self.level += dl
- if self.bol:
- self.indent()
- self.f.write(code)
- self.bol = 0
- if dl > 0:
- self.level += dl
-
- def increase_indent(self):
- self.level = self.level + 1
-
- def decrease_indent(self):
- self.level = self.level - 1
-
- def begin_block(self):
- self.putln("{")
- self.increase_indent()
-
- def end_block(self):
- self.decrease_indent()
- self.putln("}")
-
- def indent(self):
- self.f.write(" " * self.level)
-
- def mark_pos(self, pos):
- file, line, col = pos
- self.marker = '"%s":%s' % (file, line)
-
- def put_var_declarations(self, entries, static = 0, dll_linkage = None,
- definition = True):
- for entry in entries:
- if not entry.in_cinclude:
- self.put_var_declaration(entry, static, dll_linkage, definition)
-
- def put_var_declaration(self, entry, static = 0, dll_linkage = None,
- definition = True):
- #print "Code.put_var_declaration:", entry.name, repr(entry.type) ###
- visibility = entry.visibility
- if visibility == 'private' and not definition:
- #print "...private and not definition, skipping" ###
- return
- if not entry.used and visibility == "private":
- #print "not used and private, skipping" ###
- return
- storage_class = ""
- if visibility == 'extern':
- storage_class = Naming.extern_c_macro
- elif visibility == 'public':
- if not definition:
- storage_class = Naming.extern_c_macro
- elif visibility == 'private':
- if static:
- storage_class = "static"
- if storage_class:
- self.put("%s " % storage_class)
- if visibility <> 'public':
- dll_linkage = None
- self.put(entry.type.declaration_code(entry.cname,
- dll_linkage = dll_linkage))
- if entry.init is not None:
- self.put(" = %s" % entry.type.literal_code(entry.init))
- self.putln(";")
-
- def entry_as_pyobject(self, entry):
- type = entry.type
- if (not entry.is_self_arg and not entry.type.is_complete()) \
- or (entry.type.is_extension_type and entry.type.base_type):
- return "(PyObject *)" + entry.cname
- else:
- return entry.cname
-
- def as_pyobject(self, cname, type):
- if type:
- return typecast(py_object_type, type, cname)
- else:
- return cname
-
- def put_incref(self, cname, type = None):
- self.putln("Py_INCREF(%s);" % self.as_pyobject(cname, type))
-
- def put_decref(self, cname, type = None):
- self.putln("Py_DECREF(%s);" % self.as_pyobject(cname, type))
-
- def put_var_incref(self, entry):
- if entry.type.is_pyobject:
- self.putln("Py_INCREF(%s);" % self.entry_as_pyobject(entry))
-
- def put_decref_clear(self, cname, type = None):
- self.putln("Py_DECREF(%s); %s = 0;" % (
- self.as_pyobject(cname, type), cname)) # What was wrong with this?
- #typecast(py_object_type, type, cname), cname))
-
- def put_xdecref(self, cname, type):
- self.putln("Py_XDECREF(%s);" % self.as_pyobject(cname, type))
-
- def put_xdecref_clear(self, cname, type):
- self.putln("Py_XDECREF(%s); %s = 0;" % (
- self.as_pyobject(cname, type), cname))
-
- def put_var_decref(self, entry):
- if entry.type.is_pyobject:
- self.putln("Py_DECREF(%s);" % self.entry_as_pyobject(entry))
-
- def put_var_decref_clear(self, entry):
- if entry.type.is_pyobject:
- self.putln("Py_DECREF(%s); %s = 0;" % (
- self.entry_as_pyobject(entry), entry.cname))
-
- def put_var_xdecref(self, entry):
- if entry.type.is_pyobject:
- self.putln("Py_XDECREF(%s);" % self.entry_as_pyobject(entry))
-
- def put_var_xdecref_clear(self, entry):
- if entry.type.is_pyobject:
- self.putln("Py_XDECREF(%s); %s = 0;" % (
- self.entry_as_pyobject(entry), entry.cname))
-
- def put_var_decrefs(self, entries, used_only = 0):
- for entry in entries:
- if not used_only or entry.used:
- if entry.xdecref_cleanup:
- self.put_var_xdecref(entry)
- else:
- self.put_var_decref(entry)
-
- def put_var_xdecrefs(self, entries):
- for entry in entries:
- self.put_var_xdecref(entry)
-
- def put_var_xdecrefs_clear(self, entries):
- for entry in entries:
- self.put_var_xdecref_clear(entry)
-
- def put_init_to_py_none(self, cname, type):
- py_none = typecast(type, py_object_type, "Py_None")
- self.putln("%s = %s; Py_INCREF(Py_None);" % (cname, py_none))
-
- def put_init_var_to_py_none(self, entry, template = "%s"):
- code = template % entry.cname
- self.put_init_to_py_none(code, entry.type)
-
- def put_pymethoddef(self, entry, term):
- if entry.doc:
- doc_code = entry.doc_cname
- else:
- doc_code = 0
- self.putln(
- '{"%s", (PyCFunction)%s, METH_VARARGS|METH_KEYWORDS, %s}%s' % (
- entry.name,
- entry.func_cname,
- doc_code,
- term))
-
- def put_h_guard(self, guard):
- self.putln("#ifndef %s" % guard)
- self.putln("#define %s" % guard)
-
-#--------------------------------------------------------------------------
-
-class MainCCodeWriter(CCodeWriter):
- # Code writer for executable C code.
- #
- # global_state GlobalCodeState module-wide state
- # return_label string function return point label
- # error_label string error catch point label
- # continue_label string loop continue point label
- # break_label string loop break point label
- # label_counter integer counter for naming labels
- # in_try_finally boolean inside try of try...finally
- # exc_vars (string * 3) exception vars for reraise, or None
-
- in_try_finally = 0
-
- def __init__(self, f, base = None):
- CCodeWriter.__init__(self, f)
- if base:
- self.global_state = base.global_state
- else:
- self.global_state = GlobalCodeState()
- self.label_counter = 1
- self.error_label = None
- self.exc_vars = None
-
- def init_labels(self):
- self.label_counter = 0
- self.labels_used = {}
- self.return_label = self.new_label()
- self.new_error_label()
- self.continue_label = None
- self.break_label = None
-
- def new_label(self):
- n = self.label_counter
- self.label_counter = n + 1
- return "%s%d" % (Naming.label_prefix, n)
-
- def new_error_label(self):
- old_err_lbl = self.error_label
- self.error_label = self.new_label()
- return old_err_lbl
-
- def get_loop_labels(self):
- return (
- self.continue_label,
- self.break_label)
-
- def set_loop_labels(self, labels):
- (self.continue_label,
- self.break_label) = labels
-
- def new_loop_labels(self):
- old_labels = self.get_loop_labels()
- self.set_loop_labels(
- (self.new_label(),
- self.new_label()))
- return old_labels
-
- def get_all_labels(self):
- return (
- self.continue_label,
- self.break_label,
- self.return_label,
- self.error_label)
-
- def set_all_labels(self, labels):
- (self.continue_label,
- self.break_label,
- self.return_label,
- self.error_label) = labels
-
- def all_new_labels(self):
- old_labels = self.get_all_labels()
- new_labels = []
- for old_label in old_labels:
- if old_label:
- new_labels.append(self.new_label())
- else:
- new_labels.append(old_label)
- self.set_all_labels(new_labels)
- return old_labels
-
- def use_label(self, lbl):
- self.labels_used[lbl] = 1
-
- def put_label(self, lbl):
- if lbl in self.labels_used:
- self.putln("%s:;" % lbl)
-
- def put_goto(self, lbl):
- self.use_label(lbl)
- self.putln("goto %s;" % lbl)
-
- def error_goto(self, pos):
- lbl = self.error_label
- self.use_label(lbl)
- return "{%s; goto %s;}" % (
- self.error_setup(pos),
- lbl)
-
- def error_setup(self, pos):
- return "%s = %s[%s]; %s = %s" % (
- Naming.filename_cname,
- Naming.filetable_cname,
- self.lookup_filename(pos[0]),
- Naming.lineno_cname,
- pos[1])
-
- def lookup_filename(self, filename):
- return self.global_state.lookup_filename(filename)
-
- def use_utility_code(self, uc):
- self.global_state.use_utility_code(uc)
-
- def get_string_const(self, text):
- # Get C name for a string constant, adding a new one
- # if necessary.
- return self.global_state.get_string_const(text).cname
-
- def new_const(self, type):
- # Get C name for a new precalculated value.
- return self.global_state.new_const(type).cname
-
- def get_py_string_const(self, text):
- # Get C name for a Python string constant, adding a new one
- # if necessary. If the string is name-like, it will be interned.
- return self.global_state.get_py_string_const(text).cname
-
- def intern(self, name):
- return self.get_py_string_const(name)
-
-#--------------------------------------------------------------------------
-
-class StringConst:
- # Info held by GlobalCodeState about a string constant.
- #
- # cname string
- # text string
- # py_const Const Corresponding Python string
-
- py_const = None
-
- def __init__(self, cname, text):
- self.cname = cname
- self.text = text
-
-#--------------------------------------------------------------------------
-
-class Const:
- # Info held by GlobalCodeState about a precalculated value.
- #
- # cname string
- # type PyrexType
- # intern boolean for Python strings
-
- intern = 0
-
- def __init__(self, cname, type):
- self.cname = cname
- self.type = type
-
-#--------------------------------------------------------------------------
-
-class GlobalCodeState:
- # State pertaining to code generation for a whole module.
- #
- # filename_table {string : int} for finding filename table indexes
- # filename_list [string] filenames in filename table order
- # utility_code {int : int} id to utility_list index
- # utility_list list utility code used
- # const_counter int for generating const names
- # string_index {string : String} string constant index
- # string_consts [StringConst] all string constants
- # other_consts [Const] other precalculated values
-
- def __init__(self):
- self.filename_table = {}
- self.filename_list = []
- self.utility_code = {}
- self.utility_list = []
- self.const_counter = 1
- self.string_index = {}
- self.string_consts = []
- self.other_consts = []
-
- def lookup_filename(self, filename):
- try:
- index = self.filename_table[filename]
- except KeyError:
- index = len(self.filename_list)
- self.filename_list.append(filename)
- self.filename_table[filename] = index
- return index
-
- def generate_filename_table(self, code):
- code.putln("")
- code.putln("static char *%s[] = {" % Naming.filenames_cname)
- if self.filename_list:
- for filename in self.filename_list:
- filename = os.path.basename(filename)
- escaped_filename = filename.replace("\\", "\\\\").replace('"', r'\"')
- code.putln('"%s",' %
- escaped_filename)
- else:
- # Some C compilers don't like an empty array
- code.putln("0")
- code.putln("};")
-
- def use_utility_code(self, uc):
- i = id(uc)
- if i not in self.utility_code:
- self.utility_code[i] = len(self.utility_list)
- self.utility_list.append(uc)
-
- def generate_utility_functions(self, code):
- code.putln("")
- code.putln("/* Runtime support code */")
- code.putln("")
- code.putln("static void %s(void) {" % Naming.fileinit_cname)
- code.putln("%s = %s;" %
- (Naming.filetable_cname, Naming.filenames_cname))
- code.putln("}")
- for utility_code in self.utility_list:
- code.h.put(utility_code[0])
- code.put(utility_code[1])
-
- def new_const_name(self):
- # Create a new globally-unique name for a constant.
- name = "%s%s" % (Naming.const_prefix, self.const_counter)
- self.const_counter += 1
- return name
-
- def new_string_const(self, text):
- # Add a new C string constant.
- c = StringConst(self.new_const_name(), text)
- self.string_consts.append(c)
- self.string_index[text] = c
- return c
-
- def new_const(self, type, cname = None):
- if not cname:
- cname = self.new_const_name()
- c = Const(cname, type)
- self.other_consts.append(c)
- return c
-
- def new_py_const(self, cname = None, intern = 0):
- # Add a new Python constant.
- c = self.new_const(py_object_type, cname)
- if intern:
- c.intern = 1
- return c
-
- def get_string_const(self, text):
- # Get a C string constant, adding a new one if necessary.
- c = self.string_index.get(text)
- if not c:
- c = self.new_string_const(text)
- return c
-
- def get_py_string_const(self, text):
- # Get a Python string constant, adding a new one if necessary.
- # If the string is name-like, it will be interned.
- s = self.get_string_const(text)
- if not s.py_const:
- intern = len(text) <= max_intern_length and identifier_pattern.match(text)
- if intern:
- cname = Naming.interned_prefix + text
- else:
- cname = s.cname + "p"
- s.py_const = self.new_py_const(cname, intern)
- return s.py_const
-
- def generate_const_declarations(self, code):
- self.generate_string_const_declarations(code)
- self.generate_other_const_declarations(code)
- self.generate_stringtab(code)
-
- def generate_string_const_declarations(self, code):
- code.putln("")
- for c in self.string_consts:
- code.putln('static char %s[] = "%s";' % (c.cname, c.text))
-
- def generate_other_const_declarations(self, code):
- interned = []
- uninterned = []
- for c in self.other_consts:
- if c.intern:
- interned.append(c)
- else:
- uninterned.append(c)
- interned.sort(lambda c1, c2: cmp(c1.cname, c2.cname))
- def put_consts(consts):
- code.putln("")
- for c in consts:
- decl = c.type.declaration_code(c.cname)
- code.putln("static %s;" % decl)
- put_consts(interned)
- put_consts(uninterned)
-
- def generate_stringtab(self, code):
- interned = []
- uninterned = []
- for s in self.string_consts:
- p = s.py_const
- if p:
- if p.intern:
- interned.append(s)
- else:
- uninterned.append(s)
- interned.sort(lambda c1, c2: cmp(c1.py_const.cname, c2.py_const.cname))
- def put_stringtab(consts, intern):
- for c in consts:
- cname = c.cname
- code.putln("{&%s, %d, %s, sizeof(%s)}," % (
- c.py_const.cname, intern, cname, cname))
- code.putln("")
- code.putln("static __Pyx_StringTabEntry %s[] = {" % Naming.stringtab_cname)
- put_stringtab(interned, 1)
- put_stringtab(uninterned, 0)
- code.putln("{0, 0, 0, 0}")
- code.putln("};")
-
-#--------------------------------------------------------------------------
-
-class PyrexCodeWriter:
- # f file output file
- # level int indentation level
-
- def __init__(self, outfile_name):
- self.f = open_new_file(outfile_name)
- self.level = 0
-
- def putln(self, code):
- self.f.write("%s%s\n" % (" " * self.level, code))
-
- def indent(self):
- self.level += 1
-
- def dedent(self):
- self.level -= 1
-