Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
cython
Commits
c26fb663
Commit
c26fb663
authored
7 years ago
by
Robert Bradshaw
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of github.com:cython/cython
parents
aae6c5c9
85562685
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
49 additions
and
5 deletions
+49
-5
CHANGES.rst
CHANGES.rst
+3
-0
Cython/Compiler/ExprNodes.py
Cython/Compiler/ExprNodes.py
+1
-1
Cython/Compiler/Optimize.py
Cython/Compiler/Optimize.py
+17
-4
tests/run/fstring.pyx
tests/run/fstring.pyx
+28
-0
No files found.
CHANGES.rst
View file @
c26fb663
...
@@ -50,6 +50,9 @@ Bugs fixed
...
@@ -50,6 +50,9 @@ Bugs fixed
* abs(signed int) now returns a signed rather than unsigned int.
* abs(signed int) now returns a signed rather than unsigned int.
(Github issue #1837)
(Github issue #1837)
* Compile time evaluations of (partially) constant f-strings could show incorrect
results.
Other changes
Other changes
-------------
-------------
...
...
This diff is collapsed.
Click to expand it.
Cython/Compiler/ExprNodes.py
View file @
c26fb663
...
@@ -3126,7 +3126,7 @@ class FormattedValueNode(ExprNode):
...
@@ -3126,7 +3126,7 @@ class FormattedValueNode(ExprNode):
self
.
format_spec
=
self
.
format_spec
.
analyse_types
(
env
).
coerce_to_pyobject
(
env
)
self
.
format_spec
=
self
.
format_spec
.
analyse_types
(
env
).
coerce_to_pyobject
(
env
)
if
self
.
c_format_spec
is
None
:
if
self
.
c_format_spec
is
None
:
self
.
value
=
self
.
value
.
coerce_to_pyobject
(
env
)
self
.
value
=
self
.
value
.
coerce_to_pyobject
(
env
)
if
not
self
.
format_spec
and
not
self
.
conversion_char
:
if
not
self
.
format_spec
and
(
not
self
.
conversion_char
or
self
.
conversion_char
==
's'
)
:
if
self
.
value
.
type
is
unicode_type
and
not
self
.
value
.
may_be_none
():
if
self
.
value
.
type
is
unicode_type
and
not
self
.
value
.
may_be_none
():
# value is definitely a unicode string and we don't format it any special
# value is definitely a unicode string and we don't format it any special
return
self
.
value
return
self
.
value
...
...
This diff is collapsed.
Click to expand it.
Cython/Compiler/Optimize.py
View file @
c26fb663
...
@@ -3959,10 +3959,21 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
...
@@ -3959,10 +3959,21 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
def
visit_FormattedValueNode
(
self
,
node
):
def
visit_FormattedValueNode
(
self
,
node
):
self
.
visitchildren
(
node
)
self
.
visitchildren
(
node
)
conversion_char
=
node
.
conversion_char
or
's'
if
isinstance
(
node
.
format_spec
,
ExprNodes
.
UnicodeNode
)
and
not
node
.
format_spec
.
value
:
if
isinstance
(
node
.
format_spec
,
ExprNodes
.
UnicodeNode
)
and
not
node
.
format_spec
.
value
:
node
.
format_spec
=
None
node
.
format_spec
=
None
if
node
.
format_spec
is
None
and
node
.
conversion_char
is
None
and
isinstance
(
node
.
value
,
ExprNodes
.
UnicodeNode
):
if
node
.
format_spec
is
None
and
isinstance
(
node
.
value
,
ExprNodes
.
IntNode
):
return
node
.
value
value
=
EncodedString
(
node
.
value
.
value
)
if
value
.
isdigit
():
return
ExprNodes
.
UnicodeNode
(
node
.
value
.
pos
,
value
=
value
,
constant_result
=
value
)
if
node
.
format_spec
is
None
and
conversion_char
==
's'
:
value
=
None
if
isinstance
(
node
.
value
,
ExprNodes
.
UnicodeNode
):
value
=
node
.
value
.
value
elif
isinstance
(
node
.
value
,
ExprNodes
.
StringNode
):
value
=
node
.
value
.
unicode_value
if
value
is
not
None
:
return
ExprNodes
.
UnicodeNode
(
node
.
value
.
pos
,
value
=
value
,
constant_result
=
value
)
return
node
return
node
def
visit_JoinedStrNode
(
self
,
node
):
def
visit_JoinedStrNode
(
self
,
node
):
...
@@ -3980,7 +3991,8 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
...
@@ -3980,7 +3991,8 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
substrings
=
list
(
substrings
)
substrings
=
list
(
substrings
)
unode
=
substrings
[
0
]
unode
=
substrings
[
0
]
if
len
(
substrings
)
>
1
:
if
len
(
substrings
)
>
1
:
unode
.
value
=
EncodedString
(
u''
.
join
(
value
.
value
for
value
in
substrings
))
value
=
EncodedString
(
u''
.
join
(
value
.
value
for
value
in
substrings
))
unode
=
ExprNodes
.
UnicodeNode
(
unode
.
pos
,
value
=
value
,
constant_result
=
value
)
# ignore empty Unicode strings
# ignore empty Unicode strings
if
unode
.
value
:
if
unode
.
value
:
values
.
append
(
unode
)
values
.
append
(
unode
)
...
@@ -3988,7 +4000,8 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
...
@@ -3988,7 +4000,8 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
values
.
extend
(
substrings
)
values
.
extend
(
substrings
)
if
not
values
:
if
not
values
:
node
=
ExprNodes
.
UnicodeNode
(
node
.
pos
,
value
=
EncodedString
(
''
))
value
=
EncodedString
(
''
)
node
=
ExprNodes
.
UnicodeNode
(
node
.
pos
,
value
=
value
,
constant_result
=
value
)
elif
len
(
values
)
==
1
:
elif
len
(
values
)
==
1
:
node
=
values
[
0
]
node
=
values
[
0
]
elif
len
(
values
)
==
2
:
elif
len
(
values
)
==
2
:
...
...
This diff is collapsed.
Click to expand it.
tests/run/fstring.pyx
View file @
c26fb663
...
@@ -5,6 +5,8 @@
...
@@ -5,6 +5,8 @@
# Cython specific PEP 498 tests in addition to test_fstring.pyx from CPython
# Cython specific PEP 498 tests in addition to test_fstring.pyx from CPython
####
####
cimport
cython
import
sys
import
sys
IS_PYPY
=
hasattr
(
sys
,
'pypy_version_info'
)
IS_PYPY
=
hasattr
(
sys
,
'pypy_version_info'
)
...
@@ -18,13 +20,39 @@ max_long = LONG_MAX
...
@@ -18,13 +20,39 @@ max_long = LONG_MAX
min_long
=
LONG_MIN
min_long
=
LONG_MIN
@
cython
.
test_fail_if_path_exists
(
"//FormattedValueNode"
,
"//JoinedStrNode"
,
"//AddNode"
,
)
def
escaping
():
def
escaping
():
"""
"""
>>> escaping()
>>> escaping()
"""
"""
assert
f'{{{{
{
"abc"
}
}}}}{{}}{{'
==
'{{abc}}{}{'
assert
f'{{{{
{
"abc"
}
}}}}{{}}{{'
==
'{{abc}}{}{'
s
=
f'{{{{
{
"abc"
}
}}}}{{}}{{'
assert
s
==
'{{abc}}{}{'
,
s
assert
f'
\
x7b
}}'
==
'{}'
assert
f'
\
x7b
}}'
==
'{}'
s
=
f'
\
x7b
}}'
assert
s
==
'{}'
,
s
assert
f'
{
"
{{}}
"
}
'
==
'{{}}'
assert
f'
{
"
{{}}
"
}
'
==
'{{}}'
s
=
f'
{
"
{{}}
"
}
'
assert
s
==
'{{}}'
,
s
@
cython
.
test_fail_if_path_exists
(
"//FormattedValueNode"
,
"//JoinedStrNode"
,
"//AddNode"
,
)
def
nested_constant
():
"""
>>> print(nested_constant())
xyabc123321
"""
return
f"""
{
f'''xy
{
f"abc
{
123
}{
'321'
}
"!s
}
'''
}
"""
def
format2
(
ab
,
cd
):
def
format2
(
ab
,
cd
):
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment