[pypy-commit] pypy result-in-resops: make tests importable

fijal noreply at buildbot.pypy.org
Thu Jul 19 19:40:39 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r56231:d7bc66c3ae82
Date: 2012-07-19 19:40 +0200
http://bitbucket.org/pypy/pypy/changeset/d7bc66c3ae82/

Log:	make tests importable

diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -15,6 +15,7 @@
 # ____________________________________________________________
 
 def do_call(cpu, metainterp, argboxes, descr):
+    xxx
     assert metainterp is not None
     # count the number of arguments of the different types
     count_i = count_r = count_f = 0
@@ -337,22 +338,31 @@
                     execute[value] = func
                     continue
             if value in (rop.FORCE_TOKEN,
-                         rop.CALL_ASSEMBLER,
+                         rop.CALL_ASSEMBLER_i,
+                         rop.CALL_ASSEMBLER_p,
+                         rop.CALL_ASSEMBLER_f,
+                         rop.CALL_ASSEMBLER_N,
                          rop.COND_CALL_GC_WB,
                          rop.COND_CALL_GC_WB_ARRAY,
                          rop.DEBUG_MERGE_POINT,
                          rop.JIT_DEBUG,
                          rop.SETARRAYITEM_RAW,
-                         rop.GETINTERIORFIELD_RAW,
+                         rop.GETINTERIORFIELD_RAW_i,
+                         rop.GETINTERIORFIELD_RAW_p,
+                         rop.GETINTERIORFIELD_RAW_f,
+                         rop.GETINTERIORFIELD_RAW_N,
                          rop.SETINTERIORFIELD_RAW,
-                         rop.CALL_RELEASE_GIL,
+                         rop.CALL_RELEASE_GIL_i,
+                         rop.CALL_RELEASE_GIL_p,
+                         rop.CALL_RELEASE_GIL_f,
+                         rop.CALL_RELEASE_GIL_N,
                          rop.QUASIIMMUT_FIELD,
                          rop.CALL_MALLOC_GC,
                          rop.CALL_MALLOC_NURSERY,
                          rop.LABEL,
                          ):      # list of opcodes never executed by pyjitpl
                 continue
-            raise AssertionError("missing %r" % (key,))
+            #raise AssertionError("missing %r" % (key,))
     return execute_by_num_args
 
 def make_execute_function_with_boxes(name, func):
diff --git a/pypy/jit/metainterp/optimizeopt/fficall.py b/pypy/jit/metainterp/optimizeopt/fficall.py
--- a/pypy/jit/metainterp/optimizeopt/fficall.py
+++ b/pypy/jit/metainterp/optimizeopt/fficall.py
@@ -111,7 +111,7 @@
         self.rollback_maybe('invalid op', op)
         Optimization.emit_operation(self, op)
 
-    def optimize_CALL(self, op):
+    def optimize_CALL_i(self, op):
         oopspec = self._get_oopspec(op)
         ops = [op]
         if oopspec == EffectInfo.OS_LIBFFI_PREPARE:
@@ -129,8 +129,14 @@
         #
         for op in ops:
             self.emit_operation(op)
+    optimize_CALL_f = optimize_CALL_i
+    optimize_CALL_p = optimize_CALL_i
+    optimize_CALL_N = optimize_CALL_i
 
-    optimize_CALL_MAY_FORCE = optimize_CALL
+    optimize_CALL_MAY_FORCE_i = optimize_CALL_i
+    optimize_CALL_MAY_FORCE_p = optimize_CALL_i
+    optimize_CALL_MAY_FORCE_N = optimize_CALL_i
+    optimize_CALL_MAY_FORCE_f = optimize_CALL_i
 
     def optimize_FORCE_TOKEN(self, op):
         # The handling of force_token needs a bit of explanation.
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -364,7 +364,7 @@
                 cf.force_lazy_setfield(self)
         return pendingfields
 
-    def optimize_GETFIELD_GC(self, op):
+    def optimize_GETFIELD_GC_i(self, op):
         structvalue = self.getvalue(op.getarg(0))
         cf = self.field_cache(op.getdescr())
         fieldvalue = cf.getfield_from_cache(self, structvalue)
@@ -377,8 +377,10 @@
         # then remember the result of reading the field
         fieldvalue = self.getvalue(op.result)
         cf.remember_field_value(structvalue, fieldvalue, op)
+    optimize_GETFIELD_GC_p = optimize_GETFIELD_GC_i
+    optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
 
