Bugs item #1557232, was opened at 2006-09-12 08:28 Message generated for change (Comment added) made by nnorwitz You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1557232&group_id=5470
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Parser/Compiler Group: Python 2.5 Status: Open Resolution: None Priority: 7 Submitted By: Martin v. Löwis (loewis) Assigned to: Nobody/Anonymous (nobody) Summary: Parser crash Initial Comment: The code def x(((y))):pass crashes the compiler (?) in 2.5c2, on Windows. ---------------------------------------------------------------------- >Comment By: Neal Norwitz (nnorwitz) Date: 2006-09-22 01:21 Message: Logged In: YES user_id=33168 Committed revision 51972. (2.6) Still needs backport. ---------------------------------------------------------------------- Comment By: Neal Norwitz (nnorwitz) Date: 2006-09-17 22:55 Message: Logged In: YES user_id=33168 Attaching a new patch with tests. There probably should be more tests, but this is all I can think of at this point. I think I've covered the cases of the recursive definition properly now. Conceptually this is a very small patch. I've added a bunch of asserts and broken some complex lines up though. The first chunk deals with complex_args and elides superfluous parens around (x). The second chunk does the same eliding but for non-complex args. Any number of extra parens should be elided properly now. I will apply to head and 2.5.1 later. ---------------------------------------------------------------------- Comment By: Neal Norwitz (nnorwitz) Date: 2006-09-13 00:44 Message: Logged In: YES user_id=33168 I think patch v2 might fix both problems. I'm not sure it's correct. We really need a lot of tests for this stuff. ---------------------------------------------------------------------- Comment By: Neal Norwitz (nnorwitz) Date: 2006-09-12 23:22 Message: Logged In: YES user_id=33168 The attached patch seems to fix the ((((x)))) problem. I didn't run in debug mode, so I'm not positive the assert works as I expect. However now my test case below doesn't work, it puts in 5 UNPACK_SEQUENCES rather than 3. This looks like a different problem in compiler_complex_args(). Not sure how much farther I'll get tonight. ---------------------------------------------------------------------- Comment By: Neal Norwitz (nnorwitz) Date: 2006-09-12 23:00 Message: Logged In: YES user_id=33168 I guess what 2.4 does is the most reasonable behavior: >>> def f((((((x)),),),)): pass >>> dis.dis(f) 1 0 LOAD_FAST 0 (.0) 3 UNPACK_SEQUENCE 1 6 UNPACK_SEQUENCE 1 9 UNPACK_SEQUENCE 1 12 STORE_FAST 1 (x) 15 LOAD_CONST 0 (None) 18 RETURN_VALUE ---------------------------------------------------------------------- Comment By: Neal Norwitz (nnorwitz) Date: 2006-09-12 22:50 Message: Logged In: YES user_id=33168 The problem is in Python/ast.c around line 666. See the comment: /* def foo((x)): setup for checking NAME below. */ The code is not sufficient, we need a loop and need to handle various combinations of: def f(((((x))),)),))): pass I don't know if the parens above match, but the general idea is that there could be a bunch of parens and commas at various places. I'm not sure how the above should be interpreted. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1557232&group_id=5470 _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com