[pypy-commit] pypy py3k: Merge default
amauryfa
noreply at buildbot.pypy.org
Sat Oct 22 00:28:46 CEST 2011
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3k
Changeset: r48337:e53be0abbf48
Date: 2011-10-22 00:27 +0200
http://bitbucket.org/pypy/pypy/changeset/e53be0abbf48/
Log: Merge default
diff --git a/lib-python/modified-2.7/json/encoder.py b/lib-python/modified-2.7/json/encoder.py
--- a/lib-python/modified-2.7/json/encoder.py
+++ b/lib-python/modified-2.7/json/encoder.py
@@ -2,14 +2,7 @@
"""
import re
-try:
- from _json import encode_basestring_ascii as c_encode_basestring_ascii
-except ImportError:
- c_encode_basestring_ascii = None
-try:
- from _json import make_encoder as c_make_encoder
-except ImportError:
- c_make_encoder = None
+from __pypy__.builders import StringBuilder, UnicodeBuilder
ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
@@ -24,8 +17,7 @@
'\t': '\\t',
}
for i in range(0x20):
- ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i))
- #ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
+ ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
# Assume this produces an infinity on all machines (probably not guaranteed)
INFINITY = float('1e66666')
@@ -37,10 +29,9 @@
"""
def replace(match):
return ESCAPE_DCT[match.group(0)]
- return '"' + ESCAPE.sub(replace, s) + '"'
+ return ESCAPE.sub(replace, s)
-
-def py_encode_basestring_ascii(s):
+def encode_basestring_ascii(s):
"""Return an ASCII-only JSON representation of a Python string
"""
@@ -53,20 +44,18 @@
except KeyError:
n = ord(s)
if n < 0x10000:
- return '\\u{0:04x}'.format(n)
- #return '\\u%04x' % (n,)
+ return '\\u%04x' % (n,)
else:
# surrogate pair
n -= 0x10000
s1 = 0xd800 | ((n >> 10) & 0x3ff)
s2 = 0xdc00 | (n & 0x3ff)
- return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
- #return '\\u%04x\\u%04x' % (s1, s2)
- return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
-
-
-encode_basestring_ascii = (
- c_encode_basestring_ascii or py_encode_basestring_ascii)
+ return '\\u%04x\\u%04x' % (s1, s2)
+ if ESCAPE_ASCII.search(s):
+ return str(ESCAPE_ASCII.sub(replace, s))
+ return s
+py_encode_basestring_ascii = lambda s: '"' + encode_basestring_ascii(s) + '"'
+c_encode_basestring_ascii = None
class JSONEncoder(object):
"""Extensible JSON <http://json.org> encoder for Python data structures.
@@ -147,6 +136,17 @@
self.skipkeys = skipkeys
self.ensure_ascii = ensure_ascii
+ if ensure_ascii:
+ self.encoder = encode_basestring_ascii
+ else:
+ self.encoder = encode_basestring
+ if encoding != 'utf-8':
+ orig_encoder = self.encoder
+ def encoder(o):
+ if isinstance(o, str):
+ o = o.decode(encoding)
+ return orig_encoder(o)
+ self.encoder = encoder
self.check_circular = check_circular
self.allow_nan = allow_nan
self.sort_keys = sort_keys
@@ -184,24 +184,126 @@
'{"foo": ["bar", "baz"]}'
"""
- # This is for extremely simple cases and benchmarks.
+ if self.check_circular:
+ markers = {}
+ else:
+ markers = None
+ if self.ensure_ascii:
+ builder = StringBuilder()
+ else:
+ builder = UnicodeBuilder()
+ self._encode(o, markers, builder, 0)
+ return builder.build()
+
+ def _emit_indent(self, builder, _current_indent_level):
+ if self.indent is not None:
+ _current_indent_level += 1
+ newline_indent = '\n' + (' ' * (self.indent *
+ _current_indent_level))
+ separator = self.item_separator + newline_indent
+ builder.append(newline_indent)
+ else:
+ separator = self.item_separator
+ return separator, _current_indent_level
+
+ def _emit_unindent(self, builder, _current_indent_level):
+ if self.indent is not None:
+ builder.append('\n')
+ builder.append(' ' * (self.indent * (_current_indent_level - 1)))
+
+ def _encode(self, o, markers, builder, _current_indent_level):
if isinstance(o, basestring):
- if isinstance(o, str):
- _encoding = self.encoding
- if (_encoding is not None
- and not (_encoding == 'utf-8')):
- o = o.decode(_encoding)
- if self.ensure_ascii:
- return encode_basestring_ascii(o)
+ builder.append('"')
+ builder.append(self.encoder(o))
+ builder.append('"')
+ elif o is None:
+ builder.append('null')
+ elif o is True:
+ builder.append('true')
+ elif o is False:
+ builder.append('false')
+ elif isinstance(o, (int, long)):
+ builder.append(str(o))
+ elif isinstance(o, float):
+ builder.append(self._floatstr(o))
+ elif isinstance(o, (list, tuple)):
+ if not o:
+ builder.append('[]')
+ return
+ self._encode_list(o, markers, builder, _current_indent_level)
+ elif isinstance(o, dict):
+ if not o:
+ builder.append('{}')
+ return
+ self._encode_dict(o, markers, builder, _current_indent_level)
+ else:
+ self._mark_markers(markers, o)
+ res = self.default(o)
+ self._encode(res, markers, builder, _current_indent_level)
+ self._remove_markers(markers, o)
+ return res
+
+ def _encode_list(self, l, markers, builder, _current_indent_level):
+ self._mark_markers(markers, l)
+ builder.append('[')
+ first = True
+ separator, _current_indent_level = self._emit_indent(builder,
+ _current_indent_level)
+ for elem in l:
+ if first:
+ first = False
else:
- return encode_basestring(o)
- # This doesn't pass the iterator directly to ''.join() because the
- # exceptions aren't as detailed. The list call should be roughly
- # equivalent to the PySequence_Fast that ''.join() would do.
- chunks = self.iterencode(o, _one_shot=True)
- if not isinstance(chunks, (list, tuple)):
- chunks = list(chunks)
- return ''.join(chunks)
+ builder.append(separator)
+ self._encode(elem, markers, builder, _current_indent_level)
+ del elem # XXX grumble
+ self._emit_unindent(builder, _current_indent_level)
+ builder.append(']')
+ self._remove_markers(markers, l)
+
+ def _encode_dict(self, d, markers, builder, _current_indent_level):
+ self._mark_markers(markers, d)
+ first = True
+ builder.append('{')
+ separator, _current_indent_level = self._emit_indent(builder,
+ _current_indent_level)
+ if self.sort_keys:
+ items = sorted(d.items(), key=lambda kv: kv[0])
+ else:
+ items = d.iteritems()
+
+ for key, v in items:
+ if first:
+ first = False
+ else:
+ builder.append(separator)
+ if isinstance(key, basestring):
+ pass
+ # JavaScript is weakly typed for these, so it makes sense to
+ # also allow them. Many encoders seem to do something like this.
+ elif isinstance(key, float):
+ key = self._floatstr(key)
+ elif key is True:
+ key = 'true'
+ elif key is False:
+ key = 'false'
+ elif key is None:
+ key = 'null'
+ elif isinstance(key, (int, long)):
+ key = str(key)
+ elif self.skipkeys:
+ continue
+ else:
+ raise TypeError("key " + repr(key) + " is not a string")
+ builder.append('"')
+ builder.append(self.encoder(key))
+ builder.append('"')
+ builder.append(self.key_separator)
+ self._encode(v, markers, builder, _current_indent_level)
+ del key
+ del v # XXX grumble
+ self._emit_unindent(builder, _current_indent_level)
+ builder.append('}')
+ self._remove_markers(markers, d)
def iterencode(self, o, _one_shot=False):
"""Encode the given object and yield each string
@@ -217,86 +319,54 @@
markers = {}
else:
markers = None
- if self.ensure_ascii:
- _encoder = encode_basestring_ascii
+ return self._iterencode(o, markers, 0)
+
+ def _floatstr(self, o):
+ # Check for specials. Note that this type of test is processor
+ # and/or platform-specific, so do tests which don't depend on the
+ # internals.
+
+ if o != o:
+ text = 'NaN'
+ elif o == INFINITY:
+ text = 'Infinity'
+ elif o == -INFINITY:
+ text = '-Infinity'
else:
- _encoder = encode_basestring
- if self.encoding != 'utf-8':
- def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
- if isinstance(o, str):
- o = o.decode(_encoding)
- return _orig_encoder(o)
+ return FLOAT_REPR(o)
- def floatstr(o, allow_nan=self.allow_nan,
- _repr=FLOAT_REPR, _inf=INFINITY, _neginf=-INFINITY):
- # Check for specials. Note that this type of test is processor
- # and/or platform-specific, so do tests which don't depend on the
- # internals.
+ if not self.allow_nan:
+ raise ValueError(
+ "Out of range float values are not JSON compliant: " +
+ repr(o))
- if o != o:
- text = 'NaN'
- elif o == _inf:
- text = 'Infinity'
- elif o == _neginf:
- text = '-Infinity'
- else:
- return _repr(o)
+ return text
- if not allow_nan:
- raise ValueError(
- "Out of range float values are not JSON compliant: " +
- repr(o))
+ def _mark_markers(self, markers, o):
+ if markers is not None:
+ if id(o) in markers:
+ raise ValueError("Circular reference detected")
+ markers[id(o)] = None
- return text
+ def _remove_markers(self, markers, o):
+ if markers is not None:
+ del markers[id(o)]
-
- if (_one_shot and c_make_encoder is not None
- and not self.indent and not self.sort_keys):
- _iterencode = c_make_encoder(
- markers, self.default, _encoder, self.indent,
- self.key_separator, self.item_separator, self.sort_keys,
- self.skipkeys, self.allow_nan)
- else:
- _iterencode = _make_iterencode(
- markers, self.default, _encoder, self.indent, floatstr,
- self.key_separator, self.item_separator, self.sort_keys,
- self.skipkeys, _one_shot)
- return _iterencode(o, 0)
-
-def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
- _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
- ## HACK: hand-optimized bytecode; turn globals into locals
- ValueError=ValueError,
- basestring=basestring,
- dict=dict,
- float=float,
- id=id,
- int=int,
- isinstance=isinstance,
- list=list,
- long=long,
- str=str,
- tuple=tuple,
- ):
-
- def _iterencode_list(lst, _current_indent_level):
+ def _iterencode_list(self, lst, markers, _current_indent_level):
if not lst:
yield '[]'
return
- if markers is not None:
- markerid = id(lst)
- if markerid in markers:
- raise ValueError("Circular reference detected")
- markers[markerid] = lst
+ self._mark_markers(markers, lst)
buf = '['
- if _indent is not None:
+ if self.indent is not None:
_current_indent_level += 1
- newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
- separator = _item_separator + newline_indent
+ newline_indent = '\n' + (' ' * (self.indent *
+ _current_indent_level))
+ separator = self.item_separator + newline_indent
buf += newline_indent
else:
newline_indent = None
- separator = _item_separator
+ separator = self.item_separator
first = True
for value in lst:
if first:
@@ -304,7 +374,7 @@
else:
buf = separator
if isinstance(value, basestring):
- yield buf + _encoder(value)
+ yield buf + '"' + self.encoder(value) + '"'
elif value is None:
yield buf + 'null'
elif value is True:
@@ -314,44 +384,43 @@
elif isinstance(value, (int, long)):
yield buf + str(value)
elif isinstance(value, float):
- yield buf + _floatstr(value)
+ yield buf + self._floatstr(value)
else:
yield buf
if isinstance(value, (list, tuple)):
- chunks = _iterencode_list(value, _current_indent_level)
+ chunks = self._iterencode_list(value, markers,
+ _current_indent_level)
elif isinstance(value, dict):
- chunks = _iterencode_dict(value, _current_indent_level)
+ chunks = self._iterencode_dict(value, markers,
+ _current_indent_level)
else:
- chunks = _iterencode(value, _current_indent_level)
+ chunks = self._iterencode(value, markers,
+ _current_indent_level)
for chunk in chunks:
yield chunk
if newline_indent is not None:
_current_indent_level -= 1
- yield '\n' + (' ' * (_indent * _current_indent_level))
+ yield '\n' + (' ' * (self.indent * _current_indent_level))
yield ']'
- if markers is not None:
- del markers[markerid]
+ self._remove_markers(markers, lst)
- def _iterencode_dict(dct, _current_indent_level):
+ def _iterencode_dict(self, dct, markers, _current_indent_level):
if not dct:
yield '{}'
return
- if markers is not None:
- markerid = id(dct)
- if markerid in markers:
- raise ValueError("Circular reference detected")
- markers[markerid] = dct
+ self._mark_markers(markers, dct)
yield '{'
- if _indent is not None:
+ if self.indent is not None:
_current_indent_level += 1
- newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
- item_separator = _item_separator + newline_indent
+ newline_indent = '\n' + (' ' * (self.indent *
+ _current_indent_level))
+ item_separator = self.item_separator + newline_indent
yield newline_indent
else:
newline_indent = None
- item_separator = _item_separator
+ item_separator = self.item_separator
first = True
- if _sort_keys:
+ if self.sort_keys:
items = sorted(dct.items(), key=lambda kv: kv[0])
else:
items = dct.iteritems()
@@ -361,7 +430,7 @@
# JavaScript is weakly typed for these, so it makes sense to
# also allow them. Many encoders seem to do something like this.
elif isinstance(key, float):
- key = _floatstr(key)
+ key = self._floatstr(key)
elif key is True:
key = 'true'
elif key is False:
@@ -370,7 +439,7 @@
key = 'null'
elif isinstance(key, (int, long)):
key = str(key)
- elif _skipkeys:
+ elif self.skipkeys:
continue
else:
raise TypeError("key " + repr(key) + " is not a string")
@@ -378,10 +447,10 @@
first = False
else:
yield item_separator
- yield _encoder(key)
- yield _key_separator
+ yield '"' + self.encoder(key) + '"'
+ yield self.key_separator
if isinstance(value, basestring):
- yield _encoder(value)
+ yield '"' + self.encoder(value) + '"'
elif value is None:
yield 'null'
elif value is True:
@@ -391,26 +460,28 @@
elif isinstance(value, (int, long)):
yield str(value)
elif isinstance(value, float):
- yield _floatstr(value)
+ yield self._floatstr(value)
else:
if isinstance(value, (list, tuple)):
- chunks = _iterencode_list(value, _current_indent_level)
+ chunks = self._iterencode_list(value, markers,
+ _current_indent_level)
elif isinstance(value, dict):
- chunks = _iterencode_dict(value, _current_indent_level)
+ chunks = self._iterencode_dict(value, markers,
+ _current_indent_level)
else:
- chunks = _iterencode(value, _current_indent_level)
+ chunks = self._iterencode(value, markers,
+ _current_indent_level)
for chunk in chunks:
yield chunk
if newline_indent is not None:
_current_indent_level -= 1
- yield '\n' + (' ' * (_indent * _current_indent_level))
+ yield '\n' + (' ' * (self.indent * _current_indent_level))
yield '}'
- if markers is not None:
- del markers[markerid]
+ self._remove_markers(markers, dct)
- def _iterencode(o, _current_indent_level):
+ def _iterencode(self, o, markers, _current_indent_level):
if isinstance(o, basestring):
- yield _encoder(o)
+ yield '"' + self.encoder(o) + '"'
elif o is None:
yield 'null'
elif o is True:
@@ -420,23 +491,19 @@
elif isinstance(o, (int, long)):
yield str(o)
elif isinstance(o, float):
- yield _floatstr(o)
+ yield self._floatstr(o)
elif isinstance(o, (list, tuple)):
- for chunk in _iterencode_list(o, _current_indent_level):
+ for chunk in self._iterencode_list(o, markers,
+ _current_indent_level):
yield chunk
elif isinstance(o, dict):
- for chunk in _iterencode_dict(o, _current_indent_level):
+ for chunk in self._iterencode_dict(o, markers,
+ _current_indent_level):
yield chunk
else:
- if markers is not None:
- markerid = id(o)
- if markerid in markers:
- raise ValueError("Circular reference detected")
- markers[markerid] = o
- o = _default(o)
- for chunk in _iterencode(o, _current_indent_level):
+ self._mark_markers(markers, o)
+ obj = self.default(o)
+ for chunk in self._iterencode(obj, markers,
+ _current_indent_level):
yield chunk
- if markers is not None:
- del markers[markerid]
-
- return _iterencode
+ self._remove_markers(markers, o)
diff --git a/lib-python/modified-2.7/json/tests/test_unicode.py b/lib-python/modified-2.7/json/tests/test_unicode.py
--- a/lib-python/modified-2.7/json/tests/test_unicode.py
+++ b/lib-python/modified-2.7/json/tests/test_unicode.py
@@ -80,3 +80,9 @@
self.assertEqual(type(json.loads(u'["a"]')[0]), unicode)
# Issue 10038.
self.assertEqual(type(json.loads('"foo"')), unicode)
+
+ def test_encode_not_utf_8(self):
+ self.assertEqual(json.dumps('\xb1\xe6', encoding='iso8859-2'),
+ '"\\u0105\\u0107"')
+ self.assertEqual(json.dumps(['\xb1\xe6'], encoding='iso8859-2'),
+ '["\\u0105\\u0107"]')
diff --git a/lib_pypy/pyrepl/readline.py b/lib_pypy/pyrepl/readline.py
--- a/lib_pypy/pyrepl/readline.py
+++ b/lib_pypy/pyrepl/readline.py
@@ -395,9 +395,21 @@
_wrapper.f_in = f_in
_wrapper.f_out = f_out
- if hasattr(sys, '__raw_input__'): # PyPy
- _old_raw_input = sys.__raw_input__
+ if '__pypy__' in sys.builtin_module_names: # PyPy
+
+ def _old_raw_input(prompt=''):
+ # sys.__raw_input__() is only called when stdin and stdout are
+ # as expected and are ttys. If it is the case, then get_reader()
+ # should not really fail in _wrapper.raw_input(). If it still
+ # does, then we will just cancel the redirection and call again
+ # the built-in raw_input().
+ try:
+ del sys.__raw_input__
+ except AttributeError:
+ pass
+ return raw_input(prompt)
sys.__raw_input__ = _wrapper.raw_input
+
else:
# this is not really what readline.c does. Better than nothing I guess
import __builtin__
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -78,6 +78,7 @@
del working_modules['fcntl'] # LOCK_NB not defined
del working_modules["_minimal_curses"]
del working_modules["termios"]
+ del working_modules["_multiprocessing"] # depends on rctime
diff --git a/pypy/interpreter/astcompiler/ast.py b/pypy/interpreter/astcompiler/ast.py
--- a/pypy/interpreter/astcompiler/ast.py
+++ b/pypy/interpreter/astcompiler/ast.py
@@ -2,7 +2,7 @@
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter import typedef
from pypy.interpreter.gateway import interp2app
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.rlib.unroll import unrolling_iterable
from pypy.tool.pairtype import extendabletype
from pypy.tool.sourcetools import func_with_new_name
@@ -101,9 +101,7 @@
missing = required[i]
if missing is not None:
err = "required field \"%s\" missing from %s"
- err = err % (missing, host)
- w_err = space.wrap(err)
- raise OperationError(space.w_TypeError, w_err)
+ raise operationerrfmt(space.w_TypeError, err, missing, host)
raise AssertionError("should not reach here")
@@ -2857,14 +2855,13 @@
def Module_get_body(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -2900,14 +2897,13 @@
def Interactive_get_body(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -2947,8 +2943,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
return space.wrap(w_self.body)
def Expression_set_body(space, w_self, w_new_value):
@@ -2989,14 +2984,13 @@
def Suite_get_body(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3036,8 +3030,7 @@
return w_obj
if not w_self.initialization_state & w_self._lineno_mask:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'lineno'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'lineno')
return space.wrap(w_self.lineno)
def stmt_set_lineno(space, w_self, w_new_value):
@@ -3058,8 +3051,7 @@
return w_obj
if not w_self.initialization_state & w_self._col_offset_mask:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'col_offset'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'col_offset')
return space.wrap(w_self.col_offset)
def stmt_set_col_offset(space, w_self, w_new_value):
@@ -3089,8 +3081,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'name'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'name')
return space.wrap(w_self.name)
def FunctionDef_set_name(space, w_self, w_new_value):
@@ -3111,8 +3102,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'args'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'args')
return space.wrap(w_self.args)
def FunctionDef_set_args(space, w_self, w_new_value):
@@ -3129,14 +3119,13 @@
def FunctionDef_get_body(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3147,14 +3136,13 @@
def FunctionDef_get_decorator_list(space, w_self):
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'decorator_list'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'decorator_list')
if w_self.w_decorator_list is None:
if w_self.decorator_list is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.decorator_list]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_decorator_list = w_list
return w_self.w_decorator_list
@@ -3198,8 +3186,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'name'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'name')
return space.wrap(w_self.name)
def ClassDef_set_name(space, w_self, w_new_value):
@@ -3216,14 +3203,13 @@
def ClassDef_get_bases(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'bases'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'bases')
if w_self.w_bases is None:
if w_self.bases is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.bases]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_bases = w_list
return w_self.w_bases
@@ -3234,14 +3220,13 @@
def ClassDef_get_keywords(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'keywords'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'keywords')
if w_self.w_keywords is None:
if w_self.keywords is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.keywords]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_keywords = w_list
return w_self.w_keywords
@@ -3256,8 +3241,7 @@
return w_obj
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'starargs'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'starargs')
return space.wrap(w_self.starargs)
def ClassDef_set_starargs(space, w_self, w_new_value):
@@ -3278,8 +3262,7 @@
return w_obj
if not w_self.initialization_state & 16:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'kwargs'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'kwargs')
return space.wrap(w_self.kwargs)
def ClassDef_set_kwargs(space, w_self, w_new_value):
@@ -3296,14 +3279,13 @@
def ClassDef_get_body(space, w_self):
if not w_self.initialization_state & 32:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3314,14 +3296,13 @@
def ClassDef_get_decorator_list(space, w_self):
if not w_self.initialization_state & 64:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'decorator_list'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'decorator_list')
if w_self.w_decorator_list is None:
if w_self.decorator_list is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.decorator_list]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_decorator_list = w_list
return w_self.w_decorator_list
@@ -3370,8 +3351,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Return_set_value(space, w_self, w_new_value):
@@ -3412,14 +3392,13 @@
def Delete_get_targets(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'targets'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'targets')
if w_self.w_targets is None:
if w_self.targets is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.targets]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_targets = w_list
return w_self.w_targets
@@ -3455,14 +3434,13 @@
def Assign_get_targets(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'targets'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'targets')
if w_self.w_targets is None:
if w_self.targets is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.targets]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_targets = w_list
return w_self.w_targets
@@ -3477,8 +3455,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Assign_set_value(space, w_self, w_new_value):
@@ -3525,8 +3502,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'target'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'target')
return space.wrap(w_self.target)
def AugAssign_set_target(space, w_self, w_new_value):
@@ -3547,8 +3523,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'op'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'op')
return operator_to_class[w_self.op - 1]()
def AugAssign_set_op(space, w_self, w_new_value):
@@ -3571,8 +3546,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def AugAssign_set_value(space, w_self, w_new_value):
@@ -3619,8 +3593,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'target'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'target')
return space.wrap(w_self.target)
def For_set_target(space, w_self, w_new_value):
@@ -3641,8 +3614,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'iter'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'iter')
return space.wrap(w_self.iter)
def For_set_iter(space, w_self, w_new_value):
@@ -3659,14 +3631,13 @@
def For_get_body(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3677,14 +3648,13 @@
def For_get_orelse(space, w_self):
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'orelse'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'orelse')
if w_self.w_orelse is None:
if w_self.orelse is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.orelse]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_orelse = w_list
return w_self.w_orelse
@@ -3728,8 +3698,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'test'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'test')
return space.wrap(w_self.test)
def While_set_test(space, w_self, w_new_value):
@@ -3746,14 +3715,13 @@
def While_get_body(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3764,14 +3732,13 @@
def While_get_orelse(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'orelse'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'orelse')
if w_self.w_orelse is None:
if w_self.orelse is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.orelse]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_orelse = w_list
return w_self.w_orelse
@@ -3814,8 +3781,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'test'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'test')
return space.wrap(w_self.test)
def If_set_test(space, w_self, w_new_value):
@@ -3832,14 +3798,13 @@
def If_get_body(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3850,14 +3815,13 @@
def If_get_orelse(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'orelse'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'orelse')
if w_self.w_orelse is None:
if w_self.orelse is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.orelse]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_orelse = w_list
return w_self.w_orelse
@@ -3900,8 +3864,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'context_expr'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'context_expr')
return space.wrap(w_self.context_expr)
def With_set_context_expr(space, w_self, w_new_value):
@@ -3922,8 +3885,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'optional_vars'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'optional_vars')
return space.wrap(w_self.optional_vars)
def With_set_optional_vars(space, w_self, w_new_value):
@@ -3940,14 +3902,13 @@
def With_get_body(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -3989,8 +3950,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'exc'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'exc')
return space.wrap(w_self.exc)
def Raise_set_exc(space, w_self, w_new_value):
@@ -4011,8 +3971,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'cause'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'cause')
return space.wrap(w_self.cause)
def Raise_set_cause(space, w_self, w_new_value):
@@ -4054,14 +4013,13 @@
def TryExcept_get_body(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -4072,14 +4030,13 @@
def TryExcept_get_handlers(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'handlers'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'handlers')
if w_self.w_handlers is None:
if w_self.handlers is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.handlers]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_handlers = w_list
return w_self.w_handlers
@@ -4090,14 +4047,13 @@
def TryExcept_get_orelse(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'orelse'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'orelse')
if w_self.w_orelse is None:
if w_self.orelse is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.orelse]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_orelse = w_list
return w_self.w_orelse
@@ -4137,14 +4093,13 @@
def TryFinally_get_body(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -4155,14 +4110,13 @@
def TryFinally_get_finalbody(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'finalbody'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'finalbody')
if w_self.w_finalbody is None:
if w_self.finalbody is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.finalbody]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_finalbody = w_list
return w_self.w_finalbody
@@ -4204,8 +4158,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'test'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'test')
return space.wrap(w_self.test)
def Assert_set_test(space, w_self, w_new_value):
@@ -4226,8 +4179,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'msg'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'msg')
return space.wrap(w_self.msg)
def Assert_set_msg(space, w_self, w_new_value):
@@ -4269,14 +4221,13 @@
def Import_get_names(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'names'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'names')
if w_self.w_names is None:
if w_self.names is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.names]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_names = w_list
return w_self.w_names
@@ -4316,8 +4267,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'module'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'module')
return space.wrap(w_self.module)
def ImportFrom_set_module(space, w_self, w_new_value):
@@ -4337,14 +4287,13 @@
def ImportFrom_get_names(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'names'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'names')
if w_self.w_names is None:
if w_self.names is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.names]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_names = w_list
return w_self.w_names
@@ -4359,8 +4308,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'level'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'level')
return space.wrap(w_self.level)
def ImportFrom_set_level(space, w_self, w_new_value):
@@ -4404,14 +4352,13 @@
def Global_get_names(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'names'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'names')
if w_self.w_names is None:
if w_self.names is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.names]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_names = w_list
return w_self.w_names
@@ -4447,14 +4394,13 @@
def Nonlocal_get_names(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'names'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'names')
if w_self.w_names is None:
if w_self.names is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.names]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_names = w_list
return w_self.w_names
@@ -4494,8 +4440,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Expr_set_value(space, w_self, w_new_value):
@@ -4591,8 +4536,7 @@
return w_obj
if not w_self.initialization_state & w_self._lineno_mask:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'lineno'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'lineno')
return space.wrap(w_self.lineno)
def expr_set_lineno(space, w_self, w_new_value):
@@ -4613,8 +4557,7 @@
return w_obj
if not w_self.initialization_state & w_self._col_offset_mask:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'col_offset'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'col_offset')
return space.wrap(w_self.col_offset)
def expr_set_col_offset(space, w_self, w_new_value):
@@ -4644,8 +4587,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'op'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'op')
return boolop_to_class[w_self.op - 1]()
def BoolOp_set_op(space, w_self, w_new_value):
@@ -4664,14 +4606,13 @@
def BoolOp_get_values(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'values'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'values')
if w_self.w_values is None:
if w_self.values is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.values]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_values = w_list
return w_self.w_values
@@ -4712,8 +4653,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'left'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'left')
return space.wrap(w_self.left)
def BinOp_set_left(space, w_self, w_new_value):
@@ -4734,8 +4674,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'op'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'op')
return operator_to_class[w_self.op - 1]()
def BinOp_set_op(space, w_self, w_new_value):
@@ -4758,8 +4697,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'right'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'right')
return space.wrap(w_self.right)
def BinOp_set_right(space, w_self, w_new_value):
@@ -4806,8 +4744,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'op'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'op')
return unaryop_to_class[w_self.op - 1]()
def UnaryOp_set_op(space, w_self, w_new_value):
@@ -4830,8 +4767,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'operand'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'operand')
return space.wrap(w_self.operand)
def UnaryOp_set_operand(space, w_self, w_new_value):
@@ -4877,8 +4813,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'args'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'args')
return space.wrap(w_self.args)
def Lambda_set_args(space, w_self, w_new_value):
@@ -4899,8 +4834,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
return space.wrap(w_self.body)
def Lambda_set_body(space, w_self, w_new_value):
@@ -4946,8 +4880,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'test'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'test')
return space.wrap(w_self.test)
def IfExp_set_test(space, w_self, w_new_value):
@@ -4968,8 +4901,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
return space.wrap(w_self.body)
def IfExp_set_body(space, w_self, w_new_value):
@@ -4990,8 +4922,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'orelse'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'orelse')
return space.wrap(w_self.orelse)
def IfExp_set_orelse(space, w_self, w_new_value):
@@ -5034,14 +4965,13 @@
def Dict_get_keys(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'keys'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'keys')
if w_self.w_keys is None:
if w_self.keys is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.keys]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_keys = w_list
return w_self.w_keys
@@ -5052,14 +4982,13 @@
def Dict_get_values(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'values'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'values')
if w_self.w_values is None:
if w_self.values is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.values]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_values = w_list
return w_self.w_values
@@ -5097,14 +5026,13 @@
def Set_get_elts(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'elts'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'elts')
if w_self.w_elts is None:
if w_self.elts is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.elts]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_elts = w_list
return w_self.w_elts
@@ -5144,8 +5072,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'elt'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'elt')
return space.wrap(w_self.elt)
def ListComp_set_elt(space, w_self, w_new_value):
@@ -5162,14 +5089,13 @@
def ListComp_get_generators(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'generators'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'generators')
if w_self.w_generators is None:
if w_self.generators is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.generators]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_generators = w_list
return w_self.w_generators
@@ -5210,8 +5136,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'elt'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'elt')
return space.wrap(w_self.elt)
def SetComp_set_elt(space, w_self, w_new_value):
@@ -5228,14 +5153,13 @@
def SetComp_get_generators(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'generators'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'generators')
if w_self.w_generators is None:
if w_self.generators is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.generators]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_generators = w_list
return w_self.w_generators
@@ -5276,8 +5200,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'key'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'key')
return space.wrap(w_self.key)
def DictComp_set_key(space, w_self, w_new_value):
@@ -5298,8 +5221,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def DictComp_set_value(space, w_self, w_new_value):
@@ -5316,14 +5238,13 @@
def DictComp_get_generators(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'generators'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'generators')
if w_self.w_generators is None:
if w_self.generators is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.generators]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_generators = w_list
return w_self.w_generators
@@ -5365,8 +5286,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'elt'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'elt')
return space.wrap(w_self.elt)
def GeneratorExp_set_elt(space, w_self, w_new_value):
@@ -5383,14 +5303,13 @@
def GeneratorExp_get_generators(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'generators'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'generators')
if w_self.w_generators is None:
if w_self.generators is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.generators]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_generators = w_list
return w_self.w_generators
@@ -5431,8 +5350,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Yield_set_value(space, w_self, w_new_value):
@@ -5477,8 +5395,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'left'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'left')
return space.wrap(w_self.left)
def Compare_set_left(space, w_self, w_new_value):
@@ -5495,14 +5412,13 @@
def Compare_get_ops(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ops'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ops')
if w_self.w_ops is None:
if w_self.ops is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [cmpop_to_class[node - 1]() for node in w_self.ops]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_ops = w_list
return w_self.w_ops
@@ -5513,14 +5429,13 @@
def Compare_get_comparators(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'comparators'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'comparators')
if w_self.w_comparators is None:
if w_self.comparators is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.comparators]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_comparators = w_list
return w_self.w_comparators
@@ -5563,8 +5478,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'func'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'func')
return space.wrap(w_self.func)
def Call_set_func(space, w_self, w_new_value):
@@ -5581,14 +5495,13 @@
def Call_get_args(space, w_self):
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'args'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'args')
if w_self.w_args is None:
if w_self.args is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.args]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_args = w_list
return w_self.w_args
@@ -5599,14 +5512,13 @@
def Call_get_keywords(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'keywords'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'keywords')
if w_self.w_keywords is None:
if w_self.keywords is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.keywords]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_keywords = w_list
return w_self.w_keywords
@@ -5621,8 +5533,7 @@
return w_obj
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'starargs'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'starargs')
return space.wrap(w_self.starargs)
def Call_set_starargs(space, w_self, w_new_value):
@@ -5643,8 +5554,7 @@
return w_obj
if not w_self.initialization_state & 16:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'kwargs'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'kwargs')
return space.wrap(w_self.kwargs)
def Call_set_kwargs(space, w_self, w_new_value):
@@ -5695,8 +5605,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'n'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'n')
return w_self.n
def Num_set_n(space, w_self, w_new_value):
@@ -5741,8 +5650,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 's'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 's')
return w_self.s
def Str_set_s(space, w_self, w_new_value):
@@ -5787,8 +5695,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Attribute_set_value(space, w_self, w_new_value):
@@ -5809,8 +5716,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'attr'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'attr')
return space.wrap(w_self.attr)
def Attribute_set_attr(space, w_self, w_new_value):
@@ -5831,8 +5737,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ctx'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ctx')
return expr_context_to_class[w_self.ctx - 1]()
def Attribute_set_ctx(space, w_self, w_new_value):
@@ -5881,8 +5786,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Subscript_set_value(space, w_self, w_new_value):
@@ -5903,8 +5807,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'slice'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'slice')
return space.wrap(w_self.slice)
def Subscript_set_slice(space, w_self, w_new_value):
@@ -5925,8 +5828,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ctx'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ctx')
return expr_context_to_class[w_self.ctx - 1]()
def Subscript_set_ctx(space, w_self, w_new_value):
@@ -5975,8 +5877,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'id'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'id')
return space.wrap(w_self.id)
def Name_set_id(space, w_self, w_new_value):
@@ -5997,8 +5898,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ctx'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ctx')
return expr_context_to_class[w_self.ctx - 1]()
def Name_set_ctx(space, w_self, w_new_value):
@@ -6042,14 +5942,13 @@
def List_get_elts(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'elts'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'elts')
if w_self.w_elts is None:
if w_self.elts is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.elts]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_elts = w_list
return w_self.w_elts
@@ -6064,8 +5963,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ctx'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ctx')
return expr_context_to_class[w_self.ctx - 1]()
def List_set_ctx(space, w_self, w_new_value):
@@ -6110,14 +6008,13 @@
def Tuple_get_elts(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'elts'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'elts')
if w_self.w_elts is None:
if w_self.elts is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.elts]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_elts = w_list
return w_self.w_elts
@@ -6132,8 +6029,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ctx'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ctx')
return expr_context_to_class[w_self.ctx - 1]()
def Tuple_set_ctx(space, w_self, w_new_value):
@@ -6182,8 +6078,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return w_self.value
def Const_set_value(space, w_self, w_new_value):
@@ -6301,8 +6196,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'lower'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'lower')
return space.wrap(w_self.lower)
def Slice_set_lower(space, w_self, w_new_value):
@@ -6323,8 +6217,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'upper'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'upper')
return space.wrap(w_self.upper)
def Slice_set_upper(space, w_self, w_new_value):
@@ -6345,8 +6238,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'step'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'step')
return space.wrap(w_self.step)
def Slice_set_step(space, w_self, w_new_value):
@@ -6389,14 +6281,13 @@
def ExtSlice_get_dims(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'dims'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'dims')
if w_self.w_dims is None:
if w_self.dims is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.dims]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_dims = w_list
return w_self.w_dims
@@ -6436,8 +6327,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def Index_set_value(space, w_self, w_new_value):
@@ -6706,8 +6596,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'target'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'target')
return space.wrap(w_self.target)
def comprehension_set_target(space, w_self, w_new_value):
@@ -6728,8 +6617,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'iter'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'iter')
return space.wrap(w_self.iter)
def comprehension_set_iter(space, w_self, w_new_value):
@@ -6746,14 +6634,13 @@
def comprehension_get_ifs(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'ifs'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'ifs')
if w_self.w_ifs is None:
if w_self.ifs is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.ifs]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_ifs = w_list
return w_self.w_ifs
@@ -6795,8 +6682,7 @@
return w_obj
if not w_self.initialization_state & w_self._lineno_mask:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'lineno'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'lineno')
return space.wrap(w_self.lineno)
def excepthandler_set_lineno(space, w_self, w_new_value):
@@ -6817,8 +6703,7 @@
return w_obj
if not w_self.initialization_state & w_self._col_offset_mask:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'col_offset'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'col_offset')
return space.wrap(w_self.col_offset)
def excepthandler_set_col_offset(space, w_self, w_new_value):
@@ -6848,8 +6733,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'type'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'type')
return space.wrap(w_self.type)
def ExceptHandler_set_type(space, w_self, w_new_value):
@@ -6870,8 +6754,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'name'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'name')
return space.wrap(w_self.name)
def ExceptHandler_set_name(space, w_self, w_new_value):
@@ -6888,14 +6771,13 @@
def ExceptHandler_get_body(space, w_self):
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'body'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'body')
if w_self.w_body is None:
if w_self.body is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.body]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_body = w_list
return w_self.w_body
@@ -6933,14 +6815,13 @@
def arguments_get_args(space, w_self):
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'args'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'args')
if w_self.w_args is None:
if w_self.args is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.args]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_args = w_list
return w_self.w_args
@@ -6955,8 +6836,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'vararg'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'vararg')
return space.wrap(w_self.vararg)
def arguments_set_vararg(space, w_self, w_new_value):
@@ -6980,8 +6860,7 @@
return w_obj
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'kwarg'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'kwarg')
return space.wrap(w_self.kwarg)
def arguments_set_kwarg(space, w_self, w_new_value):
@@ -7001,14 +6880,13 @@
def arguments_get_defaults(space, w_self):
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'defaults'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'defaults')
if w_self.w_defaults is None:
if w_self.defaults is None:
- w_list = space.newlist([])
+ list_w = []
else:
list_w = [space.wrap(node) for node in w_self.defaults]
- w_list = space.newlist(list_w)
+ w_list = space.newlist(list_w)
w_self.w_defaults = w_list
return w_self.w_defaults
@@ -7052,8 +6930,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'arg'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'arg')
return space.wrap(w_self.arg)
def keyword_set_arg(space, w_self, w_new_value):
@@ -7074,8 +6951,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'value'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'value')
return space.wrap(w_self.value)
def keyword_set_value(space, w_self, w_new_value):
@@ -7121,8 +6997,7 @@
return w_obj
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'name'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'name')
return space.wrap(w_self.name)
def alias_set_name(space, w_self, w_new_value):
@@ -7143,8 +7018,7 @@
return w_obj
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
- w_err = space.wrap("'%s' object has no attribute 'asname'" % typename)
- raise OperationError(space.w_AttributeError, w_err)
+ raise operationerrfmt(space.w_AttributeError, "'%s' object has no attribute '%s'", typename, 'asname')
return space.wrap(w_self.asname)
def alias_set_asname(space, w_self, w_new_value):
diff --git a/pypy/interpreter/astcompiler/tools/asdl_py.py b/pypy/interpreter/astcompiler/tools/asdl_py.py
--- a/pypy/interpreter/astcompiler/tools/asdl_py.py
+++ b/pypy/interpreter/astcompiler/tools/asdl_py.py
@@ -414,13 +414,12 @@
self.emit(" return w_obj", 1)
self.emit("if not w_self.initialization_state & %s:" % (flag,), 1)
self.emit("typename = space.type(w_self).getname(space)", 2)
- self.emit("w_err = space.wrap(\"'%%s' object has no attribute '%s'\" %% typename)" %
+ self.emit("raise operationerrfmt(space.w_AttributeError, \"'%%s' object has no attribute '%%s'\", typename, '%s')" %
(field.name,), 2)
- self.emit("raise OperationError(space.w_AttributeError, w_err)", 2)
if field.seq:
self.emit("if w_self.w_%s is None:" % (field.name,), 1)
self.emit("if w_self.%s is None:" % (field.name,), 2)
- self.emit("w_list = space.newlist([])", 3)
+ self.emit("list_w = []", 3)
self.emit("else:", 2)
if field.type.value in self.data.simple_types:
wrapper = "%s_to_class[node - 1]()" % (field.type,)
@@ -428,7 +427,7 @@
wrapper = "space.wrap(node)"
self.emit("list_w = [%s for node in w_self.%s]" %
(wrapper, field.name), 3)
- self.emit("w_list = space.newlist(list_w)", 3)
+ self.emit("w_list = space.newlist(list_w)", 2)
self.emit("w_self.w_%s = w_list" % (field.name,), 2)
self.emit("return w_self.w_%s" % (field.name,), 1)
elif field.type.value in self.data.simple_types:
@@ -540,7 +539,7 @@
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter import typedef
from pypy.interpreter.gateway import interp2app
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.rlib.unroll import unrolling_iterable
from pypy.tool.pairtype import extendabletype
from pypy.tool.sourcetools import func_with_new_name
@@ -639,9 +638,7 @@
missing = required[i]
if missing is not None:
err = "required field \\"%s\\" missing from %s"
- err = err % (missing, host)
- w_err = space.wrap(err)
- raise OperationError(space.w_TypeError, w_err)
+ raise operationerrfmt(space.w_TypeError, err, missing, host)
raise AssertionError("should not reach here")
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -7,9 +7,7 @@
import weakref
from pypy.objspace.flow.model import Variable, Constant
from pypy.annotation import model as annmodel
-from pypy.jit.metainterp.history import (ConstInt, ConstPtr,
- BoxInt, BoxPtr, BoxObj, BoxFloat,
- REF, INT, FLOAT)
+from pypy.jit.metainterp.history import REF, INT, FLOAT
from pypy.jit.codewriter import heaptracker
from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr, rffi
from pypy.rpython.ootypesystem import ootype
@@ -17,7 +15,7 @@
from pypy.rpython.llinterp import LLException
from pypy.rpython.extregistry import ExtRegistryEntry
-from pypy.jit.metainterp import resoperation, executor
+from pypy.jit.metainterp import resoperation
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.backend.llgraph import symbolic
from pypy.jit.codewriter import longlong
@@ -334,6 +332,13 @@
assert isinstance(type, str) and len(type) == 1
op.descr = Descr(ofs, type, arg_types=arg_types)
+def compile_add_descr_arg(loop, ofs, type, arg_types):
+ from pypy.jit.backend.llgraph.runner import Descr
+ loop = _from_opaque(loop)
+ op = loop.operations[-1]
+ assert isinstance(type, str) and len(type) == 1
+ op.args.append(Descr(ofs, type, arg_types=arg_types))
+
def compile_add_loop_token(loop, descr):
if we_are_translated():
raise ValueError("CALL_ASSEMBLER not supported")
@@ -438,8 +443,11 @@
self._may_force = -1
def getenv(self, v):
+ from pypy.jit.backend.llgraph.runner import Descr
if isinstance(v, Constant):
return v.value
+ elif isinstance(v, Descr):
+ return v
else:
return self.env[v]
@@ -807,6 +815,29 @@
else:
raise NotImplementedError
+ def op_getinteriorfield_gc(self, descr, array, index):
+ if descr.typeinfo == REF:
+ return do_getinteriorfield_gc_ptr(array, index, descr.ofs)
+ elif descr.typeinfo == INT:
+ return do_getinteriorfield_gc_int(array, index, descr.ofs)
+ elif descr.typeinfo == FLOAT:
+ return do_getinteriorfield_gc_float(array, index, descr.ofs)
+ else:
+ raise NotImplementedError
+
+ def op_setinteriorfield_gc(self, descr, array, index, newvalue):
+ if descr.typeinfo == REF:
+ return do_setinteriorfield_gc_ptr(array, index, descr.ofs,
+ newvalue)
+ elif descr.typeinfo == INT:
+ return do_setinteriorfield_gc_int(array, index, descr.ofs,
+ newvalue)
+ elif descr.typeinfo == FLOAT:
+ return do_setinteriorfield_gc_float(array, index, descr.ofs,
+ newvalue)
+ else:
+ raise NotImplementedError
+
def op_setfield_gc(self, fielddescr, struct, newvalue):
if fielddescr.typeinfo == REF:
do_setfield_gc_ptr(struct, fielddescr.ofs, newvalue)
@@ -1354,6 +1385,22 @@
def do_getfield_gc_ptr(struct, fieldnum):
return cast_to_ptr(_getfield_gc(struct, fieldnum))
+def _getinteriorfield_gc(struct, fieldnum):
+ STRUCT, fieldname = symbolic.TokenToField[fieldnum]
+ return getattr(struct, fieldname)
+
+def do_getinteriorfield_gc_int(array, index, fieldnum):
+ struct = array._obj.container.getitem(index)
+ return cast_to_int(_getinteriorfield_gc(struct, fieldnum))
+
+def do_getinteriorfield_gc_float(array, index, fieldnum):
+ struct = array._obj.container.getitem(index)
+ return cast_to_floatstorage(_getinteriorfield_gc(struct, fieldnum))
+
+def do_getinteriorfield_gc_ptr(array, index, fieldnum):
+ struct = array._obj.container.getitem(index)
+ return cast_to_ptr(_getinteriorfield_gc(struct, fieldnum))
+
def _getfield_raw(struct, fieldnum):
STRUCT, fieldname = symbolic.TokenToField[fieldnum]
ptr = cast_from_int(lltype.Ptr(STRUCT), struct)
@@ -1409,26 +1456,28 @@
newvalue = cast_from_ptr(ITEMTYPE, newvalue)
array.setitem(index, newvalue)
-def do_setfield_gc_int(struct, fieldnum, newvalue):
- STRUCT, fieldname = symbolic.TokenToField[fieldnum]
- ptr = lltype.cast_opaque_ptr(lltype.Ptr(STRUCT), struct)
- FIELDTYPE = getattr(STRUCT, fieldname)
- newvalue = cast_from_int(FIELDTYPE, newvalue)
- setattr(ptr, fieldname, newvalue)
+def new_setfield_gc(cast_func):
+ def do_setfield_gc(struct, fieldnum, newvalue):
+ STRUCT, fieldname = symbolic.TokenToField[fieldnum]
+ ptr = lltype.cast_opaque_ptr(lltype.Ptr(STRUCT), struct)
+ FIELDTYPE = getattr(STRUCT, fieldname)
+ newvalue = cast_func(FIELDTYPE, newvalue)
+ setattr(ptr, fieldname, newvalue)
+ return do_setfield_gc
+do_setfield_gc_int = new_setfield_gc(cast_from_int)
+do_setfield_gc_float = new_setfield_gc(cast_from_floatstorage)
+do_setfield_gc_ptr = new_setfield_gc(cast_from_ptr)
-def do_setfield_gc_float(struct, fieldnum, newvalue):
- STRUCT, fieldname = symbolic.TokenToField[fieldnum]
- ptr = lltype.cast_opaque_ptr(lltype.Ptr(STRUCT), struct)
- FIELDTYPE = getattr(STRUCT, fieldname)
- newvalue = cast_from_floatstorage(FIELDTYPE, newvalue)
- setattr(ptr, fieldname, newvalue)
-
-def do_setfield_gc_ptr(struct, fieldnum, newvalue):
- STRUCT, fieldname = symbolic.TokenToField[fieldnum]
- ptr = lltype.cast_opaque_ptr(lltype.Ptr(STRUCT), struct)
- FIELDTYPE = getattr(STRUCT, fieldname)
- newvalue = cast_from_ptr(FIELDTYPE, newvalue)
- setattr(ptr, fieldname, newvalue)
+def new_setinteriorfield_gc(cast_func):
+ def do_setinteriorfield_gc(array, index, fieldnum, newvalue):
+ STRUCT, fieldname = symbolic.TokenToField[fieldnum]
+ struct = array._obj.container.getitem(index)
+ FIELDTYPE = getattr(STRUCT, fieldname)
+ setattr(struct, fieldname, cast_func(FIELDTYPE, newvalue))
+ return do_setinteriorfield_gc
+do_setinteriorfield_gc_int = new_setinteriorfield_gc(cast_from_int)
+do_setinteriorfield_gc_float = new_setinteriorfield_gc(cast_from_floatstorage)
+do_setinteriorfield_gc_ptr = new_setinteriorfield_gc(cast_from_ptr)
def do_setfield_raw_int(struct, fieldnum, newvalue):
STRUCT, fieldname = symbolic.TokenToField[fieldnum]
@@ -1694,6 +1743,7 @@
setannotation(compile_start_float_var, annmodel.SomeInteger())
setannotation(compile_add, annmodel.s_None)
setannotation(compile_add_descr, annmodel.s_None)
+setannotation(compile_add_descr_arg, annmodel.s_None)
setannotation(compile_add_var, annmodel.s_None)
setannotation(compile_add_int_const, annmodel.s_None)
setannotation(compile_add_ref_const, annmodel.s_None)
@@ -1741,6 +1791,9 @@
setannotation(do_getfield_raw_int, annmodel.SomeInteger())
setannotation(do_getfield_raw_ptr, annmodel.SomePtr(llmemory.GCREF))
setannotation(do_getfield_raw_float, s_FloatStorage)
+setannotation(do_getinteriorfield_gc_int, annmodel.SomeInteger())
+setannotation(do_getinteriorfield_gc_ptr, annmodel.SomePtr(llmemory.GCREF))
+setannotation(do_getinteriorfield_gc_float, s_FloatStorage)
setannotation(do_new, annmodel.SomePtr(llmemory.GCREF))
setannotation(do_new_array, annmodel.SomePtr(llmemory.GCREF))
setannotation(do_setarrayitem_gc_int, annmodel.s_None)
@@ -1754,6 +1807,9 @@
setannotation(do_setfield_raw_int, annmodel.s_None)
setannotation(do_setfield_raw_ptr, annmodel.s_None)
setannotation(do_setfield_raw_float, annmodel.s_None)
+setannotation(do_setinteriorfield_gc_int, annmodel.s_None)
+setannotation(do_setinteriorfield_gc_ptr, annmodel.s_None)
+setannotation(do_setinteriorfield_gc_float, annmodel.s_None)
setannotation(do_newstr, annmodel.SomePtr(llmemory.GCREF))
setannotation(do_strsetitem, annmodel.s_None)
setannotation(do_newunicode, annmodel.SomePtr(llmemory.GCREF))
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
@@ -2,7 +2,6 @@
Minimal-API wrapper around the llinterpreter to run operations.
"""
-import sys
from pypy.rlib.unroll import unrolling_iterable
from pypy.rlib.objectmodel import we_are_translated
from pypy.rpython.lltypesystem import lltype, llmemory, rclass
@@ -11,12 +10,11 @@
from pypy.jit.metainterp import history
from pypy.jit.metainterp.history import REF, INT, FLOAT
from pypy.jit.metainterp.warmstate import unwrap
-from pypy.jit.metainterp.resoperation import ResOperation, rop
+from pypy.jit.metainterp.resoperation import rop
from pypy.jit.backend import model
from pypy.jit.backend.llgraph import llimpl, symbolic
from pypy.jit.metainterp.typesystem import llhelper, oohelper
from pypy.jit.codewriter import heaptracker, longlong
-from pypy.rlib import rgc
class MiniStats:
pass
@@ -177,8 +175,10 @@
llimpl.compile_add(c, op.getopnum())
descr = op.getdescr()
if isinstance(descr, Descr):
- llimpl.compile_add_descr(c, descr.ofs, descr.typeinfo, descr.arg_types)
- if isinstance(descr, history.LoopToken) and op.getopnum() != rop.JUMP:
+ llimpl.compile_add_descr(c, descr.ofs, descr.typeinfo,
+ descr.arg_types)
+ if (isinstance(descr, history.LoopToken) and
+ op.getopnum() != rop.JUMP):
llimpl.compile_add_loop_token(c, descr)
if self.is_oo and isinstance(descr, (OODescr, MethDescr)):
# hack hack, not rpython
@@ -193,6 +193,9 @@
llimpl.compile_add_ref_const(c, x.value, self.ts.BASETYPE)
elif isinstance(x, history.ConstFloat):
llimpl.compile_add_float_const(c, x.value)
+ elif isinstance(x, Descr):
+ llimpl.compile_add_descr_arg(c, x.ofs, x.typeinfo,
+ x.arg_types)
else:
raise Exception("'%s' args contain: %r" % (op.getopname(),
x))
@@ -316,6 +319,13 @@
token = history.getkind(getattr(S, fieldname))
return self.getdescr(ofs, token[0], name=fieldname)
+ def interiorfielddescrof(self, A, fieldname):
+ S = A.OF
+ ofs2 = symbolic.get_size(A)
+ ofs, size = symbolic.get_field_token(S, fieldname)
+ token = history.getkind(getattr(S, fieldname))
+ return self.getdescr(ofs, token[0], name=fieldname, extrainfo=ofs2)
+
def calldescrof(self, FUNC, ARGS, RESULT, extrainfo):
arg_types = []
for ARG in ARGS:
@@ -353,8 +363,11 @@
def arraydescrof(self, A):
assert A.OF != lltype.Void
size = symbolic.get_size(A)
- token = history.getkind(A.OF)
- return self.getdescr(size, token[0])
+ if isinstance(A.OF, lltype.Ptr) or isinstance(A.OF, lltype.Primitive):
+ token = history.getkind(A.OF)[0]
+ else:
+ token = '?'
+ return self.getdescr(size, token)
# ---------- the backend-dependent operations ----------
@@ -406,6 +419,29 @@
assert isinstance(fielddescr, Descr)
return llimpl.do_getfield_raw_float(struct, fielddescr.ofs)
+ def bh_getinteriorfield_gc_i(self, array, index, descr):
+ assert isinstance(descr, Descr)
+ return llimpl.do_getinteriorfield_gc_int(array, index, descr.ofs)
+ def bh_getinteriorfield_gc_r(self, array, index, descr):
+ assert isinstance(descr, Descr)
+ return llimpl.do_getinteriorfield_gc_ptr(array, index, descr.ofs)
+ def bh_getinteriorfield_gc_f(self, array, index, descr):
+ assert isinstance(descr, Descr)
+ return llimpl.do_getinteriorfield_gc_float(array, index, descr.ofs)
+
+ def bh_setinteriorfield_gc_i(self, array, index, descr, value):
+ assert isinstance(descr, Descr)
+ return llimpl.do_setinteriorfield_gc_int(array, index, descr.ofs,
+ value)
+ def bh_setinteriorfield_gc_r(self, array, index, descr, value):
+ assert isinstance(descr, Descr)
+ return llimpl.do_setinteriorfield_gc_ptr(array, index, descr.ofs,
+ value)
+ def bh_setinteriorfield_gc_f(self, array, index, descr, value):
+ assert isinstance(descr, Descr)
+ return llimpl.do_setinteriorfield_gc_float(array, index, descr.ofs,
+ value)
+
def bh_new(self, sizedescr):
assert isinstance(sizedescr, Descr)
return llimpl.do_new(sizedescr.ofs)
@@ -418,7 +454,6 @@
def bh_classof(self, struct):
struct = lltype.cast_opaque_ptr(rclass.OBJECTPTR, struct)
- result = struct.typeptr
result_adr = llmemory.cast_ptr_to_adr(struct.typeptr)
return heaptracker.adr2int(result_adr)
diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -1,13 +1,10 @@
import py
-from pypy.rpython.lltypesystem import lltype, rffi, llmemory, rclass
+from pypy.rpython.lltypesystem import lltype, rffi, llmemory
from pypy.rpython.lltypesystem.lloperation import llop
from pypy.jit.backend.llsupport import symbolic, support
-from pypy.jit.metainterp.history import AbstractDescr, getkind, BoxInt, BoxPtr
-from pypy.jit.metainterp.history import BasicFailDescr, LoopToken, BoxFloat
+from pypy.jit.metainterp.history import AbstractDescr, getkind
from pypy.jit.metainterp import history
-from pypy.jit.metainterp.resoperation import ResOperation, rop
from pypy.jit.codewriter import heaptracker, longlong
-from pypy.rlib.rarithmetic import r_longlong, r_ulonglong
# The point of the class organization in this file is to make instances
# as compact as possible. This is done by not storing the field size or
@@ -23,6 +20,7 @@
self._cache_field = {}
self._cache_array = {}
self._cache_call = {}
+ self._cache_interiorfield = {}
def init_size_descr(self, STRUCT, sizedescr):
assert isinstance(STRUCT, lltype.GcStruct)
@@ -142,7 +140,6 @@
cachedict[fieldname] = fielddescr
return fielddescr
-
# ____________________________________________________________
# ArrayDescrs
@@ -252,6 +249,36 @@
cache[ARRAY] = arraydescr
return arraydescr
+# ____________________________________________________________
+# InteriorFieldDescr
+
+class InteriorFieldDescr(AbstractDescr):
+ arraydescr = BaseArrayDescr() # workaround for the annotator
+ fielddescr = BaseFieldDescr('', 0)
+
+ def __init__(self, arraydescr, fielddescr):
+ self.arraydescr = arraydescr
+ self.fielddescr = fielddescr
+
+ def is_pointer_field(self):
+ return self.fielddescr.is_pointer_field()
+
+ def is_float_field(self):
+ return self.fielddescr.is_float_field()
+
+ def repr_of_descr(self):
+ return '<InteriorFieldDescr %s>' % self.fielddescr.repr_of_descr()
+
+def get_interiorfield_descr(gc_ll_descr, ARRAY, FIELDTP, name):
+ cache = gc_ll_descr._cache_interiorfield
+ try:
+ return cache[(ARRAY, FIELDTP, name)]
+ except KeyError:
+ arraydescr = get_array_descr(gc_ll_descr, ARRAY)
+ fielddescr = get_field_descr(gc_ll_descr, FIELDTP, name)
+ descr = InteriorFieldDescr(arraydescr, fielddescr)
+ cache[(ARRAY, FIELDTP, name)] = descr
+ return descr
# ____________________________________________________________
# CallDescrs
@@ -525,7 +552,8 @@
#
if TYPE is lltype.Float or is_longlong(TYPE):
setattr(Descr, floatattrname, True)
- elif TYPE is not lltype.Bool and rffi.cast(TYPE, -1) == -1:
+ elif (TYPE is not lltype.Bool and isinstance(TYPE, lltype.Number) and
+ rffi.cast(TYPE, -1) == -1):
setattr(Descr, signedattrname, True)
#
_cache[nameprefix, TYPE] = Descr
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -45,6 +45,14 @@
def freeing_block(self, start, stop):
pass
+ def get_funcptr_for_newarray(self):
+ return llhelper(self.GC_MALLOC_ARRAY, self.malloc_array)
+ def get_funcptr_for_newstr(self):
+ return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_str)
+ def get_funcptr_for_newunicode(self):
+ return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_unicode)
+
+
def record_constptrs(self, op, gcrefs_output_list):
for i in range(op.numargs()):
v = op.getarg(i)
@@ -96,6 +104,39 @@
malloc_fn_ptr = self.configure_boehm_once()
self.funcptr_for_new = malloc_fn_ptr
+ def malloc_array(basesize, itemsize, ofs_length, num_elem):
+ try:
+ size = ovfcheck(basesize + ovfcheck(itemsize * num_elem))
+ except OverflowError:
+ return lltype.nullptr(llmemory.GCREF.TO)
+ res = self.funcptr_for_new(size)
+ if not res:
+ return res
+ rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
+ return res
+ self.malloc_array = malloc_array
+ self.GC_MALLOC_ARRAY = lltype.Ptr(lltype.FuncType(
+ [lltype.Signed] * 4, llmemory.GCREF))
+
+
+ (str_basesize, str_itemsize, str_ofs_length
+ ) = symbolic.get_array_token(rstr.STR, self.translate_support_code)
+ (unicode_basesize, unicode_itemsize, unicode_ofs_length
+ ) = symbolic.get_array_token(rstr.UNICODE, self.translate_support_code)
+ def malloc_str(length):
+ return self.malloc_array(
+ str_basesize, str_itemsize, str_ofs_length, length
+ )
+ def malloc_unicode(length):
+ return self.malloc_array(
+ unicode_basesize, unicode_itemsize, unicode_ofs_length, length
+ )
+ self.malloc_str = malloc_str
+ self.malloc_unicode = malloc_unicode
+ self.GC_MALLOC_STR_UNICODE = lltype.Ptr(lltype.FuncType(
+ [lltype.Signed], llmemory.GCREF))
+
+
# on some platform GC_init is required before any other
# GC_* functions, call it here for the benefit of tests
# XXX move this to tests
@@ -116,39 +157,27 @@
ofs_length = arraydescr.get_ofs_length(self.translate_support_code)
basesize = arraydescr.get_base_size(self.translate_support_code)
itemsize = arraydescr.get_item_size(self.translate_support_code)
- size = basesize + itemsize * num_elem
- res = self.funcptr_for_new(size)
- rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
- return res
+ return self.malloc_array(basesize, itemsize, ofs_length, num_elem)
def gc_malloc_str(self, num_elem):
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
- self.translate_support_code)
- assert itemsize == 1
- size = basesize + num_elem
- res = self.funcptr_for_new(size)
- rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
- return res
+ return self.malloc_str(num_elem)
def gc_malloc_unicode(self, num_elem):
- basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
- self.translate_support_code)
- size = basesize + num_elem * itemsize
- res = self.funcptr_for_new(size)
- rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
- return res
+ return self.malloc_unicode(num_elem)
def args_for_new(self, sizedescr):
assert isinstance(sizedescr, BaseSizeDescr)
return [sizedescr.size]
+ def args_for_new_array(self, arraydescr):
+ ofs_length = arraydescr.get_ofs_length(self.translate_support_code)
+ basesize = arraydescr.get_base_size(self.translate_support_code)
+ itemsize = arraydescr.get_item_size(self.translate_support_code)
+ return [basesize, itemsize, ofs_length]
+
def get_funcptr_for_new(self):
return self.funcptr_for_new
- get_funcptr_for_newarray = None
- get_funcptr_for_newstr = None
- get_funcptr_for_newunicode = None
-
def rewrite_assembler(self, cpu, operations, gcrefs_output_list):
# record all GCREFs too, because Boehm cannot see them and keep them
# alive if they end up as constants in the assembler
@@ -752,15 +781,6 @@
def get_funcptr_for_new(self):
return llhelper(self.GC_MALLOC_BASIC, self.malloc_basic)
- def get_funcptr_for_newarray(self):
- return llhelper(self.GC_MALLOC_ARRAY, self.malloc_array)
-
- def get_funcptr_for_newstr(self):
- return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_str)
-
- def get_funcptr_for_newunicode(self):
- return llhelper(self.GC_MALLOC_STR_UNICODE, self.malloc_unicode)
-
def do_write_barrier(self, gcref_struct, gcref_newptr):
hdr_addr = llmemory.cast_ptr_to_adr(gcref_struct)
hdr_addr -= self.gcheaderbuilder.size_gc_header
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -1,24 +1,18 @@
-import sys
from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rclass, rstr
from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rpython.llinterp import LLInterpreter, LLException
+from pypy.rpython.llinterp import LLInterpreter
from pypy.rpython.annlowlevel import llhelper
from pypy.rlib.objectmodel import we_are_translated, specialize
-from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values,\
- BoxFloat
from pypy.jit.metainterp import history
from pypy.jit.codewriter import heaptracker, longlong
from pypy.jit.backend.model import AbstractCPU
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.llsupport.symbolic import WORD, unroll_basic_sizes
-from pypy.jit.backend.llsupport.descr import get_size_descr, BaseSizeDescr
-from pypy.jit.backend.llsupport.descr import get_field_descr, BaseFieldDescr
-from pypy.jit.backend.llsupport.descr import get_array_descr, BaseArrayDescr
-from pypy.jit.backend.llsupport.descr import get_call_descr
-from pypy.jit.backend.llsupport.descr import BaseIntCallDescr, GcPtrCallDescr
-from pypy.jit.backend.llsupport.descr import FloatCallDescr, VoidCallDescr
+from pypy.jit.backend.llsupport.descr import (get_size_descr,
+ get_field_descr, BaseFieldDescr, get_array_descr, BaseArrayDescr,
+ get_call_descr, BaseIntCallDescr, GcPtrCallDescr, FloatCallDescr,
+ VoidCallDescr, InteriorFieldDescr, get_interiorfield_descr)
from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
-from pypy.rpython.annlowlevel import cast_instance_to_base_ptr
class AbstractLLCPU(AbstractCPU):
@@ -241,6 +235,9 @@
def arraydescrof(self, A):
return get_array_descr(self.gc_ll_descr, A)
+ def interiorfielddescrof(self, A, fieldname):
+ return get_interiorfield_descr(self.gc_ll_descr, A, A.OF, fieldname)
+
def unpack_arraydescr(self, arraydescr):
assert isinstance(arraydescr, BaseArrayDescr)
return arraydescr.get_base_size(self.translate_support_code)
@@ -358,6 +355,100 @@
bh_getarrayitem_raw_i = bh_getarrayitem_gc_i
bh_getarrayitem_raw_f = bh_getarrayitem_gc_f
+ def bh_getinteriorfield_gc_i(self, gcref, itemindex, descr):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ fieldsize = descr.fielddescr.get_field_size(self.translate_support_code)
+ sign = descr.fielddescr.is_field_signed()
+ fullofs = itemindex * size + ofs
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), fullofs)
+ for STYPE, UTYPE, itemsize in unroll_basic_sizes:
+ if fieldsize == itemsize:
+ if sign:
+ item = rffi.cast(rffi.CArrayPtr(STYPE), items)
+ val = item[0]
+ val = rffi.cast(lltype.Signed, val)
+ else:
+ item = rffi.cast(rffi.CArrayPtr(UTYPE), items)
+ val = item[0]
+ val = rffi.cast(lltype.Signed, val)
+ # --- end of GC unsafe code ---
+ return val
+ else:
+ raise NotImplementedError("size = %d" % fieldsize)
+
+ def bh_getinteriorfield_gc_r(self, gcref, itemindex, descr):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs +
+ size * itemindex)
+ items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+ pval = self._cast_int_to_gcref(items[0])
+ # --- end of GC unsafe code ---
+ return pval
+
+ def bh_getinteriorfield_gc_f(self, gcref, itemindex, descr):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs +
+ size * itemindex)
+ items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
+ fval = items[0]
+ # --- end of GC unsafe code ---
+ return fval
+
+ def bh_setinteriorfield_gc_i(self, gcref, itemindex, descr, value):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ fieldsize = descr.fielddescr.get_field_size(self.translate_support_code)
+ ofs = itemindex * size + ofs
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ for TYPE, _, itemsize in unroll_basic_sizes:
+ if fieldsize == itemsize:
+ items = rffi.cast(rffi.CArrayPtr(TYPE), items)
+ items[0] = rffi.cast(TYPE, value)
+ # --- end of GC unsafe code ---
+ return
+ else:
+ raise NotImplementedError("size = %d" % fieldsize)
+
+ def bh_setinteriorfield_gc_r(self, gcref, itemindex, descr, newvalue):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ self.gc_ll_descr.do_write_barrier(gcref, newvalue)
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref),
+ ofs + size * itemindex)
+ items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+ items[0] = self.cast_gcref_to_int(newvalue)
+ # --- end of GC unsafe code ---
+
+ def bh_setinteriorfield_gc_f(self, gcref, itemindex, descr, newvalue):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref),
+ ofs + size * itemindex)
+ items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
+ items[0] = newvalue
+ # --- end of GC unsafe code ---
+
def bh_strlen(self, string):
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
return len(s.chars)
@@ -475,7 +566,6 @@
def bh_classof(self, struct):
struct = lltype.cast_opaque_ptr(rclass.OBJECTPTR, struct)
- result = struct.typeptr
result_adr = llmemory.cast_ptr_to_adr(struct.typeptr)
return heaptracker.adr2int(result_adr)
diff --git a/pypy/jit/backend/llsupport/regalloc.py b/pypy/jit/backend/llsupport/regalloc.py
--- a/pypy/jit/backend/llsupport/regalloc.py
+++ b/pypy/jit/backend/llsupport/regalloc.py
@@ -287,7 +287,6 @@
self.reg_bindings[to_v] = reg
def _move_variable_away(self, v, prev_loc):
- reg = None
if self.free_regs:
loc = self.free_regs.pop()
self.reg_bindings[v] = loc
diff --git a/pypy/jit/backend/llsupport/test/test_asmmemmgr.py b/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
--- a/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
+++ b/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
@@ -211,14 +211,14 @@
debug._log = debug.DebugLog()
try:
mc._dump(addr, 'test-logname-section')
- log = list(debug._log)
+ log = list(debug._log)
finally:
debug._log = None
encoded = ''.join(writtencode).encode('hex').upper()
ataddr = '@%x' % addr
assert log == [('test-logname-section',
[('debug_print', 'CODE_DUMP', ataddr, '+0 ', encoded)])]
- #
+
lltype.free(p, flavor='raw')
def test_blockbuildermixin2():
diff --git a/pypy/jit/backend/llsupport/test/test_descr.py b/pypy/jit/backend/llsupport/test/test_descr.py
--- a/pypy/jit/backend/llsupport/test/test_descr.py
+++ b/pypy/jit/backend/llsupport/test/test_descr.py
@@ -3,7 +3,6 @@
from pypy.jit.backend.llsupport import symbolic
from pypy.rlib.objectmodel import Symbolic
from pypy.rpython.annlowlevel import llhelper
-from pypy.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr
from pypy.jit.metainterp import history
from pypy.jit.codewriter import longlong
import sys, struct, py
@@ -149,7 +148,9 @@
A2 = lltype.GcArray(lltype.Ptr(T))
A3 = lltype.GcArray(lltype.Ptr(U))
A4 = lltype.GcArray(lltype.Float)
- A5 = lltype.GcArray(lltype.SingleFloat)
+ A5 = lltype.GcArray(lltype.Struct('x', ('v', lltype.Signed),
+ ('k', lltype.Signed)))
+ A6 = lltype.GcArray(lltype.SingleFloat)
assert getArrayDescrClass(A2) is GcPtrArrayDescr
assert getArrayDescrClass(A3) is NonGcPtrArrayDescr
cls = getArrayDescrClass(A1)
@@ -158,7 +159,7 @@
clsf = getArrayDescrClass(A4)
assert clsf != cls
assert clsf == getArrayDescrClass(lltype.GcArray(lltype.Float))
- clss = getArrayDescrClass(A5)
+ clss = getArrayDescrClass(A6)
assert clss not in (clsf, cls)
assert clss == getArrayDescrClass(lltype.GcArray(rffi.UINT))
#
@@ -168,11 +169,12 @@
descr3 = get_array_descr(c0, A3)
descr4 = get_array_descr(c0, A4)
descr5 = get_array_descr(c0, A5)
+ descr6 = get_array_descr(c0, A6)
assert descr1.__class__ is cls
assert descr2.__class__ is GcPtrArrayDescr
assert descr3.__class__ is NonGcPtrArrayDescr
assert descr4.__class__ is clsf
- assert descr5.__class__ is clss
+ assert descr6.__class__ is clss
assert descr1 == get_array_descr(c0, lltype.GcArray(lltype.Char))
assert not descr1.is_array_of_pointers()
assert descr2.is_array_of_pointers()
@@ -202,7 +204,8 @@
assert descr2.get_item_size(False) == rffi.sizeof(lltype.Ptr(T))
assert descr3.get_item_size(False) == rffi.sizeof(lltype.Ptr(U))
assert descr4.get_item_size(False) == rffi.sizeof(lltype.Float)
- assert descr5.get_item_size(False) == rffi.sizeof(lltype.SingleFloat)
+ assert descr5.get_item_size(False) == rffi.sizeof(lltype.Signed) * 2
+ assert descr6.get_item_size(False) == rffi.sizeof(lltype.SingleFloat)
#
assert isinstance(descr1.get_base_size(True), Symbolic)
assert isinstance(descr2.get_base_size(True), Symbolic)
@@ -348,7 +351,6 @@
(rffi.SHORT, True), (rffi.USHORT, False),
(rffi.INT, True), (rffi.UINT, False),
(rffi.LONG, True), (rffi.ULONG, False)]:
- A = lltype.GcArray(RESTYPE)
for tsc in [False, True]:
c2 = GcCache(tsc)
descr1 = get_call_descr(c2, [], RESTYPE)
@@ -379,7 +381,6 @@
descr3i = get_array_descr(c0, lltype.GcArray(lltype.Char))
assert descr3i.repr_of_descr() == '<CharArrayDescr>'
#
- cache = {}
descr4 = get_call_descr(c0, [lltype.Char, lltype.Ptr(S)], lltype.Ptr(S))
assert 'GcPtrCallDescr' in descr4.repr_of_descr()
#
@@ -412,10 +413,10 @@
ARGS = [lltype.Float, lltype.Ptr(ARRAY)]
RES = lltype.Float
- def f(a, b):
+ def f2(a, b):
return float(b[0]) + a
- fnptr = llhelper(lltype.Ptr(lltype.FuncType(ARGS, RES)), f)
+ fnptr = llhelper(lltype.Ptr(lltype.FuncType(ARGS, RES)), f2)
descr2 = get_call_descr(c0, ARGS, RES)
a = lltype.malloc(ARRAY, 3)
opaquea = lltype.cast_opaque_ptr(llmemory.GCREF, a)
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -1,5 +1,5 @@
from pypy.rlib.debug import debug_start, debug_print, debug_stop
-from pypy.jit.metainterp import history, compile
+from pypy.jit.metainterp import history
class AbstractCPU(object):
@@ -213,6 +213,10 @@
def typedescrof(TYPE):
raise NotImplementedError
+ @staticmethod
+ def interiorfielddescrof(A, fieldname):
+ raise NotImplementedError
+
# ---------- the backend-dependent operations ----------
# lltype specific operations
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -5,7 +5,7 @@
BoxInt, Box, BoxPtr,
LoopToken,
ConstInt, ConstPtr,
- BoxObj, Const,
+ BoxObj,
ConstObj, BoxFloat, ConstFloat)
from pypy.jit.metainterp.resoperation import ResOperation, rop
from pypy.jit.metainterp.typesystem import deref
@@ -111,7 +111,7 @@
self.cpu.set_future_value_int(0, 2)
fail = self.cpu.execute_token(looptoken)
res = self.cpu.get_latest_value_int(0)
- assert res == 3
+ assert res == 3
assert fail.identifier == 1
def test_compile_loop(self):
@@ -127,7 +127,7 @@
]
inputargs = [i0]
operations[2].setfailargs([i1])
-
+
self.cpu.compile_loop(inputargs, operations, looptoken)
self.cpu.set_future_value_int(0, 2)
fail = self.cpu.execute_token(looptoken)
@@ -148,7 +148,7 @@
]
inputargs = [i0]
operations[2].setfailargs([None, None, i1, None])
-
+
self.cpu.compile_loop(inputargs, operations, looptoken)
self.cpu.set_future_value_int(0, 2)
fail = self.cpu.execute_token(looptoken)
@@ -372,7 +372,7 @@
for opnum, boxargs, retvalue in get_int_tests():
res = self.execute_operation(opnum, boxargs, 'int')
assert res.value == retvalue
-
+
def test_float_operations(self):
from pypy.jit.metainterp.test.test_executor import get_float_tests
for opnum, boxargs, rettype, retvalue in get_float_tests(self.cpu):
@@ -438,7 +438,7 @@
def test_ovf_operations_reversed(self):
self.test_ovf_operations(reversed=True)
-
+
def test_bh_call(self):
cpu = self.cpu
#
@@ -503,7 +503,7 @@
[funcbox, BoxInt(num), BoxInt(num)],
'int', descr=dyn_calldescr)
assert res.value == 2 * num
-
+
if cpu.supports_floats:
def func(f0, f1, f2, f3, f4, f5, f6, i0, i1, f7, f8, f9):
@@ -543,7 +543,7 @@
funcbox = self.get_funcbox(self.cpu, func_ptr)
res = self.execute_operation(rop.CALL, [funcbox] + map(BoxInt, args), 'int', descr=calldescr)
assert res.value == func(*args)
-
+
def test_call_stack_alignment(self):
# test stack alignment issues, notably for Mac OS/X.
# also test the ordering of the arguments.
@@ -615,7 +615,7 @@
res = self.execute_operation(rop.GETFIELD_GC, [t_box],
'int', descr=shortdescr)
assert res.value == 1331
-
+
#
u_box, U_box = self.alloc_instance(self.U)
fielddescr2 = self.cpu.fielddescrof(self.S, 'next')
@@ -695,7 +695,7 @@
def test_failing_guard_class(self):
t_box, T_box = self.alloc_instance(self.T)
- u_box, U_box = self.alloc_instance(self.U)
+ u_box, U_box = self.alloc_instance(self.U)
null_box = self.null_instance()
for opname, args in [(rop.GUARD_CLASS, [t_box, U_box]),
(rop.GUARD_CLASS, [u_box, T_box]),
@@ -787,7 +787,7 @@
r = self.execute_operation(rop.GETARRAYITEM_GC, [a_box, BoxInt(3)],
'int', descr=arraydescr)
assert r.value == 160
-
+
#
if isinstance(A, lltype.GcArray):
A = lltype.Ptr(A)
@@ -880,6 +880,73 @@
'int', descr=arraydescr)
assert r.value == 7441
+ def test_array_of_structs(self):
+ TP = lltype.GcStruct('x')
+ ITEM = lltype.Struct('x',
+ ('vs', lltype.Signed),
+ ('vu', lltype.Unsigned),
+ ('vsc', rffi.SIGNEDCHAR),
+ ('vuc', rffi.UCHAR),
+ ('vss', rffi.SHORT),
+ ('vus', rffi.USHORT),
+ ('vsi', rffi.INT),
+ ('vui', rffi.UINT),
+ ('k', lltype.Float),
+ ('p', lltype.Ptr(TP)))
+ a_box, A = self.alloc_array_of(ITEM, 15)
+ s_box, S = self.alloc_instance(TP)
+ kdescr = self.cpu.interiorfielddescrof(A, 'k')
+ pdescr = self.cpu.interiorfielddescrof(A, 'p')
+ self.execute_operation(rop.SETINTERIORFIELD_GC, [a_box, BoxInt(3),
+ boxfloat(1.5)],
+ 'void', descr=kdescr)
+ f = self.cpu.bh_getinteriorfield_gc_f(a_box.getref_base(), 3, kdescr)
+ assert longlong.getrealfloat(f) == 1.5
+ self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, kdescr, longlong.getfloatstorage(2.5))
+ r = self.execute_operation(rop.GETINTERIORFIELD_GC, [a_box, BoxInt(3)],
+ 'float', descr=kdescr)
+ assert r.getfloat() == 2.5
+ #
+ NUMBER_FIELDS = [('vs', lltype.Signed),
+ ('vu', lltype.Unsigned),
+ ('vsc', rffi.SIGNEDCHAR),
+ ('vuc', rffi.UCHAR),
+ ('vss', rffi.SHORT),
+ ('vus', rffi.USHORT),
+ ('vsi', rffi.INT),
+ ('vui', rffi.UINT)]
+ for name, TYPE in NUMBER_FIELDS[::-1]:
+ vdescr = self.cpu.interiorfielddescrof(A, name)
+ self.execute_operation(rop.SETINTERIORFIELD_GC, [a_box, BoxInt(3),
+ BoxInt(-15)],
+ 'void', descr=vdescr)
+ for name, TYPE in NUMBER_FIELDS:
+ vdescr = self.cpu.interiorfielddescrof(A, name)
+ i = self.cpu.bh_getinteriorfield_gc_i(a_box.getref_base(), 3,
+ vdescr)
+ assert i == rffi.cast(lltype.Signed, rffi.cast(TYPE, -15))
+ for name, TYPE in NUMBER_FIELDS[::-1]:
+ vdescr = self.cpu.interiorfielddescrof(A, name)
+ self.cpu.bh_setinteriorfield_gc_i(a_box.getref_base(), 3,
+ vdescr, -25)
+ for name, TYPE in NUMBER_FIELDS:
+ vdescr = self.cpu.interiorfielddescrof(A, name)
+ r = self.execute_operation(rop.GETINTERIORFIELD_GC,
+ [a_box, BoxInt(3)],
+ 'int', descr=vdescr)
+ assert r.getint() == rffi.cast(lltype.Signed, rffi.cast(TYPE, -25))
+ #
+ self.execute_operation(rop.SETINTERIORFIELD_GC, [a_box, BoxInt(4),
+ s_box],
+ 'void', descr=pdescr)
+ r = self.cpu.bh_getinteriorfield_gc_r(a_box.getref_base(), 4, pdescr)
+ assert r == s_box.getref_base()
+ self.cpu.bh_setinteriorfield_gc_r(a_box.getref_base(), 3, pdescr,
+ s_box.getref_base())
+ r = self.execute_operation(rop.GETINTERIORFIELD_GC, [a_box, BoxInt(3)],
+ 'ref', descr=pdescr)
+ assert r.getref_base() == s_box.getref_base()
+
def test_string_basic(self):
s_box = self.alloc_string("hello\xfe")
r = self.execute_operation(rop.STRLEN, [s_box], 'int')
@@ -1402,7 +1469,7 @@
addr = llmemory.cast_ptr_to_adr(func_ptr)
return ConstInt(heaptracker.adr2int(addr))
-
+
MY_VTABLE = rclass.OBJECT_VTABLE # for tests only
S = lltype.GcForwardReference()
@@ -1439,7 +1506,6 @@
return BoxPtr(lltype.nullptr(llmemory.GCREF.TO))
def alloc_array_of(self, ITEM, length):
- cpu = self.cpu
A = lltype.GcArray(ITEM)
a = lltype.malloc(A, length)
a_box = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, a))
@@ -2318,7 +2384,7 @@
for opname, arg, res in ops:
self.execute_operation(opname, [arg], 'void')
assert self.guard_failed == res
-
+
lltype.free(x, flavor='raw')
def test_assembler_call(self):
@@ -2398,7 +2464,7 @@
FakeJitDriverSD.portal_calldescr = self.cpu.calldescrof(
lltype.Ptr(lltype.FuncType(ARGS, RES)), ARGS, RES,
EffectInfo.MOST_GENERAL)
-
+
ops = '''
[f0, f1]
f2 = float_add(f0, f1)
@@ -2489,7 +2555,7 @@
FakeJitDriverSD.portal_calldescr = self.cpu.calldescrof(
lltype.Ptr(lltype.FuncType(ARGS, RES)), ARGS, RES,
EffectInfo.MOST_GENERAL)
-
+
ops = '''
[f0, f1]
f2 = float_add(f0, f1)
@@ -2940,4 +3006,4 @@
def alloc_unicode(self, unicode):
py.test.skip("implement me")
-
+
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -1,7 +1,7 @@
import sys, os
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
-from pypy.jit.metainterp.history import Const, Box, BoxInt, BoxPtr, BoxFloat
+from pypy.jit.metainterp.history import Const, Box, BoxInt, ConstInt
from pypy.jit.metainterp.history import (AbstractFailDescr, INT, REF, FLOAT,
LoopToken)
from pypy.rpython.lltypesystem import lltype, rffi, rstr, llmemory
@@ -36,7 +36,6 @@
from pypy.rlib import rgc
from pypy.rlib.clibffi import FFI_DEFAULT_ABI
from pypy.jit.backend.x86.jump import remap_frame_layout
-from pypy.jit.metainterp.history import ConstInt, BoxInt
from pypy.jit.codewriter.effectinfo import EffectInfo
from pypy.jit.codewriter import longlong
@@ -729,8 +728,8 @@
# Also, make sure this is consistent with FRAME_FIXED_SIZE.
self.mc.PUSH_r(ebp.value)
self.mc.MOV_rr(ebp.value, esp.value)
- for regloc in self.cpu.CALLEE_SAVE_REGISTERS:
- self.mc.PUSH_r(regloc.value)
+ for loc in self.cpu.CALLEE_SAVE_REGISTERS:
+ self.mc.PUSH_r(loc.value)
gcrootmap = self.cpu.gc_ll_descr.gcrootmap
if gcrootmap and gcrootmap.is_shadow_stack:
@@ -994,7 +993,7 @@
effectinfo = op.getdescr().get_extra_info()
oopspecindex = effectinfo.oopspecindex
genop_llong_list[oopspecindex](self, op, arglocs, resloc)
-
+
def regalloc_perform_math(self, op, arglocs, resloc):
effectinfo = op.getdescr().get_extra_info()
oopspecindex = effectinfo.oopspecindex
@@ -1311,7 +1310,7 @@
genop_guard_float_eq = _cmpop_guard_float("E", "E", "NE","NE")
genop_guard_float_gt = _cmpop_guard_float("A", "B", "BE","AE")
genop_guard_float_ge = _cmpop_guard_float("AE","BE", "B", "A")
-
+
def genop_math_sqrt(self, op, arglocs, resloc):
self.mc.SQRTSD(arglocs[0], resloc)
@@ -1597,12 +1596,27 @@
genop_getarrayitem_gc_pure = genop_getarrayitem_gc
genop_getarrayitem_raw = genop_getarrayitem_gc
+ def genop_getinteriorfield_gc(self, op, arglocs, resloc):
+ base_loc, ofs_loc, itemsize_loc, fieldsize_loc, index_loc, sign_loc = arglocs
+ # XXX should not use IMUL in most cases
+ self.mc.IMUL(index_loc, itemsize_loc)
+ src_addr = AddressLoc(base_loc, index_loc, 0, ofs_loc.value)
+ self.load_from_mem(resloc, src_addr, fieldsize_loc, sign_loc)
+
+
def genop_discard_setfield_gc(self, op, arglocs):
base_loc, ofs_loc, size_loc, value_loc = arglocs
assert isinstance(size_loc, ImmedLoc)
dest_addr = AddressLoc(base_loc, ofs_loc)
self.save_into_mem(dest_addr, value_loc, size_loc)
+ def genop_discard_setinteriorfield_gc(self, op, arglocs):
+ base_loc, ofs_loc, itemsize_loc, fieldsize_loc, index_loc, value_loc = arglocs
+ # XXX should not use IMUL in most cases
+ self.mc.IMUL(index_loc, itemsize_loc)
+ dest_addr = AddressLoc(base_loc, index_loc, 0, ofs_loc.value)
+ self.save_into_mem(dest_addr, value_loc, fieldsize_loc)
+
def genop_discard_setarrayitem_gc(self, op, arglocs):
base_loc, ofs_loc, value_loc, size_loc, baseofs = arglocs
assert isinstance(baseofs, ImmedLoc)
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -7,7 +7,7 @@
ResOperation, BoxPtr, ConstFloat,
BoxFloat, LoopToken, INT, REF, FLOAT)
from pypy.jit.backend.x86.regloc import *
-from pypy.rpython.lltypesystem import lltype, ll2ctypes, rffi, rstr
+from pypy.rpython.lltypesystem import lltype, rffi, rstr
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib import rgc
from pypy.jit.backend.llsupport import symbolic
@@ -17,11 +17,12 @@
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.backend.llsupport.descr import BaseFieldDescr, BaseArrayDescr
from pypy.jit.backend.llsupport.descr import BaseCallDescr, BaseSizeDescr
+from pypy.jit.backend.llsupport.descr import InteriorFieldDescr
from pypy.jit.backend.llsupport.regalloc import FrameManager, RegisterManager,\
TempBox
from pypy.jit.backend.x86.arch import WORD, FRAME_FIXED_SIZE
from pypy.jit.backend.x86.arch import IS_X86_32, IS_X86_64, MY_COPY_OF_REGS
-from pypy.rlib.rarithmetic import r_longlong, r_uint
+from pypy.rlib.rarithmetic import r_longlong
class X86RegisterManager(RegisterManager):
@@ -433,7 +434,7 @@
if self.can_merge_with_next_guard(op, i, operations):
oplist_with_guard[op.getopnum()](self, op, operations[i + 1])
i += 1
- elif not we_are_translated() and op.getopnum() == -124:
+ elif not we_are_translated() and op.getopnum() == -124:
self._consider_force_spill(op)
else:
oplist[op.getopnum()](self, op)
@@ -815,7 +816,7 @@
save_all_regs = guard_not_forced_op is not None
self.xrm.before_call(force_store, save_all_regs=save_all_regs)
if not save_all_regs:
- gcrootmap = gc_ll_descr = self.assembler.cpu.gc_ll_descr.gcrootmap
+ gcrootmap = self.assembler.cpu.gc_ll_descr.gcrootmap
if gcrootmap and gcrootmap.is_shadow_stack:
save_all_regs = 2
self.rm.before_call(force_store, save_all_regs=save_all_regs)
@@ -972,74 +973,27 @@
return self._call(op, arglocs)
def consider_newstr(self, op):
- gc_ll_descr = self.assembler.cpu.gc_ll_descr
- if gc_ll_descr.get_funcptr_for_newstr is not None:
- # framework GC
- loc = self.loc(op.getarg(0))
- return self._call(op, [loc])
- # boehm GC (XXX kill the following code at some point)
- ofs_items, itemsize, ofs = symbolic.get_array_token(rstr.STR, self.translate_support_code)
- assert itemsize == 1
- return self._malloc_varsize(ofs_items, ofs, 0, op.getarg(0),
- op.result)
+ loc = self.loc(op.getarg(0))
+ return self._call(op, [loc])
def consider_newunicode(self, op):
- gc_ll_descr = self.assembler.cpu.gc_ll_descr
- if gc_ll_descr.get_funcptr_for_newunicode is not None:
- # framework GC
- loc = self.loc(op.getarg(0))
- return self._call(op, [loc])
- # boehm GC (XXX kill the following code at some point)
- ofs_items, _, ofs = symbolic.get_array_token(rstr.UNICODE,
- self.translate_support_code)
- scale = self._get_unicode_item_scale()
- return self._malloc_varsize(ofs_items, ofs, scale, op.getarg(0),
- op.result)
-
- def _malloc_varsize(self, ofs_items, ofs_length, scale, v, res_v):
- # XXX kill this function at some point
- if isinstance(v, Box):
- loc = self.rm.make_sure_var_in_reg(v, [v])
- tempbox = TempBox()
- other_loc = self.rm.force_allocate_reg(tempbox, [v])
- self.assembler.load_effective_addr(loc, ofs_items,scale, other_loc)
- else:
- tempbox = None
- other_loc = imm(ofs_items + (v.getint() << scale))
- self._call(ResOperation(rop.NEW, [], res_v),
- [other_loc], [v])
- loc = self.rm.make_sure_var_in_reg(v, [res_v])
- assert self.loc(res_v) == eax
- # now we have to reload length to some reasonable place
- self.rm.possibly_free_var(v)
- if tempbox is not None:
- self.rm.possibly_free_var(tempbox)
- self.PerformDiscard(ResOperation(rop.SETFIELD_GC, [None, None], None),
- [eax, imm(ofs_length), imm(WORD), loc])
+ loc = self.loc(op.getarg(0))
+ return self._call(op, [loc])
def consider_new_array(self, op):
gc_ll_descr = self.assembler.cpu.gc_ll_descr
- if gc_ll_descr.get_funcptr_for_newarray is not None:
- # framework GC
- box_num_elem = op.getarg(0)
- if isinstance(box_num_elem, ConstInt):
- num_elem = box_num_elem.value
- if gc_ll_descr.can_inline_malloc_varsize(op.getdescr(),
- num_elem):
- self.fastpath_malloc_varsize(op, op.getdescr(), num_elem)
- return
- args = self.assembler.cpu.gc_ll_descr.args_for_new_array(
- op.getdescr())
- arglocs = [imm(x) for x in args]
- arglocs.append(self.loc(box_num_elem))
- self._call(op, arglocs)
- return
- # boehm GC (XXX kill the following code at some point)
- itemsize, basesize, ofs_length, _, _ = (
- self._unpack_arraydescr(op.getdescr()))
- scale_of_field = _get_scale(itemsize)
- self._malloc_varsize(basesize, ofs_length, scale_of_field,
- op.getarg(0), op.result)
+ box_num_elem = op.getarg(0)
+ if isinstance(box_num_elem, ConstInt):
+ num_elem = box_num_elem.value
+ if gc_ll_descr.can_inline_malloc_varsize(op.getdescr(),
+ num_elem):
+ self.fastpath_malloc_varsize(op, op.getdescr(), num_elem)
+ return
+ args = self.assembler.cpu.gc_ll_descr.args_for_new_array(
+ op.getdescr())
+ arglocs = [imm(x) for x in args]
+ arglocs.append(self.loc(box_num_elem))
+ self._call(op, arglocs)
def _unpack_arraydescr(self, arraydescr):
assert isinstance(arraydescr, BaseArrayDescr)
@@ -1058,6 +1012,16 @@
sign = fielddescr.is_field_signed()
return imm(ofs), imm(size), ptr, sign
+ def _unpack_interiorfielddescr(self, descr):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs = arraydescr.get_base_size(self.translate_support_code)
+ itemsize = arraydescr.get_item_size(self.translate_support_code)
+ fieldsize = descr.fielddescr.get_field_size(self.translate_support_code)
+ sign = descr.fielddescr.is_field_signed()
+ ofs += descr.fielddescr.offset
+ return imm(ofs), imm(itemsize), imm(fieldsize), sign
+
def consider_setfield_gc(self, op):
ofs_loc, size_loc, _, _ = self._unpack_fielddescr(op.getdescr())
assert isinstance(size_loc, ImmedLoc)
@@ -1074,6 +1038,21 @@
consider_setfield_raw = consider_setfield_gc
+ def consider_setinteriorfield_gc(self, op):
+ t = self._unpack_interiorfielddescr(op.getdescr())
+ ofs, itemsize, fieldsize, _ = t
+ args = op.getarglist()
+ tmpvar = TempBox()
+ base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+ index_loc = self.rm.force_result_in_reg(tmpvar, op.getarg(1),
+ args)
+ # we're free to modify index now
+ value_loc = self.make_sure_var_in_reg(op.getarg(2), args)
+ self.possibly_free_vars(args)
+ self.rm.possibly_free_var(tmpvar)
+ self.PerformDiscard(op, [base_loc, ofs, itemsize, fieldsize,
+ index_loc, value_loc])
+
def consider_strsetitem(self, op):
args = op.getarglist()
base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
@@ -1135,6 +1114,24 @@
consider_getarrayitem_raw = consider_getarrayitem_gc
consider_getarrayitem_gc_pure = consider_getarrayitem_gc
+ def consider_getinteriorfield_gc(self, op):
+ t = self._unpack_interiorfielddescr(op.getdescr())
+ ofs, itemsize, fieldsize, sign = t
+ if sign:
+ sign_loc = imm1
+ else:
+ sign_loc = imm0
+ args = op.getarglist()
+ tmpvar = TempBox()
+ base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+ index_loc = self.rm.force_result_in_reg(tmpvar, op.getarg(1),
+ args)
+ self.rm.possibly_free_vars_for_op(op)
+ self.rm.possibly_free_var(tmpvar)
+ result_loc = self.force_allocate_reg(op.result)
+ self.Perform(op, [base_loc, ofs, itemsize, fieldsize,
+ index_loc, sign_loc], result_loc)
+
def consider_int_is_true(self, op, guard_op):
# doesn't need arg to be in a register
argloc = self.loc(op.getarg(0))
@@ -1241,7 +1238,6 @@
self.rm.possibly_free_var(srcaddr_box)
def _gen_address_inside_string(self, baseloc, ofsloc, resloc, is_unicode):
- cpu = self.assembler.cpu
if is_unicode:
ofs_items, _, _ = symbolic.get_array_token(rstr.UNICODE,
self.translate_support_code)
@@ -1300,7 +1296,7 @@
tmpreg = X86RegisterManager.all_regs[0]
tmploc = self.rm.force_allocate_reg(box, selected_reg=tmpreg)
xmmtmp = X86XMMRegisterManager.all_regs[0]
- xmmtmploc = self.xrm.force_allocate_reg(box1, selected_reg=xmmtmp)
+ self.xrm.force_allocate_reg(box1, selected_reg=xmmtmp)
# Part about non-floats
# XXX we don't need a copy, we only just the original list
src_locations1 = [self.loc(op.getarg(i)) for i in range(op.numargs())
@@ -1380,7 +1376,7 @@
return lambda self, op: fn(self, op, None)
def is_comparison_or_ovf_op(opnum):
- from pypy.jit.metainterp.resoperation import opclasses, AbstractResOp
+ from pypy.jit.metainterp.resoperation import opclasses
cls = opclasses[opnum]
# hack hack: in theory they are instance method, but they don't use
# any instance field, we can use a fake object
diff --git a/pypy/jit/backend/x86/test/test_del.py b/pypy/jit/backend/x86/test/test_del.py
--- a/pypy/jit/backend/x86/test/test_del.py
+++ b/pypy/jit/backend/x86/test/test_del.py
@@ -1,5 +1,4 @@
-import py
from pypy.jit.backend.x86.test.test_basic import Jit386Mixin
from pypy.jit.metainterp.test.test_del import DelTests
diff --git a/pypy/jit/backend/x86/test/test_dict.py b/pypy/jit/backend/x86/test/test_dict.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/backend/x86/test/test_dict.py
@@ -0,0 +1,9 @@
+
+from pypy.jit.backend.x86.test.test_basic import Jit386Mixin
+from pypy.jit.metainterp.test.test_dict import DictTests
+
+
+class TestDict(Jit386Mixin, DictTests):
+ # for the individual tests see
+ # ====> ../../../metainterp/test/test_dict.py
+ pass
diff --git a/pypy/jit/backend/x86/test/test_runner.py b/pypy/jit/backend/x86/test/test_runner.py
--- a/pypy/jit/backend/x86/test/test_runner.py
+++ b/pypy/jit/backend/x86/test/test_runner.py
@@ -31,7 +31,7 @@
# for the individual tests see
# ====> ../../test/runner_test.py
-
+
def setup_method(self, meth):
self.cpu = CPU(rtyper=None, stats=FakeStats())
self.cpu.setup_once()
@@ -69,22 +69,16 @@
def test_allocations(self):
from pypy.rpython.lltypesystem import rstr
-
+
allocs = [None]
all = []
+ orig_new = self.cpu.gc_ll_descr.funcptr_for_new
def f(size):
allocs.insert(0, size)
- buf = ctypes.create_string_buffer(size)
- all.append(buf)
- return ctypes.cast(buf, ctypes.c_void_p).value
- func = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)(f)
- addr = ctypes.cast(func, ctypes.c_void_p).value
- # ctypes produces an unsigned value. We need it to be signed for, eg,
- # relative addressing to work properly.
- addr = rffi.cast(lltype.Signed, addr)
-
+ return orig_new(size)
+
self.cpu.assembler.setup_once()
- self.cpu.assembler.malloc_func_addr = addr
+ self.cpu.gc_ll_descr.funcptr_for_new = f
ofs = symbolic.get_field_token(rstr.STR, 'chars', False)[0]
res = self.execute_operation(rop.NEWSTR, [ConstInt(7)], 'ref')
@@ -108,7 +102,7 @@
res = self.execute_operation(rop.NEW_ARRAY, [ConstInt(10)],
'ref', descr)
assert allocs[0] == 10*WORD + ofs + WORD
- resbuf = self._resbuf(res)
+ resbuf = self._resbuf(res)
assert resbuf[ofs/WORD] == 10
# ------------------------------------------------------------
@@ -116,7 +110,7 @@
res = self.execute_operation(rop.NEW_ARRAY, [BoxInt(10)],
'ref', descr)
assert allocs[0] == 10*WORD + ofs + WORD
- resbuf = self._resbuf(res)
+ resbuf = self._resbuf(res)
assert resbuf[ofs/WORD] == 10
def test_stringitems(self):
@@ -146,7 +140,7 @@
ConstInt(2), BoxInt(38)],
'void', descr)
assert resbuf[itemsofs/WORD + 2] == 38
-
+
self.execute_operation(rop.SETARRAYITEM_GC, [res,
BoxInt(3), BoxInt(42)],
'void', descr)
@@ -167,7 +161,7 @@
BoxInt(2)],
'int', descr)
assert r.value == 38
-
+
r = self.execute_operation(rop.GETARRAYITEM_GC, [res, BoxInt(3)],
'int', descr)
assert r.value == 42
@@ -226,7 +220,7 @@
self.execute_operation(rop.SETFIELD_GC, [res, BoxInt(1234)], 'void', ofs_i)
i = self.execute_operation(rop.GETFIELD_GC, [res], 'int', ofs_i)
assert i.value == 1234
-
+
#u = self.execute_operation(rop.GETFIELD_GC, [res, ofs_u], 'int')
#assert u.value == 5
self.execute_operation(rop.SETFIELD_GC, [res, ConstInt(1)], 'void',
@@ -299,7 +293,7 @@
else:
assert result != execute(self.cpu, None,
op, None, b).value
-
+
def test_stuff_followed_by_guard(self):
boxes = [(BoxInt(1), BoxInt(0)),
@@ -523,7 +517,7 @@
def test_debugger_on(self):
from pypy.tool.logparser import parse_log_file, extract_category
from pypy.rlib import debug
-
+
loop = """
[i0]
debug_merge_point('xyz', 0)
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -52,9 +52,11 @@
newoperations = []
#
def do_rename(var, var_or_const):
+ if var.concretetype is lltype.Void:
+ renamings[var] = Constant(None, lltype.Void)
+ return
renamings[var] = var_or_const
- if (isinstance(var_or_const, Constant)
- and var.concretetype != lltype.Void):
+ if isinstance(var_or_const, Constant):
value = var_or_const.value
value = lltype._cast_whatever(var.concretetype, value)
renamings_constants[var] = Constant(value, var.concretetype)
@@ -735,29 +737,54 @@
return SpaceOperation(opname, [op.args[0]], op.result)
def rewrite_op_getinteriorfield(self, op):
- # only supports strings and unicodes
assert len(op.args) == 3
- assert op.args[1].value == 'chars'
optype = op.args[0].concretetype
if optype == lltype.Ptr(rstr.STR):
opname = "strgetitem"
+ return SpaceOperation(opname, [op.args[0], op.args[2]], op.result)
+ elif optype == lltype.Ptr(rstr.UNICODE):
+ opname = "unicodegetitem"
+ return SpaceOperation(opname, [op.args[0], op.args[2]], op.result)
else:
- assert optype == lltype.Ptr(rstr.UNICODE)
- opname = "unicodegetitem"
- return SpaceOperation(opname, [op.args[0], op.args[2]], op.result)
+ v_inst, v_index, c_field = op.args
+ if op.result.concretetype is lltype.Void:
+ return
+ # only GcArray of Struct supported
+ assert isinstance(v_inst.concretetype.TO, lltype.GcArray)
+ STRUCT = v_inst.concretetype.TO.OF
+ assert isinstance(STRUCT, lltype.Struct)
+ descr = self.cpu.interiorfielddescrof(v_inst.concretetype.TO,
+ c_field.value)
+ args = [v_inst, v_index, descr]
+ kind = getkind(op.result.concretetype)[0]
+ return SpaceOperation('getinteriorfield_gc_%s' % kind, args,
+ op.result)
def rewrite_op_setinteriorfield(self, op):
- # only supports strings and unicodes
assert len(op.args) == 4
- assert op.args[1].value == 'chars'
optype = op.args[0].concretetype
if optype == lltype.Ptr(rstr.STR):
opname = "strsetitem"
+ return SpaceOperation(opname, [op.args[0], op.args[2], op.args[3]],
+ op.result)
+ elif optype == lltype.Ptr(rstr.UNICODE):
+ opname = "unicodesetitem"
+ return SpaceOperation(opname, [op.args[0], op.args[2], op.args[3]],
+ op.result)
else:
- assert optype == lltype.Ptr(rstr.UNICODE)
- opname = "unicodesetitem"
- return SpaceOperation(opname, [op.args[0], op.args[2], op.args[3]],
- op.result)
+ v_inst, v_index, c_field, v_value = op.args
+ if v_value.concretetype is lltype.Void:
+ return
+ # only GcArray of Struct supported
+ assert isinstance(v_inst.concretetype.TO, lltype.GcArray)
+ STRUCT = v_inst.concretetype.TO.OF
+ assert isinstance(STRUCT, lltype.Struct)
+ descr = self.cpu.interiorfielddescrof(v_inst.concretetype.TO,
+ c_field.value)
+ kind = getkind(v_value.concretetype)[0]
+ args = [v_inst, v_index, v_value, descr]
+ return SpaceOperation('setinteriorfield_gc_%s' % kind, args,
+ op.result)
def _rewrite_equality(self, op, opname):
arg0, arg1 = op.args
diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py
--- a/pypy/jit/codewriter/support.py
+++ b/pypy/jit/codewriter/support.py
@@ -13,7 +13,6 @@
from pypy.translator.simplify import get_funcobj
from pypy.translator.unsimplify import split_block
from pypy.objspace.flow.model import Constant
-from pypy import conftest
from pypy.translator.translator import TranslationContext
from pypy.annotation.policy import AnnotatorPolicy
from pypy.annotation import model as annmodel
@@ -48,15 +47,13 @@
a.build_types(func, argtypes, main_entry_point=True)
rtyper = t.buildrtyper(type_system = type_system)
rtyper.specialize()
- if inline:
- auto_inlining(t, threshold=inline)
+ #if inline:
+ # auto_inlining(t, threshold=inline)
if backendoptimize:
from pypy.translator.backendopt.all import backend_optimizations
backend_optimizations(t, inline_threshold=inline or 0,
remove_asserts=True, really_remove_asserts=True)
- #if conftest.option.view:
- # t.view()
return rtyper
def getgraph(func, values):
@@ -456,6 +453,8 @@
return LLtypeHelpers._dictnext_items(lltype.Ptr(RES), iter)
_ll_1_dictiter_nextitems.need_result_type = True
+ _ll_1_dict_resize = ll_rdict.ll_dict_resize
+
# ---------- strings and unicode ----------
_ll_1_str_str2unicode = ll_rstr.LLHelpers.ll_str2unicode
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -1,4 +1,3 @@
-import py
import random
try:
from itertools import product
@@ -16,13 +15,13 @@
from pypy.objspace.flow.model import FunctionGraph, Block, Link
from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
-from pypy.jit.codewriter.jtransform import Transformer
-from pypy.jit.metainterp.history import getkind
-from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr, rlist
+from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr
from pypy.rpython.lltypesystem.module import ll_math
from pypy.translator.unsimplify import varoftype
from pypy.jit.codewriter import heaptracker, effectinfo
from pypy.jit.codewriter.flatten import ListOfKind
+from pypy.jit.codewriter.jtransform import Transformer
+from pypy.jit.metainterp.history import getkind
def const(x):
return Constant(x, lltype.typeOf(x))
@@ -37,6 +36,8 @@
return ('calldescr', FUNC, ARGS, RESULT)
def fielddescrof(self, STRUCT, name):
return ('fielddescr', STRUCT, name)
+ def interiorfielddescrof(self, ARRAY, name):
+ return ('interiorfielddescr', ARRAY, name)
def arraydescrof(self, ARRAY):
return FakeDescr(('arraydescr', ARRAY))
def sizeof(self, STRUCT):
@@ -539,7 +540,7 @@
def test_rename_on_links():
v1 = Variable()
- v2 = Variable()
+ v2 = Variable(); v2.concretetype = llmemory.Address
v3 = Variable()
block = Block([v1])
block.operations = [SpaceOperation('cast_pointer', [v1], v2)]
@@ -676,6 +677,22 @@
assert op1.args == [v, v_index]
assert op1.result == v_result
+def test_dict_getinteriorfield():
+ DICT = lltype.GcArray(lltype.Struct('ENTRY', ('v', lltype.Signed),
+ ('k', lltype.Signed)))
+ v = varoftype(lltype.Ptr(DICT))
+ i = varoftype(lltype.Signed)
+ v_result = varoftype(lltype.Signed)
+ op = SpaceOperation('getinteriorfield', [v, i, Constant('v', lltype.Void)],
+ v_result)
+ op1 = Transformer(FakeCPU()).rewrite_operation(op)
+ assert op1.opname == 'getinteriorfield_gc_i'
+ assert op1.args == [v, i, ('interiorfielddescr', DICT, 'v')]
+ op = SpaceOperation('getinteriorfield', [v, i, Constant('v', lltype.Void)],
+ Constant(None, lltype.Void))
+ op1 = Transformer(FakeCPU()).rewrite_operation(op)
+ assert op1 is None
+
def test_str_setinteriorfield():
v = varoftype(lltype.Ptr(rstr.STR))
v_index = varoftype(lltype.Signed)
@@ -702,6 +719,23 @@
assert op1.args == [v, v_index, v_newchr]
assert op1.result == v_void
+def test_dict_setinteriorfield():
+ DICT = lltype.GcArray(lltype.Struct('ENTRY', ('v', lltype.Signed),
+ ('k', lltype.Signed)))
+ v = varoftype(lltype.Ptr(DICT))
+ i = varoftype(lltype.Signed)
+ v_void = varoftype(lltype.Void)
+ op = SpaceOperation('setinteriorfield', [v, i, Constant('v', lltype.Void),
+ i],
+ v_void)
+ op1 = Transformer(FakeCPU()).rewrite_operation(op)
+ assert op1.opname == 'setinteriorfield_gc_i'
+ assert op1.args == [v, i, i, ('interiorfielddescr', DICT, 'v')]
+ op = SpaceOperation('setinteriorfield', [v, i, Constant('v', lltype.Void),
+ v_void], v_void)
+ op1 = Transformer(FakeCPU()).rewrite_operation(op)
+ assert not op1
+
def test_promote_1():
v1 = varoftype(lltype.Signed)
v2 = varoftype(lltype.Signed)
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -6,7 +6,6 @@
from pypy.rlib.debug import make_sure_not_resized
from pypy.rpython.lltypesystem import lltype, llmemory, rclass
from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rpython.llinterp import LLException
from pypy.jit.codewriter.jitcode import JitCode, SwitchDictDescr
from pypy.jit.codewriter import heaptracker, longlong
from pypy.jit.metainterp.jitexc import JitException, get_llexception, reraise
@@ -1154,6 +1153,26 @@
array = cpu.bh_getfield_gc_r(vable, fdescr)
return cpu.bh_arraylen_gc(adescr, array)
+ @arguments("cpu", "r", "i", "d", returns="i")
+ def bhimpl_getinteriorfield_gc_i(cpu, array, index, descr):
+ return cpu.bh_getinteriorfield_gc_i(array, index, descr)
+ @arguments("cpu", "r", "i", "d", returns="r")
+ def bhimpl_getinteriorfield_gc_r(cpu, array, index, descr):
+ return cpu.bh_getinteriorfield_gc_r(array, index, descr)
+ @arguments("cpu", "r", "i", "d", returns="f")
+ def bhimpl_getinteriorfield_gc_f(cpu, array, index, descr):
+ return cpu.bh_getinteriorfield_gc_f(array, index, descr)
+
+ @arguments("cpu", "r", "i", "d", "i")
+ def bhimpl_setinteriorfield_gc_i(cpu, array, index, descr, value):
+ cpu.bh_setinteriorfield_gc_i(array, index, descr, value)
+ @arguments("cpu", "r", "i", "d", "r")
+ def bhimpl_setinteriorfield_gc_r(cpu, array, index, descr, value):
+ cpu.bh_setinteriorfield_gc_r(array, index, descr, value)
+ @arguments("cpu", "r", "i", "d", "f")
+ def bhimpl_setinteriorfield_gc_f(cpu, array, index, descr, value):
+ cpu.bh_setinteriorfield_gc_f(array, index, descr, value)
+
@arguments("cpu", "r", "d", returns="i")
def bhimpl_getfield_gc_i(cpu, struct, fielddescr):
return cpu.bh_getfield_gc_i(struct, fielddescr)
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -1,11 +1,8 @@
"""This implements pyjitpl's execution of operations.
"""
-import py
-from pypy.rpython.lltypesystem import lltype, llmemory, rstr
-from pypy.rpython.ootypesystem import ootype
-from pypy.rpython.lltypesystem.lloperation import llop
-from pypy.rlib.rarithmetic import ovfcheck, r_uint, intmask, r_longlong
+from pypy.rpython.lltypesystem import lltype, rstr
+from pypy.rlib.rarithmetic import ovfcheck, r_longlong
from pypy.rlib.rtimer import read_timestamp
from pypy.rlib.unroll import unrolling_iterable
from pypy.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat, check_descr
@@ -123,6 +120,29 @@
else:
cpu.bh_setarrayitem_raw_i(arraydescr, array, index, itembox.getint())
+def do_getinteriorfield_gc(cpu, _, arraybox, indexbox, descr):
+ array = arraybox.getref_base()
+ index = indexbox.getint()
+ if descr.is_pointer_field():
+ return BoxPtr(cpu.bh_getinteriorfield_gc_r(array, index, descr))
+ elif descr.is_float_field():
+ return BoxFloat(cpu.bh_getinteriorfield_gc_f(array, index, descr))
+ else:
+ return BoxInt(cpu.bh_getinteriorfield_gc_i(array, index, descr))
+
+def do_setinteriorfield_gc(cpu, _, arraybox, indexbox, valuebox, descr):
+ array = arraybox.getref_base()
+ index = indexbox.getint()
+ if descr.is_pointer_field():
+ cpu.bh_setinteriorfield_gc_r(array, index, descr,
+ valuebox.getref_base())
+ elif descr.is_float_field():
+ cpu.bh_setinteriorfield_gc_f(array, index, descr,
+ valuebox.getfloatstorage())
+ else:
+ cpu.bh_setinteriorfield_gc_i(array, index, descr,
+ valuebox.getint())
+
def do_getfield_gc(cpu, _, structbox, fielddescr):
struct = structbox.getref_base()
if fielddescr.is_pointer_field():
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -36,6 +36,7 @@
class MIFrame(object):
+ debug = False
def __init__(self, metainterp):
self.metainterp = metainterp
@@ -548,6 +549,14 @@
opimpl_getfield_gc_r_pure = _opimpl_getfield_gc_pure_any
opimpl_getfield_gc_f_pure = _opimpl_getfield_gc_pure_any
+ @arguments("box", "box", "descr")
+ def _opimpl_getinteriorfield_gc_any(self, array, index, descr):
+ return self.execute_with_descr(rop.GETINTERIORFIELD_GC, descr,
+ array, index)
+ opimpl_getinteriorfield_gc_i = _opimpl_getinteriorfield_gc_any
+ opimpl_getinteriorfield_gc_f = _opimpl_getinteriorfield_gc_any
+ opimpl_getinteriorfield_gc_r = _opimpl_getinteriorfield_gc_any
+
@specialize.arg(1)
def _opimpl_getfield_gc_any_pureornot(self, opnum, box, fielddescr):
tobox = self.metainterp.heapcache.getfield(box, fielddescr)
@@ -588,6 +597,15 @@
opimpl_setfield_gc_r = _opimpl_setfield_gc_any
opimpl_setfield_gc_f = _opimpl_setfield_gc_any
+ @arguments("box", "box", "box", "descr")
+ def _opimpl_setinteriorfield_gc_any(self, array, index, value, descr):
+ self.execute_with_descr(rop.SETINTERIORFIELD_GC, descr,
+ array, index, value)
+ opimpl_setinteriorfield_gc_i = _opimpl_setinteriorfield_gc_any
+ opimpl_setinteriorfield_gc_f = _opimpl_setinteriorfield_gc_any
+ opimpl_setinteriorfield_gc_r = _opimpl_setinteriorfield_gc_any
+
+
@arguments("box", "descr")
def _opimpl_getfield_raw_any(self, box, fielddescr):
return self.execute_with_descr(rop.GETFIELD_RAW, fielddescr, box)
@@ -2588,17 +2606,21 @@
self.pc = position
#
if not we_are_translated():
- print '\tpyjitpl: %s(%s)' % (name, ', '.join(map(repr, args))),
+ if self.debug:
+ print '\tpyjitpl: %s(%s)' % (name, ', '.join(map(repr, args))),
try:
resultbox = unboundmethod(self, *args)
except Exception, e:
- print '-> %s!' % e.__class__.__name__
+ if self.debug:
+ print '-> %s!' % e.__class__.__name__
raise
if num_return_args == 0:
- print
+ if self.debug:
+ print
assert resultbox is None
else:
- print '-> %r' % (resultbox,)
+ if self.debug:
+ print '-> %r' % (resultbox,)
assert argcodes[next_argcode] == '>'
result_argcode = argcodes[next_argcode + 1]
assert resultbox.type == {'i': history.INT,
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -1,5 +1,4 @@
from pypy.rlib.objectmodel import we_are_translated
-from pypy.rlib.debug import make_sure_not_resized
def ResOperation(opnum, args, result, descr=None):
cls = opclasses[opnum]
@@ -457,6 +456,7 @@
'GETARRAYITEM_GC/2d',
'GETARRAYITEM_RAW/2d',
+ 'GETINTERIORFIELD_GC/2d',
'GETFIELD_GC/1d',
'GETFIELD_RAW/1d',
'_MALLOC_FIRST',
@@ -473,6 +473,7 @@
'SETARRAYITEM_GC/3d',
'SETARRAYITEM_RAW/3d',
+ 'SETINTERIORFIELD_GC/3d',
'SETFIELD_GC/2d',
'SETFIELD_RAW/2d',
'STRSETITEM/3',
diff --git a/pypy/jit/metainterp/test/test_dict.py b/pypy/jit/metainterp/test/test_dict.py
--- a/pypy/jit/metainterp/test/test_dict.py
+++ b/pypy/jit/metainterp/test/test_dict.py
@@ -91,7 +91,7 @@
res1 = f(100)
res2 = self.meta_interp(f, [100], listops=True)
assert res1 == res2
- self.check_loops(int_mod=1) # the hash was traced
+ self.check_loops(int_mod=1) # the hash was traced and eq, but cached
def test_dict_setdefault(self):
myjitdriver = JitDriver(greens = [], reds = ['total', 'dct'])
@@ -128,7 +128,7 @@
assert f(100) == 50
res = self.meta_interp(f, [100], listops=True)
assert res == 50
- self.check_loops(int_mod=1)
+ self.check_loops(int_mod=1) # key + eq, but cached
def test_repeated_lookup(self):
myjitdriver = JitDriver(greens = [], reds = ['n', 'd'])
@@ -153,10 +153,12 @@
res = self.meta_interp(f, [100], listops=True)
assert res == f(50)
- self.check_loops({"call": 7, "guard_false": 1, "guard_no_exception": 6,
+ self.check_loops({"call": 5, "getfield_gc": 1, "getinteriorfield_gc": 1,
+ "guard_false": 1, "guard_no_exception": 4,
"guard_true": 1, "int_and": 1, "int_gt": 1,
"int_is_true": 1, "int_sub": 1, "jump": 1,
- "new_with_vtable": 1, "setfield_gc": 1})
+ "new_with_vtable": 1, "new": 1, "new_array": 1,
+ "setfield_gc": 3, })
class TestOOtype(DictTests, OOJitMixin):
diff --git a/pypy/jit/metainterp/warmspot.py b/pypy/jit/metainterp/warmspot.py
--- a/pypy/jit/metainterp/warmspot.py
+++ b/pypy/jit/metainterp/warmspot.py
@@ -206,7 +206,7 @@
self.make_enter_functions()
self.rewrite_jit_merge_points(policy)
- verbose = not self.cpu.translate_support_code
+ verbose = False # not self.cpu.translate_support_code
self.codewriter.make_jitcodes(verbose=verbose)
self.rewrite_can_enter_jits()
self.rewrite_set_param()
diff --git a/pypy/module/__builtin__/__init__.py b/pypy/module/__builtin__/__init__.py
--- a/pypy/module/__builtin__/__init__.py
+++ b/pypy/module/__builtin__/__init__.py
@@ -24,6 +24,7 @@
'map' : 'app_functional.map',
'reduce' : 'app_functional.reduce',
'filter' : 'app_functional.filter',
+ 'zip' : 'app_functional.zip',
'vars' : 'app_inspect.vars',
'dir' : 'app_inspect.dir',
@@ -87,7 +88,6 @@
'enumerate' : 'functional.W_Enumerate',
'min' : 'functional.min',
'max' : 'functional.max',
- 'zip' : 'functional.zip',
'reversed' : 'functional.reversed',
'super' : 'descriptor.W_Super',
'staticmethod' : 'descriptor.StaticMethod',
diff --git a/pypy/module/__builtin__/app_functional.py b/pypy/module/__builtin__/app_functional.py
--- a/pypy/module/__builtin__/app_functional.py
+++ b/pypy/module/__builtin__/app_functional.py
@@ -132,3 +132,20 @@
for item in seq:
if func(item):
yield item
+
+def zip(*sequences):
+ """zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
+
+Return a list of tuples, where each tuple contains the i-th element
+from each of the argument sequences. The returned list is truncated
+in length to the length of the shortest argument sequence."""
+ if not sequences:
+ return []
+ result = []
+ iterators = [iter(seq) for seq in sequences]
+ while True:
+ try:
+ items = [next(it) for it in iterators]
+ except StopIteration:
+ return result
+ result.append(tuple(items))
diff --git a/pypy/module/__builtin__/app_io.py b/pypy/module/__builtin__/app_io.py
--- a/pypy/module/__builtin__/app_io.py
+++ b/pypy/module/__builtin__/app_io.py
@@ -27,7 +27,20 @@
co = compile(source.rstrip()+"\n", filename, 'exec')
exec(co, glob, loc)
-def input(prompt=None):
+def _write_prompt(stdout, prompt):
+ print(prompt, file=stdout, end='')
+ try:
+ flush = stdout.flush
+ except AttributeError:
+ pass
+ else:
+ flush()
+ try:
+ stdout.softspace = 0
+ except (AttributeError, TypeError):
+ pass
+
+def input(prompt=''):
"""input([prompt]) -> string
Read a string from standard input. The trailing newline is stripped.
@@ -47,18 +60,10 @@
if (hasattr(sys, '__raw_input__') and
isinstance(stdin, file) and stdin.fileno() == 0 and stdin.isatty() and
isinstance(stdout, file) and stdout.fileno() == 1):
- if prompt is None:
- prompt = ''
- return sys.__raw_input__(prompt)
+ _write_prompt(stdout, '')
+ return sys.__raw_input__(str(prompt))
- if prompt is not None:
- stdout.write(prompt)
- try:
- flush = stdout.flush
- except AttributeError:
- pass
- else:
- flush()
+ _write_prompt(stdout, prompt)
line = stdin.readline()
if not line: # inputting an empty line gives line == '\n'
raise EOFError
diff --git a/pypy/module/__builtin__/functional.py b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -116,27 +116,6 @@
"""
return min_max(space, __args__, "min")
- at unwrap_spec(sequences_w="args_w")
-def zip(space, sequences_w):
- """Return a list of tuples, where the nth tuple contains every nth item of
- each collection.
-
- If the collections have different lengths, zip returns a list as long as the
- shortest collection, ignoring the trailing items in the other collections.
- """
- if not sequences_w:
- return space.newlist([])
- result_w = []
- iterators_w = [space.iter(w_seq) for w_seq in sequences_w]
- while True:
- try:
- items_w = [space.next(w_it) for w_it in iterators_w]
- except OperationError, e:
- if not e.match(space, space.w_StopIteration):
- raise
- return space.newlist(result_w)
- result_w.append(space.newtuple(items_w))
-
class W_Enumerate(Wrappable):
def __init__(self, w_iter, w_start):
diff --git a/pypy/module/__builtin__/test/test_rawinput.py b/pypy/module/__builtin__/test/test_rawinput.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/__builtin__/test/test_rawinput.py
@@ -0,0 +1,80 @@
+import autopath
+
+
+class AppTestRawInput():
+
+ def test_input_and_raw_input(self):
+ import sys, StringIO
+ for prompt, expected in [("def:", "abc/ def:/ghi\n"),
+ ("", "abc/ /ghi\n"),
+ (42, "abc/ 42/ghi\n"),
+ (None, "abc/ None/ghi\n"),
+ (Ellipsis, "abc/ /ghi\n")]:
+ for inputfn, inputtext, gottext in [
+ (raw_input, "foo\nbar\n", "foo"),
+ (input, "40+2\n", 42)]:
+ save = sys.stdin, sys.stdout
+ try:
+ sys.stdin = StringIO.StringIO(inputtext)
+ out = sys.stdout = StringIO.StringIO()
+ print "abc", # softspace = 1
+ out.write('/')
+ if prompt is Ellipsis:
+ got = inputfn()
+ else:
+ got = inputfn(prompt)
+ out.write('/')
+ print "ghi"
+ finally:
+ sys.stdin, sys.stdout = save
+ assert out.getvalue() == expected
+ assert got == gottext
+
+ def test_softspace(self):
+ import sys
+ import StringIO
+ fin = StringIO.StringIO()
+ fout = StringIO.StringIO()
+
+ fin.write("Coconuts\n")
+ fin.seek(0)
+
+ sys_stdin_orig = sys.stdin
+ sys_stdout_orig = sys.stdout
+
+ sys.stdin = fin
+ sys.stdout = fout
+
+ print "test",
+ raw_input("test")
+
+ sys.stdin = sys_stdin_orig
+ sys.stdout = sys_stdout_orig
+
+ fout.seek(0)
+ assert fout.read() == "test test"
+
+ def test_softspace_carryover(self):
+ import sys
+ import StringIO
+ fin = StringIO.StringIO()
+ fout = StringIO.StringIO()
+
+ fin.write("Coconuts\n")
+ fin.seek(0)
+
+ sys_stdin_orig = sys.stdin
+ sys_stdout_orig = sys.stdout
+
+ sys.stdin = fin
+ sys.stdout = fout
+
+ print "test",
+ raw_input("test")
+ print "test",
+
+ sys.stdin = sys_stdin_orig
+ sys.stdout = sys_stdout_orig
+
+ fout.seek(0)
+ assert fout.read() == "test testtest"
diff --git a/pypy/module/pypyjit/test_pypy_c/test_containers.py b/pypy/module/pypyjit/test_pypy_c/test_containers.py
--- a/pypy/module/pypyjit/test_pypy_c/test_containers.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_containers.py
@@ -46,7 +46,7 @@
assert loop.match_by_id("getitem", """
i28 = call(ConstClass(ll_dict_lookup__dicttablePtr_objectPtr_Signed), p18, p6, i25, descr=...)
...
- p33 = call(ConstClass(ll_get_value__dicttablePtr_Signed), p18, i28, descr=...)
+ p33 = getinteriorfield_gc(p31, i26, <InteriorFieldDescr <GcPtrFieldDescr dictentry.value .*>>)
...
""")
diff --git a/pypy/module/pypyjit/test_pypy_c/test_string.py b/pypy/module/pypyjit/test_pypy_c/test_string.py
--- a/pypy/module/pypyjit/test_pypy_c/test_string.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_string.py
@@ -93,7 +93,8 @@
i46 = call(ConstClass(ll_startswith__rpy_stringPtr_rpy_stringPtr), p28, ConstPtr(ptr45), descr=<BoolCallDescr>)
guard_false(i46, descr=...)
p51 = new_with_vtable(21136408)
- setfield_gc(p51, _, descr=...) # 6 setfields, but the order is dict-order-dependent
+ setfield_gc(p51, _, descr=...) # 7 setfields, but the order is dict-order-dependent
+ setfield_gc(p51, _, descr=...)
setfield_gc(p51, _, descr=...)
setfield_gc(p51, _, descr=...)
setfield_gc(p51, _, descr=...)
diff --git a/pypy/rlib/_rsocket_rffi.py b/pypy/rlib/_rsocket_rffi.py
--- a/pypy/rlib/_rsocket_rffi.py
+++ b/pypy/rlib/_rsocket_rffi.py
@@ -16,6 +16,7 @@
_MINGW = target_platform.name == "mingw32"
_SOLARIS = sys.platform == "sunos5"
_MACOSX = sys.platform == "darwin"
+_HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now
if _POSIX:
includes = ('sys/types.h',
@@ -34,11 +35,12 @@
'stdint.h',
'errno.h',
)
+ if _HAS_AF_PACKET:
+ includes += ('netpacket/packet.h',
+ 'sys/ioctl.h',
+ 'net/if.h')
- cond_includes = [('AF_NETLINK', 'linux/netlink.h'),
- ('AF_PACKET', 'netpacket/packet.h'),
- ('AF_PACKET', 'sys/ioctl.h'),
- ('AF_PACKET', 'net/if.h')]
+ cond_includes = [('AF_NETLINK', 'linux/netlink.h')]
libraries = ()
calling_conv = 'c'
@@ -320,18 +322,18 @@
('events', rffi.SHORT),
('revents', rffi.SHORT)])
- CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll',
+ if _HAS_AF_PACKET:
+ CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll',
[('sll_ifindex', rffi.INT),
('sll_protocol', rffi.INT),
('sll_pkttype', rffi.INT),
('sll_hatype', rffi.INT),
('sll_addr', rffi.CFixedArray(rffi.CHAR, 8)),
- ('sll_halen', rffi.INT)],
- ifdef='AF_PACKET')
+ ('sll_halen', rffi.INT)])
- CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT),
- ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))],
- ifdef='AF_PACKET')
+ CConfig.ifreq = platform.Struct('struct ifreq',
+ [('ifr_ifindex', rffi.INT),
+ ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))])
if _WIN32:
CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP)
@@ -386,6 +388,8 @@
constants[name] = value
else:
constants[name] = default
+if not _HAS_AF_PACKET and 'AF_PACKET' in constants:
+ del constants['AF_PACKET']
constants['has_ipv6'] = True # This is a configuration option in CPython
for name, value in constants.items():
@@ -439,21 +443,14 @@
if _POSIX:
nfds_t = cConfig.nfds_t
pollfd = cConfig.pollfd
- if cConfig.sockaddr_ll is not None:
+ if _HAS_AF_PACKET:
sockaddr_ll = cConfig.sockaddr_ll
- ifreq = cConfig.ifreq
+ ifreq = cConfig.ifreq
if WIN32:
WSAEVENT = cConfig.WSAEVENT
WSANETWORKEVENTS = cConfig.WSANETWORKEVENTS
timeval = cConfig.timeval
-#if _POSIX:
-# includes = list(includes)
-# for _name, _header in cond_includes:
-# if getattr(cConfig, _name) is not None:
-# includes.append(_header)
-# eci = ExternalCompilationInfo(includes=includes, libraries=libraries,
-# separate_module_sources=sources)
def external(name, args, result, **kwds):
return rffi.llexternal(name, args, result, compilation_info=eci,
@@ -544,7 +541,7 @@
socketpair_t = rffi.CArray(socketfd_type)
socketpair = external('socketpair', [rffi.INT, rffi.INT, rffi.INT,
lltype.Ptr(socketpair_t)], rffi.INT)
- if ifreq is not None:
+ if _HAS_AF_PACKET:
ioctl = external('ioctl', [socketfd_type, rffi.INT, lltype.Ptr(ifreq)],
rffi.INT)
diff --git a/pypy/rlib/rerased.py b/pypy/rlib/rerased.py
--- a/pypy/rlib/rerased.py
+++ b/pypy/rlib/rerased.py
@@ -135,6 +135,8 @@
_about_ = erase_int
def compute_result_annotation(self, s_obj):
+ config = self.bookkeeper.annotator.translator.config
+ assert config.translation.taggedpointers, "need to enable tagged pointers to use erase_int"
assert annmodel.SomeInteger().contains(s_obj)
return SomeErased()
@@ -228,6 +230,8 @@
def convert_const(self, value):
if value._identity is _identity_for_ints:
+ config = self.rtyper.annotator.translator.config
+ assert config.translation.taggedpointers, "need to enable tagged pointers to use erase_int"
return lltype.cast_int_to_ptr(self.lowleveltype, value._x * 2 + 1)
bk = self.rtyper.annotator.bookkeeper
s_obj = value._identity.get_input_annotation(bk)
diff --git a/pypy/rlib/rsocket.py b/pypy/rlib/rsocket.py
--- a/pypy/rlib/rsocket.py
+++ b/pypy/rlib/rsocket.py
@@ -8,6 +8,7 @@
# Known missing features:
#
# - address families other than AF_INET, AF_INET6, AF_UNIX, AF_PACKET
+# - AF_PACKET is only supported on Linux
# - methods makefile(),
# - SSL
#
diff --git a/pypy/rlib/test/test_rerased.py b/pypy/rlib/test/test_rerased.py
--- a/pypy/rlib/test/test_rerased.py
+++ b/pypy/rlib/test/test_rerased.py
@@ -10,6 +10,13 @@
from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
+def make_annotator():
+ a = RPythonAnnotator()
+ a.translator.config.translation.taggedpointers = True
+ return a
+
+
+
class X(object):
pass
@@ -55,7 +62,7 @@
def test_annotate_1():
def f():
return eraseX(X())
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [])
assert isinstance(s, SomeErased)
@@ -66,7 +73,7 @@
#assert not is_integer(e)
x2 = uneraseX(e)
return x2
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [])
assert isinstance(s, annmodel.SomeInstance)
assert s.classdef == a.bookkeeper.getuniqueclassdef(X)
@@ -77,7 +84,7 @@
#assert is_integer(e)
x2 = unerase_int(e)
return x2
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [])
assert isinstance(s, annmodel.SomeInteger)
@@ -105,7 +112,7 @@
x = make(n)
return check(x, n)
#
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [int])
assert isinstance(s, annmodel.SomeInteger)
@@ -135,7 +142,7 @@
else:
return inst
#
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [])
assert isinstance(s, annmodel.SomeInstance)
assert s.classdef == a.bookkeeper.getuniqueclassdef(A)
@@ -155,7 +162,7 @@
e = e2
return unerase(e)
#
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [int])
assert isinstance(s, annmodel.SomeInstance)
assert s.classdef == a.bookkeeper.getuniqueclassdef(X)
@@ -165,11 +172,14 @@
e1 = erase_int(42)
def f(i):
return unerase_int(e1)
- a = RPythonAnnotator()
+ a = make_annotator()
s = a.build_types(f, [int])
assert isinstance(s, annmodel.SomeInteger)
class BaseTestRErased(BaseRtypingTest):
+ def interpret(self, *args, **kwargs):
+ kwargs["taggedpointers"] = True
+ return BaseRtypingTest.interpret(self, *args, **kwargs)
def test_rtype_1(self):
def f():
return eraseX(X())
diff --git a/pypy/rpython/lltypesystem/ll2ctypes.py b/pypy/rpython/lltypesystem/ll2ctypes.py
--- a/pypy/rpython/lltypesystem/ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/ll2ctypes.py
@@ -15,12 +15,11 @@
load_library_kwargs = {}
import os
-from pypy import conftest
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.extfunc import ExtRegistryEntry
from pypy.rlib.objectmodel import Symbolic, ComputedIntSymbolic
from pypy.tool.uid import fixid
-from pypy.rlib.rarithmetic import r_uint, r_singlefloat, r_longfloat, base_int, intmask
+from pypy.rlib.rarithmetic import r_singlefloat, r_longfloat, base_int, intmask
from pypy.annotation import model as annmodel
from pypy.rpython.llinterp import LLInterpreter, LLException
from pypy.rpython.lltypesystem.rclass import OBJECT, OBJECT_VTABLE
@@ -531,6 +530,10 @@
def __str__(self):
return repr(self)
+ def _setparentstructure(self, parent, parentindex):
+ super(_parentable_mixin, self)._setparentstructure(parent, parentindex)
+ self._keepparent = parent # always keep a strong ref
+
class _struct_mixin(_parentable_mixin):
"""Mixin added to _struct containers when they become ctypes-based."""
__slots__ = ()
@@ -566,7 +569,10 @@
return 0, sys.maxint
def getitem(self, index, uninitialized_ok=False):
- return self._storage.contents._getitem(index, boundscheck=False)
+ res = self._storage.contents._getitem(index, boundscheck=False)
+ if isinstance(self._TYPE.OF, lltype.ContainerType):
+ res._obj._setparentstructure(self, index)
+ return res
def setitem(self, index, value):
self._storage.contents._setitem(index, value, boundscheck=False)
@@ -1279,6 +1285,8 @@
self.intval = intmask(void_p.value)
def __eq__(self, other):
+ if not other:
+ return self.intval == 0
if isinstance(other, _llgcopaque):
return self.intval == other.intval
storage = object()
diff --git a/pypy/rpython/lltypesystem/lltype.py b/pypy/rpython/lltypesystem/lltype.py
--- a/pypy/rpython/lltypesystem/lltype.py
+++ b/pypy/rpython/lltypesystem/lltype.py
@@ -1522,7 +1522,7 @@
and parentindex in (self._parent_type._names[0], 0)
and self._TYPE._gckind == typeOf(parent)._gckind):
# keep strong reference to parent, we share the same allocation
- self._keepparent = parent
+ self._keepparent = parent
def _parentstructure(self, check=True):
if self._wrparent is not None:
@@ -1730,7 +1730,8 @@
# Keep the parent array alive, we share the same allocation.
# Don't do it if we are inside a GC object, though -- it's someone
# else's job to keep the GC object alive
- if typeOf(top_container(parent))._gckind == 'raw':
+ if (typeOf(top_container(parent))._gckind == 'raw' or
+ hasattr(top_container(parent)._storage, 'contents')): # ll2ctypes
self._keepparent = parent
def __str__(self):
diff --git a/pypy/rpython/lltypesystem/rbuilder.py b/pypy/rpython/lltypesystem/rbuilder.py
--- a/pypy/rpython/lltypesystem/rbuilder.py
+++ b/pypy/rpython/lltypesystem/rbuilder.py
@@ -29,7 +29,7 @@
except OverflowError:
raise MemoryError
newbuf = mallocfn(new_allocated)
- copycontentsfn(ll_builder.buf, newbuf, 0, 0, ll_builder.allocated)
+ copycontentsfn(ll_builder.buf, newbuf, 0, 0, ll_builder.used)
ll_builder.buf = newbuf
ll_builder.allocated = new_allocated
return func_with_new_name(stringbuilder_grow, name)
@@ -56,7 +56,7 @@
class BaseStringBuilderRepr(AbstractStringBuilderRepr):
def empty(self):
return nullptr(self.lowleveltype.TO)
-
+
@classmethod
def ll_new(cls, init_size):
if init_size < 0 or init_size > MAX:
diff --git a/pypy/rpython/lltypesystem/rdict.py b/pypy/rpython/lltypesystem/rdict.py
--- a/pypy/rpython/lltypesystem/rdict.py
+++ b/pypy/rpython/lltypesystem/rdict.py
@@ -1,16 +1,14 @@
from pypy.tool.pairtype import pairtype
-from pypy.annotation import model as annmodel
from pypy.objspace.flow.model import Constant
-from pypy.rpython.rdict import AbstractDictRepr, AbstractDictIteratorRepr,\
- rtype_newdict
+from pypy.rpython.rdict import (AbstractDictRepr, AbstractDictIteratorRepr,
+ rtype_newdict)
from pypy.rpython.lltypesystem import lltype
+from pypy.rlib import objectmodel, jit
from pypy.rlib.rarithmetic import r_uint, intmask, LONG_BIT
-from pypy.rlib.objectmodel import hlinvoke
-from pypy.rpython import robject
-from pypy.rlib import objectmodel, jit
from pypy.rpython import rmodel
from pypy.rpython.error import TyperError
+
HIGHEST_BIT = intmask(1 << (LONG_BIT - 1))
MASK = intmask(HIGHEST_BIT - 1)
@@ -424,17 +422,16 @@
ENTRIES = lltype.typeOf(entries).TO
return ENTRIES.fasthashfn(entries[i].key)
- at jit.dont_look_inside
def ll_get_value(d, i):
return d.entries[i].value
def ll_keyhash_custom(d, key):
DICT = lltype.typeOf(d).TO
- return hlinvoke(DICT.r_rdict_hashfn, d.fnkeyhash, key)
+ return objectmodel.hlinvoke(DICT.r_rdict_hashfn, d.fnkeyhash, key)
def ll_keyeq_custom(d, key1, key2):
DICT = lltype.typeOf(d).TO
- return hlinvoke(DICT.r_rdict_eqfn, d.fnkeyeq, key1, key2)
+ return objectmodel.hlinvoke(DICT.r_rdict_eqfn, d.fnkeyeq, key1, key2)
def ll_dict_len(d):
return d.num_items
@@ -455,6 +452,8 @@
i = ll_dict_lookup(d, key, hash)
return _ll_dict_setitem_lookup_done(d, key, value, hash, i)
+# Leaving as dont_look_inside ATM, it has a few branches which could lead to
+# many bridges if we don't consider their possible frequency.
@jit.dont_look_inside
def _ll_dict_setitem_lookup_done(d, key, value, hash, i):
valid = (i & HIGHEST_BIT) == 0
@@ -508,6 +507,8 @@
else:
return default
+# XXX: Move the size checking and resize into a single call which is opauqe to
+# the JIT to avoid extra branches.
@jit.dont_look_inside
def _ll_dict_del(d, i):
d.entries.mark_deleted(i)
@@ -548,6 +549,7 @@
# ------- a port of CPython's dictobject.c's lookdict implementation -------
PERTURB_SHIFT = 5
+ at jit.dont_look_inside
def ll_dict_lookup(d, key, hash):
entries = d.entries
ENTRIES = lltype.typeOf(entries).TO
@@ -637,7 +639,6 @@
d.num_items = 0
d.resize_counter = DICT_INITSIZE * 2
return d
-ll_newdict.oopspec = 'newdict()'
def ll_newdict_size(DICT, length_estimate):
length_estimate = (length_estimate // 2) * 3
@@ -649,7 +650,6 @@
d.num_items = 0
d.resize_counter = n * 2
return d
-ll_newdict_size.oopspec = 'newdict()'
# pypy.rpython.memory.lldict uses a dict based on Struct and Array
# instead of GcStruct and GcArray, which is done by using different
@@ -882,7 +882,6 @@
global_popitem_index.nextindex = base + counter
return i
- at jit.dont_look_inside
def ll_popitem(ELEM, dic):
i = _ll_getnextitem(dic)
entry = dic.entries[i]
diff --git a/pypy/rpython/lltypesystem/test/test_ll2ctypes.py b/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
--- a/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
@@ -8,6 +8,7 @@
from pypy.rpython.lltypesystem.ll2ctypes import uninitialized2ctypes
from pypy.rpython.lltypesystem.ll2ctypes import ALLOCATED, force_cast
from pypy.rpython.lltypesystem.ll2ctypes import cast_adr_to_int, get_ctypes_type
+from pypy.rpython.lltypesystem.ll2ctypes import _llgcopaque
from pypy.rpython.annlowlevel import llhelper
from pypy.rlib import rposix
from pypy.translator.tool.cbuild import ExternalCompilationInfo
@@ -1349,6 +1350,11 @@
round = ctypes2lltype(llmemory.GCREF, lltype2ctypes(opaque.hide()))
assert Opaque.show(round) is opaque
+ def test_array_of_structs(self):
+ A = lltype.GcArray(lltype.Struct('x', ('v', lltype.Signed)))
+ a = lltype.malloc(A, 5)
+ a2 = ctypes2lltype(lltype.Ptr(A), lltype2ctypes(a))
+ assert a2._obj.getitem(0)._obj._parentstructure() is a2._obj
class TestPlatform(object):
def test_lib_on_libpaths(self):
@@ -1390,3 +1396,7 @@
f = rffi.llexternal('f', [rffi.INT, rffi.INT], rffi.INT,
compilation_info=eci)
assert f(3, 4) == 7
+
+ def test_llgcopaque_eq(self):
+ assert _llgcopaque(1) != None
+ assert _llgcopaque(0) == None
diff --git a/pypy/translator/c/database.py b/pypy/translator/c/database.py
--- a/pypy/translator/c/database.py
+++ b/pypy/translator/c/database.py
@@ -176,7 +176,7 @@
# introduced by the GC transformer, or the type_info_table
return node
- def get(self, obj):
+ def get(self, obj, funcgen=None):
if isinstance(obj, CConstant):
return obj.c_name # without further checks
T = typeOf(obj)
@@ -228,6 +228,8 @@
return '((%s) %d)' % (cdecl(self.gettype(T), ''),
obj._obj)
node = self.getcontainernode(container)
+ if node._funccodegen_owner is None:
+ node._funccodegen_owner = funcgen
return node.getptrname()
else:
return '((%s) NULL)' % (cdecl(self.gettype(T), ''), )
@@ -284,14 +286,16 @@
finish_callbacks.append(('GC transformer: finished tables',
self.gctransformer.get_finish_tables()))
- def add_dependencies(newdependencies):
+ def add_dependencies(newdependencies, parent=None):
for value in newdependencies:
#if isinstance(value, _uninitialized):
# continue
if isinstance(typeOf(value), ContainerType):
- self.getcontainernode(value)
+ node = self.getcontainernode(value)
+ if parent and node._funccodegen_owner is not None:
+ node._funccodegen_owner = parent._funccodegen_owner
else:
- self.get(value)
+ self.get(value, parent and parent._funccodegen_owner)
while True:
while True:
@@ -303,7 +307,7 @@
if i == len(self.containerlist):
break
node = self.containerlist[i]
- add_dependencies(node.enum_dependencies())
+ add_dependencies(node.enum_dependencies(), node)
i += 1
self.completedcontainers = i
if i == show_i:
diff --git a/pypy/translator/c/gc.py b/pypy/translator/c/gc.py
--- a/pypy/translator/c/gc.py
+++ b/pypy/translator/c/gc.py
@@ -170,6 +170,7 @@
nodekind = 'refcnt rtti'
globalcontainer = True
typename = 'void (@)(void *)'
+ _funccodegen_owner = None
def __init__(self, db, T, obj):
assert T == RuntimeTypeInfo
@@ -266,6 +267,7 @@
nodekind = 'boehm rtti'
globalcontainer = True
typename = 'char @'
+ _funccodegen_owner = None
def __init__(self, db, T, obj):
assert T == RuntimeTypeInfo
diff --git a/pypy/translator/c/gcc/test/test_asmgcroot.py b/pypy/translator/c/gcc/test/test_asmgcroot.py
--- a/pypy/translator/c/gcc/test/test_asmgcroot.py
+++ b/pypy/translator/c/gcc/test/test_asmgcroot.py
@@ -21,6 +21,7 @@
config = get_pypy_config(translating=True)
config.translation.gc = cls.gcpolicy
config.translation.gcrootfinder = "asmgcc"
+ config.translation.taggedpointers = getattr(cls, "taggedpointers", False)
return config
@classmethod
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -682,8 +682,7 @@
def getbasecfilefornode(self, node, basecname):
# For FuncNode instances, use the python source filename (relative to
# the top directory):
- if hasattr(node.obj, 'graph'):
- g = node.obj.graph
+ def invent_nice_name(g):
# Lookup the filename from the function.
# However, not all FunctionGraph objs actually have a "func":
if hasattr(g, 'func'):
@@ -693,6 +692,15 @@
if pypkgpath:
relpypath = localpath.relto(pypkgpath)
return relpypath.replace('.py', '.c')
+ return None
+ if hasattr(node.obj, 'graph'):
+ name = invent_nice_name(node.obj.graph)
+ if name is not None:
+ return name
+ elif node._funccodegen_owner is not None:
+ name = invent_nice_name(node._funccodegen_owner.graph)
+ if name is not None:
+ return "data_" + name
return basecname
def splitnodesimpl(self, basecname, nodes, nextra, nbetween,
diff --git a/pypy/translator/c/node.py b/pypy/translator/c/node.py
--- a/pypy/translator/c/node.py
+++ b/pypy/translator/c/node.py
@@ -485,6 +485,7 @@
__slots__ = """db obj
typename implementationtypename
name
+ _funccodegen_owner
globalcontainer""".split()
eci_name = '_compilation_info'
@@ -509,6 +510,7 @@
if self.typename != self.implementationtypename:
if db.gettypedefnode(T).extra_union_for_varlength:
self.name += '.b'
+ self._funccodegen_owner = None
def getptrname(self):
return '(&%s)' % self.name
@@ -842,6 +844,9 @@
if self.funcgens:
argnames = self.funcgens[0].argnames() #Assume identical for all funcgens
self.implementationtypename = self.db.gettype(self.T, argnames=argnames)
+ self._funccodegen_owner = self.funcgens[0]
+ else:
+ self._funccodegen_owner = None
def basename(self):
return self.obj._name
@@ -1005,6 +1010,7 @@
globalcontainer = True
typename = 'PyObject @'
implementationtypename = 'PyObject *@'
+ _funccodegen_owner = None
def __init__(self, db, T, obj):
# obj is a _pyobject here; obj.value is the underlying CPython object
diff --git a/pypy/translator/c/primitive.py b/pypy/translator/c/primitive.py
--- a/pypy/translator/c/primitive.py
+++ b/pypy/translator/c/primitive.py
@@ -141,7 +141,12 @@
def name_gcref(value, db):
if value:
- realobj = value._obj.container
+ obj = value._obj
+ if isinstance(obj, int):
+ # a tagged pointer
+ assert obj & 1 == 1
+ return '((%s) %d)' % (cdecl("void*", ''), obj)
+ realobj = obj.container
realvalue = cast_opaque_ptr(Ptr(typeOf(realobj)), value)
return db.get(realvalue)
else:
diff --git a/pypy/translator/c/test/test_newgc.py b/pypy/translator/c/test/test_newgc.py
--- a/pypy/translator/c/test/test_newgc.py
+++ b/pypy/translator/c/test/test_newgc.py
@@ -1487,6 +1487,43 @@
res = self.run("tagged")
assert res == expected
+ def define_erased(cls):
+ from pypy.rlib import rerased
+ erase, unerase = rerased.new_erasing_pair("test")
+ class Unrelated(object):
+ pass
+
+ u = Unrelated()
+ u.tagged = True
+ u.x = rerased.erase_int(41)
+ class A(object):
+ pass
+ def fn():
+ n = 1
+ while n >= 0:
+ if u.tagged:
+ n = rerased.unerase_int(u.x)
+ a = A()
+ a.n = n - 1
+ u.x = erase(a)
+ u.tagged = False
+ else:
+ n = unerase(u.x).n
+ u.x = rerased.erase_int(n - 1)
+ u.tagged = True
+ def func():
+ rgc.collect() # check that a prebuilt erased integer doesn't explode
+ u.x = rerased.erase_int(1000)
+ u.tagged = True
+ fn()
+ return 1
+ return func
+
+ def test_erased(self):
+ expected = self.run_orig("erased")
+ res = self.run("erased")
+ assert res == expected
+
from pypy.rlib.objectmodel import UnboxedValue
class TaggedBase(object):
More information about the pypy-commit
mailing list