[pypy-svn] r69154 - in pypy/trunk/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Nov 11 13:09:09 CET 2009
Author: arigo
Date: Wed Nov 11 13:09:09 2009
New Revision: 69154
Modified:
pypy/trunk/pypy/jit/metainterp/codewriter.py
pypy/trunk/pypy/jit/metainterp/pyjitpl.py
pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py
Log:
(fijal, arigo)
Introduce a list that maps the address of functions and classes
to their name.
Modified: pypy/trunk/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/trunk/pypy/jit/metainterp/codewriter.py Wed Nov 11 13:09:09 2009
@@ -65,6 +65,8 @@
self.counter = 0
self.class_sizes = []
self._class_sizes_seen = {}
+ self.list_of_addr2name = []
+ self._functions_addr_seen = {}
# set later with .start()
self.metainterp_sd = None
@@ -172,7 +174,8 @@
portal_code = self.make_portal_bytecode(portal_graph)
self.metainterp_sd.info_from_codewriter(portal_code, leave_code,
- self.class_sizes)
+ self.class_sizes,
+ self.list_of_addr2name)
def _start(self, metainterp_sd, portal_runner_ptr):
self.metainterp_sd = metainterp_sd
@@ -306,6 +309,8 @@
methdescr.setup(jitcodes)
def getcalldescr(self, v_func, args, result, consider_effects_of=None):
+ if isinstance(v_func, Constant):
+ self.register_known_function(v_func.value)
non_void_args = [x for x in args if x.concretetype is not lltype.Void]
NON_VOID_ARGS = [x.concretetype for x in non_void_args]
RESULT = result.concretetype
@@ -330,6 +335,8 @@
self._class_sizes_seen[key] = True
sizedescr = self.cpu.sizeof(STRUCT)
self.class_sizes.append((vtable, sizedescr))
+ vtable_addr = llmemory.cast_ptr_to_adr(vtable)
+ self.list_of_addr2name.append((vtable_addr, STRUCT.__name__))
def register_known_ooclass(self, cls, CLASS):
# ootype only
@@ -338,6 +345,12 @@
typedescr = self.cpu.typedescrof(CLASS)
self.class_sizes.append((cls, typedescr))
+ def register_known_function(self, func):
+ if self.rtyper.type_system.name == 'lltypesystem':
+ if func._obj not in self._functions_addr_seen:
+ self._functions_addr_seen[func._obj] = True
+ func_addr = llmemory.cast_ptr_to_adr(func)
+ self.list_of_addr2name.append((func_addr, func._obj._name))
class BytecodeMaker(object):
Modified: pypy/trunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/trunk/pypy/jit/metainterp/pyjitpl.py Wed Nov 11 13:09:09 2009
@@ -1022,15 +1022,18 @@
self.portal_code = None
self.leave_code = None
- self._class_sizes = None
+ self._class_sizes = None
+ self._list_of_addr2name = None
def _freeze_(self):
return True
- def info_from_codewriter(self, portal_code, leave_code, class_sizes):
+ def info_from_codewriter(self, portal_code, leave_code, class_sizes,
+ list_of_addr2name=[]):
self.portal_code = portal_code
self.leave_code = leave_code
self._class_sizes = class_sizes
+ self._list_of_addr2name = list_of_addr2name
def finish_setup(self, optimizer=None):
warmrunnerdesc = self.warmrunnerdesc
@@ -1063,6 +1066,10 @@
class_sizes[vtable] = sizedescr
self.cpu.set_class_sizes(class_sizes)
+ def get_addr2name_dict(self):
+ # for debugging
+ pass #...
+
def bytecode_for_address(self, fnaddress):
if we_are_translated():
d = self.globaldata.indirectcall_dict
Modified: pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_codewriter.py Wed Nov 11 13:09:09 2009
@@ -121,12 +121,14 @@
supports_floats = False
def fielddescrof(self, STRUCT, fieldname):
return ('fielddescr', STRUCT, fieldname)
- def calldescrof(self, FUNC, NON_VOID_ARGS, RESULT):
+ def calldescrof(self, FUNC, NON_VOID_ARGS, RESULT, stuff=None):
return ('calldescr', FUNC, NON_VOID_ARGS, RESULT)
def typedescrof(self, CLASS):
return ('typedescr', CLASS)
def methdescrof(self, CLASS, methname):
return FakeMethDescr(CLASS, methname)
+ def sizeof(self, STRUCT):
+ return ('sizeof', STRUCT)
if type_system == 'lltype':
FakeCPU.ts = typesystem.llhelper
@@ -366,6 +368,24 @@
assert jitcode._source.count('oononnull') == 2
assert jitcode._source.count('ooisnull') == 2
+ def test_list_of_addr2name(self):
+ class A1:
+ def g(self):
+ self.x = 123
+ return 5
+ def f():
+ a = A1()
+ a.y = a.g()
+ return a
+ graphs = self.make_graphs(f, [])
+ cw = CodeWriter(self.rtyper)
+ cw.candidate_graphs = [graphs[0]]
+ cw._start(self.metainterp_sd, None)
+ jitcode = cw.make_one_bytecode((graphs[0], None), False)
+ assert len(cw.list_of_addr2name) == 2
+ assert cw.list_of_addr2name[0][1].endswith('.A1')
+ assert cw.list_of_addr2name[1][1] == 'A1.g'
+
class ImmutableFieldsTests:
def test_fields(self):
More information about the Pypy-commit
mailing list