[pypy-commit] pypy py3k: merge default
pjenvey
noreply at buildbot.pypy.org
Mon Apr 7 20:54:01 CEST 2014
Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r70484:dbedd0a64d5d
Date: 2014-04-07 11:53 -0700
http://bitbucket.org/pypy/pypy/changeset/dbedd0a64d5d/
Log: merge default
diff too long, truncating to 2000 out of 3817 lines
diff --git a/lib-python/2.7/test/test_argparse.py b/lib-python/2.7/test/test_argparse.py
--- a/lib-python/2.7/test/test_argparse.py
+++ b/lib-python/2.7/test/test_argparse.py
@@ -48,7 +48,6 @@
def tearDown(self):
os.chdir(self.old_dir)
- gc.collect()
for root, dirs, files in os.walk(self.temp_dir, topdown=False):
for name in files:
os.chmod(os.path.join(self.temp_dir, name), stat.S_IWRITE)
diff --git a/lib-python/2.7/test/test_file2k.py b/lib-python/2.7/test/test_file2k.py
--- a/lib-python/2.7/test/test_file2k.py
+++ b/lib-python/2.7/test/test_file2k.py
@@ -162,6 +162,7 @@
# Remark: Do not perform more than one test per open file,
# since that does NOT catch the readline error on Windows.
data = 'xxx'
+ self.f.close()
for mode in ['w', 'wb', 'a', 'ab']:
for attr in ['read', 'readline', 'readlines']:
self.f = open(TESTFN, mode)
diff --git a/lib_pypy/_ctypes_test.py b/lib_pypy/_ctypes_test.py
--- a/lib_pypy/_ctypes_test.py
+++ b/lib_pypy/_ctypes_test.py
@@ -19,5 +19,5 @@
fp, filename, description = imp.find_module('_ctypes_test', path=[output_dir])
imp.load_module('_ctypes_test', fp, filename, description)
except ImportError:
- print 'could not find _ctypes_test in',output_dir
+ print('could not find _ctypes_test in %s' % output_dir)
_pypy_testcapi.compile_shared('_ctypes_test.c', '_ctypes_test', output_dir)
diff --git a/pypy/doc/_ref.txt b/pypy/doc/_ref.txt
--- a/pypy/doc/_ref.txt
+++ b/pypy/doc/_ref.txt
@@ -4,7 +4,6 @@
.. _`lib-python/2.7/dis.py`: https://bitbucket.org/pypy/pypy/src/default/lib-python/2.7/dis.py
.. _`lib_pypy/`: https://bitbucket.org/pypy/pypy/src/default/lib_pypy/
.. _`lib_pypy/greenlet.py`: https://bitbucket.org/pypy/pypy/src/default/lib_pypy/greenlet.py
-.. _`lib_pypy/pypy_test/`: https://bitbucket.org/pypy/pypy/src/default/lib_pypy/pypy_test/
.. _`lib_pypy/tputil.py`: https://bitbucket.org/pypy/pypy/src/default/lib_pypy/tputil.py
.. _`pypy/bin/`: https://bitbucket.org/pypy/pypy/src/default/pypy/bin/
.. _`pypy/bin/pyinteractive.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/bin/pyinteractive.py
@@ -35,7 +34,6 @@
.. _`pypy/interpreter/gateway.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/interpreter/gateway.py
.. _`pypy/interpreter/mixedmodule.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/interpreter/mixedmodule.py
.. _`pypy/interpreter/module.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/interpreter/module.py
-.. _`pypy/interpreter/nestedscope.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/interpreter/nestedscope.py
.. _`pypy/interpreter/pyframe.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/interpreter/pyframe.py
.. _`pypy/interpreter/pyopcode.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/interpreter/pyopcode.py
.. _`pypy/interpreter/pyparser`:
@@ -49,21 +47,21 @@
.. _`pypy/module`:
.. _`pypy/module/`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/
.. _`pypy/module/__builtin__/__init__.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/__builtin__/__init__.py
+.. _`pypy/module/cppyy/capi/__init__.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/cppyy/capi/__init__.py
+.. _`pypy/module/cppyy/capi/builtin_capi.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/cppyy/capi/builtin_capi.py
+.. _`pypy/module/cppyy/include/capi.h`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/cppyy/include/capi.h
+.. _`pypy/module/test_lib_pypy/`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/test_lib_pypy/
.. _`pypy/objspace/`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/
-.. _`pypy/objspace/flow/`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/flow/
.. _`pypy/objspace/std`:
.. _`pypy/objspace/std/`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/
-.. _`pypy/objspace/std/listtype.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/listtype.py
+.. _`pypy/objspace/std/bytesobject.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/bytesobject.py
.. _`pypy/objspace/std/multimethod.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/multimethod.py
.. _`pypy/objspace/std/objspace.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/objspace.py
.. _`pypy/objspace/std/proxy_helpers.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/proxy_helpers.py
.. _`pypy/objspace/std/proxyobject.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/proxyobject.py
-.. _`pypy/objspace/std/stringtype.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/stringtype.py
+.. _`pypy/objspace/std/strbufobject.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/strbufobject.py
.. _`pypy/objspace/std/transparent.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/transparent.py
-.. _`pypy/objspace/std/tupleobject.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/tupleobject.py
-.. _`pypy/objspace/std/tupletype.py`: https://bitbucket.org/pypy/pypy/src/default/pypy/objspace/std/tupletype.py
.. _`pypy/tool/`: https://bitbucket.org/pypy/pypy/src/default/pypy/tool/
-.. _`pypy/tool/algo/`: https://bitbucket.org/pypy/pypy/src/default/pypy/tool/algo/
.. _`pypy/tool/pytest/`: https://bitbucket.org/pypy/pypy/src/default/pypy/tool/pytest/
.. _`rpython/annotator`:
.. _`rpython/annotator/`: https://bitbucket.org/pypy/pypy/src/default/rpython/annotator/
@@ -75,6 +73,11 @@
.. _`rpython/config/translationoption.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/config/translationoption.py
.. _`rpython/flowspace/`: https://bitbucket.org/pypy/pypy/src/default/rpython/flowspace/
.. _`rpython/flowspace/model.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/flowspace/model.py
+.. _`rpython/memory/`: https://bitbucket.org/pypy/pypy/src/default/rpython/memory/
+.. _`rpython/memory/gc/generation.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/memory/gc/generation.py
+.. _`rpython/memory/gc/hybrid.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/memory/gc/hybrid.py
+.. _`rpython/memory/gc/minimarkpage.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/memory/gc/minimarkpage.py
+.. _`rpython/memory/gc/semispace.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/memory/gc/semispace.py
.. _`rpython/rlib`:
.. _`rpython/rlib/`: https://bitbucket.org/pypy/pypy/src/default/rpython/rlib/
.. _`rpython/rlib/listsort.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rlib/listsort.py
@@ -93,16 +96,12 @@
.. _`rpython/rtyper/`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/
.. _`rpython/rtyper/lltypesystem/`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/lltypesystem/
.. _`rpython/rtyper/lltypesystem/lltype.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/lltypesystem/lltype.py
-.. _`rpython/rtyper/memory/`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/memory/
-.. _`rpython/rtyper/memory/gc/generation.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/memory/gc/generation.py
-.. _`rpython/rtyper/memory/gc/hybrid.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/memory/gc/hybrid.py
-.. _`rpython/rtyper/memory/gc/minimarkpage.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/memory/gc/minimarkpage.py
-.. _`rpython/rtyper/memory/gc/semispace.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/memory/gc/semispace.py
.. _`rpython/rtyper/rint.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/rint.py
.. _`rpython/rtyper/rlist.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/rlist.py
.. _`rpython/rtyper/rmodel.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/rmodel.py
.. _`rpython/rtyper/rtyper.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/rtyper.py
.. _`rpython/rtyper/test/test_llinterp.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/test/test_llinterp.py
+.. _`rpython/tool/algo/`: https://bitbucket.org/pypy/pypy/src/default/rpython/tool/algo/
.. _`rpython/translator`:
.. _`rpython/translator/`: https://bitbucket.org/pypy/pypy/src/default/rpython/translator/
.. _`rpython/translator/backendopt/`: https://bitbucket.org/pypy/pypy/src/default/rpython/translator/backendopt/
diff --git a/pypy/doc/cleanup.rst b/pypy/doc/cleanup.rst
--- a/pypy/doc/cleanup.rst
+++ b/pypy/doc/cleanup.rst
@@ -9,9 +9,3 @@
distribution.rst
- dot-net.rst
-
-
-
-
-
diff --git a/pypy/doc/coding-guide.rst b/pypy/doc/coding-guide.rst
--- a/pypy/doc/coding-guide.rst
+++ b/pypy/doc/coding-guide.rst
@@ -742,9 +742,9 @@
Testing modules in ``lib_pypy/``
--------------------------------
-You can go to the `lib_pypy/pypy_test/`_ directory and invoke the testing tool
+You can go to the `pypy/module/test_lib_pypy/`_ directory and invoke the testing tool
("py.test" or "python ../../pypy/test_all.py") to run tests against the
-lib_pypy hierarchy. Note, that tests in `lib_pypy/pypy_test/`_ are allowed
+lib_pypy hierarchy. Note, that tests in `pypy/module/test_lib_pypy/`_ are allowed
and encouraged to let their tests run at interpreter level although
`lib_pypy/`_ modules eventually live at PyPy's application level.
This allows us to quickly test our python-coded reimplementations
@@ -835,15 +835,6 @@
web interface.
.. _`development tracker`: https://bugs.pypy.org/
-
-use your codespeak login or register
-------------------------------------
-
-If you have an existing codespeak account, you can use it to login within the
-tracker. Else, you can `register with the tracker`_ easily.
-
-
-.. _`register with the tracker`: https://bugs.pypy.org/user?@template=register
.. _`roundup`: http://roundup.sourceforge.net/
diff --git a/pypy/doc/config/opt.rst b/pypy/doc/config/opt.rst
--- a/pypy/doc/config/opt.rst
+++ b/pypy/doc/config/opt.rst
@@ -46,5 +46,5 @@
The default level is `2`.
-.. _`Boehm-Demers-Weiser garbage collector`: http://www.hpl.hp.com/personal/Hans_Boehm/gc/
+.. _`Boehm-Demers-Weiser garbage collector`: http://hboehm.info/gc/
.. _`custom garbage collectors`: ../garbage_collection.html
diff --git a/pypy/doc/config/translation.backendopt.txt b/pypy/doc/config/translation.backendopt.txt
--- a/pypy/doc/config/translation.backendopt.txt
+++ b/pypy/doc/config/translation.backendopt.txt
@@ -1,5 +1,5 @@
This group contains options about various backend optimization passes. Most of
them are described in the `EU report about optimization`_
-.. _`EU report about optimization`: http://codespeak.net/pypy/extradoc/eu-report/D07.1_Massive_Parallelism_and_Translation_Aspects-2007-02-28.pdf
+.. _`EU report about optimization`: https://bitbucket.org/pypy/extradoc/raw/tip/eu-report/D07.1_Massive_Parallelism_and_Translation_Aspects-2007-02-28.pdf
diff --git a/pypy/doc/cppyy_backend.rst b/pypy/doc/cppyy_backend.rst
--- a/pypy/doc/cppyy_backend.rst
+++ b/pypy/doc/cppyy_backend.rst
@@ -51,3 +51,6 @@
to ``PATH``).
In case of the former, include files are expected under ``$ROOTSYS/include``
and libraries under ``$ROOTSYS/lib``.
+
+
+.. include:: _ref.txt
diff --git a/pypy/doc/dir-reference.rst b/pypy/doc/dir-reference.rst
--- a/pypy/doc/dir-reference.rst
+++ b/pypy/doc/dir-reference.rst
@@ -47,7 +47,7 @@
`pypy/tool/`_ various utilities and hacks used
from various places
-`pypy/tool/algo/`_ general-purpose algorithmic and mathematic
+`rpython/tool/algo/`_ general-purpose algorithmic and mathematic
tools
`pypy/tool/pytest/`_ support code for our `testing methods`_
@@ -129,3 +129,4 @@
.. _Mono: http://www.mono-project.com/
.. _`"standard library"`: rlib.html
.. _`graph viewer`: getting-started-dev.html#try-out-the-translator
+.. include:: _ref.txt
diff --git a/pypy/doc/discussions.rst b/pypy/doc/discussions.rst
--- a/pypy/doc/discussions.rst
+++ b/pypy/doc/discussions.rst
@@ -11,7 +11,5 @@
discussion/finalizer-order.rst
discussion/howtoimplementpickling.rst
discussion/improve-rpython.rst
- discussion/outline-external-ootype.rst
- discussion/VM-integration.rst
diff --git a/pypy/doc/distribution.rst b/pypy/doc/distribution.rst
--- a/pypy/doc/distribution.rst
+++ b/pypy/doc/distribution.rst
@@ -1,5 +1,3 @@
-.. include:: needswork.txt
-
=============================
lib_pypy/distributed features
=============================
diff --git a/pypy/doc/eventhistory.rst b/pypy/doc/eventhistory.rst
--- a/pypy/doc/eventhistory.rst
+++ b/pypy/doc/eventhistory.rst
@@ -17,7 +17,7 @@
Read more in the `EuroPython 2006 sprint report`_.
-.. _`EuroPython 2006 sprint report`: http://codespeak.net/pypy/extradoc/sprintinfo/post-ep2006/report.txt
+.. _`EuroPython 2006 sprint report`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/post-ep2006/report.txt
PyPy at XP 2006 and Agile 2006
==================================================================
@@ -41,8 +41,8 @@
Read more in `the sprint announcement`_, see who is planning to attend
on the `people page`_.
-.. _`the sprint announcement`: http://codespeak.net/pypy/extradoc/sprintinfo/ddorf2006/announce.html
-.. _`people page`: http://codespeak.net/pypy/extradoc/sprintinfo/ddorf2006/people.html
+.. _`the sprint announcement`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ddorf2006/announce.html
+.. _`people page`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ddorf2006/people.txt
PyPy sprint at Akihabara (Tokyo, Japan)
==================================================================
@@ -84,8 +84,8 @@
Read the report_ and the original announcement_.
-.. _report: http://codespeak.net/pypy/extradoc/sprintinfo/louvain-la-neuve-2006/report.html
-.. _announcement: http://codespeak.net/pypy/extradoc/sprintinfo/louvain-la-neuve-2006/sprint-announcement.html
+.. _report: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/louvain-la-neuve-2006/report.txt
+.. _announcement: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/louvain-la-neuve-2006/sprint-announcement.txt
PyCon Sprint 2006 (Dallas, Texas, USA)
==================================================================
@@ -114,7 +114,7 @@
said they were interested in the outcome and would keep an eye on its
progress. Read the `talk slides`_.
-.. _`talk slides`: http://codespeak.net/pypy/extradoc/talk/solutions-linux-paris-2006.html
+.. _`talk slides`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/solutions-linux-paris-2006.html
PyPy Sprint in Palma De Mallorca 23rd - 29th January 2006
@@ -129,9 +129,9 @@
for the first three days and `one for the rest of the sprint`_.
-.. _`the announcement`: http://codespeak.net/pypy/extradoc/sprintinfo/mallorca/sprint-announcement.html
-.. _`sprint report`: http://codespeak.net/pipermail/pypy-dev/2006q1/002746.html
-.. _`one for the rest of the sprint`: http://codespeak.net/pipermail/pypy-dev/2006q1/002749.html
+.. _`the announcement`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/mallorca/sprint-announcement.txt
+.. _`sprint report`: https://mail.python.org/pipermail/pypy-dev/2006-January/002746.html
+.. _`one for the rest of the sprint`: https://mail.python.org/pipermail/pypy-dev/2006-January/002749.html
Preliminary EU reports released
===============================
@@ -155,8 +155,8 @@
Michael and Carl have written a `report about the first half`_ and `one about
the second half`_ of the sprint. *(12/18/2005)*
-.. _`report about the first half`: http://codespeak.net/pipermail/pypy-dev/2005q4/002656.html
-.. _`one about the second half`: http://codespeak.net/pipermail/pypy-dev/2005q4/002660.html
+.. _`report about the first half`: https://mail.python.org/pipermail/pypy-dev/2005-December/002656.html
+.. _`one about the second half`: https://mail.python.org/pipermail/pypy-dev/2005-December/002660.html
PyPy release 0.8.0
===================
@@ -187,12 +187,12 @@
way back.
*(10/18/2005)*
-.. _`Logilab offices in Paris`: http://codespeak.net/pypy/extradoc/sprintinfo/paris-2005-sprint.html
+.. _`Logilab offices in Paris`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/paris-2005-sprint.txt
.. _JIT: http://en.wikipedia.org/wiki/Just-in-time_compilation
.. _`continuation-passing`: http://en.wikipedia.org/wiki/Continuation_passing_style
-.. _`report about day one`: http://codespeak.net/pipermail/pypy-dev/2005q4/002510.html
-.. _`one about day two and three`: http://codespeak.net/pipermail/pypy-dev/2005q4/002512.html
-.. _`the rest of the sprint`: http://codespeak.net/pipermail/pypy-dev/2005q4/002514.html
+.. _`report about day one`: https://mail.python.org/pipermail/pypy-dev/2005-October/002510.html
+.. _`one about day two and three`: https://mail.python.org/pipermail/pypy-dev/2005-October/002512.html
+.. _`the rest of the sprint`: https://mail.python.org/pipermail/pypy-dev/2005-October/002514.html
PyPy release 0.7.0
===================
@@ -217,15 +217,13 @@
Its main focus is translation of the whole PyPy interpreter
to a low level language and reaching 2.4.1 Python compliance.
The goal of the sprint is to release a first self-contained
-PyPy-0.7 version. Carl has written a report about `day 1 - 3`_,
-there are `some pictures`_ online and a `heidelberg summary report`_
-detailing some of the works that led to the successful release
-of `pypy-0.7.0`_!
+PyPy-0.7 version. Carl has written a report about `day 1 - 3`_
+and a `heidelberg summary report`_ detailing some of the works
+that led to the successful release of `pypy-0.7.0`_!
-.. _`heidelberg summary report`: http://codespeak.net/pypy/extradoc/sprintinfo/Heidelberg-report.html
-.. _`PyPy sprint`: http://codespeak.net/pypy/extradoc/sprintinfo/Heidelberg-sprint.html
-.. _`day 1 - 3`: http://codespeak.net/pipermail/pypy-dev/2005q3/002287.html
-.. _`some pictures`: http://codespeak.net/~hpk/heidelberg-sprint/
+.. _`heidelberg summary report`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/Heidelberg-report.txt
+.. _`PyPy sprint`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/Heidelberg-sprint.txt
+.. _`day 1 - 3`: https://mail.python.org/pipermail/pypy-dev/2005-August/002287.html
PyPy Hildesheim2 finished: first self-contained PyPy run!
===========================================================
@@ -233,20 +231,16 @@
Up until 31st August we were in a PyPy sprint at `Trillke-Gut`_.
Carl has written a `report about day 1`_, Holger
about `day 2 and day 3`_ and Carl again about `day 4 and day 5`_,
-On `day 6`_ Holger reports the `breakthrough`_: PyPy runs
-on its own! Hurray_!. And Carl finally reports about the winding
+On `day 6`_ Holger reports the breakthrough: PyPy runs
+on its own! Hurray!. And Carl finally reports about the winding
down of `day 7`_ which saw us relaxing, discussing and generally
-having a good time. You might want to look at the selected
-`pictures from the sprint`_.
+having a good time.
-.. _`report about day 1`: http://codespeak.net/pipermail/pypy-dev/2005q3/002217.html
-.. _`day 2 and day 3`: http://codespeak.net/pipermail/pypy-dev/2005q3/002220.html
-.. _`day 4 and day 5`: http://codespeak.net/pipermail/pypy-dev/2005q3/002234.html
-.. _`day 6`: http://codespeak.net/pipermail/pypy-dev/2005q3/002239.html
-.. _`day 7`: http://codespeak.net/pipermail/pypy-dev/2005q3/002245.html
-.. _`breakthrough`: http://codespeak.net/~hpk/hildesheim2-sprint-www/hildesheim2-sprint-www-Thumbnails/36.jpg
-.. _`hurray`: http://codespeak.net/~hpk/hildesheim2-sprint-www/hildesheim2-sprint-www-Pages/Image37.html
-.. _`pictures from the sprint`: http://codespeak.net/~hpk/hildesheim2-sprint-www/
+.. _`report about day 1`: https://mail.python.org/pipermail/pypy-dev/2005-July/002217.html
+.. _`day 2 and day 3`: https://mail.python.org/pipermail/pypy-dev/2005-July/002220.html
+.. _`day 4 and day 5`: https://mail.python.org/pipermail/pypy-dev/2005-July/002234.html
+.. _`day 6`: https://mail.python.org/pipermail/pypy-dev/2005-July/002239.html
+.. _`day 7`: https://mail.python.org/pipermail/pypy-dev/2005-August/002245.html
.. _`Trillke-Gut`: http://www.trillke.net
EuroPython 2005 sprints finished
@@ -264,15 +258,15 @@
the LLVM backends and type inference in general.
*(07/13/2005)*
-.. _`day 1`: http://codespeak.net/pipermail/pypy-dev/2005q2/002169.html
-.. _`day 2`: http://codespeak.net/pipermail/pypy-dev/2005q2/002171.html
-.. _`day 3`: http://codespeak.net/pipermail/pypy-dev/2005q2/002172.html
-.. _`pypy-dev`: http://mail.python.org/mailman/listinfo/pypy-dev
+.. _`day 1`: https://mail.python.org/pipermail/pypy-dev/2005-June/002169.html
+.. _`day 2`: https://mail.python.org/pipermail/pypy-dev/2005-June/002171.html
+.. _`day 3`: https://mail.python.org/pipermail/pypy-dev/2005-June/002172.html
+.. _`pypy-dev`: https://mail.python.org/mailman/listinfo/pypy-dev
.. _EuroPython: http://europython.org
.. _`translation`: translation.html
-.. _`sprint announcement`: http://codespeak.net/pypy/extradoc/sprintinfo/EP2005-announcement.html
-.. _`list of people coming`: http://codespeak.net/pypy/extradoc/sprintinfo/EP2005-people.html
+.. _`sprint announcement`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/EP2005-announcement.html
+.. _`list of people coming`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/EP2005-people.html
Duesseldorf PyPy sprint 2-9 June 2006
==================================================================
@@ -285,8 +279,8 @@
Read more in `the sprint announcement`_, see who is planning to attend
on the `people page`_.
-.. _`the sprint announcement`: http://codespeak.net/pypy/extradoc/sprintinfo/ddorf2006/announce.html
-.. _`people page`: http://codespeak.net/pypy/extradoc/sprintinfo/ddorf2006/people.html
+.. _`the sprint announcement`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ddorf2006/announce.txt
+.. _`people page`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ddorf2006/people.txt
PyPy at XP 2006 and Agile 2006
diff --git a/pypy/doc/extradoc.rst b/pypy/doc/extradoc.rst
--- a/pypy/doc/extradoc.rst
+++ b/pypy/doc/extradoc.rst
@@ -79,7 +79,7 @@
.. _`Tracing the Meta-Level: PyPy's Tracing JIT Compiler`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/icooolps2009/bolz-tracing-jit.pdf
.. _`Faster than C#: Efficient Implementation of Dynamic Languages on .NET`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/icooolps2009-dotnet/cli-jit.pdf
.. _`Automatic JIT Compiler Generation with Runtime Partial Evaluation`: http://wwwold.cobra.cs.uni-duesseldorf.de/thesis/final-master.pdf
-.. _`RPython: A Step towards Reconciling Dynamically and Statically Typed OO Languages`: http://www.disi.unige.it/person/AnconaD/papers/Recent_abstracts.html#AACM-DLS07
+.. _`RPython: A Step towards Reconciling Dynamically and Statically Typed OO Languages`: http://www.disi.unige.it/person/AnconaD/papers/DynamicLanguages_abstracts.html#AACM-DLS07
.. _`EU Reports`: index-report.html
.. _`Hardware Transactional Memory Support for Lightweight Dynamic Language Evolution`: http://sabi.net/nriley/pubs/dls6-riley.pdf
.. _`PyGirl: Generating Whole-System VMs from High-Level Prototypes using PyPy`: http://scg.unibe.ch/archive/papers/Brun09cPyGirl.pdf
@@ -356,8 +356,6 @@
.. _`transparent dynamic optimization`: http://www.hpl.hp.com/techreports/1999/HPL-1999-77.pdf
.. _Dynamo: http://www.hpl.hp.com/techreports/1999/HPL-1999-78.pdf
.. _testdesign: coding-guide.html#test-design
-.. _feasible: http://codespeak.net/pipermail/pypy-dev/2004q2/001289.html
-.. _rock: http://codespeak.net/pipermail/pypy-dev/2004q1/001255.html
.. _LLVM: http://llvm.org/
.. _IronPython: http://ironpython.codeplex.com/
.. _`Dynamic Native Optimization of Native Interpreters`: http://people.csail.mit.edu/gregs/dynamorio.html
diff --git a/pypy/doc/getting-started-dev.rst b/pypy/doc/getting-started-dev.rst
--- a/pypy/doc/getting-started-dev.rst
+++ b/pypy/doc/getting-started-dev.rst
@@ -222,7 +222,7 @@
PyPy development always was and is still thoroughly test-driven.
We use the flexible `py.test testing tool`_ which you can `install independently
-<http://pytest.org/getting-started.html>`_ and use for other projects.
+<http://pytest.org/latest/getting-started.html#getstarted>`_ and use for other projects.
The PyPy source tree comes with an inlined version of ``py.test``
which you can invoke by typing::
@@ -264,7 +264,7 @@
interpreter.
.. _`py.test testing tool`: http://pytest.org
-.. _`py.test usage and invocations`: http://pytest.org/usage.html#usage
+.. _`py.test usage and invocations`: http://pytest.org/latest/usage.html#usage
Special Introspection Features of the Untranslated Python Interpreter
---------------------------------------------------------------------
diff --git a/pypy/doc/glossary.rst b/pypy/doc/glossary.rst
--- a/pypy/doc/glossary.rst
+++ b/pypy/doc/glossary.rst
@@ -1,5 +1,3 @@
-.. include:: needswork.txt
-
.. _glossary:
********
diff --git a/pypy/doc/interpreter.rst b/pypy/doc/interpreter.rst
--- a/pypy/doc/interpreter.rst
+++ b/pypy/doc/interpreter.rst
@@ -256,7 +256,7 @@
example and the higher level `chapter on Modules in the coding
guide`_.
-.. _`__builtin__ module`: https://bitbucket.org/pypy/pypy/src/tip/pypy/module/__builtin__/
+.. _`__builtin__ module`: https://bitbucket.org/pypy/pypy/src/default/pypy/module/__builtin__/
.. _`chapter on Modules in the coding guide`: coding-guide.html#modules
.. _`Gateway classes`:
diff --git a/pypy/doc/objspace-proxies.rst b/pypy/doc/objspace-proxies.rst
--- a/pypy/doc/objspace-proxies.rst
+++ b/pypy/doc/objspace-proxies.rst
@@ -185,6 +185,6 @@
.. _`standard object space`: objspace.html#the-standard-object-space
.. [D12.1] `High-Level Backends and Interpreter Feature Prototypes`, PyPy
- EU-Report, 2007, http://codespeak.net/pypy/extradoc/eu-report/D12.1_H-L-Backends_and_Feature_Prototypes-2007-03-22.pdf
+ EU-Report, 2007, https://bitbucket.org/pypy/extradoc/raw/tip/eu-report/D12.1_H-L-Backends_and_Feature_Prototypes-2007-03-22.pdf
.. include:: _ref.txt
diff --git a/pypy/doc/objspace.rst b/pypy/doc/objspace.rst
--- a/pypy/doc/objspace.rst
+++ b/pypy/doc/objspace.rst
@@ -339,44 +339,35 @@
Object types
------------
-The larger part of the `pypy/objspace/std/`_ package defines and implements the
-library of Python's standard built-in object types. Each type (int, float,
-list, tuple, str, type, etc.) is typically implemented by two modules:
+The larger part of the `pypy/objspace/std/`_ package defines and
+implements the library of Python's standard built-in object types. Each
+type ``xxx`` (int, float, list, tuple, str, type, etc.) is typically
+implemented in the module ``xxxobject.py``.
-* the *type specification* module, which for a type ``xxx`` is called ``xxxtype.py``;
+The ``W_AbstractXxxObject`` class, when present, is the abstract base
+class, which mainly defines what appears on the Python-level type
+object. There are then actual implementations as subclasses, which are
+called ``W_XxxObject`` or some variant for the cases where we have
+several different implementations. For example,
+`pypy/objspace/std/bytesobject.py`_ defines ``W_AbstractBytesObject``,
+which contains everything needed to build the ``str`` app-level type;
+and there are subclasses ``W_BytesObject`` (the usual string) and
+``W_StringBufferObject`` (a special implementation tweaked for repeated
+additions, in `pypy/objspace/std/strbufobject.py`_). For mutable data
+types like lists and dictionaries, we have a single class
+``W_ListObject`` or ``W_DictMultiObject`` which has an indirection to
+the real data and a strategy; the strategy can change as the content of
+the object changes.
-* the *implementation* module, called ``xxxobject.py``.
-
-The ``xxxtype.py`` module basically defines the type object itself. For
-example, `pypy/objspace/std/listtype.py`_ contains the specification of the object you get when
-you type ``list`` in a PyPy prompt. `pypy/objspace/std/listtype.py`_ enumerates the methods
-specific to lists, like ``append()``.
-
-A particular method implemented by all types is the ``__new__()`` special
-method, which in Python's new-style-classes world is responsible for creating
-an instance of the type. In PyPy, ``__new__()`` locates and imports the module
-implementing *instances* of the type, and creates such an instance based on the
-arguments the user supplied to the constructor. For example, `pypy/objspace/std/tupletype.py`_
-defines ``__new__()`` to import the class ``W_TupleObject`` from
-`pypy/objspace/std/tupleobject.py`_ and instantiate it. The `pypy/objspace/std/tupleobject.py`_ then contains a
-"real" implementation of tuples: the way the data is stored in the
-``W_TupleObject`` class, how the operations work, etc.
-
-The goal of the above module layout is to cleanly separate the Python
-type object, visible to the user, and the actual implementation of its
-instances. It is possible to provide *several* implementations of the
-instances of the same Python type, by writing several ``W_XxxObject``
-classes. Every place that instantiates a new object of that Python type
-can decide which ``W_XxxObject`` class to instantiate.
-
-From the user's point of view, the multiple internal ``W_XxxObject``
-classes are not visible: they are still all instances of exactly the
-same Python type. PyPy knows that (e.g.) the application-level type of
-its interpreter-level ``W_StringObject`` instances is str because
-there is a ``typedef`` class attribute in ``W_StringObject`` which
-points back to the string type specification from `pypy/objspace/std/stringtype.py`_; all
-other implementations of strings use the same ``typedef`` from
-`pypy/objspace/std/stringtype.py`_.
+From the user's point of view, even when there are several
+``W_AbstractXxxObject`` subclasses, this is not visible: at the
+app-level, they are still all instances of exactly the same Python type.
+PyPy knows that (e.g.) the application-level type of its
+interpreter-level ``W_BytesObject`` instances is str because there is a
+``typedef`` class attribute in ``W_BytesObject`` which points back to
+the string type specification from `pypy/objspace/std/bytesobject.py`_;
+all other implementations of strings use the same ``typedef`` from
+`pypy/objspace/std/bytesobject.py`_.
For other examples of multiple implementations of the same Python type,
see `Standard Interpreter Optimizations`_.
@@ -387,6 +378,9 @@
Multimethods
------------
+*Note: multimethods are on the way out. Although they look cool,
+they failed to provide enough benefits.*
+
The Standard Object Space allows multiple object implementations per
Python type - this is based on multimethods_. For a description of the
multimethod variant that we implemented and which features it supports,
@@ -491,7 +485,7 @@
Introduction
------------
-The task of the FlowObjSpace (the source is at `pypy/objspace/flow/`_) is to generate a control-flow graph from a
+The task of the FlowObjSpace (the source is at `rpython/flowspace/`_) is to generate a control-flow graph from a
function. This graph will also contain a trace of the individual operations, so
that it is actually just an alternate representation for the function.
diff --git a/pypy/doc/rffi.rst b/pypy/doc/rffi.rst
--- a/pypy/doc/rffi.rst
+++ b/pypy/doc/rffi.rst
@@ -43,7 +43,7 @@
See cbuild_ for more info on ExternalCompilationInfo.
.. _`low level types`: rtyper.html#low-level-type
-.. _cbuild: https://bitbucket.org/pypy/pypy/src/tip/rpython/translator/tool/cbuild.py
+.. _cbuild: https://bitbucket.org/pypy/pypy/src/default/rpython/translator/tool/cbuild.py
Types
@@ -56,7 +56,7 @@
flavor='raw'. There are several helpers like string -> char*
converter, refer to the source for details.
-.. _rffi: https://bitbucket.org/pypy/pypy/src/tip/pypy/rpython/lltypesystem/rffi.py
+.. _rffi: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/lltypesystem/rffi.py
Registering function as external
---------------------------------
@@ -68,4 +68,4 @@
functions, passing llimpl as an argument and eventually llfakeimpl
as a fake low-level implementation for tests performed by an llinterp.
-.. _`extfunc.py`: https://bitbucket.org/pypy/pypy/src/tip/pypy/rpython/extfunc.py
+.. _`extfunc.py`: https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/extfunc.py
diff --git a/pypy/doc/sprint-reports.rst b/pypy/doc/sprint-reports.rst
--- a/pypy/doc/sprint-reports.rst
+++ b/pypy/doc/sprint-reports.rst
@@ -42,30 +42,30 @@
* `CERN (July 2010)`_
* `Düsseldorf (October 2010)`_
- .. _Hildesheim (Feb 2003): http://codespeak.net/pypy/extradoc/sprintinfo/HildesheimReport.html
- .. _Gothenburg (May 2003): http://codespeak.net/pypy/extradoc/sprintinfo/gothenburg-2003-sprintreport.txt
- .. _LovainLaNeuve (June 2003): http://codespeak.net/pypy/extradoc/sprintinfo/LouvainLaNeuveReport.txt
- .. _Berlin (Sept 2003): http://codespeak.net/pypy/extradoc/sprintinfo/BerlinReport.txt
- .. _Amsterdam (Dec 2003): http://codespeak.net/pypy/extradoc/sprintinfo/AmsterdamReport.txt
- .. _Vilnius (Nov 2004): http://codespeak.net/pypy/extradoc/sprintinfo/vilnius-2004-sprintreport.txt
- .. _Leysin (Jan 2005): http://codespeak.net/pypy/extradoc/sprintinfo/LeysinReport.txt
- .. _PyCon/Washington (March 2005): http://codespeak.net/pypy/extradoc/sprintinfo/pycon_sprint_report.txt
- .. _Europython/Gothenburg (June 2005): http://codespeak.net/pypy/extradoc/sprintinfo/ep2005-sprintreport.txt
- .. _Hildesheim (July 2005): http://codespeak.net/pypy/extradoc/sprintinfo/hildesheim2005-sprintreport.txt
- .. _Heidelberg (Aug 2005): http://codespeak.net/pypy/extradoc/sprintinfo/Heidelberg-report.txt
- .. _Paris (Oct 2005): http://codespeak.net/pypy/extradoc/sprintinfo/paris/paris-report.txt
- .. _Gothenburg (Dec 2005): http://codespeak.net/pypy/extradoc/sprintinfo/gothenburg-2005/gothenburg-dec2005-sprintreport.txt
- .. _Mallorca (Jan 2006): http://codespeak.net/pypy/extradoc/sprintinfo/mallorca/mallorca-sprintreport.txt
- .. _LouvainLaNeuve (March 2006): http://codespeak.net/pypy/extradoc/sprintinfo/louvain-la-neuve-2006/report.txt
- .. _Leysin (April 2006): http://codespeak.net/pypy/extradoc/sprintinfo/leysin-winter-2006-sprintreport.txt
- .. _Tokyo (April 2006): http://codespeak.net/pypy/extradoc/sprintinfo/tokyo/sprint-report.txt
- .. _Düsseldorf (June 2006): http://codespeak.net/pypy/extradoc/sprintinfo/ddorf2006/report1.txt
- .. _Europython/Geneva (July 2006): http://codespeak.net/pypy/extradoc/sprintinfo/post-ep2006/report.txt
- .. _Düsseldorf (October 2006): http://codespeak.net/pypy/extradoc/sprintinfo/ddorf2006b/report.txt
- .. _`Leysin (January 2007)`: http://codespeak.net/pypy/extradoc/sprintinfo/leysin-winter-2007/report.txt
- .. _Hildesheim (Feb 2007): http://codespeak.net/pypy/extradoc/sprintinfo/trillke-2007/sprint-report.txt
- .. _`EU report writing sprint`: http://codespeak.net/pypy/extradoc/sprintinfo/trillke-2007/eu-report-sprint-report.txt
- .. _`PyCon/Dallas (Feb 2006)`: http://codespeak.net/pypy/extradoc/sprintinfo/pycon06/sprint-report.txt
+ .. _Hildesheim (Feb 2003): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/HildesheimReport.txt
+ .. _Gothenburg (May 2003): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/gothenburg-2003-sprintreport.txt
+ .. _LovainLaNeuve (June 2003): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/LouvainLaNeuveReport.txt
+ .. _Berlin (Sept 2003): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/BerlinReport.txt
+ .. _Amsterdam (Dec 2003): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/AmsterdamReport.txt
+ .. _Vilnius (Nov 2004): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/vilnius-2004-sprintreport.txt
+ .. _Leysin (Jan 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/LeysinReport.txt
+ .. _PyCon/Washington (March 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/pycon_sprint_report.txt
+ .. _Europython/Gothenburg (June 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ep2005-sprintreport.txt
+ .. _Hildesheim (July 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/hildesheim2005-sprintreport.txt
+ .. _Heidelberg (Aug 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/Heidelberg-report.txt
+ .. _Paris (Oct 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/paris/paris-report.txt
+ .. _Gothenburg (Dec 2005): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/gothenburg-2005/gothenburg-dec2005-sprintreport.txt
+ .. _Mallorca (Jan 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/mallorca/mallorca-sprintreport.txt
+ .. _LouvainLaNeuve (March 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/louvain-la-neuve-2006/report.txt
+ .. _Leysin (April 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/leysin-winter-2006-sprintreport.txt
+ .. _Tokyo (April 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/tokyo/sprint-report.txt
+ .. _Düsseldorf (June 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ddorf2006/report1.txt
+ .. _Europython/Geneva (July 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/post-ep2006/report.txt
+ .. _Düsseldorf (October 2006): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/ddorf2006b/report.txt
+ .. _`Leysin (January 2007)`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/leysin-winter-2007/report.txt
+ .. _Hildesheim (Feb 2007): https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/trillke-2007/sprint-report.txt
+ .. _`EU report writing sprint`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/trillke-2007/eu-report-sprint-report.txt
+ .. _`PyCon/Dallas (Feb 2006)`: https://bitbucket.org/pypy/extradoc/raw/tip/sprintinfo/pycon06/sprint-report.txt
.. _`Göteborg (November 2007)`: http://morepypy.blogspot.com/2007_11_01_archive.html
.. _`Leysin (January 2008)`: http://morepypy.blogspot.com/2008/01/leysin-winter-sport-sprint-started.html
.. _`Berlin (May 2008)`: http://morepypy.blogspot.com/2008_05_01_archive.html
diff --git a/pypy/doc/statistic/index.rst b/pypy/doc/statistic/index.rst
--- a/pypy/doc/statistic/index.rst
+++ b/pypy/doc/statistic/index.rst
@@ -1,3 +1,7 @@
+.. warning::
+
+ This page is no longer updated, of historical interest only.
+
=======================
PyPy Project Statistics
=======================
diff --git a/pypy/doc/stm.rst b/pypy/doc/stm.rst
--- a/pypy/doc/stm.rst
+++ b/pypy/doc/stm.rst
@@ -15,25 +15,49 @@
user, describes work in progress, and finally gives references to more
implementation details.
-This work was done by Remi Meier and Armin Rigo.
+This work was done by Remi Meier and Armin Rigo. Thanks to all donors
+for crowd-funding the work so far! Please have a look at the 2nd call
+for donation (*not ready yet*)
+.. .. _`2nd call for donation`: http://pypy.org/tmdonate2.html
-Introduction and current status
-===============================
+
+Introduction
+============
``pypy-stm`` is a variant of the regular PyPy interpreter. With caveats
-listed below, it should be in theory within 25%-50% of the speed of
-PyPy, comparing the JITting version in both cases. It is called STM for
-Software Transactional Memory, which is the internal technique used (see
-`Reference to implementation details`_).
+listed below, it should be in theory within 25%-50% of the speed of a
+regular PyPy, comparing the JITting version in both cases. It is called
+STM for Software Transactional Memory, which is the internal technique
+used (see `Reference to implementation details`_).
+
+What you get in exchange for this slow-down is that ``pypy-stm`` runs
+any multithreaded Python program on multiple CPUs at once. Programs
+running two threads or more in parallel should ideally run faster than
+in a regular PyPy, either now or soon as issues are fixed. In one way,
+that's all there is to it: this is a GIL-less Python, feel free to
+`download and try it`__. However, the deeper idea behind the
+``pypy-stm`` project is to improve what is so far the state-of-the-art
+for using multiple CPUs, which for cases where separate processes don't
+work is done by writing explicitly multi-threaded programs. Instead,
+``pypy-stm`` is flushing forward an approach to *hide* the threads, as
+described below in `atomic sections`_.
+
+
+.. __:
+
+Current status
+==============
**pypy-stm requires 64-bit Linux for now.**
Development is done in the branch `stmgc-c7`_. If you are only
interested in trying it out, you can download a Ubuntu 12.04 binary
-here__. The current version supports four "segments", which means that
-it will run up to four threads in parallel (in other words, you get a
-GIL effect again, but only if trying to execute more than 4 threads).
+here__ (``pypy-2.2.x-stm*.tar.bz2``; this version is a release mode,
+but not stripped of debug symbols). The current version supports four
+"segments", which means that it will run up to four threads in parallel
+(in other words, you get a GIL effect again, but only if trying to
+execute more than 4 threads).
To build a version from sources, you first need to compile a custom
version of clang; we recommend downloading `llvm and clang like
@@ -46,17 +70,19 @@
rpython/bin/rpython -Ojit --stm pypy/goal/targetpypystandalone.py
.. _`stmgc-c7`: https://bitbucket.org/pypy/pypy/src/stmgc-c7/
-.. __: http://buildbot.pypy.org/nightly/stmgc-c7/
+.. __: http://cobra.cs.uni-duesseldorf.de/~buildmaster/misc/
.. __: http://clang.llvm.org/get_started.html
.. __: https://bitbucket.org/pypy/stmgc/src/default/c7/llvmfix/
Caveats:
-* It should generally work. Please do `report bugs`_ that manifest as a
- crash or wrong behavior (markedly different from the behavior of a
- regular PyPy). Performance bugs are likely to be known issues; we're
- working on them.
+* So far, small examples work fine, but there are still a number of
+ bugs. We're busy fixing them.
+
+* Currently limited to 1.5 GB of RAM (this is just a parameter in
+ `core.h`__). Memory overflows are not detected correctly, so may
+ cause segmentation faults.
* The JIT warm-up time is abysmal (as opposed to the regular PyPy's,
which is "only" bad). Moreover, you should run it with a command like
@@ -73,9 +99,11 @@
programs that modify large lists or dicts, suffer from these missing
optimizations.
-* The GC has no support for destructors: the ``__del__`` method is
- never called (including on file objects, which won't be closed for
- you). This is of course temporary.
+* The GC has no support for destructors: the ``__del__`` method is never
+ called (including on file objects, which won't be closed for you).
+ This is of course temporary. Also, weakrefs might appear to work a
+ bit strangely for now (staying alive even though ``gc.collect()``, or
+ even dying but then un-dying for a short time before dying again).
* The STM system is based on very efficient read/write barriers, which
are mostly done (their placement could be improved a bit in
@@ -98,6 +126,7 @@
probably, several days or more.
.. _`report bugs`: https://bugs.pypy.org/
+.. __: https://bitbucket.org/pypy/pypy/raw/stmgc-c7/rpython/translator/stm/src_stm/stm/core.h
@@ -172,9 +201,9 @@
unchanged. This capability can be hidden in a library or in the
framework you use; the end user's code does not need to be explicitly
aware of using threads. For a simple example of this, see
-`lib_pypy/transaction.py`_. The idea is that if you have a program
-where the function ``f(key, value)`` runs on every item of some big
-dictionary, you can replace the loop with::
+`transaction.py`_ in ``lib_pypy``. The idea is that if you have a
+program where the function ``f(key, value)`` runs on every item of some
+big dictionary, you can replace the loop with::
for key, value in bigdict.items():
transaction.add(f, key, value)
@@ -185,7 +214,18 @@
result is that the behavior should be exactly equivalent: you don't get
any extra multithreading issue.
-.. _`lib_pypy/transaction.py`: https://bitbucket.org/pypy/pypy/raw/stmgc-c7/lib_pypy/transaction.py
+This approach hides the notion of threads from the end programmer,
+including all the hard multithreading-related issues. This is not the
+first alternative approach to explicit threads; for example, OpenMP_ is
+one. However, it is one of the first ones which does not require the
+code to be organized in a particular fashion. Instead, it works on any
+Python program which has got latent, imperfect parallelism. Ideally, it
+only requires that the end programmer identifies where this parallelism
+is likely to be found, and communicates it to the system, using for
+example the ``transaction.add()`` scheme.
+
+.. _`transaction.py`: https://bitbucket.org/pypy/pypy/raw/stmgc-c7/lib_pypy/transaction.py
+.. _OpenMP: http://en.wikipedia.org/wiki/OpenMP
==================
@@ -221,7 +261,7 @@
The core of the implementation is in a separate C library called stmgc_,
in the c7_ subdirectory. Please see the `README.txt`_ for more
-information.
+information. In particular, the notion of segment is discussed there.
.. _stmgc: https://bitbucket.org/pypy/stmgc/src/default/
.. _c7: https://bitbucket.org/pypy/stmgc/src/default/c7/
diff --git a/pypy/doc/translation.rst b/pypy/doc/translation.rst
--- a/pypy/doc/translation.rst
+++ b/pypy/doc/translation.rst
@@ -380,7 +380,7 @@
The RPython Typer
=================
-https://bitbucket.org/pypy/pypy/src/default/pypy/rpython/
+https://bitbucket.org/pypy/pypy/src/default/rpython/rtyper/
The RTyper is the first place where the choice of backend makes a
difference; as outlined above we are assuming that ANSI C is the target.
@@ -603,7 +603,7 @@
- using the `Boehm-Demers-Weiser conservative garbage collector`_
- using one of our custom `exact GCs implemented in RPython`_
-.. _`Boehm-Demers-Weiser conservative garbage collector`: http://www.hpl.hp.com/personal/Hans_Boehm/gc/
+.. _`Boehm-Demers-Weiser conservative garbage collector`: http://hboehm.info/gc/
.. _`exact GCs implemented in RPython`: garbage_collection.html
Almost all application-level Python code allocates objects at a very fast
@@ -621,7 +621,7 @@
The C Back-End
==============
-https://bitbucket.org/pypy/pypy/src/default/pypy/translator/c/
+https://bitbucket.org/pypy/pypy/src/default/rpython/translator/c/
GenC is usually the most actively maintained backend -- everyone working on
PyPy has a C compiler, for one thing -- and is usually where new features are
diff --git a/pypy/doc/windows.rst b/pypy/doc/windows.rst
--- a/pypy/doc/windows.rst
+++ b/pypy/doc/windows.rst
@@ -86,7 +86,7 @@
option (this is the default at some optimization levels like ``-O1``,
but unneeded for high-performance translations like ``-O2``).
You may get it at
-http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.1.tar.gz
+http://hboehm.info/gc/gc_source/gc-7.1.tar.gz
Versions 7.0 and 7.1 are known to work; the 6.x series won't work with
pypy. Unpack this folder in the base directory. Then open a command
diff --git a/rpython/config/test/test_translationoption.py b/rpython/config/test/test_translationoption.py
--- a/rpython/config/test/test_translationoption.py
+++ b/rpython/config/test/test_translationoption.py
@@ -1,10 +1,17 @@
import py
from rpython.config.translationoption import get_combined_translation_config
from rpython.config.translationoption import set_opt_level
-from rpython.config.config import ConflictConfigError
+from rpython.config.config import ConflictConfigError, ConfigError
+from rpython.translator.platform import platform as compiler
def test_no_gcrootfinder_with_boehm():
config = get_combined_translation_config()
config.translation.gcrootfinder = "shadowstack"
py.test.raises(ConflictConfigError, set_opt_level, config, '0')
+
+if compiler.name == 'msvc':
+ def test_no_asmgcrot_on_msvc():
+ config = get_combined_translation_config()
+ py.test.raises(ConfigError, config.translation.setoption,
+ 'gcrootfinder', 'asmgcc', 'user')
diff --git a/rpython/config/translationoption.py b/rpython/config/translationoption.py
--- a/rpython/config/translationoption.py
+++ b/rpython/config/translationoption.py
@@ -1,9 +1,10 @@
import sys
import os
from rpython.config.config import OptionDescription, BoolOption, IntOption, ArbitraryOption, FloatOption
-from rpython.config.config import ChoiceOption, StrOption, Config
+from rpython.config.config import ChoiceOption, StrOption, Config, ConflictConfigError
from rpython.config.config import ConfigError
from rpython.config.support import detect_number_of_processors
+from rpython.translator.platform import platform as compiler
DEFL_INLINE_THRESHOLD = 32.4 # just enough to inline add__Int_Int()
# and just small enough to prevend inlining of some rlist functions.
@@ -16,8 +17,13 @@
if sys.platform.startswith("linux"):
DEFL_ROOTFINDER_WITHJIT = "asmgcc"
+ ROOTFINDERS = ["n/a", "shadowstack", "asmgcc"]
+elif compiler.name == 'msvc':
+ DEFL_ROOTFINDER_WITHJIT = "shadowstack"
+ ROOTFINDERS = ["n/a", "shadowstack"]
else:
DEFL_ROOTFINDER_WITHJIT = "shadowstack"
+ ROOTFINDERS = ["n/a", "shadowstack", "asmgcc"]
IS_64_BITS = sys.maxint > 2147483647
@@ -85,7 +91,7 @@
default=IS_64_BITS, cmdline="--gcremovetypeptr"),
ChoiceOption("gcrootfinder",
"Strategy for finding GC Roots (framework GCs only)",
- ["n/a", "shadowstack", "asmgcc"],
+ ROOTFINDERS,
"shadowstack",
cmdline="--gcrootfinder",
requires={
diff --git a/rpython/flowspace/test/test_unroll.py b/rpython/flowspace/test/test_unroll.py
--- a/rpython/flowspace/test/test_unroll.py
+++ b/rpython/flowspace/test/test_unroll.py
@@ -1,23 +1,10 @@
import operator
+
from rpython.flowspace.test.test_objspace import Base
-from rpython.rlib.unroll import unrolling_zero, unrolling_iterable
+from rpython.rlib.unroll import unrolling_iterable
+
class TestUnroll(Base):
-
- def test_unrolling_int(self):
- l = range(10)
- def f(tot):
- i = unrolling_zero
- while i < len(l):
- tot += l[i]
- i = i + 1
- return tot*2
- assert f(0) == sum(l)*2
-
- graph = self.codetest(f)
- ops = self.all_operations(graph)
- assert ops == {'inplace_add': 10, 'mul': 1}
-
def test_unroller(self):
l = unrolling_iterable(range(10))
def f(tot):
diff --git a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
--- a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
+++ b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
@@ -5,7 +5,7 @@
"""
import weakref
-import os
+import os, py
from rpython.rlib import rgc
from rpython.rtyper.lltypesystem import lltype
from rpython.rlib.jit import JitDriver, dont_look_inside
@@ -13,6 +13,7 @@
from rpython.jit.backend.llsupport.gc import GcLLDescr_framework
from rpython.tool.udir import udir
from rpython.config.translationoption import DEFL_GC
+from rpython.config.config import ConfigError
class X(object):
@@ -166,6 +167,9 @@
cls.cbuilder = compile(get_entry(allfuncs), cls.gc,
gcrootfinder=cls.gcrootfinder, jit=True,
thread=True)
+ except ConfigError, e:
+ assert str(e).startswith('invalid value asmgcc')
+ py.test.skip('asmgcc not supported')
finally:
GcLLDescr_framework.DEBUG = OLD_DEBUG
diff --git a/rpython/jit/backend/llsupport/test/ztranslation_test.py b/rpython/jit/backend/llsupport/test/ztranslation_test.py
--- a/rpython/jit/backend/llsupport/test/ztranslation_test.py
+++ b/rpython/jit/backend/llsupport/test/ztranslation_test.py
@@ -1,4 +1,4 @@
-import os, sys
+import os, sys, py
from rpython.tool.udir import udir
from rpython.rlib.jit import JitDriver, unroll_parameters, set_param
from rpython.rlib.jit import PARAMETERS, dont_look_inside
@@ -7,7 +7,7 @@
from rpython.jit.backend.detect_cpu import getcpuclass
from rpython.jit.backend.test.support import CCompiledMixin
from rpython.jit.codewriter.policy import StopAtXPolicy
-
+from rpython.config.config import ConfigError
class TranslationTest(CCompiledMixin):
CPUClass = getcpuclass()
@@ -252,6 +252,9 @@
try:
res = self.meta_interp(main, [400])
assert res == main(400)
+ except ConfigError,e:
+ assert str(e).startswith('invalid value asmgcc')
+ py.test.skip('asmgcc not supported')
finally:
del os.environ['PYPYLOG']
diff --git a/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py b/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py
--- a/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py
+++ b/rpython/jit/backend/x86/test/test_zrpy_gcasmgcc.py
@@ -1,4 +1,9 @@
+import py
from rpython.jit.backend.llsupport.test.zrpy_gc_test import CompileFrameworkTests
+from rpython.translator.platform import platform as compiler
+
+if compiler.name == 'msvc':
+ py.test.skip('asmgcc buggy on msvc')
class TestAsmGcc(CompileFrameworkTests):
gcrootfinder = "asmgcc"
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -567,7 +567,8 @@
# common case: this is not a guard_value, and we are not
# already busy tracing. The rest of self.status stores a
# valid per-guard index in the jitcounter.
- hash = self.status & self.ST_SHIFT_MASK
+ hash = self.status
+ assert hash == (self.status & self.ST_SHIFT_MASK)
#
# do we have the BUSY flag? If so, we're tracing right now, e.g. in an
# outer invocation of the same function, so don't trace again for now.
diff --git a/rpython/jit/metainterp/test/test_intbound.py b/rpython/jit/metainterp/optimizeopt/test/test_intbound.py
rename from rpython/jit/metainterp/test/test_intbound.py
rename to rpython/jit/metainterp/optimizeopt/test/test_intbound.py
--- a/rpython/jit/metainterp/test/test_intbound.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_intbound.py
@@ -1,5 +1,7 @@
from rpython.jit.metainterp.optimizeopt.intutils import IntBound, IntUpperBound, \
IntLowerBound, IntUnbounded
+from rpython.jit.metainterp.optimizeopt.intbounds import next_pow2_m1
+
from copy import copy
import sys
from rpython.rlib.rarithmetic import LONG_BIT
@@ -235,8 +237,8 @@
for shift_count_bound in (IntBound(7, LONG_BIT), IntBound(-7, 7)):
#assert not b.lshift_bound(shift_count_bound).has_upper
assert not b.rshift_bound(shift_count_bound).has_upper
-
-
+
+
def test_div_bound():
for _, _, b1 in some_bounds():
for _, _, b2 in some_bounds():
@@ -258,7 +260,6 @@
assert a.contains(0)
-
def test_sub_bound():
for _, _, b1 in some_bounds():
for _, _, b2 in some_bounds():
@@ -271,3 +272,14 @@
a=bound(2, 4).sub_bound(bound(1, 2))
assert not a.contains(-1)
assert not a.contains(4)
+
+
+def test_next_pow2_m1():
+ assert next_pow2_m1(0) == 0
+ assert next_pow2_m1(1) == 1
+ assert next_pow2_m1(7) == 7
+ assert next_pow2_m1(256) == 511
+ assert next_pow2_m1(255) == 255
+ assert next_pow2_m1(80) == 127
+ assert next_pow2_m1((1 << 32) - 5) == (1 << 32) - 1
+ assert next_pow2_m1((1 << 64) - 1) == (1 << 64) - 1
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py b/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py
deleted file mode 100644
--- a/rpython/jit/metainterp/optimizeopt/test/test_intbounds.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from rpython.jit.metainterp.optimizeopt.intbounds import next_pow2_m1
-
-
-def test_next_pow2_m1():
- assert next_pow2_m1(0) == 0
- assert next_pow2_m1(1) == 1
- assert next_pow2_m1(7) == 7
- assert next_pow2_m1(256) == 511
- assert next_pow2_m1(255) == 255
- assert next_pow2_m1(80) == 127
- assert next_pow2_m1((1 << 32) - 5) == (1 << 32) - 1
- assert next_pow2_m1((1 << 64) - 1) == (1 << 64) - 1
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -0,0 +1,1181 @@
+from __future__ import with_statement
+import py
+from rpython.jit.metainterp.optimize import InvalidLoop
+from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo, VStructStateInfo, \
+ VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes
+from rpython.jit.metainterp.optimizeopt.optimizer import OptValue
+from rpython.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr, ConstInt, ConstPtr
+from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \
+ equaloplists, FakeDescrWithSnapshot
+from rpython.jit.metainterp.optimizeopt.intutils import IntBound
+from rpython.jit.metainterp.history import TreeLoop, JitCellToken
+from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData
+from rpython.jit.metainterp.resoperation import ResOperation, rop
+
+class TestBasic:
+ someptr1 = LLtypeMixin.myptr
+ someptr2 = LLtypeMixin.myptr2
+
+ def test_position_generalization(self):
+ def postest(info1, info2):
+ info1.position = 0
+ assert info1.generalization_of(info1, {}, {})
+ info2.position = 0
+ assert info1.generalization_of(info2, {}, {})
+ info2.position = 1
+ renum = {}
+ assert info1.generalization_of(info2, renum, {})
+ assert renum == {0:1}
+ assert info1.generalization_of(info2, {0:1}, {})
+ assert info1.generalization_of(info2, {1:1}, {})
+ bad = {}
+ assert not info1.generalization_of(info2, {0:0}, bad)
+ assert info1 in bad and info2 in bad
+
+ for BoxType in (BoxInt, BoxFloat, BoxPtr):
+ info1 = NotVirtualStateInfo(OptValue(BoxType()))
+ info2 = NotVirtualStateInfo(OptValue(BoxType()))
+ postest(info1, info2)
+
+ info1, info2 = VArrayStateInfo(42), VArrayStateInfo(42)
+ info1.fieldstate = info2.fieldstate = []
+ postest(info1, info2)
+
+ info1, info2 = VStructStateInfo(42, []), VStructStateInfo(42, [])
+ info1.fieldstate = info2.fieldstate = []
+ postest(info1, info2)
+
+ info1, info2 = VirtualStateInfo(ConstInt(42), []), VirtualStateInfo(ConstInt(42), [])
+ info1.fieldstate = info2.fieldstate = []
+ postest(info1, info2)
+
+ def test_NotVirtualStateInfo_generalization(self):
+ def isgeneral(value1, value2):
+ info1 = NotVirtualStateInfo(value1)
+ info1.position = 0
+ info2 = NotVirtualStateInfo(value2)
+ info2.position = 0
+ return info1.generalization_of(info2, {}, {})
+
+ assert isgeneral(OptValue(BoxInt()), OptValue(ConstInt(7)))
+ assert not isgeneral(OptValue(ConstInt(7)), OptValue(BoxInt()))
+
+ ptr = OptValue(BoxPtr())
+ nonnull = OptValue(BoxPtr())
+ nonnull.make_nonnull(0)
+ knownclass = OptValue(BoxPtr())
+ knownclass.make_constant_class(ConstPtr(self.someptr1), 0)
+ const = OptValue(BoxPtr)
+ const.make_constant_class(ConstPtr(self.someptr1), 0)
+ const.make_constant(ConstPtr(self.someptr1))
+ inorder = [ptr, nonnull, knownclass, const]
+ for i in range(len(inorder)):
+ for j in range(i, len(inorder)):
+ assert isgeneral(inorder[i], inorder[j])
+ if i != j:
+ assert not isgeneral(inorder[j], inorder[i])
+
+ value1 = OptValue(BoxInt())
+ value2 = OptValue(BoxInt())
+ value2.intbound.make_lt(IntBound(10, 10))
+ assert isgeneral(value1, value2)
+ assert not isgeneral(value2, value1)
+
+ assert isgeneral(OptValue(ConstInt(7)), OptValue(ConstInt(7)))
+ S = lltype.GcStruct('S')
+ foo = lltype.malloc(S)
+ fooref = lltype.cast_opaque_ptr(llmemory.GCREF, foo)
+ assert isgeneral(OptValue(ConstPtr(fooref)),
+ OptValue(ConstPtr(fooref)))
+
+ value1 = OptValue(BoxPtr())
+ value1.make_nonnull(None)
+ value2 = OptValue(ConstPtr(LLtypeMixin.nullptr))
+ assert not isgeneral(value1, value2)
+
+ def test_field_matching_generalization(self):
+ const1 = NotVirtualStateInfo(OptValue(ConstInt(1)))
+ const2 = NotVirtualStateInfo(OptValue(ConstInt(2)))
+ const1.position = const2.position = 1
+ assert not const1.generalization_of(const2, {}, {})
+ assert not const2.generalization_of(const1, {}, {})
+
+ def fldtst(info1, info2):
+ info1.position = info2.position = 0
+ info1.fieldstate = [const1]
+ info2.fieldstate = [const2]
+ assert not info1.generalization_of(info2, {}, {})
+ assert not info2.generalization_of(info1, {}, {})
+ assert info1.generalization_of(info1, {}, {})
+ assert info2.generalization_of(info2, {}, {})
+ fldtst(VArrayStateInfo(42), VArrayStateInfo(42))
+ fldtst(VStructStateInfo(42, [7]), VStructStateInfo(42, [7]))
+ fldtst(VirtualStateInfo(ConstInt(42), [7]), VirtualStateInfo(ConstInt(42), [7]))
+
+ def test_known_class_generalization(self):
+ knownclass1 = OptValue(BoxPtr())
+ knownclass1.make_constant_class(ConstPtr(self.someptr1), 0)
+ info1 = NotVirtualStateInfo(knownclass1)
+ info1.position = 0
+ knownclass2 = OptValue(BoxPtr())
+ knownclass2.make_constant_class(ConstPtr(self.someptr1), 0)
+ info2 = NotVirtualStateInfo(knownclass2)
+ info2.position = 0
+ assert info1.generalization_of(info2, {}, {})
+ assert info2.generalization_of(info1, {}, {})
+
+ knownclass3 = OptValue(BoxPtr())
+ knownclass3.make_constant_class(ConstPtr(self.someptr2), 0)
+ info3 = NotVirtualStateInfo(knownclass3)
+ info3.position = 0
+ assert not info1.generalization_of(info3, {}, {})
+ assert not info2.generalization_of(info3, {}, {})
+ assert not info3.generalization_of(info2, {}, {})
+ assert not info3.generalization_of(info1, {}, {})
+
+
+ def test_circular_generalization(self):
+ for info in (VArrayStateInfo(42), VStructStateInfo(42, [7]),
+ VirtualStateInfo(ConstInt(42), [7])):
+ info.position = 0
+ info.fieldstate = [info]
+ assert info.generalization_of(info, {}, {})
+
+
+class BaseTestGenerateGuards(BaseTest):
+ def guards(self, info1, info2, box, expected):
+ info1.position = info2.position = 0
+ guards = []
+ info1.generate_guards(info2, box, self.cpu, guards, {})
+ self.compare(guards, expected, [box])
+
+ def compare(self, guards, expected, inputargs):
+ loop = self.parse(expected)
+ boxmap = {}
+ assert len(loop.inputargs) == len(inputargs)
+ for a, b in zip(loop.inputargs, inputargs):
+ boxmap[a] = b
+ for op in loop.operations:
+ if op.is_guard():
+ op.setdescr(None)
+ assert equaloplists(guards, loop.operations, False,
+ boxmap)
+ def test_intbounds(self):
+ value1 = OptValue(BoxInt())
+ value1.intbound.make_ge(IntBound(0, 10))
+ value1.intbound.make_le(IntBound(20, 30))
+ info1 = NotVirtualStateInfo(value1)
+ info2 = NotVirtualStateInfo(OptValue(BoxInt()))
+ expected = """
+ [i0]
+ i1 = int_ge(i0, 0)
+ guard_true(i1) []
+ i2 = int_le(i0, 30)
+ guard_true(i2) []
+ """
+ self.guards(info1, info2, BoxInt(15), expected)
+ py.test.raises(InvalidLoop, self.guards,
+ info1, info2, BoxInt(50), expected)
+
+
+ def test_known_class(self):
+ value1 = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value1.make_constant_class(classbox, -1)
+ info1 = NotVirtualStateInfo(value1)
+ info2 = NotVirtualStateInfo(OptValue(self.nodebox))
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ guard_class(p0, ConstClass(node_vtable)) []
+ """
+ self.guards(info1, info2, self.nodebox, expected)
+ py.test.raises(InvalidLoop, self.guards,
+ info1, info2, BoxPtr(), expected)
+
+ def test_known_class_value(self):
+ value1 = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value1.make_constant_class(classbox, -1)
+ box = self.nodebox
+ guards = value1.make_guards(box)
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ guard_class(p0, ConstClass(node_vtable)) []
+ """
+ self.compare(guards, expected, [box])
+
+ def test_known_value(self):
+ value1 = OptValue(self.nodebox)
+ value1.make_constant(ConstInt(1))
+ box = self.nodebox
+ guards = value1.make_guards(box)
+ expected = """
+ [i0]
+ guard_value(i0, 1) []
+ """
+ self.compare(guards, expected, [box])
+
+ def test_equal_inputargs(self):
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ vstate1 = VirtualState([knownclass_info, knownclass_info])
+ assert vstate1.generalization_of(vstate1)
+
+ unknown_info1 = NotVirtualStateInfo(OptValue(self.nodebox))
+ vstate2 = VirtualState([unknown_info1, unknown_info1])
+ assert vstate2.generalization_of(vstate2)
+ assert not vstate1.generalization_of(vstate2)
+ assert vstate2.generalization_of(vstate1)
+
+ unknown_info1 = NotVirtualStateInfo(OptValue(self.nodebox))
+ unknown_info2 = NotVirtualStateInfo(OptValue(self.nodebox))
+ vstate3 = VirtualState([unknown_info1, unknown_info2])
+ assert vstate3.generalization_of(vstate2)
+ assert vstate3.generalization_of(vstate1)
+ assert not vstate2.generalization_of(vstate3)
+ assert not vstate1.generalization_of(vstate3)
+
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ guard_class(p0, ConstClass(node_vtable)) []
+ """
+ guards = []
+ vstate1.generate_guards(vstate2, [self.nodebox, self.nodebox], self.cpu, guards)
+ self.compare(guards, expected, [self.nodebox])
+
+ with py.test.raises(InvalidLoop):
+ guards = []
+ vstate1.generate_guards(vstate3, [self.nodebox, self.nodebox],
+ self.cpu, guards)
+ with py.test.raises(InvalidLoop):
+ guards = []
+ vstate2.generate_guards(vstate3, [self.nodebox, self.nodebox],
+ self.cpu, guards)
+
+ def test_virtuals_with_equal_fields(self):
+ info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VirtualStateInfo(ConstInt(42), [1, 2])
+ unknown_info1 = NotVirtualStateInfo(OptValue(self.nodebox))
+ info2.fieldstate = [unknown_info1, unknown_info1]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+ assert not vstate1.generalization_of(vstate2)
+ assert vstate2.generalization_of(vstate1)
+
+ info3 = VirtualStateInfo(ConstInt(42), [1, 2])
+ unknown_info1 = NotVirtualStateInfo(OptValue(self.nodebox))
+ unknown_info2 = NotVirtualStateInfo(OptValue(self.nodebox))
+ info3.fieldstate = [unknown_info1, unknown_info2]
+ vstate3 = VirtualState([info3])
+ assert vstate3.generalization_of(vstate2)
+ assert vstate3.generalization_of(vstate1)
+ assert not vstate2.generalization_of(vstate3)
+ assert not vstate1.generalization_of(vstate3)
+
+ def test_virtuals_with_nonmatching_fields(self):
+ info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VirtualStateInfo(ConstInt(42), [1, 2])
+ value = OptValue(self.nodebox2)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox2)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info2.fieldstate = [knownclass_info, knownclass_info]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_virtuals_with_nonmatching_descrs(self):
+ info1 = VirtualStateInfo(ConstInt(42), [10, 20])
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VirtualStateInfo(ConstInt(42), [1, 2])
+ value = OptValue(self.nodebox2)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox2)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info2.fieldstate = [knownclass_info, knownclass_info]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_virtuals_with_nonmatching_classes(self):
+ info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VirtualStateInfo(ConstInt(7), [1, 2])
+ value = OptValue(self.nodebox2)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox2)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info2.fieldstate = [knownclass_info, knownclass_info]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_nonvirtual_is_not_virtual(self):
+ info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = NotVirtualStateInfo(value)
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_arrays_with_nonmatching_fields(self):
+ info1 = VArrayStateInfo(42)
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VArrayStateInfo(42)
+ value = OptValue(self.nodebox2)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox2)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info2.fieldstate = [knownclass_info, knownclass_info]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_arrays_of_different_sizes(self):
+ info1 = VArrayStateInfo(42)
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VArrayStateInfo(42)
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info2.fieldstate = [knownclass_info]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_arrays_with_nonmatching_types(self):
+ info1 = VArrayStateInfo(42)
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = VArrayStateInfo(7)
+ value = OptValue(self.nodebox2)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox2)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info2.fieldstate = [knownclass_info, knownclass_info]
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+ def test_nonvirtual_is_not_array(self):
+ info1 = VArrayStateInfo(42)
+ value = OptValue(self.nodebox)
+ classbox = self.cpu.ts.cls_of_box(self.nodebox)
+ value.make_constant_class(classbox, -1)
+ knownclass_info = NotVirtualStateInfo(value)
+ info1.fieldstate = [knownclass_info, knownclass_info]
+ vstate1 = VirtualState([info1])
+ assert vstate1.generalization_of(vstate1)
+
+ info2 = NotVirtualStateInfo(value)
+ vstate2 = VirtualState([info2])
+ assert vstate2.generalization_of(vstate2)
+
+ assert not vstate2.generalization_of(vstate1)
+ assert not vstate1.generalization_of(vstate2)
+
+
+class BaseTestBridges(BaseTest):
+ enable_opts = "intbounds:rewrite:virtualize:string:pure:heap:unroll"
+
+ def _do_optimize_bridge(self, bridge, call_pure_results):
+ from rpython.jit.metainterp.optimizeopt import optimize_trace
+ from rpython.jit.metainterp.optimizeopt.util import args_dict
+
+ self.bridge = bridge
+ bridge.call_pure_results = args_dict()
+ if call_pure_results is not None:
+ for k, v in call_pure_results.items():
+ bridge.call_pure_results[list(k)] = v
+ metainterp_sd = FakeMetaInterpStaticData(self.cpu)
+ if hasattr(self, 'vrefinfo'):
+ metainterp_sd.virtualref_info = self.vrefinfo
+ if hasattr(self, 'callinfocollection'):
+ metainterp_sd.callinfocollection = self.callinfocollection
+ #
+ bridge.resume_at_jump_descr = FakeDescrWithSnapshot()
+ optimize_trace(metainterp_sd, bridge, self.enable_opts)
+
+
+ def optimize_bridge(self, loops, bridge, expected, expected_target='Loop', **boxvalues):
+ if isinstance(loops, str):
+ loops = (loops, )
+ loops = [self.parse(loop) for loop in loops]
+ bridge = self.parse(bridge)
+ for loop in loops:
+ loop.preamble = self.unroll_and_optimize(loop)
+ preamble = loops[0].preamble
+ token = JitCellToken()
+ token.target_tokens = [l.operations[0].getdescr() for l in [preamble] + loops]
+
+ boxes = {}
+ for b in bridge.inputargs + [op.result for op in bridge.operations]:
+ boxes[str(b)] = b
+ for b, v in boxvalues.items():
+ boxes[b].value = v
+ bridge.operations[-1].setdescr(token)
+ self._do_optimize_bridge(bridge, None)
+ if bridge.operations[-1].getopnum() == rop.LABEL:
+ assert expected == 'RETRACE'
+ return
+
+ print '\n'.join([str(o) for o in bridge.operations])
+ expected = self.parse(expected)
+ self.assert_equal(bridge, expected)
+
+ if expected_target == 'Preamble':
+ assert bridge.operations[-1].getdescr() is preamble.operations[0].getdescr()
+ elif expected_target == 'Loop':
+ assert len(loops) == 1
+ assert bridge.operations[-1].getdescr() is loops[0].operations[0].getdescr()
+ elif expected_target.startswith('Loop'):
+ n = int(expected_target[4:])
+ assert bridge.operations[-1].getdescr() is loops[n].operations[0].getdescr()
+ else:
+ assert False
+
+ def test_nonnull(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, 'RETRACE', p0=self.nullptr)
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+ self.optimize_bridge(loop, expected, expected, p0=self.myptr)
+ self.optimize_bridge(loop, expected, expected, p0=self.nullptr)
+
+ def test_cached_nonnull(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p1) []
+ call(p1, descr=nonwritedescr)
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p1) []
+ jump(p0, p1)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+
+ def test_cached_unused_nonnull(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p1) []
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p1) []
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+
+ def test_cached_invalid_nonnull(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p1) []
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_value(p1, ConstPtr(nullptr)) []
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, bridge, 'Preamble', p0=self.myptr)
+
+ def test_multiple_nonnull(self):
+ loops = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ jump(p0)
+ """, """
+ [p0]
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ jump(p0)
+ """
+ self.optimize_bridge(loops, bridge, expected, 'Loop1', p0=self.nullptr)
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ jump(p0)
+ """
+ self.optimize_bridge(loops, bridge, expected, 'Loop0', p0=self.myptr)
+
+ def test_constant(self):
+ loops = """
+ [p0]
+ p1 = same_as(ConstPtr(myptr))
+ jump(p1)
+ """, """
+ [p0]
+ p1 = same_as(ConstPtr(myptr2))
+ jump(p1)
+ """, """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ jump()
+ """
+ self.optimize_bridge(loops, loops[0], expected, 'Loop0')
+ self.optimize_bridge(loops, loops[1], expected, 'Loop1')
+ expected = """
+ [p0]
+ jump(p0)
+ """
+ self.optimize_bridge(loops, loops[2], expected, 'Loop2')
+
+ def test_cached_constant(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_value(p1, ConstPtr(myptr)) []
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_value(p1, ConstPtr(myptr)) []
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+
+ def test_virtual(self):
+ loops = """
+ [p0, p1]
+ p2 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p2, p1, descr=nextdescr)
+ setfield_gc(p2, 7, descr=adescr)
+ setfield_gc(p2, 42, descr=bdescr)
+ jump(p2, p1)
+ ""","""
+ [p0, p1]
+ p2 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p2, p1, descr=nextdescr)
+ setfield_gc(p2, 9, descr=adescr)
+ jump(p2, p1)
+ """
+ expected = """
+ [p0, p1]
+ jump(p1)
+ """
+ self.optimize_bridge(loops, loops[0], expected, 'Loop0')
+ self.optimize_bridge(loops, loops[1], expected, 'Loop1')
+ bridge = """
+ [p0, p1]
+ p2 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p2, p1, descr=nextdescr)
+ setfield_gc(p2, 42, descr=adescr)
+ setfield_gc(p2, 7, descr=bdescr)
+ jump(p2, p1)
+ """
+ self.optimize_bridge(loops, bridge, "RETRACE")
+ bridge = """
+ [p0, p1]
+ p2 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p2, p1, descr=nextdescr)
+ setfield_gc(p2, 7, descr=adescr)
+ jump(p2, p1)
+ """
+ self.optimize_bridge(loops, bridge, "RETRACE")
+
+ def test_known_class(self):
+ loops = """
+ [p0]
+ guard_nonnull_class(p0, ConstClass(node_vtable)) []
+ jump(p0)
+ ""","""
+ [p0]
+ guard_nonnull_class(p0, ConstClass(node_vtable2)) []
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ self.optimize_bridge(loops, bridge, loops[0], 'Loop0', p0=self.nodebox.value)
+ self.optimize_bridge(loops, bridge, loops[1], 'Loop1', p0=self.nodebox2.value)
+ self.optimize_bridge(loops[0], bridge, 'RETRACE', p0=self.nodebox2.value)
+ self.optimize_bridge(loops, loops[0], loops[0], 'Loop0', p0=self.nullptr)
+ self.optimize_bridge(loops, loops[1], loops[1], 'Loop1', p0=self.nullptr)
+
+ def test_cached_known_class(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_class(p1, ConstClass(node_vtable)) []
+ jump(p0)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull_class(p1, ConstClass(node_vtable)) []
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+
+
+ def test_lenbound_array(self):
+ loop = """
+ [p0]
+ i2 = getarrayitem_gc(p0, 10, descr=arraydescr)
+ call(i2, descr=nonwritedescr)
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ i2 = getarrayitem_gc(p0, 10, descr=arraydescr)
+ call(i2, descr=nonwritedescr)
+ jump(p0, i2)
+ """
+ self.optimize_bridge(loop, loop, expected, 'Loop0')
+ bridge = """
+ [p0]
+ i2 = getarrayitem_gc(p0, 15, descr=arraydescr)
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ i2 = getarrayitem_gc(p0, 15, descr=arraydescr)
+ i3 = getarrayitem_gc(p0, 10, descr=arraydescr)
+ jump(p0, i3)
+ """
+ self.optimize_bridge(loop, bridge, expected, 'Loop0')
+ bridge = """
+ [p0]
+ i2 = getarrayitem_gc(p0, 5, descr=arraydescr)
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, 'RETRACE')
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, 'RETRACE')
+
+ def test_cached_lenbound_array(self):
+ loop = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ i2 = getarrayitem_gc(p1, 10, descr=arraydescr)
+ call(i2, descr=nonwritedescr)
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ i2 = getarrayitem_gc(p1, 10, descr=arraydescr)
+ call(i2, descr=nonwritedescr)
+ i3 = arraylen_gc(p1, descr=arraydescr) # Should be killed by backend
+ jump(p0, i2, p1)
+ """
+ self.optimize_bridge(loop, loop, expected)
+ bridge = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ i2 = getarrayitem_gc(p1, 15, descr=arraydescr)
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ i2 = getarrayitem_gc(p1, 15, descr=arraydescr)
+ i3 = arraylen_gc(p1, descr=arraydescr) # Should be killed by backend
+ i4 = getarrayitem_gc(p1, 10, descr=arraydescr)
+ jump(p0, i4, p1)
+ """
+ self.optimize_bridge(loop, bridge, expected)
+ bridge = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ i2 = getarrayitem_gc(p1, 5, descr=arraydescr)
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ p1 = getfield_gc(p0, descr=nextdescr)
+ i2 = getarrayitem_gc(p1, 5, descr=arraydescr)
+ i3 = arraylen_gc(p1, descr=arraydescr) # Should be killed by backend
+ i4 = int_ge(i3, 11)
+ guard_true(i4) []
+ i5 = getarrayitem_gc(p1, 10, descr=arraydescr)
+ jump(p0, i5, p1)
+ """
+ self.optimize_bridge(loop, bridge, expected)
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ p1 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p1) []
+ i3 = arraylen_gc(p1, descr=arraydescr) # Should be killed by backend
+ i4 = int_ge(i3, 11)
+ guard_true(i4) []
+ i5 = getarrayitem_gc(p1, 10, descr=arraydescr)
+ jump(p0, i5, p1)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+
+ def test_cached_setarrayitem_gc(self):
+ loop = """
+ [p0, p1]
+ p2 = getfield_gc(p0, descr=nextdescr)
+ pp = getarrayitem_gc(p2, 0, descr=arraydescr)
+ call(pp, descr=nonwritedescr)
+ p3 = getfield_gc(p1, descr=nextdescr)
+ setarrayitem_gc(p2, 0, p3, descr=arraydescr)
+ jump(p0, p3)
+ """
+ bridge = """
+ [p0, p1]
+ jump(p0, p1)
+ """
+ expected = """
+ [p0, p1]
+ guard_nonnull(p0) []
+ p2 = getfield_gc(p0, descr=nextdescr)
+ guard_nonnull(p2) []
+ i5 = arraylen_gc(p2, descr=arraydescr)
+ i6 = int_ge(i5, 1)
+ guard_true(i6) []
+ p3 = getarrayitem_gc(p2, 0, descr=arraydescr)
+ jump(p0, p1, p3, p2)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+
+ def test_cache_constant_setfield(self):
+ loop = """
+ [p5]
+ i10 = getfield_gc(p5, descr=valuedescr)
+ call(i10, descr=nonwritedescr)
+ setfield_gc(p5, 1, descr=valuedescr)
+ jump(p5)
+ """
+ bridge = """
+ [p0]
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_nonnull(p0) []
+ i10 = getfield_gc(p0, descr=valuedescr)
+ guard_value(i10, 1) []
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, expected, p0=self.myptr)
+ bridge = """
+ [p0]
+ setfield_gc(p0, 7, descr=valuedescr)
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ setfield_gc(p0, 7, descr=valuedescr)
+ jump(p0)
+ """
+ self.optimize_bridge(loop, bridge, expected, 'Preamble', p0=self.myptr)
+
+ def test_cached_equal_fields(self):
+ loop = """
+ [p5, p6]
+ i10 = getfield_gc(p5, descr=valuedescr)
+ i11 = getfield_gc(p6, descr=nextdescr)
+ call(i10, i11, descr=nonwritedescr)
+ setfield_gc(p6, i10, descr=nextdescr)
More information about the pypy-commit
mailing list