Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r62323:80061bd0e2b6
Date: 2013-03-12 16:03 -0700
http://bitbucket.org/pypy/pypy/changeset/80061bd0e2b6/
Log: properly decode *all* AST identifiers
diff --git a/pypy/interpreter/astcompiler/ast.py
b/pypy/interpreter/astcompiler/ast.py
--- a/pypy/interpreter/astcompiler/ast.py
+++ b/pypy/interpreter/astcompiler/ast.py
@@ -3105,7 +3105,9 @@
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'name')
- return space.wrap(w_self.name)
+ if w_self.name is None:
+ return space.w_None
+ return space.wrap(w_self.name.decode('utf-8'))
def FunctionDef_set_name(space, w_self, w_new_value):
try:
@@ -3237,7 +3239,9 @@
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'name')
- return space.wrap(w_self.name)
+ if w_self.name is None:
+ return space.w_None
+ return space.wrap(w_self.name.decode('utf-8'))
def ClassDef_set_name(space, w_self, w_new_value):
try:
@@ -4368,7 +4372,9 @@
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'module')
- return space.wrap(w_self.module)
+ if w_self.module is None:
+ return space.w_None
+ return space.wrap(w_self.module.decode('utf-8'))
def ImportFrom_set_module(space, w_self, w_new_value):
try:
@@ -5947,7 +5953,9 @@
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'attr')
- return space.wrap(w_self.attr)
+ if w_self.attr is None:
+ return space.w_None
+ return space.wrap(w_self.attr.decode('utf-8'))
def Attribute_set_attr(space, w_self, w_new_value):
try:
@@ -6190,7 +6198,9 @@
if not w_self.initialization_state & 4:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'id')
- return space.wrap(w_self.id)
+ if w_self.id is None:
+ return space.w_None
+ return space.wrap(w_self.id.decode('utf-8'))
def Name_set_id(space, w_self, w_new_value):
try:
@@ -7078,7 +7088,9 @@
if not w_self.initialization_state & 8:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'name')
- return space.wrap(w_self.name)
+ if w_self.name is None:
+ return space.w_None
+ return space.wrap(w_self.name.decode('utf-8'))
def ExceptHandler_set_name(space, w_self, w_new_value):
try:
@@ -7164,7 +7176,9 @@
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'vararg')
- return space.wrap(w_self.vararg)
+ if w_self.vararg is None:
+ return space.w_None
+ return space.wrap(w_self.vararg.decode('utf-8'))
def arguments_set_vararg(space, w_self, w_new_value):
try:
@@ -7230,7 +7244,9 @@
if not w_self.initialization_state & 16:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'kwarg')
- return space.wrap(w_self.kwarg)
+ if w_self.kwarg is None:
+ return space.w_None
+ return space.wrap(w_self.kwarg.decode('utf-8'))
def arguments_set_kwarg(space, w_self, w_new_value):
try:
@@ -7348,7 +7364,9 @@
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'arg')
- return space.wrap(w_self.arg)
+ if w_self.arg is None:
+ return space.w_None
+ return space.wrap(w_self.arg.decode('utf-8'))
def arg_set_arg(space, w_self, w_new_value):
try:
@@ -7419,7 +7437,9 @@
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'arg')
- return space.wrap(w_self.arg)
+ if w_self.arg is None:
+ return space.w_None
+ return space.wrap(w_self.arg.decode('utf-8'))
def keyword_set_arg(space, w_self, w_new_value):
try:
@@ -7490,7 +7510,9 @@
if not w_self.initialization_state & 1:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'name')
- return space.wrap(w_self.name)
+ if w_self.name is None:
+ return space.w_None
+ return space.wrap(w_self.name.decode('utf-8'))
def alias_set_name(space, w_self, w_new_value):
try:
@@ -7512,7 +7534,9 @@
if not w_self.initialization_state & 2:
typename = space.type(w_self).getname(space)
raise operationerrfmt(space.w_AttributeError, "'%s' object has no
attribute '%s'", typename, 'asname')
- return space.wrap(w_self.asname)
+ if w_self.asname is None:
+ return space.w_None
+ return space.wrap(w_self.asname.decode('utf-8'))
def alias_set_asname(space, w_self, w_new_value):
try:
diff --git a/pypy/interpreter/astcompiler/tools/asdl_py.py
b/pypy/interpreter/astcompiler/tools/asdl_py.py
--- a/pypy/interpreter/astcompiler/tools/asdl_py.py
+++ b/pypy/interpreter/astcompiler/tools/asdl_py.py
@@ -438,6 +438,10 @@
self.emit("return %s_to_class[w_self.%s - 1]()" % config, 1)
elif field.type.value in ("object", "string"):
self.emit("return w_self.%s" % (field.name,), 1)
+ elif field.type.value == 'identifier':
+ self.emit("if w_self.%s is None:" % (field.name,), 1)
+ self.emit("return space.w_None", 2)
+ self.emit("return space.wrap(w_self.%s.decode('utf-8'))" %
(field.name,), 1)
else:
self.emit("return space.wrap(w_self.%s)" % (field.name,), 1)
self.emit("")
diff --git a/pypy/module/_ast/test/test_ast.py
b/pypy/module/_ast/test/test_ast.py
--- a/pypy/module/_ast/test/test_ast.py
+++ b/pypy/module/_ast/test/test_ast.py
@@ -86,10 +86,29 @@
name.id = "hi"
assert name.id == "hi"
- def test_unicode_identifier(self):
+ def test_name_pep3131(self):
name = self.get_ast("日本", "eval").body
+ assert isinstance(name, self.ast.Name)
assert name.id == "日本"
+ def test_function_pep3131(self):
+ fn = self.get_ast("def µ(µ='foo'): pass").body[0]
+ assert isinstance(fn, self.ast.FunctionDef)
+ # µ normalized to NFKC
+ expected = '\u03bc'
+ assert fn.name == expected
+ assert fn.args.args[0].arg == expected
+
+ def test_import_pep3131(self):
+ ast = self.ast
+ im = self.get_ast("from packageµ import modµ as
µ").body[0]
+ assert isinstance(im, ast.ImportFrom)
+ expected = '\u03bc'
+ assert im.module == 'package' + expected
+ alias = im.names[0]
+ assert alias.name == 'mod' + expected
+ assert alias.asname == expected
+
@py.test.mark.skipif("py.test.config.option.runappdirect")
def test_object(self):
ast = self.ast
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit