# redesigned. It doesn't take return, raise, continue, or break into
# account.
-_END_POS = ((unichr(sys.maxunicode)*10),())
+from Cython.Compiler.Scanning import StringSourceDescriptor
+try:
+ _END_POS = (StringSourceDescriptor(unichr(sys.maxunicode)*10, ''),
+ sys.maxint, sys.maxint)
+except AttributeError: # Py3
+ _END_POS = (StringSourceDescriptor(unichr(sys.maxunicode)*10, ''),
+ sys.maxsize, sys.maxsize)
class ControlFlow(object):
from Errors import error
from ParseTreeTransforms import SkipDeclarations
+try:
+ reduce
+except NameError:
+ from functools import reduce
+
#def unwrap_node(node):
# while isinstance(node, ExprNodes.PersistentNode):
# node = node.arg
A SourceDescriptor should be considered immutable.
"""
_escaped_description = None
+ _cmp_name = ''
def __str__(self):
assert False # To catch all places where a descriptor is used directly as a filename
self.get_description().encode('ASCII', 'replace').decode("ASCII")
return self._escaped_description
+ def __gt__(self, other):
+ # this is only used to provide some sort of order
+ try:
+ return self._cmp_name > other._cmp_name
+ except AttributeError:
+ return False
+
+ def __lt__(self, other):
+ # this is only used to provide some sort of order
+ try:
+ return self._cmp_name < other._cmp_name
+ except AttributeError:
+ return False
+
+ def __le__(self, other):
+ # this is only used to provide some sort of order
+ try:
+ return self._cmp_name <= other._cmp_name
+ except AttributeError:
+ return False
+
class FileSourceDescriptor(SourceDescriptor):
"""
Represents a code source. A code source is a more generic abstraction
"""
def __init__(self, filename):
self.filename = filename
+ self._cmp_name = filename
def get_lines(self):
return Utils.open_source_file(self.filename)
def __init__(self, name, code):
self.name = name
self.codelines = [x + "\n" for x in code.split("\n")]
+ self._cmp_name = name
def get_lines(self):
return self.codelines
# token_number, "Pattern can match 0 input symbols")
if isinstance(action_spec, Actions.Action):
action = action_spec
- elif callable(action_spec):
- action = Actions.Call(action_spec)
else:
- action = Actions.Return(action_spec)
+ try:
+ action_spec.__call__
+ except AttributeError:
+ action = Actions.Return(action_spec)
+ else:
+ action = Actions.Call(action_spec)
final_state = machine.new_state()
re.build_machine(machine, initial_state, final_state,
match_bol = 1, nocase = 0)
# Emulated language constructs
def cast(type, arg):
- if callable(type):
+ if hasattr(type, '__call__'):
return type(arg)
else:
return arg
return pointer(type(arg))([arg])
def declare(type=None, value=None, **kwds):
- if type and callable(type):
+ if type is not None and hasattr(type, '__call__'):
if value:
return type(value)
else:
def write_init_code(self, writer, pos):
if not self.init:
return
- if callable(self.init):
- self.init(writer, pos)
- else:
+ 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 callable(self.cleanup):
- self.cleanup(writer, pos)
- else:
+ 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...
True
>>> mul() == 1*60*1000
True
->>> arithm() == 9*2+3*8/6-10
+>>> arithm() == 9*2+3*8//6-10
True
>>> parameters() == _func(-1 -2, - (-3+4), 1*2*3)
True
return 1*60*1000
def arithm():
- return 9*2+3*8/6-10
+ return 9*2+3*8//6-10
def parameters():
return _func(-1 -2, - (-3+4), 1*2*3)