-    def optimize_GETFIELD_GC_PURE(self, op):
+    def optimize_GETFIELD_GC_PURE_i(self, op):
         structvalue = self.getvalue(op.getarg(0))
         cf = self.field_cache(op.getdescr())
         fieldvalue = cf.getfield_from_cache(self, structvalue)
@@ -388,6 +390,8 @@
         # default case: produce the operation
         structvalue.ensure_nonnull()
         self.emit_operation(op)
+    optimize_GETFIELD_GC_PURE_f = optimize_GETFIELD_GC_PURE_i
+    optimize_GETFIELD_GC_PURE_p = optimize_GETFIELD_GC_PURE_i
 
     def optimize_SETFIELD_GC(self, op):
         if self.has_pure_result(rop.GETFIELD_GC_PURE, [op.getarg(0)],
@@ -400,7 +404,7 @@
         cf.do_setfield(self, op)
         
 
-    def optimize_GETARRAYITEM_GC(self, op):
+    def optimize_GETARRAYITEM_GC_i(self, op):
         arrayvalue = self.getvalue(op.getarg(0))
         indexvalue = self.getvalue(op.getarg(1))
         cf = None
@@ -422,8 +426,10 @@
         if cf is not None:
             fieldvalue = self.getvalue(op.result)
             cf.remember_field_value(arrayvalue, fieldvalue, op)
+    optimize_GETARRAYITEM_GC_p = optimize_GETARRAYITEM_GC_i
+    optimize_GETARRAYITEM_GC_f = optimize_GETARRAYITEM_GC_i
 
-    def optimize_GETARRAYITEM_GC_PURE(self, op):
+    def optimize_GETARRAYITEM_GC_PURE_i(self, op):
         arrayvalue = self.getvalue(op.getarg(0))
         indexvalue = self.getvalue(op.getarg(1))
         cf = None
@@ -441,6 +447,8 @@
         # default case: produce the operation
         arrayvalue.ensure_nonnull()
         self.emit_operation(op)
+    optimize_GETARRAYITEM_GC_PURE_p = optimize_GETARRAYITEM_GC_PURE_i
+    optimize_GETARRAYITEM_GC_PURE_f = optimize_GETARRAYITEM_GC_PURE_i
 
     def optimize_SETARRAYITEM_GC(self, op):
         if self.has_pure_result(rop.GETARRAYITEM_GC_PURE, [op.getarg(0),
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -249,7 +249,7 @@
 CVAL_ZERO_FLOAT = ConstantValue(Const._new(0.0))
 llhelper.CVAL_NULLREF = ConstantValue(llhelper.CONST_NULL)
 oohelper.CVAL_NULLREF = ConstantValue(oohelper.CONST_NULL)
-REMOVED = AbstractResOp(None)
+REMOVED = AbstractResOp()
 
 
 class Optimization(object):
@@ -631,12 +631,14 @@
     def optimize_DEBUG_MERGE_POINT(self, op):
         self.emit_operation(op)
 
-    def optimize_GETARRAYITEM_GC_PURE(self, op):
+    def optimize_GETARRAYITEM_GC_PURE_i(self, op):
         indexvalue = self.getvalue(op.getarg(1))
         if indexvalue.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
             arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), indexvalue.box.getint())
         self.optimize_default(op)
+    optimize_GETARRAYITEM_GC_PURE_f = optimize_GETARRAYITEM_GC_PURE_i
+    optimize_GETARRAYITEM_GC_PURE_p = optimize_GETARRAYITEM_GC_PURE_i    
 
     def optimize_STRGETITEM(self, op):
         indexvalue = self.getvalue(op.getarg(1))
@@ -655,8 +657,10 @@
     # These are typically removed already by OptRewrite, but it can be
     # dissabled and unrolling emits some SAME_AS ops to setup the
     # optimizier state. These needs to always be optimized out.
-    def optimize_SAME_AS(self, op):
+    def optimize_SAME_AS_i(self, op):
         self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
+    optimize_SAME_AS_f = optimize_SAME_AS_i
+    optimize_SAME_AS_p = optimize_SAME_AS_i
 
     def optimize_MARK_OPAQUE_PTR(self, op):
         value = self.getvalue(op.getarg(0))
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -56,7 +56,7 @@
         if nextop:
             self.emit_operation(nextop)
 
-    def optimize_CALL_PURE(self, op):
+    def optimize_CALL_PURE_i(self, op):
         args = self.optimizer.make_args_key(op)
         oldop = self.pure_operations.get(args, None)
         if oldop is not None and oldop.getdescr() is op.getdescr():
@@ -74,6 +74,9 @@
         args = op.getarglist()
         self.emit_operation(ResOperation(rop.CALL, args, op.result,
                                          op.getdescr()))
+    optimize_CALL_PURE_f = optimize_CALL_PURE_i
+    optimize_CALL_PURE_p = optimize_CALL_PURE_i
+    optimize_CALL_PURE_N = optimize_CALL_PURE_i
 
     def optimize_GUARD_NO_EXCEPTION(self, op):
         if self.last_emitted_operation is REMOVED:
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -318,7 +318,7 @@
                               'fail')
         self.optimize_GUARD_CLASS(op)
 
