Issue4360
This issue tracker has been migrated to GitHub,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2008-11-20 10:29 by kaizhu, last changed 2022-04-11 14:56 by admin. This issue is now closed.
Files | ||||
---|---|---|---|---|
File name | Uploaded | Description | Edit | |
super-withcell.patch | amaury.forgeotdarc, 2008-11-20 14:16 |
Messages (8) | |||
---|---|---|---|
msg76093 - (view) | Author: kai zhu (kaizhu) | Date: 2008-11-20 10:29 | |
################################ # super_closure.py class A(object): def foo(self): return super() # remove the closure below # & SystemError goes away ??? lambda: self A().foo() ################################ when run on 3.0rc1 & 3.0rc2: hpc-login2 3 ~/work/py3to2: python3.0 super_closure.py Traceback (most recent call last): File "super_closure.py", line 9, in <module> A().foo() File "super_closure.py", line 5, in foo return super() SystemError: super(): __class__ is not a type (A) SystemError seems to b raised from typeobject.c (line6155): static int super_init(PyObject *self, PyObject *args, PyObject *kwds) {... if (!PyType_Check(type)) { PyErr_Format(PyExc_SystemError, "super(): __class__ is not a type (%s)", Py_TYPE(type)->tp_name); return -1; } break; |
|||
msg76094 - (view) | Author: kai zhu (kaizhu) | Date: 2008-11-20 10:59 | |
here's a printout of bytecode from script >>> >>> s = open("super_closure.py").read() >>> c = compile(s, "super_closure.py", "exec") >>> t = py3to2.codetree(c) >>> print( t ) codetree( co_argcount = 0, co_cellvars = (), co_code = b'Gd\x00\x00\x84\x00\x00d\x01\x00e\x00\x00\x83\x03\x00Z\x01\x00e\x01\x00\x83\x00\x00j\x02\x00\x83\x00\x00\x01d\x02\x00S', co_filename = 'super_closure.py', co_firstlineno = 3, co_flags = 64, co_freevars = (), co_kwonlyargcount =0, co_lnotab = b'\x13\x06', co_name = '<module>', co_names = ('object', 'A', 'foo'), co_nlocals = 0, co_stacksize = 4, co_varnames = (), depth = 0, co_consts = ( codetree( co_argcount = 1, co_cellvars = ('__class__',), co_code = b'|\x00\x00Ee\x00\x00Z\x01\x00\x87\x00\x00f\x01\x00d\x00\x00\x86\x00\x00Z\x02\x00\x87\x00\x00S', co_filename = 'super_closure.py', co_firstlineno = 3, co_flags = 2, co_freevars = (), co_kwonlyargcount =0, co_lnotab = b'\n\x01', co_name = 'A', co_names = ('__name__', '__module__', 'foo'), co_nlocals = 1, co_stacksize = 2, co_varnames = ('__locals__',), depth = 1, co_consts = ( codetree( co_argcount = 1, co_cellvars = ('self',), co_code = b't\x00\x00\x83\x00\x00S\x87\x00\x00f\x01\x00d\x01\x00\x86\x00\x00\x01', co_filename = 'super_closure.py', co_firstlineno = 4, co_flags = 3, co_freevars = ('__class__',), co_kwonlyargcount =0, co_lnotab = b'\x00\x01\x07\x03', co_name = 'foo', co_names = ('super',), co_nlocals = 1, co_stacksize = 2, co_varnames = ('self',), depth = 2, co_consts = ( None, codetree( co_argcount = 0, co_cellvars = (), co_code = b'\x88\x00\x00S', co_filename = 'super_closure.py', co_firstlineno = 8, co_flags = 19, co_freevars = ('self',), co_kwonlyargcount =0, co_lnotab = b'', co_name = '<lambda>', co_names = (), co_nlocals = 0, co_stacksize = 1, co_varnames = (), depth = 3, co_consts = ( )), )), )), A, None, )) >>> and disassembly: >>> >>> print( t.dis() ) 3 0 LOAD_BUILD_CLASS 1 LOAD_CONST 0 (<code object A at 0x2a987af9b0, file "super_closure.py", line 3>) 4 MAKE_FUNCTION 0 7 LOAD_CONST 1 ('A') 10 LOAD_NAME 0 (object) 13 CALL_FUNCTION 3 16 STORE_NAME 1 (A) 9 19 LOAD_NAME 1 (A) 22 CALL_FUNCTION 0 25 LOAD_ATTR 2 (foo) 28 CALL_FUNCTION 0 31 POP_TOP 32 LOAD_CONST 2 (None) 35 RETURN_VALUE 3 0 LOAD_FAST 0 (__locals__) 3 STORE_LOCALS 4 LOAD_NAME 0 (__name__) 7 STORE_NAME 1 (__module__) 4 10 LOAD_CLOSURE 0 (__class__) 13 BUILD_TUPLE 1 16 LOAD_CONST 0 (<code object foo at 0x2a987afd30, file "super_closure.py", line 4>) 19 MAKE_CLOSURE 0 22 STORE_NAME 2 (foo) 25 LOAD_CLOSURE 0 (__class__) 28 RETURN_VALUE 5 0 LOAD_GLOBAL 0 (super) 3 CALL_FUNCTION 0 6 RETURN_VALUE 8 7 LOAD_CLOSURE 0 (self) 10 BUILD_TUPLE 1 13 LOAD_CONST 1 (<code object <lambda> at 0x2a984c0530, file "super_closure.py", line 8>) 16 MAKE_CLOSURE 0 19 POP_TOP 8 0 LOAD_DEREF 0 (self) 3 RETURN_VALUE >>> |
|||
msg76095 - (view) | Author: kai zhu (kaizhu) | Date: 2008-11-20 11:10 | |
same thing, except w/ closure commented out (& everything is happy) ################################ # super_ok.py class A(object): def foo(self): return super() # comment the closure below # & SystemError goes away # lambda: self A().foo() ################################ >>> >>> s = open("super_ok.py").read() >>> c = compile(s, "super_ok.py", "exec") >>> t = py3to2.codetree(t) >>> print( t ) codetree( co_argcount = 0, co_cellvars = (), co_code = b'Gd\x00\x00\x84\x00\x00d\x01\x00e\x00\x00\x83\x03\x00Z\x01\x00e\x01\x00\x83\x00\x00j\x02\x00\x83\x00\x00\x01d\x02\x00S', co_filename = 'super_closure.py', co_firstlineno = 3, co_flags = 64, co_freevars = (), co_kwonlyargcount =0, co_lnotab = b'\x13\x06', co_name = '<module>', co_names = ('object', 'A', 'foo'), co_nlocals = 0, co_stacksize = 4, co_varnames = (), depth = 0, co_consts = ( codetree( co_argcount = 1, co_cellvars = ('__class__',), co_code = b'|\x00\x00Ee\x00\x00Z\x01\x00\x87\x00\x00f\x01\x00d\x00\x00\x86\x00\x00Z\x02\x00\x87\x00\x00S', co_filename = 'super_closure.py', co_firstlineno = 3, co_flags = 2, co_freevars = (), co_kwonlyargcount =0, co_lnotab = b'\n\x01', co_name = 'A', co_names = ('__name__', '__module__', 'foo'), co_nlocals = 1, co_stacksize = 2, co_varnames = ('__locals__',), depth = 1, co_consts = ( codetree( co_argcount = 1, co_cellvars = ('self',), co_code = b't\x00\x00\x83\x00\x00S\x87\x00\x00f\x01\x00d\x01\x00\x86\x00\x00\x01', co_filename = 'super_closure.py', co_firstlineno = 4, co_flags = 3, co_freevars = ('__class__',), co_kwonlyargcount =0, co_lnotab = b'\x00\x01\x07\x03', co_name = 'foo', co_names = ('super',), co_nlocals = 1, co_stacksize = 2, co_varnames = ('self',), depth = 2, co_consts = ( None, codetree( co_argcount = 0, co_cellvars = (), co_code = b'\x88\x00\x00S', co_filename = 'super_closure.py', co_firstlineno = 8, co_flags = 19, co_freevars = ('self',), co_kwonlyargcount =0, co_lnotab = b'', co_name = '<lambda>', co_names = (), co_nlocals = 0, co_stacksize = 1, co_varnames = (), depth = 3, co_consts = ( )), )), )), A, None, )) >>> >>> print( t.dis() ) 3 0 LOAD_BUILD_CLASS 1 LOAD_CONST 0 (<code object A at 0x2a987af2b0, file "super_closure.py", line 3>) 4 MAKE_FUNCTION 0 7 LOAD_CONST 1 ('A') 10 LOAD_NAME 0 (object) 13 CALL_FUNCTION 3 16 STORE_NAME 1 (A) 9 19 LOAD_NAME 1 (A) 22 CALL_FUNCTION 0 25 LOAD_ATTR 2 (foo) 28 CALL_FUNCTION 0 31 POP_TOP 32 LOAD_CONST 2 (None) 35 RETURN_VALUE 3 0 LOAD_FAST 0 (__locals__) 3 STORE_LOCALS 4 LOAD_NAME 0 (__name__) 7 STORE_NAME 1 (__module__) 4 10 LOAD_CLOSURE 0 (__class__) 13 BUILD_TUPLE 1 16 LOAD_CONST 0 (<code object foo at 0x2a987af4b0, file "super_closure.py", line 4>) 19 MAKE_CLOSURE 0 22 STORE_NAME 2 (foo) 25 LOAD_CLOSURE 0 (__class__) 28 RETURN_VALUE 5 0 LOAD_GLOBAL 0 (super) 3 CALL_FUNCTION 0 6 RETURN_VALUE 8 7 LOAD_CLOSURE 0 (self) 10 BUILD_TUPLE 1 13 LOAD_CONST 1 (<code object <lambda> at 0x2a987af5b0, file "super_closure.py", line 8>) 16 MAKE_CLOSURE 0 19 POP_TOP 8 0 LOAD_DEREF 0 (self) 3 RETURN_VALUE >>> |
|||
msg76096 - (view) | Author: kai zhu (kaizhu) | Date: 2008-11-20 11:18 | |
oops, sorry reprinted the same code ^^;;; ignore previous post, & use this: (sorry again for mucking up this page) ################################ # super_ok.py class A(object): def foo(self): return super() # comment the closure below # & SystemError goes away # lambda: self A().foo() ################################ >>> s = open("super_ok.py").read(); c = compile(s, "super_ok.py", "exec"); t = py3to2.codetree(c) >>> print( t ) codetree( co_argcount = 0, co_cellvars = (), co_code = b'Gd\x00\x00\x84\x00\x00d\x01\x00e\x00\x00\x83\x03\x00Z\x01\x00e\x01\x00\x83\x00\x00j\x02\x00\x83\x00\x00\x01d\x02\x00S', co_filename = 'super_ok.py', co_firstlineno = 3, co_flags = 64, co_freevars = (), co_kwonlyargcount =0, co_lnotab = b'\x13\x06', co_name = '<module>', co_names = ('object', 'A', 'foo'), co_nlocals = 0, co_stacksize = 4, co_varnames = (), depth = 0, co_consts = ( codetree( co_argcount = 1, co_cellvars = ('__class__',), co_code = b'|\x00\x00Ee\x00\x00Z\x01\x00\x87\x00\x00f\x01\x00d\x00\x00\x86\x00\x00Z\x02\x00\x87\x00\x00S', co_filename = 'super_ok.py', co_firstlineno = 3, co_flags = 2, co_freevars = (), co_kwonlyargcount =0, co_lnotab = b'\n\x01', co_name = 'A', co_names = ('__name__', '__module__', 'foo'), co_nlocals = 1, co_stacksize = 2, co_varnames = ('__locals__',), depth = 1, co_consts = ( codetree( co_argcount = 1, co_cellvars = (), co_code = b't\x00\x00\x83\x00\x00S', co_filename = 'super_ok.py', co_firstlineno = 4, co_flags = 3, co_freevars = ('__class__',), co_kwonlyargcount =0, co_lnotab = b'\x00\x01', co_name = 'foo', co_names = ('super',), co_nlocals = 1, co_stacksize = 1, co_varnames = ('self',), depth = 2, co_consts = ( None, )), )), A, None, )) >>> print( t.dis() ) 3 0 LOAD_BUILD_CLASS 1 LOAD_CONST 0 (<code object A at 0x2a987afd30, file "super_ok.py", line 3>) 4 MAKE_FUNCTION 0 7 LOAD_CONST 1 ('A') 10 LOAD_NAME 0 (object) 13 CALL_FUNCTION 3 16 STORE_NAME 1 (A) 9 19 LOAD_NAME 1 (A) 22 CALL_FUNCTION 0 25 LOAD_ATTR 2 (foo) 28 CALL_FUNCTION 0 31 POP_TOP 32 LOAD_CONST 2 (None) 35 RETURN_VALUE 3 0 LOAD_FAST 0 (__locals__) 3 STORE_LOCALS 4 LOAD_NAME 0 (__name__) 7 STORE_NAME 1 (__module__) 4 10 LOAD_CLOSURE 0 (__class__) 13 BUILD_TUPLE 1 16 LOAD_CONST 0 (<code object foo at 0x2a984c0530, file "super_ok.py", line 4>) 19 MAKE_CLOSURE 0 22 STORE_NAME 2 (foo) 25 LOAD_CLOSURE 0 (__class__) 28 RETURN_VALUE 5 0 LOAD_GLOBAL 0 (super) 3 CALL_FUNCTION 0 6 RETURN_VALUE >>> |
|||
msg76103 - (view) | Author: Amaury Forgeot d'Arc (amaury.forgeotdarc) * | Date: 2008-11-20 14:16 | |
In a running frame, f->f_localplus is a vector composed of: - the values of the local variables - the cells containing variables used in a nested closure. - the values of free variables defined in a outer scope. super() needs to access the free var containing the enclosing class object, but forgets to account for the number of cells... The attached patch corrects the problem. |
|||
msg76104 - (view) | Author: Christian Heimes (christian.heimes) * | Date: 2008-11-20 14:19 | |
Yet another release blocker for Barry. Good work, Amaury. |
|||
msg76129 - (view) | Author: Brett Cannon (brett.cannon) * | Date: 2008-11-20 18:57 | |
The patch looks good to me. |
|||
msg76133 - (view) | Author: Barry A. Warsaw (barry) * | Date: 2008-11-20 20:02 | |
patch applied; r67299 |
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-04-11 14:56:41 | admin | set | github: 48610 |
2008-11-20 20:02:17 | barry | set | status: open -> closed messages: + msg76133 |
2008-11-20 18:58:05 | brett.cannon | set | keywords:
- needs review stage: patch review -> commit review |
2008-11-20 18:57:51 | brett.cannon | set | nosy:
+ brett.cannon messages: + msg76129 |
2008-11-20 14:19:34 | christian.heimes | set | nosy:
+ christian.heimes, barry messages: + msg76104 priority: release blocker assignee: barry components: - Build resolution: accepted stage: patch review |
2008-11-20 14:16:22 | amaury.forgeotdarc | set | keywords:
+ needs review, patch files: + super-withcell.patch messages: + msg76103 nosy: + amaury.forgeotdarc |
2008-11-20 11:18:50 | kaizhu | set | messages: + msg76096 |
2008-11-20 11:10:28 | kaizhu | set | messages: + msg76095 |
2008-11-20 10:59:15 | kaizhu | set | messages: + msg76094 |
2008-11-20 10:29:19 | kaizhu | create |