[pypy-svn] r74292 - pypy/branch/blackhole-improvement/pypy/jit/metainterp

arigo at codespeak.net arigo at codespeak.net
Fri Apr 30 17:14:45 CEST 2010


Author: arigo
Date: Fri Apr 30 17:14:43 2010
New Revision: 74292

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
Log:
Enough to make test_format pass also on pyjitpl.


Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	Fri Apr 30 17:14:43 2010
@@ -125,6 +125,8 @@
                     position += length
                 elif argtype == 'self':
                     value = self
+                elif argtype == 'cpu':
+                    value = self.cpu
                 elif argtype == 'pc':
                     value = position
                 elif argtype == 'd':
@@ -706,67 +708,67 @@
     # ----------
     # the following operations are directly implemented by the backend
 
-    @arguments("self", "i", "d", "R", returns="i")
-    def bhimpl_residual_call_r_i(self, func, calldescr, args_r):
-        return self.cpu.bh_call_i(func, calldescr, None, args_r, None)
-    @arguments("self", "i", "d", "R", returns="r")
-    def bhimpl_residual_call_r_r(self, func, calldescr, args_r):
-        return self.cpu.bh_call_r(func, calldescr, None, args_r, None)
-    @arguments("self", "i", "d", "R", returns="f")
-    def bhimpl_residual_call_r_f(self, func, calldescr, args_r):
-        return self.cpu.bh_call_f(func, calldescr, None, args_r, None)
-    @arguments("self", "i", "d", "R")
-    def bhimpl_residual_call_r_v(self, func, calldescr, args_r):
-        self.cpu.bh_call_v(func, calldescr, None, args_r, None)
-
-    @arguments("self", "i", "d", "I", "R", returns="i")
-    def bhimpl_residual_call_ir_i(self, func, calldescr, args_i, args_r):
-        return self.cpu.bh_call_i(func, calldescr, args_i, args_r, None)
-    @arguments("self", "i", "d", "I", "R", returns="r")
-    def bhimpl_residual_call_ir_r(self, func, calldescr, args_i, args_r):
-        return self.cpu.bh_call_r(func, calldescr, args_i, args_r, None)
-    @arguments("self", "i", "d", "I", "R", returns="f")
-    def bhimpl_residual_call_ir_f(self, func, calldescr, args_i, args_r):
-        return self.cpu.bh_call_f(func, calldescr, args_i, args_r, None)
-    @arguments("self", "i", "d", "I", "R")
-    def bhimpl_residual_call_ir_v(self, func, calldescr, args_i, args_r):
-        self.cpu.bh_call_v(func, calldescr, args_i, args_r, None)
-
-    @arguments("self", "i", "d", "I", "R", "F", returns="i")
-    def bhimpl_residual_call_irf_i(self, func, calldescr,args_i,args_r,args_f):
-        return self.cpu.bh_call_i(func, calldescr, args_i, args_r, args_f)
-    @arguments("self", "i", "d", "I", "R", "F", returns="r")
-    def bhimpl_residual_call_irf_r(self, func, calldescr,args_i,args_r,args_f):
-        return self.cpu.bh_call_r(func, calldescr, args_i, args_r, args_f)
-    @arguments("self", "i", "d", "I", "R", "F", returns="f")
-    def bhimpl_residual_call_irf_f(self, func, calldescr,args_i,args_r,args_f):
-        return self.cpu.bh_call_f(func, calldescr, args_i, args_r, args_f)
-    @arguments("self", "i", "d", "I", "R", "F")
-    def bhimpl_residual_call_irf_v(self, func, calldescr,args_i,args_r,args_f):
-        self.cpu.bh_call_v(func, calldescr, args_i, args_r, args_f)
-
-    @arguments("self", "d", "i", returns="r")
-    def bhimpl_new_array(self, arraydescr, length):
-        return self.cpu.bh_new_array(arraydescr, length)
-    @arguments("self", "d", "r", "i", "r")
-    def bhimpl_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
-        self.cpu.bh_setarrayitem_gc_r(arraydescr, array, index, newvalue)
-
-    @arguments("self", "r", "d", returns="i")
-    def bhimpl_getfield_gc_i(self, struct, fielddescr):
-        return self.cpu.bh_getfield_gc_i(struct, fielddescr)
-    @arguments("self", "r", "d", returns="i")
-    def bhimpl_getfield_gc_c(self, struct, fielddescr):
-        return self.cpu.bh_getfield_gc_c(struct, fielddescr)
-    @arguments("self", "r", "d", returns="i")
-    def bhimpl_getfield_gc_u(self, struct, fielddescr):
-        return self.cpu.bh_getfield_gc_u(struct, fielddescr)
-    @arguments("self", "r", "d", returns="r")
-    def bhimpl_getfield_gc_r(self, struct, fielddescr):
-        return self.cpu.bh_getfield_gc_r(struct, fielddescr)
-    @arguments("self", "r", "d", returns="f")
-    def bhimpl_getfield_gc_f(self, struct, fielddescr):
-        return self.cpu.bh_getfield_gc_f(struct, fielddescr)
+    @arguments("cpu", "i", "d", "R", returns="i")
+    def bhimpl_residual_call_r_i(cpu, func, calldescr, args_r):
+        return cpu.bh_call_i(func, calldescr, None, args_r, None)
+    @arguments("cpu", "i", "d", "R", returns="r")
+    def bhimpl_residual_call_r_r(cpu, func, calldescr, args_r):
+        return cpu.bh_call_r(func, calldescr, None, args_r, None)
+    @arguments("cpu", "i", "d", "R", returns="f")
+    def bhimpl_residual_call_r_f(cpu, func, calldescr, args_r):
+        return cpu.bh_call_f(func, calldescr, None, args_r, None)
+    @arguments("cpu", "i", "d", "R")
+    def bhimpl_residual_call_r_v(cpu, func, calldescr, args_r):
+        cpu.bh_call_v(func, calldescr, None, args_r, None)
+
+    @arguments("cpu", "i", "d", "I", "R", returns="i")
+    def bhimpl_residual_call_ir_i(cpu, func, calldescr, args_i, args_r):
+        return cpu.bh_call_i(func, calldescr, args_i, args_r, None)
+    @arguments("cpu", "i", "d", "I", "R", returns="r")
+    def bhimpl_residual_call_ir_r(cpu, func, calldescr, args_i, args_r):
+        return cpu.bh_call_r(func, calldescr, args_i, args_r, None)
+    @arguments("cpu", "i", "d", "I", "R", returns="f")
+    def bhimpl_residual_call_ir_f(cpu, func, calldescr, args_i, args_r):
+        return cpu.bh_call_f(func, calldescr, args_i, args_r, None)
+    @arguments("cpu", "i", "d", "I", "R")
+    def bhimpl_residual_call_ir_v(cpu, func, calldescr, args_i, args_r):
+        cpu.bh_call_v(func, calldescr, args_i, args_r, None)
+
+    @arguments("cpu", "i", "d", "I", "R", "F", returns="i")
+    def bhimpl_residual_call_irf_i(cpu, func, calldescr,args_i,args_r,args_f):
+        return cpu.bh_call_i(func, calldescr, args_i, args_r, args_f)
+    @arguments("cpu", "i", "d", "I", "R", "F", returns="r")
+    def bhimpl_residual_call_irf_r(cpu, func, calldescr,args_i,args_r,args_f):
+        return cpu.bh_call_r(func, calldescr, args_i, args_r, args_f)
+    @arguments("cpu", "i", "d", "I", "R", "F", returns="f")
+    def bhimpl_residual_call_irf_f(cpu, func, calldescr,args_i,args_r,args_f):
+        return cpu.bh_call_f(func, calldescr, args_i, args_r, args_f)
+    @arguments("cpu", "i", "d", "I", "R", "F")
+    def bhimpl_residual_call_irf_v(cpu, func, calldescr,args_i,args_r,args_f):
+        cpu.bh_call_v(func, calldescr, args_i, args_r, args_f)
+
+    @arguments("cpu", "d", "i", returns="r")
+    def bhimpl_new_array(cpu, arraydescr, length):
+        return cpu.bh_new_array(arraydescr, length)
+    @arguments("cpu", "d", "r", "i", "r")
+    def bhimpl_setarrayitem_gc_r(cpu, arraydescr, array, index, newvalue):
+        cpu.bh_setarrayitem_gc_r(arraydescr, array, index, newvalue)
+
+    @arguments("cpu", "r", "d", returns="i")
+    def bhimpl_getfield_gc_i(cpu, struct, fielddescr):
+        return cpu.bh_getfield_gc_i(struct, fielddescr)
+    @arguments("cpu", "r", "d", returns="i")
+    def bhimpl_getfield_gc_c(cpu, struct, fielddescr):
+        return cpu.bh_getfield_gc_c(struct, fielddescr)
+    @arguments("cpu", "r", "d", returns="i")
+    def bhimpl_getfield_gc_u(cpu, struct, fielddescr):
+        return cpu.bh_getfield_gc_u(struct, fielddescr)
+    @arguments("cpu", "r", "d", returns="r")
+    def bhimpl_getfield_gc_r(cpu, struct, fielddescr):
+        return cpu.bh_getfield_gc_r(struct, fielddescr)
+    @arguments("cpu", "r", "d", returns="f")
+    def bhimpl_getfield_gc_f(cpu, struct, fielddescr):
+        return cpu.bh_getfield_gc_f(struct, fielddescr)
 
     bhimpl_getfield_gc_i_pure = bhimpl_getfield_gc_i
     bhimpl_getfield_gc_c_pure = bhimpl_getfield_gc_c