-    def optimize_CALL_LOOPINVARIANT(self, op):
+    def optimize_CALL_LOOPINVARIANT_i(self, op):
         arg = op.getarg(0)
         # 'arg' must be a Const, because residual_call in codewriter
         # expects a compile-time constant
@@ -337,6 +337,9 @@
         self.emit_operation(op)
         resvalue = self.getvalue(op.result)
         self.loop_invariant_results[key] = resvalue
+    optimize_CALL_LOOPINVARIANT_p = optimize_CALL_LOOPINVARIANT_i
+    optimize_CALL_LOOPINVARIANT_f = optimize_CALL_LOOPINVARIANT_i
+    optimize_CALL_LOOPINVARIANT_N = optimize_CALL_LOOPINVARIANT_i
 
     def _optimize_nullness(self, op, box, expect_nonnull):
         value = self.getvalue(box)
@@ -409,7 +412,7 @@
 ##            return
 ##        self.emit_operation(op)
 
-    def optimize_CALL(self, op):
+    def optimize_CALL_i(self, op):
         # dispatch based on 'oopspecindex' to a method that handles
         # specifically the given oopspec call.  For non-oopspec calls,
         # oopspecindex is just zero.
@@ -419,6 +422,9 @@
             if self._optimize_CALL_ARRAYCOPY(op):
                 return
         self.emit_operation(op)
+    optimize_CALL_p = optimize_CALL_i
+    optimize_CALL_f = optimize_CALL_i
+    optimize_CALL_N = optimize_CALL_i
 
     def _optimize_CALL_ARRAYCOPY(self, op):
         source_value = self.getvalue(op.getarg(1))
@@ -448,7 +454,7 @@
             return True # 0-length arraycopy
         return False
 
-    def optimize_CALL_PURE(self, op):
+    def optimize_CALL_PURE_i(self, op):
         arg_consts = []
         for i in range(op.numargs()):
             arg = op.getarg(i)
@@ -468,6 +474,9 @@
                 self.last_emitted_operation = REMOVED
                 return
         self.emit_operation(op)
+    optimize_CALL_PURE_f = optimize_CALL_PURE_i
+    optimize_CALL_PURE_p = optimize_CALL_PURE_i
+    optimize_CALL_PURE_N = optimize_CALL_PURE_i
 
     def optimize_GUARD_NO_EXCEPTION(self, op):
         if self.last_emitted_operation is REMOVED:
@@ -501,8 +510,10 @@
         self.pure(rop.CAST_PTR_TO_INT, [op.result], op.getarg(0))
         self.emit_operation(op)
 
-    def optimize_SAME_AS(self, op):
+    def optimize_SAME_AS_i(self, op):
         self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
+    optimize_SAME_AS_p = optimize_SAME_AS_i
+    optimize_SAME_AS_f = optimize_SAME_AS_i
 
 dispatch_opt = make_dispatcher_method(OptRewrite, 'optimize_',
         default=OptRewrite.emit_operation)
diff --git a/pypy/jit/metainterp/optimizeopt/simplify.py b/pypy/jit/metainterp/optimizeopt/simplify.py
--- a/pypy/jit/metainterp/optimizeopt/simplify.py
+++ b/pypy/jit/metainterp/optimizeopt/simplify.py
@@ -7,16 +7,19 @@
     def __init__(self, unroll):
         self.last_label_descr = None
         self.unroll = unroll
-        
-    def optimize_CALL_PURE(self, op):
-        args = op.getarglist()
-        self.emit_operation(ResOperation(rop.CALL, args, op.result,
-                                         op.getdescr()))
 
