[pypy-commit] pypy default: Issue 2551: Struct should be initialized in __init__, not __new__
amauryfa
pypy.commits at gmail.com
Fri May 5 12:49:34 EDT 2017
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r91189:f452cdf49d49
Date: 2017-05-04 00:23 +0200
http://bitbucket.org/pypy/pypy/changeset/f452cdf49d49/
Log: Issue 2551: Struct should be initialized in __init__, not __new__
diff --git a/pypy/module/struct/interp_struct.py b/pypy/module/struct/interp_struct.py
--- a/pypy/module/struct/interp_struct.py
+++ b/pypy/module/struct/interp_struct.py
@@ -115,16 +115,17 @@
class W_Struct(W_Root):
_immutable_fields_ = ["format", "size"]
- def __init__(self, space, format):
+ format = ""
+ size = -1
+
+ def descr__new__(space, w_subtype, __args__):
+ return space.allocate_instance(W_Struct, w_subtype)
+
+ @unwrap_spec(format='text')
+ def descr__init__(self, space, format):
self.format = format
self.size = _calcsize(space, format)
- @unwrap_spec(format='text')
- def descr__new__(space, w_subtype, format):
- self = space.allocate_instance(W_Struct, w_subtype)
- W_Struct.__init__(self, space, format)
- return self
-
def descr_pack(self, space, args_w):
return pack(space, jit.promote_string(self.format), args_w)
@@ -141,6 +142,7 @@
W_Struct.typedef = TypeDef("Struct",
__new__=interp2app(W_Struct.descr__new__.im_func),
+ __init__=interp2app(W_Struct.descr__init__),
format=interp_attrproperty("format", cls=W_Struct, wrapfn="newbytes"),
size=interp_attrproperty("size", cls=W_Struct, wrapfn="newint"),
diff --git a/pypy/module/struct/test/test_struct.py b/pypy/module/struct/test/test_struct.py
--- a/pypy/module/struct/test/test_struct.py
+++ b/pypy/module/struct/test/test_struct.py
@@ -429,6 +429,14 @@
assert s.unpack(s.pack(42)) == (42,)
assert s.unpack_from(memoryview(s.pack(42))) == (42,)
+ def test_struct_subclass(self):
+ class S(self.struct.Struct):
+ def __init__(self):
+ assert self.size == -1
+ super(S, self).__init__('c')
+ assert self.size == 1
+ assert S().unpack('a') == ('a',)
+
def test_overflow(self):
raises(self.struct.error, self.struct.pack, 'i', 1<<65)
More information about the pypy-commit
mailing list