@@ -774,21 +776,21 @@
     bhimpl_getfield_gc_r_pure = bhimpl_getfield_gc_r
     bhimpl_getfield_gc_f_pure = bhimpl_getfield_gc_f
 
-    @arguments("self", "i", "d", returns="i")
-    def bhimpl_getfield_raw_i(self, struct, fielddescr):
-        return self.cpu.bh_getfield_raw_i(struct, fielddescr)
-    @arguments("self", "i", "d", returns="i")
-    def bhimpl_getfield_raw_c(self, struct, fielddescr):
-        return self.cpu.bh_getfield_raw_c(struct, fielddescr)
-    @arguments("self", "i", "d", returns="i")
-    def bhimpl_getfield_raw_u(self, struct, fielddescr):
-        return self.cpu.bh_getfield_raw_u(struct, fielddescr)
-    @arguments("self", "i", "d", returns="r")
-    def bhimpl_getfield_raw_r(self, struct, fielddescr):
-        return self.cpu.bh_getfield_raw_r(struct, fielddescr)
-    @arguments("self", "i", "d", returns="f")
-    def bhimpl_getfield_raw_f(self, struct, fielddescr):
-        return self.cpu.bh_getfield_raw_f(struct, fielddescr)
+    @arguments("cpu", "i", "d", returns="i")
+    def bhimpl_getfield_raw_i(cpu, struct, fielddescr):
+        return cpu.bh_getfield_raw_i(struct, fielddescr)
+    @arguments("cpu", "i", "d", returns="i")
+    def bhimpl_getfield_raw_c(cpu, struct, fielddescr):
+        return cpu.bh_getfield_raw_c(struct, fielddescr)
+    @arguments("cpu", "i", "d", returns="i")
+    def bhimpl_getfield_raw_u(cpu, struct, fielddescr):
+        return cpu.bh_getfield_raw_u(struct, fielddescr)
+    @arguments("cpu", "i", "d", returns="r")
+    def bhimpl_getfield_raw_r(cpu, struct, fielddescr):
+        return cpu.bh_getfield_raw_r(struct, fielddescr)
+    @arguments("cpu", "i", "d", returns="f")
+    def bhimpl_getfield_raw_f(cpu, struct, fielddescr):
+        return cpu.bh_getfield_raw_f(struct, fielddescr)
 
     bhimpl_getfield_raw_i_pure = bhimpl_getfield_raw_i
     bhimpl_getfield_raw_c_pure = bhimpl_getfield_raw_c