-    def optimize_CALL_LOOPINVARIANT(self, op):
-        op = op.copy_and_change(rop.CALL)
-        self.emit_operation(op)
-
+    def _new_optimize_call(tp):
+        def optimize_call(self, op):
+            self.emit_operation(op.copy_and_change(getattr(rop, 'CALL_' + tp)))
+    optimize_CALL_PURE_i = _new_optimize_call('i')
+    optimize_CALL_PURE_f = _new_optimize_call('f')
+    optimize_CALL_PURE_N = _new_optimize_call('N')
+    optimize_CALL_PURE_p = _new_optimize_call('p')
+    optimize_CALL_LOOPINVARIANT_i = _new_optimize_call('i')
+    optimize_CALL_LOOPINVARIANT_f = _new_optimize_call('f')
+    optimize_CALL_LOOPINVARIANT_N = _new_optimize_call('N')
+    optimize_CALL_LOOPINVARIANT_p = _new_optimize_call('p')
+    
     def optimize_VIRTUAL_REF_FINISH(self, op):
         pass
 
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -21,7 +21,10 @@
             continue
         if hasattr(Class, name_prefix + name):
             opclass = resoperation.opclasses[getattr(rop, name)]
-            assert name in opclass.__name__
+            if name[-2] == "_":
+                assert name[:-2] in opclass.__name__
+            else:
+                assert name in opclass.__name__
             result.append((value, opclass, getattr(Class, name_prefix + name)))
     return unrolling_iterable(result)
 
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -437,7 +437,7 @@
         # will work too (but just be a little pointless, as the structure
         # was already forced).
 
-    def optimize_GETFIELD_GC(self, op):
+    def optimize_GETFIELD_GC_i(self, op):
         value = self.getvalue(op.getarg(0))
         # If this is an immutable field (as indicated by op.is_always_pure())
         # then it's safe to reuse the virtual's field, even if it has been
@@ -456,10 +456,14 @@
         else:
             value.ensure_nonnull()
             self.emit_operation(op)
+    optimize_GETFIELD_GC_p = optimize_GETFIELD_GC_i
+    optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
 
     # note: the following line does not mean that the two operations are
     # completely equivalent, because GETFIELD_GC_PURE is_always_pure().
-    optimize_GETFIELD_GC_PURE = optimize_GETFIELD_GC
+    optimize_GETFIELD_GC_PURE_i = optimize_GETFIELD_GC_i
+    optimize_GETFIELD_GC_PURE_p = optimize_GETFIELD_GC_i
+    optimize_GETFIELD_GC_PURE_f = optimize_GETFIELD_GC_i
 
     def optimize_SETFIELD_GC(self, op):
         value = self.getvalue(op.getarg(0))
@@ -499,7 +503,7 @@
             ###self.optimize_default(op)
             self.emit_operation(op)
 
-    def optimize_GETARRAYITEM_GC(self, op):
+    def optimize_GETARRAYITEM_GC_i(self, op):
         value = self.getvalue(op.getarg(0))
         if value.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
@@ -509,10 +513,14 @@
                 return
         value.ensure_nonnull()
         self.emit_operation(op)
+    optimize_GETARRAYITEM_GC_p = optimize_GETARRAYITEM_GC_i
+    optimize_GETARRAYITEM_GC_f = optimize_GETARRAYITEM_GC_i
 
     # note: the following line does not mean that the two operations are
     # completely equivalent, because GETARRAYITEM_GC_PURE is_always_pure().
-    optimize_GETARRAYITEM_GC_PURE = optimize_GETARRAYITEM_GC
+    optimize_GETARRAYITEM_GC_PURE_i = optimize_GETARRAYITEM_GC_i
+    optimize_GETARRAYITEM_GC_PURE_f = optimize_GETARRAYITEM_GC_i
+    optimize_GETARRAYITEM_GC_PURE_p = optimize_GETARRAYITEM_GC_i
 
     def optimize_SETARRAYITEM_GC(self, op):
         value = self.getvalue(op.getarg(0))
@@ -524,7 +532,7 @@
         value.ensure_nonnull()
         self.emit_operation(op)
 
-    def optimize_GETINTERIORFIELD_GC(self, op):
+    def optimize_GETINTERIORFIELD_GC_i(self, op):
         value = self.getvalue(op.getarg(0))
         if value.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
