mirror of
https://github.com/python/cpython.git
synced 2025-11-17 01:25:57 +00:00
merge 3.2 (#14378)
This commit is contained in:
commit
98ba753432
3 changed files with 13 additions and 9 deletions
|
|
@ -226,6 +226,12 @@ class AST_Tests(unittest.TestCase):
|
||||||
im = ast.parse("from . import y").body[0]
|
im = ast.parse("from . import y").body[0]
|
||||||
self.assertIsNone(im.module)
|
self.assertIsNone(im.module)
|
||||||
|
|
||||||
|
def test_non_interned_future_from_ast(self):
|
||||||
|
mod = ast.parse("from __future__ import division")
|
||||||
|
self.assertIsInstance(mod.body[0], ast.ImportFrom)
|
||||||
|
mod.body[0].module = " __future__ ".strip()
|
||||||
|
compile(mod, "<test>", "exec")
|
||||||
|
|
||||||
def test_base_classes(self):
|
def test_base_classes(self):
|
||||||
self.assertTrue(issubclass(ast.For, ast.stmt))
|
self.assertTrue(issubclass(ast.For, ast.stmt))
|
||||||
self.assertTrue(issubclass(ast.Name, ast.expr))
|
self.assertTrue(issubclass(ast.Name, ast.expr))
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,11 @@ Core and Builtins
|
||||||
- Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
|
- Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
|
||||||
are passed arguments and their complementary method is not overridden.
|
are passed arguments and their complementary method is not overridden.
|
||||||
|
|
||||||
- Give the ast.AST class a __dict__.
|
- Issue #14378: Fix compiling ast.ImportFrom nodes with a "__future__" string as
|
||||||
|
the module name that was not interned.
|
||||||
|
|
||||||
|
- Issue #14331: Use significantly less stack space when importing modules by
|
||||||
|
allocating path buffers on the heap instead of the stack.
|
||||||
|
|
||||||
- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
|
- Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
|
||||||
passed strings.
|
passed strings.
|
||||||
|
|
|
||||||
|
|
@ -60,13 +60,6 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
|
||||||
{
|
{
|
||||||
int i, found_docstring = 0, done = 0, prev_line = 0;
|
int i, found_docstring = 0, done = 0, prev_line = 0;
|
||||||
|
|
||||||
static PyObject *future;
|
|
||||||
if (!future) {
|
|
||||||
future = PyUnicode_InternFromString("__future__");
|
|
||||||
if (!future)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
|
if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
@ -93,7 +86,8 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (s->kind == ImportFrom_kind) {
|
if (s->kind == ImportFrom_kind) {
|
||||||
if (s->v.ImportFrom.module == future) {
|
PyObject *modname = s->v.ImportFrom.module;
|
||||||
|
if (!PyUnicode_CompareWithASCIIString(modname, "__future__")) {
|
||||||
if (done) {
|
if (done) {
|
||||||
PyErr_SetString(PyExc_SyntaxError,
|
PyErr_SetString(PyExc_SyntaxError,
|
||||||
ERR_LATE_FUTURE);
|
ERR_LATE_FUTURE);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue