Commit b1cc6aa2 authored by Mark Dickinson's avatar Mark Dickinson

Issue #9011: AST creation no longer modifies CST for negated numeric literals.

parent 1658797a
......@@ -567,6 +567,17 @@ class CompileTestCase(unittest.TestCase):
st = parser.suite('a = u"\u1"')
self.assertRaises(SyntaxError, parser.compilest, st)
def test_issue_9011(self):
# Issue 9011: compilation of an unary minus expression changed
# the meaning of the ST, so that a second compilation produced
# incorrect results.
st = parser.expr('-3')
code1 = parser.compilest(st)
self.assertEqual(eval(code1), -3)
code2 = parser.compilest(st)
self.assertEqual(eval(code2), -3)
class ParserStackLimitTestCase(unittest.TestCase):
"""try to push the parser to/over it's limits.
see http://bugs.python.org/issue1881 for a discussion
......
......@@ -9,6 +9,9 @@ What's New in Python 2.7.4
Core and Builtins
-----------------
- Issue #9011: Fix hacky AST code that modified the CST when compiling
a negated numeric literal.
- Issue #16306: Fix multiple error messages when unknown command line
parameters where passed to the interpreter. Patch by Hieu Nguyen.
......
......@@ -1744,14 +1744,19 @@ ast_for_factor(struct compiling *c, const node *n)
NCH(ppower) == 1 &&
TYPE((patom = CHILD(ppower, 0))) == atom &&
TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
PyObject *pynum;
char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
if (s == NULL)
return NULL;
s[0] = '-';
strcpy(s + 1, STR(pnum));
PyObject_FREE(STR(pnum));
STR(pnum) = s;
return ast_for_atom(c, patom);
pynum = parsenumber(c, s);
PyObject_FREE(s);
if (!pynum)
return NULL;
PyArena_AddPyObject(c->c_arena, pynum);
return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
}
expression = ast_for_expr(c, CHILD(n, 1));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment