[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