Commit 9875327a authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Move UtilityCode to Code.py

parent 128c5563
from Cython.Compiler.Visitor import VisitorTransform, CythonTransform from Visitor import VisitorTransform, CythonTransform
from Cython.Compiler.ModuleNode import ModuleNode from ModuleNode import ModuleNode
from Cython.Compiler.Nodes import * from Nodes import *
from Cython.Compiler.ExprNodes import * from ExprNodes import *
from Cython.Compiler.StringEncoding import EncodedString from StringEncoding import EncodedString
from Cython.Compiler.Errors import CompileError from Errors import CompileError
from Cython.Utils import UtilityCode from Code import UtilityCode
import Interpreter import Interpreter
import PyrexTypes import PyrexTypes
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
from Symtab import BuiltinScope, StructOrUnionScope from Symtab import BuiltinScope, StructOrUnionScope
from Cython.Utils import UtilityCode from Code import UtilityCode
from TypeSlots import Signature from TypeSlots import Signature
import PyrexTypes import PyrexTypes
import Naming import Naming
......
...@@ -8,9 +8,6 @@ import Naming ...@@ -8,9 +8,6 @@ import Naming
import Options import Options
import StringEncoding import StringEncoding
from Cython import Utils from Cython import Utils
from PyrexTypes import py_object_type, typecast
import PyrexTypes
from TypeSlots import method_coexist
from Scanning import SourceDescriptor from Scanning import SourceDescriptor
from Cython.StringIOTree import StringIOTree from Cython.StringIOTree import StringIOTree
try: try:
...@@ -19,6 +16,58 @@ except NameError: ...@@ -19,6 +16,58 @@ except NameError:
from sets import Set as set from sets import Set as set
import DebugFlags import DebugFlags
from Cython.Utils import none_or_sub
# a simple class that simplifies the usage of utility code
class UtilityCode(object):
def __init__(self, proto=None, impl=None, init=None, cleanup=None, requires=None):
self.proto = proto
self.impl = impl
self.init = init
self.cleanup = cleanup
self.requires = requires
self._cache = {}
self.specialize_list = []
def write_init_code(self, writer, pos):
if not self.init:
return
if isinstance(self.init, basestring):
writer.put(self.init)
else:
self.init(writer, pos)
def write_cleanup_code(self, writer, pos):
if not self.cleanup:
return
if isinstance(self.cleanup, basestring):
writer.put(self.cleanup)
else:
self.cleanup(writer, pos)
def specialize(self, pyrex_type=None, **data):
# Dicts aren't hashable...
if pyrex_type is not None:
data['type'] = pyrex_type.declaration_code('')
data['type_name'] = pyrex_type.specalization_name()
key = data.items(); key.sort(); key = tuple(key)
try:
return self._cache[key]
except KeyError:
if self.requires is None:
requires = None
else:
requires = [r.specialize(data) for r in self.requires]
s = self._cache[key] = UtilityCode(
none_or_sub(self.proto, data),
none_or_sub(self.impl, data),
none_or_sub(self.init, data),
none_or_sub(self.cleanup, data),
requires)
self.specialize_list.append(s)
return s
class FunctionState(object): class FunctionState(object):
# return_label string function return point label # return_label string function return point label
# error_label string error catch point label # error_label string error catch point label
...@@ -397,6 +446,7 @@ class GlobalState(object): ...@@ -397,6 +446,7 @@ class GlobalState(object):
# utility_code_def # utility_code_def
# #
code = self.parts['utility_code_def'] code = self.parts['utility_code_def']
import PyrexTypes
code.put(PyrexTypes.type_conversion_functions) code.put(PyrexTypes.type_conversion_functions)
code.putln("") code.putln("")
...@@ -979,6 +1029,7 @@ class CCodeWriter(object): ...@@ -979,6 +1029,7 @@ class CCodeWriter(object):
return entry.cname return entry.cname
def as_pyobject(self, cname, type): def as_pyobject(self, cname, type):
from PyrexTypes import py_object_type, typecast
return typecast(py_object_type, type, cname) return typecast(py_object_type, type, cname)
def put_gotref(self, cname): def put_gotref(self, cname):
...@@ -1026,6 +1077,7 @@ class CCodeWriter(object): ...@@ -1026,6 +1077,7 @@ class CCodeWriter(object):
self.putln("__Pyx_INCREF(%s);" % self.entry_as_pyobject(entry)) self.putln("__Pyx_INCREF(%s);" % self.entry_as_pyobject(entry))
def put_decref_clear(self, cname, type, nanny=True): def put_decref_clear(self, cname, type, nanny=True):
from PyrexTypes import py_object_type, typecast
if nanny: if nanny:
self.putln("__Pyx_DECREF(%s); %s = 0;" % ( self.putln("__Pyx_DECREF(%s); %s = 0;" % (
typecast(py_object_type, type, cname), cname)) typecast(py_object_type, type, cname), cname))
...@@ -1085,6 +1137,7 @@ class CCodeWriter(object): ...@@ -1085,6 +1137,7 @@ class CCodeWriter(object):
self.put_var_xdecref_clear(entry) self.put_var_xdecref_clear(entry)
def put_init_to_py_none(self, cname, type, nanny=True): def put_init_to_py_none(self, cname, type, nanny=True):
from PyrexTypes import py_object_type, typecast
py_none = typecast(type, py_object_type, "Py_None") py_none = typecast(type, py_object_type, "Py_None")
if nanny: if nanny:
self.putln("%s = %s; __Pyx_INCREF(Py_None);" % (cname, py_none)) self.putln("%s = %s; __Pyx_INCREF(Py_None);" % (cname, py_none))
...@@ -1098,6 +1151,7 @@ class CCodeWriter(object): ...@@ -1098,6 +1151,7 @@ class CCodeWriter(object):
self.put_init_to_py_none(code, entry.type, nanny) self.put_init_to_py_none(code, entry.type, nanny)
def put_pymethoddef(self, entry, term): def put_pymethoddef(self, entry, term):
from TypeSlots import method_coexist
if entry.doc: if entry.doc:
doc_code = entry.doc_cname doc_code = entry.doc_cname
else: else:
......
...@@ -6,7 +6,7 @@ import operator ...@@ -6,7 +6,7 @@ import operator
from Errors import error, warning, InternalError from Errors import error, warning, InternalError
from Errors import hold_errors, release_errors, held_errors, report_error from Errors import hold_errors, release_errors, held_errors, report_error
from Cython.Utils import UtilityCode from Code import UtilityCode
import StringEncoding import StringEncoding
import Naming import Naming
import Nodes import Nodes
......
...@@ -23,7 +23,8 @@ import DebugFlags ...@@ -23,7 +23,8 @@ import DebugFlags
from Errors import error, warning from Errors import error, warning
from PyrexTypes import py_object_type from PyrexTypes import py_object_type
from Cython.Utils import open_new_file, replace_suffix, UtilityCode from Cython.Utils import open_new_file, replace_suffix
from Code import UtilityCode
from StringEncoding import escape_byte_string, EncodedString from StringEncoding import escape_byte_string, EncodedString
......
...@@ -13,7 +13,8 @@ import TypeSlots ...@@ -13,7 +13,8 @@ import TypeSlots
from PyrexTypes import py_object_type, error_type, CTypedefType, CFuncType from PyrexTypes import py_object_type, error_type, CTypedefType, CFuncType
from Symtab import ModuleScope, LocalScope, GeneratorLocalScope, \ from Symtab import ModuleScope, LocalScope, GeneratorLocalScope, \
StructOrUnionScope, PyClassScope, CClassScope StructOrUnionScope, PyClassScope, CClassScope
from Cython.Utils import open_new_file, replace_suffix, UtilityCode from Cython.Utils import open_new_file, replace_suffix
from Code import UtilityCode
from StringEncoding import EncodedString, escape_byte_string, split_docstring from StringEncoding import EncodedString, escape_byte_string, split_docstring
import Options import Options
import ControlFlow import ControlFlow
......
...@@ -8,7 +8,7 @@ import TypeSlots ...@@ -8,7 +8,7 @@ import TypeSlots
import Symtab import Symtab
import Options import Options
from Cython.Utils import UtilityCode from Code import UtilityCode
from StringEncoding import EncodedString from StringEncoding import EncodedString
from Errors import error from Errors import error
from ParseTreeTransforms import SkipDeclarations from ParseTreeTransforms import SkipDeclarations
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Pyrex - Types # Pyrex - Types
# #
from Cython.Utils import UtilityCode from Code import UtilityCode
import StringEncoding import StringEncoding
import Naming import Naming
import copy import copy
......
...@@ -14,6 +14,7 @@ from TypeSlots import \ ...@@ -14,6 +14,7 @@ from TypeSlots import \
pyfunction_signature, pymethod_signature, \ pyfunction_signature, pymethod_signature, \
get_special_method_signature, get_property_accessor_signature get_special_method_signature, get_property_accessor_signature
import ControlFlow import ControlFlow
import Code
import __builtin__ import __builtin__
try: try:
set set
...@@ -1382,7 +1383,7 @@ class PropertyScope(Scope): ...@@ -1382,7 +1383,7 @@ class PropertyScope(Scope):
# Should this go elsewhere (and then get imported)? # Should this go elsewhere (and then get imported)?
#------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------
classmethod_utility_code = Utils.UtilityCode( classmethod_utility_code = Code.UtilityCode(
proto = """ proto = """
#include "descrobject.h" #include "descrobject.h"
static PyObject* __Pyx_Method_ClassMethod(PyObject *method); /*proto*/ static PyObject* __Pyx_Method_ClassMethod(PyObject *method); /*proto*/
......
...@@ -95,52 +95,3 @@ def none_or_sub(s, data): ...@@ -95,52 +95,3 @@ def none_or_sub(s, data):
else: else:
return s % data return s % data
# a simple class that simplifies the usage of utility code
class UtilityCode(object):
def __init__(self, proto=None, impl=None, init=None, cleanup=None, requires=None):
self.proto = proto
self.impl = impl
self.init = init
self.cleanup = cleanup
self.requires = requires
self._cache = {}
self.specialize_list = []
def write_init_code(self, writer, pos):
if not self.init:
return
if isinstance(self.init, basestring):
writer.put(self.init)
else:
self.init(writer, pos)
def write_cleanup_code(self, writer, pos):
if not self.cleanup:
return
if isinstance(self.cleanup, basestring):
writer.put(self.cleanup)
else:
self.cleanup(writer, pos)
def specialize(self, pyrex_type=None, **data):
# Dicts aren't hashable...
if pyrex_type is not None:
data['type'] = pyrex_type.declaration_code('')
data['type_name'] = pyrex_type.specalization_name()
key = data.items(); key.sort(); key = tuple(key)
try:
return self._cache[key]
except KeyError:
if self.requires is None:
requires = None
else:
requires = [r.specialize(data) for r in self.requires]
s = self._cache[key] = UtilityCode(
none_or_sub(self.proto, data),
none_or_sub(self.impl, data),
none_or_sub(self.init, data),
none_or_sub(self.cleanup, data),
requires)
self.specialize_list.append(s)
return s
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment