[pypy-svn] r5104 - pypy/trunk/src/pypy/objspace/std
arigo at codespeak.net
arigo at codespeak.net
Wed Jun 16 14:57:05 CEST 2004
Author: arigo
Date: Wed Jun 16 14:57:04 2004
New Revision: 5104
Modified:
pypy/trunk/src/pypy/objspace/std/longobject.py
pypy/trunk/src/pypy/objspace/std/multimethod.py
Log:
Darker and darker hacks to multimethod.py to cope with int-to-long coercion
rules. At some point we need to rethink all this.
Modified: pypy/trunk/src/pypy/objspace/std/longobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/longobject.py (original)
+++ pypy/trunk/src/pypy/objspace/std/longobject.py Wed Jun 16 14:57:04 2004
@@ -30,10 +30,13 @@
if -sys.maxint-1 <= w_longobj.longval <= sys.maxint:
return W_IntObject(space, int(w_longobj.longval))
else:
- raise OperationError(space.w_OverflowError,
- space.wrap("long too large to convert to int"))
+ # note the 'return' here -- hack
+ return FailedToImplement(
+ OperationError(space.w_OverflowError,
+ space.wrap("long too large to convert to int")))
delegate__Long.result_class = W_IntObject
delegate__Long.priority = PRIORITY_CHANGE_TYPE
+delegate__Long.can_fail = True
def long__Long(space, w_value):
Modified: pypy/trunk/src/pypy/objspace/std/multimethod.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/multimethod.py (original)
+++ pypy/trunk/src/pypy/objspace/std/multimethod.py Wed Jun 16 14:57:04 2004
@@ -84,28 +84,45 @@
# t.__name__ for t in argclasses]
arglist = ['a%d'%i for i in range(len(argclasses))] + ['*extraargs']
source = ['def do(space,%s):' % ','.join(arglist)]
- converted = [{(): 'a%d'%i} for i in range(len(argclasses))]
+ converted = [{(): ('a%d'%i, False)} for i in range(len(argclasses))]
def make_conversion(argi, convlist):
if tuple(convlist) in converted[argi]:
return converted[argi][tuple(convlist)]
else:
- prev = make_conversion(argi, convlist[:-1])
+ prev, can_fail = make_conversion(argi, convlist[:-1])
new = '%s_%d' % (prev, len(converted[argi]))
fname = all_functions.setdefault(convlist[-1],
'd%d' % len(all_functions))
- source.append(' %s = %s(space,%s)' % (new, fname, prev))
- converted[argi][tuple(convlist)] = new
- return new
+ if can_fail:
+ source.append(' if isinstance(%s, FailedToImplement):' % prev)
+ source.append(' %s = %s' % (new, prev))
+ source.append(' else:')
+ indent = ' '
+ else:
+ indent = ' '
+ source.append('%s%s = %s(space,%s)' % (indent, new, fname, prev))
+ can_fail = can_fail or getattr(convlist[-1], 'can_fail', False)
+ converted[argi][tuple(convlist)] = new, can_fail
+ return new, can_fail
all_functions = {}
has_firstfailure = False
for fn, conversions in calllist:
# make the required conversions
fname = all_functions.setdefault(fn, 'f%d' % len(all_functions))
- arglist = [make_conversion(i, conversions[i])
- for i in range(len(argclasses))] + ['*extraargs']
+ arglist = []
+ failcheck = []
+ for i in range(len(argclasses)):
+ argname, can_fail = make_conversion(i, conversions[i])
+ arglist.append(argname)
+ if can_fail:
+ failcheck.append(argname)
+ arglist.append('*extraargs')
source.append( ' try:')
+ for argname in failcheck:
+ source.append(' if isinstance(%s, FailedToImplement):' % argname)
+ source.append(' raise %s' % argname)
source.append( ' return %s(space,%s)' % (
fname, ','.join(arglist)))
if has_firstfailure:
More information about the Pypy-commit
mailing list