[pypy-commit] pypy jit-targets: hg merge default
hakanardo
noreply at buildbot.pypy.org
Mon Dec 12 09:04:10 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r50404:d3d7d07ab453
Date: 2011-12-12 08:53 +0100
http://bitbucket.org/pypy/pypy/changeset/d3d7d07ab453/
Log: hg merge default
diff --git a/pypy/doc/faq.rst b/pypy/doc/faq.rst
--- a/pypy/doc/faq.rst
+++ b/pypy/doc/faq.rst
@@ -112,10 +112,32 @@
You might be interested in our `benchmarking site`_ and our
`jit documentation`_.
+Note that the JIT has a very high warm-up cost, meaning that the
+programs are slow at the beginning. If you want to compare the timings
+with CPython, even relatively simple programs need to run *at least* one
+second, preferrably at least a few seconds. Large, complicated programs
+need even more time to warm-up the JIT.
+
.. _`benchmarking site`: http://speed.pypy.org
.. _`jit documentation`: jit/index.html
+---------------------------------------------------------------
+Couldn't the JIT dump and reload already-compiled machine code?
+---------------------------------------------------------------
+
+No, we found no way of doing that. The JIT generates machine code
+containing a large number of constant addresses --- constant at the time
+the machine code is written. The vast majority is probably not at all
+constants that you find in the executable, with a nice link name. E.g.
+the addresses of Python classes are used all the time, but Python
+classes don't come statically from the executable; they are created anew
+every time you restart your program. This makes saving and reloading
+machine code completely impossible without some very advanced way of
+mapping addresses in the old (now-dead) process to addresses in the new
+process, including checking that all the previous assumptions about the
+(now-dead) object are still true about the new object.
+
.. _`prolog and javascript`:
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -261,8 +261,10 @@
return fail_index
def execute_token(self, loop_token):
- """Calls the assembler generated for the given loop.
- Returns the ResOperation that failed, of type rop.FAIL.
+ """Calls the fake 'assembler' generated for the given loop.
+ Returns the descr of the last executed operation: either the one
+ attached to the failing guard, or the one attached to the FINISH.
+ Use set_future_value_xxx() before, and get_latest_value_xxx() after.
"""
fail_index = self._execute_token(loop_token)
return self.get_fail_descr_from_number(fail_index)
diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -91,6 +91,9 @@
descr_neg = _unaryop_impl("negative")
descr_abs = _unaryop_impl("absolute")
+ def descr_tolist(self, space):
+ return self.get_dtype(space).itemtype.to_builtin_type(space, self)
+
class W_BoolBox(W_GenericBox, PrimitiveBox):
descr__new__, get_dtype = new_dtype_getter("bool")
@@ -179,6 +182,8 @@
__neg__ = interp2app(W_GenericBox.descr_neg),
__abs__ = interp2app(W_GenericBox.descr_abs),
+
+ tolist = interp2app(W_GenericBox.descr_tolist),
)
W_BoolBox.typedef = TypeDef("bool_", W_GenericBox.typedef,
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -876,6 +876,17 @@
arr.setshape(space, new_shape)
return arr
+ def descr_tolist(self, space):
+ if len(self.shape) == 0:
+ assert isinstance(self, Scalar)
+ return self.value.descr_tolist(space)
+ w_result = space.newlist([])
+ for i in range(self.shape[0]):
+ space.call_method(w_result, "append",
+ space.call_method(self.descr_getitem(space, space.wrap(i)), "tolist")
+ )
+ return w_result
+
def descr_mean(self, space):
return space.div(self.descr_sum(space), space.wrap(self.find_size()))
@@ -1485,6 +1496,7 @@
copy = interp2app(BaseArray.descr_copy),
reshape = interp2app(BaseArray.descr_reshape),
+ tolist = interp2app(BaseArray.descr_tolist),
)
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -879,6 +879,45 @@
b[0] = 3
assert b.__debug_repr__() == 'Call2(add, forced=Array)'
+ def test_tolist_scalar(self):
+ from numpypy import int32, bool_
+ x = int32(23)
+ assert x.tolist() == 23
+ assert type(x.tolist()) is int
+ y = bool_(True)
+ assert y.tolist() is True
+
+ def test_tolist_zerodim(self):
+ from numpypy import array
+ x = array(3)
+ assert x.tolist() == 3
+ assert type(x.tolist()) is int
+
+ def test_tolist_singledim(self):
+ from numpypy import array
+ a = array(range(5))
+ assert a.tolist() == [0, 1, 2, 3, 4]
+ assert type(a.tolist()[0]) is int
+ b = array([0.2, 0.4, 0.6])
+ assert b.tolist() == [0.2, 0.4, 0.6]
+
+ def test_tolist_multidim(self):
+ from numpypy import array
+ a = array([[1, 2], [3, 4]])
+ assert a.tolist() == [[1, 2], [3, 4]]
+
+ def test_tolist_view(self):
+ from numpypy import array
+ a = array([[1,2],[3,4]])
+ assert (a + a).tolist() == [[2, 4], [6, 8]]
+
+ def test_tolist_slice(self):
+ from numpypy import array
+ a = array([[17.1, 27.2], [40.3, 50.3]])
+ assert a[:,0].tolist() == [17.1, 40.3]
+ assert a[0].tolist() == [17.1, 27.2]
+
+
class AppTestMultiDim(BaseNumpyAppTest):
def test_init(self):
import numpypy
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -78,6 +78,9 @@
w_obj.__init__(self._coerce(space, w_item).value)
return w_obj
+ def to_builtin_type(self, space, box):
+ return space.wrap(self.for_computation(self.unbox(box)))
+
def _coerce(self, space, w_item):
raise NotImplementedError
@@ -180,6 +183,9 @@
def _coerce(self, space, w_item):
return self.box(space.is_true(w_item))
+ def to_builtin_type(self, space, w_item):
+ return space.wrap(self.unbox(w_item))
+
def str_format(self, box):
value = self.unbox(box)
return "True" if value else "False"
More information about the pypy-commit
mailing list