@@ -796,50 +798,50 @@
     bhimpl_getfield_raw_r_pure = bhimpl_getfield_raw_r
     bhimpl_getfield_raw_f_pure = bhimpl_getfield_raw_f
 
-    @arguments("self", "r", "d", "i")
-    def bhimpl_setfield_gc_i(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_gc_i(struct, fielddescr, newvalue)
-    @arguments("self", "r", "d", "i")
-    def bhimpl_setfield_gc_c(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_gc_c(struct, fielddescr, newvalue)
-    @arguments("self", "r", "d", "i")
-    def bhimpl_setfield_gc_u(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_gc_u(struct, fielddescr, newvalue)
-    @arguments("self", "r", "d", "r")
-    def bhimpl_setfield_gc_r(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_gc_r(struct, fielddescr, newvalue)
-    @arguments("self", "r", "d", "f")
-    def bhimpl_setfield_gc_f(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_gc_f(struct, fielddescr, newvalue)
-
-    @arguments("self", "i", "d", "i")
-    def bhimpl_setfield_raw_i(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_raw_i(struct, fielddescr, newvalue)
-    @arguments("self", "i", "d", "i")
-    def bhimpl_setfield_raw_c(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_raw_c(struct, fielddescr, newvalue)
-    @arguments("self", "i", "d", "i")
-    def bhimpl_setfield_raw_u(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_raw_u(struct, fielddescr, newvalue)
-    @arguments("self", "i", "d", "r")
-    def bhimpl_setfield_raw_r(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_raw_r(struct, fielddescr, newvalue)
-    @arguments("self", "i", "d", "f")
-    def bhimpl_setfield_raw_f(self, struct, fielddescr, newvalue):
-        self.cpu.bh_setfield_raw_f(struct, fielddescr, newvalue)
-
-    @arguments("self", "d", returns="r")
-    def bhimpl_new(self, descr):
-        return self.cpu.bh_new(descr)
-
-    @arguments("self", "d", returns="r")
-    def bhimpl_new_with_vtable(self, descr):
-        return self.cpu.bh_new_with_vtable(descr)
-
-    @arguments("self", "r", returns="i")
-    def bhimpl_guard_class(self, struct):
-        return self.cpu.bh_classof(struct)
-
-    @arguments("self", "r", returns="i")
-    def bhimpl_cast_ptr_to_int(self, p):
-        return self.cpu.bh_cast_ptr_to_int(p)
+    @arguments("cpu", "r", "d", "i")
+    def bhimpl_setfield_gc_i(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_gc_i(struct, fielddescr, newvalue)
+    @arguments("cpu", "r", "d", "i")
+    def bhimpl_setfield_gc_c(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_gc_c(struct, fielddescr, newvalue)
+    @arguments("cpu", "r", "d", "i")
+    def bhimpl_setfield_gc_u(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_gc_u(struct, fielddescr, newvalue)
+    @arguments("cpu", "r", "d", "r")
+    def bhimpl_setfield_gc_r(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_gc_r(struct, fielddescr, newvalue)
+    @arguments("cpu", "r", "d", "f")
+    def bhimpl_setfield_gc_f(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_gc_f(struct, fielddescr, newvalue)
+
+    @arguments("cpu", "i", "d", "i")
+    def bhimpl_setfield_raw_i(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_raw_i(struct, fielddescr, newvalue)
+    @arguments("cpu", "i", "d", "i")
+    def bhimpl_setfield_raw_c(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_raw_c(struct, fielddescr, newvalue)
+    @arguments("cpu", "i", "d", "i")
+    def bhimpl_setfield_raw_u(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_raw_u(struct, fielddescr, newvalue)
+    @arguments("cpu", "i", "d", "r")
+    def bhimpl_setfield_raw_r(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_raw_r(struct, fielddescr, newvalue)
+    @arguments("cpu", "i", "d", "f")
+    def bhimpl_setfield_raw_f(cpu, struct, fielddescr, newvalue):
+        cpu.bh_setfield_raw_f(struct, fielddescr, newvalue)
+
+    @arguments("cpu", "d", returns="r")
+    def bhimpl_new(cpu, descr):
+        return cpu.bh_new(descr)
+
+    @arguments("cpu", "d", returns="r")
+    def bhimpl_new_with_vtable(cpu, descr):
+        return cpu.bh_new_with_vtable(descr)
+
+    @arguments("cpu", "r", returns="i")
+    def bhimpl_guard_class(cpu, struct):
+        return cpu.bh_classof(struct)
+
+    @arguments("cpu", "r", returns="i")
+    def bhimpl_cast_ptr_to_int(cpu, p):
+        return cpu.bh_cast_ptr_to_int(p)

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	Fri Apr 30 17:14:43 2010
@@ -61,6 +61,21 @@
         return None
     raise AssertionError("bad rettype")
 
+def do_setarrayitem_gc(cpu, arraybox, indexbox, itembox, arraydescr):
+    array = arraybox.getref_base()
+    index = indexbox.getint()
+    if itembox.type == INT:
+        item = itembox.getint()
+        cpu.bh_setarrayitem_gc_i(arraydescr, array, index, item)
+    elif itembox.type == REF:
+        item = itembox.getref_base()
+        cpu.bh_setarrayitem_gc_r(arraydescr, array, index, item)
+    elif itembox.type == FLOAT:
+        item = itembox.getfloat()
+        cpu.bh_setarrayitem_gc_f(arraydescr, array, index, item)
+    else:
+        raise AssertionError("bad itembox.type")
+
 # ____________________________________________________________
 
 ##def do_force_token(cpu):
@@ -114,6 +129,19 @@
                 raise Exception("duplicate entry for op number %d" % value)
             if key.endswith('_PURE'):
                 key = key[:-5]
+            #
+            # Fish for a way for the pyjitpl interpreter to delegate
+            # really running the operation to the blackhole interpreter
+            # or directly to the cpu.  First try the do_xxx() functions
+            # explicitly encoded above:
+            name = 'do_' + key.lower()
+            if name in globals():
+                execute[value] = globals()[name]
+                continue
+            # If missing, fallback to the bhimpl_xxx() method of the
+            # blackhole interpreter.  This only works if there is a
+            # method of the exact same name and it accepts simple
+            # parameters.
             name = 'bhimpl_' + key.lower()
             if hasattr(BlackholeInterpreter, name):
                 func = make_execute_function_with_boxes(
@@ -122,11 +150,7 @@
                 if func is not None:
                     execute[value] = func
                     continue
-            name = 'do_' + key.lower()
-            if name in globals():
-                execute[value] = globals()[name]
-                continue
-            pass  # XXX...
+            print "XXX warning: missing", key
     cpuclass._execute_by_num_args = execute_by_num_args
 
 def make_execute_function_with_boxes(name, func):
@@ -134,7 +158,7 @@
     # from the BlackholeInterpreter class.  The wrapper is a new function
     # that receives and returns boxed values.
     for argtype in func.argtypes:
-        if argtype not in ('i', 'r', 'f'):
+        if argtype not in ('i', 'r', 'f', 'd', 'cpu'):
             return None
     if func.resulttype not in ('i', 'r', 'f', None):
         return None
@@ -144,11 +168,17 @@
     def do(cpu, *argboxes):
         newargs = ()
         for argtype in argtypes:
-            argbox = argboxes[0]
-            argboxes = argboxes[1:]
-            if argtype == 'i':   value = argbox.getint()
-            elif argtype == 'r': value = argbox.getref_base()
-            elif argtype == 'f': value = argbox.getfloat()
+            if argtype == 'cpu':
+                value = cpu
+            elif argtype == 'd':
+                value = argboxes[-1]
+                argboxes = argboxes[:-1]
+            else:
+                argbox = argboxes[0]
+                argboxes = argboxes[1:]
+                if argtype == 'i':   value = argbox.getint()
+                elif argtype == 'r': value = argbox.getref_base()
+                elif argtype == 'f': value = argbox.getfloat()
             newargs = newargs + (value,)
         assert not argboxes
         #
@@ -190,7 +220,8 @@
         assert descr is None
     func = get_execute_function(cpu, opnum, len(argboxes))
     assert func is not None
-    return func(cpu, *argboxes)
+    return func(cpu, *argboxes)     # note that the 'argboxes' tuple
+                                    # optionally ends with the descr
 execute._annspecialcase_ = 'specialize:arg(1)'
 
 def execute_varargs(cpu, opnum, argboxes, descr):

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Fri Apr 30 17:14:43 2010
@@ -32,10 +32,11 @@
         return func
     return decorate
 
-def XXX(func):
-    def cannot_call(*args, **kwds):
-        raise Exception('not implemented: %s' % func.__name__)
-    return cannot_call
+class XXX:      # XXX temporary hack
+    def __init__(self, func):
+        self.func = func
+    def __getattr__(self, _):
+        raise Exception("@XXX: " + self.func.__name__)
 
 # ____________________________________________________________
 
@@ -279,9 +280,9 @@
     def opimpl_subclassof(self, box1, box2):
         self.execute(rop.SUBCLASSOF, box1, box2)
 
-    @XXX  #arguments("descr", "box")
-    def opimpl_new_array(self, itemsize, countbox):
-        self.execute_with_descr(rop.NEW_ARRAY, itemsize, countbox)
+    @arguments("descr", "box")
+    def opimpl_new_array(self, itemsizedescr, countbox):
+        return self.execute_with_descr(rop.NEW_ARRAY, itemsizedescr, countbox)
 
     @XXX  #arguments("box", "descr", "box")
     def opimpl_getarrayitem_gc(self, arraybox, arraydesc, indexbox):
@@ -291,9 +292,14 @@
     def opimpl_getarrayitem_gc_pure(self, arraybox, arraydesc, indexbox):
         self.execute_with_descr(rop.GETARRAYITEM_GC_PURE, arraydesc, arraybox, indexbox)
 
-    @XXX  #arguments("box", "descr", "box", "box")
-    def opimpl_setarrayitem_gc(self, arraybox, arraydesc, indexbox, itembox):
-        self.execute_with_descr(rop.SETARRAYITEM_GC, arraydesc, arraybox, indexbox, itembox)
+    @arguments("descr", "box", "box", "box")
+    def _opimpl_setarrayitem_gc(self, arraydesc, arraybox, indexbox, itembox):
+        self.execute_with_descr(rop.SETARRAYITEM_GC, arraydesc, arraybox,
+                                indexbox, itembox)
+
+    opimpl_setarrayitem_gc_i = _opimpl_setarrayitem_gc
+    opimpl_setarrayitem_gc_r = _opimpl_setarrayitem_gc
+    opimpl_setarrayitem_gc_f = _opimpl_setarrayitem_gc
 
     @XXX  #arguments("box", "descr")
     def opimpl_arraylen_gc(self, arraybox, arraydesc):



More information about the Pypy-commit mailing list