[pypy-commit] pypy value-profiling: merge default
cfbolz
noreply at buildbot.pypy.org
Thu Aug 13 13:34:43 CEST 2015
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: value-profiling
Changeset: r78959:72c1b4d38529
Date: 2015-08-13 13:34 +0200
http://bitbucket.org/pypy/pypy/changeset/72c1b4d38529/
Log: merge default
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -63,3 +63,6 @@
.. branch: fix-tinylang-goals
Update tinylang goals to match current rpython
+
+.. branch: vmprof-review
+
diff --git a/pypy/module/micronumpy/descriptor.py b/pypy/module/micronumpy/descriptor.py
--- a/pypy/module/micronumpy/descriptor.py
+++ b/pypy/module/micronumpy/descriptor.py
@@ -588,7 +588,8 @@
return space.newtuple([w_class, builder_args, data])
def descr_setstate(self, space, w_data):
- if self.fields is None: # if builtin dtype
+ if self.fields is None and not isinstance(self.itemtype, types.VoidType):
+ # if builtin dtype (but not w_voiddtype)
return space.w_None
version = space.int_w(space.getitem(w_data, space.wrap(0)))
diff --git a/pypy/module/micronumpy/test/test_dtypes.py b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -350,8 +350,8 @@
assert np.dtype(xyz).name == 'xyz'
# another obscure API, used in numpy record.py
# it seems numpy throws away the subclass type and parses the spec
- a = np.dtype((xyz, [('x', int), ('y', float)]))
- assert repr(a) == "dtype([('x', '<i8'), ('y', '<f8')])"
+ a = np.dtype((xyz, [('x', 'int32'), ('y', 'float32')]))
+ assert repr(a) == "dtype([('x', '<i4'), ('y', '<f4')])"
def test_index(self):
import numpy as np
diff --git a/pypy/module/micronumpy/test/test_ndarray.py b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -3808,7 +3808,7 @@
assert (a == [1, 2]).all()
def test_pickle(self):
- from numpy import dtype, array
+ from numpy import dtype, array, int32
from cPickle import loads, dumps
d = dtype([('x', str), ('y', 'int32')])
@@ -3825,6 +3825,11 @@
assert a[0]['y'] == 2
assert a[1]['y'] == 1
+
+ a = array([(1, [])], dtype=[('a', int32), ('b', int32, 0)])
+ assert a['b'].shape == (1, 0)
+ b = loads(dumps(a))
+ assert b['b'].shape == (1, 0)
def test_subarrays(self):
from numpy import dtype, array, zeros
diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py
--- a/rpython/rlib/rvmprof/cintf.py
+++ b/rpython/rlib/rvmprof/cintf.py
@@ -6,54 +6,69 @@
from rpython.rtyper.tool import rffi_platform as platform
from rpython.jit.backend import detect_cpu
-if not detect_cpu.autodetect().startswith(detect_cpu.MODEL_X86_64):
- py.test.skip("rvmprof only supports x86-64 CPUs for now")
+class VMProfPlatformUnsupported(Exception):
+ pass
-ROOT = py.path.local(__file__).join('..')
-SRC = ROOT.join('src')
+def setup():
+ if not detect_cpu.autodetect().startswith(detect_cpu.MODEL_X86_64):
+ raise VMProfPlatformUnsupported("rvmprof only supports"
+ " x86-64 CPUs for now")
-if sys.platform.startswith('linux'):
- libs = ['dl']
-else:
- libs = []
+ ROOT = py.path.local(__file__).join('..')
+ SRC = ROOT.join('src')
-eci_kwds = dict(
- include_dirs = [SRC],
- includes = ['rvmprof.h'],
- libraries = libs,
- separate_module_files = [SRC.join('rvmprof.c')],
- post_include_bits=['#define RPYTHON_VMPROF\n'],
- )
-eci = ExternalCompilationInfo(**eci_kwds)
-platform.verify_eci(ExternalCompilationInfo(
- compile_extra=['-DRPYTHON_LL2CTYPES'],
- **eci_kwds))
+ if sys.platform.startswith('linux'):
+ libs = ['dl']
+ else:
+ libs = []
+ eci_kwds = dict(
+ include_dirs = [SRC],
+ includes = ['rvmprof.h'],
+ libraries = libs,
+ separate_module_files = [SRC.join('rvmprof.c')],
+ post_include_bits=['#define RPYTHON_VMPROF\n'],
+ )
+ eci = ExternalCompilationInfo(**eci_kwds)
-vmprof_init = rffi.llexternal("rpython_vmprof_init", [rffi.INT], rffi.CCHARP,
- compilation_info=eci)
-vmprof_enable = rffi.llexternal("rpython_vmprof_enable", [rffi.LONG], rffi.INT,
- compilation_info=eci,
- save_err=rffi.RFFI_SAVE_ERRNO)
-vmprof_disable = rffi.llexternal("rpython_vmprof_disable", [], rffi.INT,
- compilation_info=eci,
- save_err=rffi.RFFI_SAVE_ERRNO)
-vmprof_write_buf = rffi.llexternal("rpython_vmprof_write_buf",
- [rffi.CCHARP, rffi.LONG],
- lltype.Void, compilation_info=eci)
+ platform.verify_eci(ExternalCompilationInfo(
+ compile_extra=['-DRPYTHON_LL2CTYPES'],
+ **eci_kwds))
-## vmprof_register_virtual_function = rffi.llexternal(
-## "vmprof_register_virtual_function",
-## [rffi.CCHARP, rffi.VOIDP, rffi.VOIDP], lltype.Void,
-## compilation_info=eci, _nowrapper=True)
-vmprof_ignore_signals = rffi.llexternal("rpython_vmprof_ignore_signals",
- [rffi.INT], lltype.Void,
- compilation_info=eci)
+ vmprof_init = rffi.llexternal("rpython_vmprof_init", [rffi.INT], rffi.CCHARP,
+ compilation_info=eci)
+ vmprof_enable = rffi.llexternal("rpython_vmprof_enable", [rffi.LONG], rffi.INT,
+ compilation_info=eci,
+ save_err=rffi.RFFI_SAVE_ERRNO)
+ vmprof_disable = rffi.llexternal("rpython_vmprof_disable", [], rffi.INT,
+ compilation_info=eci,
+ save_err=rffi.RFFI_SAVE_ERRNO)
+ vmprof_write_buf = rffi.llexternal("rpython_vmprof_write_buf",
+ [rffi.CCHARP, rffi.LONG],
+ lltype.Void, compilation_info=eci)
+ ## vmprof_register_virtual_function = rffi.llexternal(
+ ## "vmprof_register_virtual_function",
+ ## [rffi.CCHARP, rffi.VOIDP, rffi.VOIDP], lltype.Void,
+ ## compilation_info=eci, _nowrapper=True)
+
+ vmprof_ignore_signals = rffi.llexternal("rpython_vmprof_ignore_signals",
+ [rffi.INT], lltype.Void,
+ compilation_info=eci)
+ return CInterface(locals())
+
+
+class CInterface(object):
+ def __init__(self, namespace):
+ for k, v in namespace.iteritems():
+ setattr(self, k, v)
+
+ def _freeze_(self):
+ return True
def token2lltype(tok):
if tok == 'i':
diff --git a/rpython/rlib/rvmprof/rvmprof.py b/rpython/rlib/rvmprof/rvmprof.py
--- a/rpython/rlib/rvmprof/rvmprof.py
+++ b/rpython/rlib/rvmprof/rvmprof.py
@@ -19,7 +19,6 @@
def __str__(self):
return self.msg
-
class VMProf(object):
def __init__(self):
@@ -31,6 +30,7 @@
self._code_unique_id = 0 # XXX this is wrong, it won't work on 32bit
else:
self._code_unique_id = 0x7000000000000000
+ self.cintf = cintf.setup()
def _cleanup_(self):
self.is_enabled = False
@@ -106,14 +106,14 @@
raise VMProfError("bad value for 'interval'")
interval_usec = int(interval * 1000000.0)
- p_error = cintf.vmprof_init(fileno)
+ p_error = self.cintf.vmprof_init(fileno)
if p_error:
raise VMProfError(rffi.charp2str(p_error))
self.fileno = fileno
self._write_header(interval_usec)
self._gather_all_code_objs()
- res = cintf.vmprof_enable(interval_usec)
+ res = self.cintf.vmprof_enable(interval_usec)
if res < 0:
raise VMProfError(os.strerror(rposix.get_saved_errno()))
self.is_enabled = True
@@ -128,7 +128,7 @@
if self._current_codes is not None:
self._flush_codes()
self.fileno = -1
- res = cintf.vmprof_disable()
+ res = self.cintf.vmprof_disable()
if res < 0:
raise VMProfError(os.strerror(rposix.get_saved_errno()))
@@ -149,7 +149,7 @@
def _flush_codes(self):
buf = self._current_codes.build()
self._current_codes = None
- cintf.vmprof_write_buf(buf, len(buf))
+ self.cintf.vmprof_write_buf(buf, len(buf))
# NOTE: keep in mind that vmprof_write_buf() can only write
# a maximum of 8184 bytes. This should be guaranteed here because:
assert MAX_CODES + 17 + MAX_FUNC_NAME <= 8184
@@ -165,7 +165,7 @@
b.append(chr(len('pypy')))
b.append('pypy')
buf = b.build()
- cintf.vmprof_write_buf(buf, len(buf))
+ self.cintf.vmprof_write_buf(buf, len(buf))
def _write_long_to_string_builder(l, b):
diff --git a/rpython/rtyper/rpbc.py b/rpython/rtyper/rpbc.py
--- a/rpython/rtyper/rpbc.py
+++ b/rpython/rtyper/rpbc.py
@@ -750,6 +750,10 @@
def get_ll_eq_function(self):
return None
+ def ll_str(self, ptr):
+ cls = lltype.cast_pointer(CLASSTYPE, ptr)
+ return cls.name
+
def ll_cls_hash(cls):
if not cls:
diff --git a/rpython/rtyper/test/test_rpbc.py b/rpython/rtyper/test/test_rpbc.py
--- a/rpython/rtyper/test/test_rpbc.py
+++ b/rpython/rtyper/test/test_rpbc.py
@@ -1656,6 +1656,20 @@
res = self.interpret(g, [2])
assert self.ll_to_string(res) == "ASub"
+ def test_str_class(self):
+ class Base(object): pass
+ class ASub(Base): pass
+ def g(n):
+ if n == 1:
+ x = Base()
+ else:
+ x = ASub()
+ return str(x.__class__)
+ res = self.interpret(g, [1])
+ assert self.ll_to_string(res) == "Base"
+ res = self.interpret(g, [2])
+ assert self.ll_to_string(res) == "ASub"
+
def test_bug_callfamily(self):
def cb1():
xxx # never actually called
More information about the pypy-commit
mailing list