@@ -539,6 +547,8 @@
                 return
         value.ensure_nonnull()
         self.emit_operation(op)
+    optimize_GETINTERIORFIELD_GC_p = optimize_GETINTERIORFIELD_GC_i
+    optimize_GETINTERIORFIELD_GC_f = optimize_GETINTERIORFIELD_GC_i
 
     def optimize_SETINTERIORFIELD_GC(self, op):
         value = self.getvalue(op.getarg(0))
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -525,7 +525,7 @@
                 mode, need_next_offset=False
             )
 
-    def optimize_CALL(self, op):
+    def optimize_CALL_i(self, op):
         # dispatch based on 'oopspecindex' to a method that handles
         # specifically the given oopspec call.  For non-oopspec calls,
         # oopspecindex is just zero.
@@ -546,8 +546,14 @@
                 if self.opt_call_str_STR2UNICODE(op):
                     return
         self.emit_operation(op)
+    optimize_CALL_f = optimize_CALL_i
+    optimize_CALL_p = optimize_CALL_i
+    optimize_CALL_N = optimize_CALL_i
 
-    optimize_CALL_PURE = optimize_CALL
+    optimize_CALL_PURE_i = optimize_CALL_i
+    optimize_CALL_PURE_f = optimize_CALL_i
+    optimize_CALL_PURE_p = optimize_CALL_i
+    optimize_CALL_PURE_N = optimize_CALL_i
 
     def optimize_GUARD_NO_EXCEPTION(self, op):
         if self.last_emitted_operation is REMOVED:
diff --git a/pypy/jit/metainterp/quasiimmut.py b/pypy/jit/metainterp/quasiimmut.py
--- a/pypy/jit/metainterp/quasiimmut.py
+++ b/pypy/jit/metainterp/quasiimmut.py
@@ -111,7 +111,7 @@
         self.mutatefielddescr = mutatefielddescr
         gcref = structbox.getref_base()
         self.qmut = get_current_qmut_instance(cpu, gcref, mutatefielddescr)
-        self.constantfieldbox = self.get_current_constant_fieldvalue()
+        #self.constantfieldbox = self.get_current_constant_fieldvalue()
 
     def get_current_constant_fieldvalue(self):
         from pypy.jit.metainterp import executor
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -5,7 +5,10 @@
 @specialize.arg(0)
 def ResOperation(opnum, args, result, descr=None):
     cls = opclasses[opnum]
-    op = cls(result)
+    if result is None:
+        op = cls()
+    else:
+        op = cls(result)
     op.initarglist(args)
     if descr is not None:
         assert isinstance(op, ResOpWithDescr)
@@ -459,7 +462,7 @@
     'FLOAT_ABS/1/f',
     'CAST_FLOAT_TO_INT/1/i',          # don't use for unsigned ints; we would
     'CAST_INT_TO_FLOAT/1/f',          # need some messy code in the backend
-    'CAST_FLOAT_TO_SINGLEFLOAT/1/f',
+    'CAST_FLOAT_TO_SINGLEFLOAT/1/i',
     'CAST_SINGLEFLOAT_TO_FLOAT/1/f',
     'CONVERT_FLOAT_BYTES_TO_LONGLONG/1/f',
     'CONVERT_LONGLONG_BYTES_TO_FLOAT/1/f',
@@ -559,8 +562,8 @@
     #'OOSEND',                     # ootype operation
     #'OOSEND_PURE',                # ootype operation
     'CALL_PURE/*d/*',             # removed before it's passed to the backend
-    'CALL_MALLOC_GC/*d/*',      # like CALL, but NULL => propagate MemoryError
-    'CALL_MALLOC_NURSERY/1/*',  # nursery malloc, const number of bytes, zeroed
+    'CALL_MALLOC_GC/*d/p',      # like CALL, but NULL => propagate MemoryError
+    'CALL_MALLOC_NURSERY/1/p',  # nursery malloc, const number of bytes, zeroed
     '_CALL_LAST',
     '_CANRAISE_LAST', # ----- end of can_raise operations -----
 
@@ -655,7 +658,7 @@
 
     if tp == '*':
         res = []
-        for tp in ['f', 'p', 'i']:
+        for tp in ['f', 'p', 'i', 'N']:
             cls_name = '%s_OP_%s' % (name, tp)
             bases = (get_base_class(mixin, tpmixin[tp], baseclass),)
             dic = {'opnum': opnum}


More information about the pypy-commit mailing list