[pypy-commit] pypy default: Merged precise-instantiate:
alex_gaynor
noreply at buildbot.pypy.org
Fri Jul 12 07:57:24 CEST 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r65368:0bcbff2e5aca
Date: 2013-07-12 15:56 +1000
http://bitbucket.org/pypy/pypy/changeset/0bcbff2e5aca/
Log: Merged precise-instantiate:
Makes it so the analyzers are able to see which "instantiate"
functions can actually be called when cls() could be any one of
several classes.
diff --git a/rpython/jit/codewriter/test/test_codewriter.py b/rpython/jit/codewriter/test/test_codewriter.py
--- a/rpython/jit/codewriter/test/test_codewriter.py
+++ b/rpython/jit/codewriter/test/test_codewriter.py
@@ -13,6 +13,7 @@
self.ARGS = ARGS
self.RESULT = RESULT
self.effectinfo = effectinfo
+
def get_extra_info(self):
return self.effectinfo
@@ -37,7 +38,7 @@
class tracker:
pass
-
+
calldescrof = FakeCallDescr
fielddescrof = FakeFieldDescr
sizeof = FakeSizeDescr
@@ -121,20 +122,32 @@
blackholeinterp.run()
assert blackholeinterp.get_tmpreg_i() == 100+6+5+4+3
+
def test_instantiate():
- class A1: id = 651
- class A2(A1): id = 652
- class B1: id = 661
- class B2(B1): id = 662
+ class A1:
+ id = 651
+
+ class A2(A1):
+ id = 652
+
+ class B1:
+ id = 661
+
+ class B2(B1):
+ id = 662
+
def dont_look(n):
return n + 1
+
+ classes = [
+ (A1, B1),
+ (A2, B2)
+ ]
+
def f(n):
- if n > 5:
- x, y = A1, B1
- else:
- x, y = A2, B2
+ x, y = classes[n]
return x().id + y().id + dont_look(n)
- rtyper = support.annotate(f, [35])
+ rtyper = support.annotate(f, [0])
maingraph = rtyper.annotator.translator.graphs[0]
cw = CodeWriter(FakeCPU(rtyper), [FakeJitDriverSD(maingraph)])
cw.find_all_graphs(FakePolicy())
@@ -149,16 +162,10 @@
else:
assert 0, "missing instantiate_*_%s in:\n%r" % (expected,
names)
- #
- print cw.assembler.list_of_addr2name
- names = dict.fromkeys([value
- for key, value in cw.assembler.list_of_addr2name])
- assert 'A1' in names
- assert 'B1' in names
- assert 'A2' in names
- assert 'B2' in names
+ names = set([value for key, value in cw.assembler.list_of_addr2name])
assert 'dont_look' in names
+
def test_instantiate_with_unreasonable_attr():
# It is possible to have in real code the instantiate() function for
# a class be dont-look-inside. This is caused by the code that
@@ -169,17 +176,19 @@
name = graph.name
return not (name.startswith('instantiate_') and
name.endswith('A2'))
+
class A1:
pass
+
class A2(A1):
pass
+
+ classes = [A1, A2]
+
def f(n):
- if n > 5:
- x = A1
- else:
- x = A2
+ x = classes[n]
x()
- rtyper = support.annotate(f, [35])
+ rtyper = support.annotate(f, [1])
maingraph = rtyper.annotator.translator.graphs[0]
cw = CodeWriter(FakeCPU(rtyper), [FakeJitDriverSD(maingraph)])
cw.find_all_graphs(MyFakePolicy())
@@ -188,12 +197,7 @@
names = [jitcode.name for jitcode in cw.assembler.indirectcalltargets]
assert len(names) == 1
assert names[0].startswith('instantiate_') and names[0].endswith('A1')
- #
- print cw.assembler.list_of_addr2name
- names = dict.fromkeys([value
- for key, value in cw.assembler.list_of_addr2name])
- assert 'A1' in names
- assert 'A2' in names
+
def test_int_abs():
def f(n):
@@ -209,7 +213,7 @@
def test_raw_malloc_and_access():
TP = rffi.CArray(lltype.Signed)
-
+
def f(n):
a = lltype.malloc(TP, n, flavor='raw')
a[0] = n
diff --git a/rpython/jit/codewriter/test/test_effectinfo.py b/rpython/jit/codewriter/test/test_effectinfo.py
--- a/rpython/jit/codewriter/test/test_effectinfo.py
+++ b/rpython/jit/codewriter/test/test_effectinfo.py
@@ -132,7 +132,6 @@
fgraph = graphof(t, func)
return VirtualizableAnalyzer(t).analyze(fgraph.startblock.operations[0])
- @pytest.mark.xfail
def test_constructor(self):
class A(object):
x = 1
diff --git a/rpython/rtyper/lltypesystem/rpbc.py b/rpython/rtyper/lltypesystem/rpbc.py
--- a/rpython/rtyper/lltypesystem/rpbc.py
+++ b/rpython/rtyper/lltypesystem/rpbc.py
@@ -1,25 +1,20 @@
import types
-import sys
-from rpython.tool.pairtype import pairtype, pair
-from rpython.annotator import model as annmodel
-from rpython.annotator import description
-from rpython.flowspace.model import Constant, Variable
-from rpython.rtyper.lltypesystem.lltype import \
- typeOf, Void, ForwardReference, Struct, Bool, Char, \
- Ptr, malloc, nullptr, Array, Signed, FuncType
-from rpython.rtyper.rmodel import Repr, TyperError, inputconst, inputdesc
-from rpython.rtyper.rpbc import samesig,\
- commonbase, allattributenames, adjust_shape, \
- AbstractClassesPBCRepr, AbstractMethodsPBCRepr, OverriddenFunctionPBCRepr, \
- AbstractMultipleFrozenPBCRepr, MethodOfFrozenPBCRepr, \
- AbstractFunctionsPBCRepr, AbstractMultipleUnrelatedFrozenPBCRepr, \
- SingleFrozenPBCRepr, none_frozen_pbc_repr, get_concrete_calltable
+
+from rpython.annotator import description, model as annmodel
+from rpython.rlib.debug import ll_assert
+from rpython.rlib.unroll import unrolling_iterable
+from rpython.rtyper import callparse
from rpython.rtyper.lltypesystem import rclass, llmemory
-from rpython.tool.sourcetools import has_varargs
-from rpython.rlib.unroll import unrolling_iterable
-from rpython.rlib.debug import ll_assert
+from rpython.rtyper.lltypesystem.lltype import (typeOf, Void, ForwardReference,
+ Struct, Bool, Char, Ptr, malloc, nullptr, Array, Signed)
+from rpython.rtyper.rmodel import Repr, TyperError, inputconst
+from rpython.rtyper.rpbc import (AbstractClassesPBCRepr, AbstractMethodsPBCRepr,
+ OverriddenFunctionPBCRepr, AbstractMultipleFrozenPBCRepr,
+ AbstractFunctionsPBCRepr, AbstractMultipleUnrelatedFrozenPBCRepr,
+ SingleFrozenPBCRepr, MethodOfFrozenPBCRepr, none_frozen_pbc_repr,
+ get_concrete_calltable)
+from rpython.tool.pairtype import pairtype
-from rpython.rtyper import callparse
def rtype_is_None(robj1, rnone2, hop, pos=0):
if isinstance(robj1.lowleveltype, Ptr):
@@ -41,6 +36,7 @@
else:
raise TyperError('rtype_is_None of %r' % (robj1))
+
# ____________________________________________________________
class MultipleFrozenPBCRepr(AbstractMultipleFrozenPBCRepr):
@@ -67,7 +63,7 @@
mangled_name, r_value = self.fieldmap[attr]
cmangledname = inputconst(Void, mangled_name)
return llops.genop('getfield', [vpbc, cmangledname],
- resulttype = r_value)
+ resulttype=r_value)
class MultipleUnrelatedFrozenPBCRepr(AbstractMultipleUnrelatedFrozenPBCRepr):
@@ -86,6 +82,7 @@
def null_instance(self):
return llmemory.Address._defl()
+
class __extend__(pairtype(MultipleUnrelatedFrozenPBCRepr,
MultipleUnrelatedFrozenPBCRepr),
pairtype(MultipleUnrelatedFrozenPBCRepr,
@@ -100,11 +97,13 @@
vlist = hop.inputargs(r, r)
return hop.genop('adr_eq', vlist, resulttype=Bool)
+
class __extend__(pairtype(MultipleFrozenPBCRepr,
MultipleUnrelatedFrozenPBCRepr)):
def convert_from_to((robj1, robj2), v, llops):
return llops.genop('cast_ptr_to_adr', [v], resulttype=llmemory.Address)
+
# ____________________________________________________________
class FunctionsPBCRepr(AbstractFunctionsPBCRepr):
@@ -123,6 +122,7 @@
def get_specfunc_row(self, llop, v, c_rowname, resulttype):
return llop.genop('getfield', [v, c_rowname], resulttype=resulttype)
+
class SmallFunctionSetPBCRepr(Repr):
def __init__(self, rtyper, s_pbc):
self.rtyper = rtyper
@@ -252,15 +252,6 @@
return hop.genop('char_ne', [v1, inputconst(Char, '\000')],
resulttype=Bool)
-## def rtype_simple_call(self, hop):
-## v_index = hop.inputarg(self, arg=0)
-## v_ptr = hop.llops.convertvar(v_index, self, self.pointer_repr)
-## hop2 = hop.copy()
-## hop2.args_r[0] = self.pointer_repr
-## hop2.args_v[0] = v_ptr
-## return hop2.dispatch()
-
-## rtype_call_args = rtype_simple_call
class __extend__(pairtype(SmallFunctionSetPBCRepr, FunctionsPBCRepr)):
def convert_from_to((r_set, r_ptr), v, llops):
@@ -273,6 +264,7 @@
return llops.genop('getarrayitem', [r_set.c_pointer_table, v_int],
resulttype=r_ptr.lowleveltype)
+
def compression_function(r_set):
if r_set._compression_function is None:
table = []
@@ -280,6 +272,7 @@
table.append((chr(i), p))
last_c, last_p = table[-1]
unroll_table = unrolling_iterable(table[:-1])
+
def ll_compress(fnptr):
for c, p in unroll_table:
if fnptr == p:
@@ -290,6 +283,7 @@
r_set._compression_function = ll_compress
return r_set._compression_function
+
class __extend__(pairtype(FunctionsPBCRepr, SmallFunctionSetPBCRepr)):
def convert_from_to((r_ptr, r_set), v, llops):
if r_ptr.lowleveltype is Void:
@@ -299,6 +293,7 @@
ll_compress = compression_function(r_set)
return llops.gendirectcall(ll_compress, v)
+
def conversion_table(r_from, r_to):
if r_to in r_from._conversion_tables:
return r_from._conversion_tables[r_to]
@@ -320,7 +315,6 @@
r_from._conversion_tables[r_to] = r
return r
-## myf = open('convlog.txt', 'w')
class __extend__(pairtype(SmallFunctionSetPBCRepr, SmallFunctionSetPBCRepr)):
def convert_from_to((r_from, r_to), v, llops):
@@ -343,6 +337,7 @@
else:
return v
+
class MethodsPBCRepr(AbstractMethodsPBCRepr):
"""Representation selected for a PBC of the form {func: classdef...}.
It assumes that all the methods come from the same name in a base
@@ -394,9 +389,12 @@
# no __init__ here, AbstractClassesPBCRepr.__init__ is good enough
def _instantiate_runtime_class(self, hop, vtypeptr, r_instance):
- from rpython.rtyper.lltypesystem.rbuiltin import ll_instantiate
- v_inst1 = hop.gendirectcall(ll_instantiate, vtypeptr)
- return hop.genop('cast_pointer', [v_inst1], resulttype = r_instance)
+ v_instantiate = hop.genop('getfield', [vtypeptr, hop.inputconst(Void, "instantiate")], resulttype=vtypeptr.concretetype.TO.instantiate)
+ possible_graphs = hop.inputconst(Void,
+ [desc.getclassdef(None).my_instantiate_graph for desc in self.s_pbc.descriptions]
+ )
+ v_inst = hop.genop('indirect_call', [v_instantiate, possible_graphs], resulttype=vtypeptr.concretetype.TO.instantiate.TO.RESULT)
+ return hop.genop('cast_pointer', [v_inst], resulttype=r_instance)
def getlowleveltype(self):
return rclass.CLASSTYPE
@@ -415,17 +413,3 @@
return 0
else:
return cls.hash
-
-# ____________________________________________________________
-
-##def rtype_call_memo(hop):
-## memo_table = hop.args_v[0].value
-## if memo_table.s_result.is_constant():
-## return hop.inputconst(hop.r_result, memo_table.s_result.const)
-## fieldname = memo_table.fieldname
-## assert hop.nb_args == 2, "XXX"
-
-## r_pbc = hop.args_r[1]
-## assert isinstance(r_pbc, (MultipleFrozenPBCRepr, ClassesPBCRepr))
-## v_table, v_pbc = hop.inputargs(Void, r_pbc)
-## return r_pbc.getfield(v_pbc, fieldname, hop.llops)
More information about the pypy-commit
mailing list