Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
e0aef4f3
Commit
e0aef4f3
authored
Dec 25, 2017
by
Yury Selivanov
Committed by
GitHub
Dec 25, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bpo-31721: Allow Future._log_traceback to only be set to False (#5009)
parent
3070b71e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
37 additions
and
6 deletions
+37
-6
Lib/asyncio/futures.py
Lib/asyncio/futures.py
+16
-6
Lib/test/test_asyncio/test_futures.py
Lib/test/test_asyncio/test_futures.py
+5
-0
Lib/test/test_asyncio/test_tasks.py
Lib/test/test_asyncio/test_tasks.py
+9
-0
Misc/NEWS.d/next/Library/2017-12-25-11-09-46.bpo-31721.5gM972.rst
...S.d/next/Library/2017-12-25-11-09-46.bpo-31721.5gM972.rst
+2
-0
Modules/_asynciomodule.c
Modules/_asynciomodule.c
+5
-0
No files found.
Lib/asyncio/futures.py
View file @
e0aef4f3
...
...
@@ -65,7 +65,7 @@ class Future:
# `yield Future()` (incorrect).
_asyncio_future_blocking
=
False
_log_traceback
=
False
_
_
log_traceback
=
False
def
__init__
(
self
,
*
,
loop
=
None
):
"""Initialize the future.
...
...
@@ -90,7 +90,7 @@ class Future:
' '
.
join
(
self
.
_repr_info
()))
def
__del__
(
self
):
if
not
self
.
_log_traceback
:
if
not
self
.
_
_
log_traceback
:
# set_exception() was not called, or result() or exception()
# has consumed the exception
return
...
...
@@ -105,6 +105,16 @@ class Future:
context
[
'source_traceback'
]
=
self
.
_source_traceback
self
.
_loop
.
call_exception_handler
(
context
)
@
property
def
_log_traceback
(
self
):
return
self
.
__log_traceback
@
_log_traceback
.
setter
def
_log_traceback
(
self
,
val
):
if
bool
(
val
):
raise
ValueError
(
'_log_traceback can only be set to False'
)
self
.
__log_traceback
=
False
def
get_loop
(
self
):
"""Return the event loop the Future is bound to."""
return
self
.
_loop
...
...
@@ -116,7 +126,7 @@ class Future:
change the future's state to cancelled, schedule the callbacks and
return True.
"""
self
.
_log_traceback
=
False
self
.
_
_
log_traceback
=
False
if
self
.
_state
!=
_PENDING
:
return
False
self
.
_state
=
_CANCELLED
...
...
@@ -162,7 +172,7 @@ class Future:
raise
CancelledError
if
self
.
_state
!=
_FINISHED
:
raise
InvalidStateError
(
'Result is not ready.'
)
self
.
_log_traceback
=
False
self
.
_
_
log_traceback
=
False
if
self
.
_exception
is
not
None
:
raise
self
.
_exception
return
self
.
_result
...
...
@@ -179,7 +189,7 @@ class Future:
raise
CancelledError
if
self
.
_state
!=
_FINISHED
:
raise
InvalidStateError
(
'Exception is not set.'
)
self
.
_log_traceback
=
False
self
.
_
_
log_traceback
=
False
return
self
.
_exception
def
add_done_callback
(
self
,
fn
):
...
...
@@ -237,7 +247,7 @@ class Future:
self
.
_exception
=
exception
self
.
_state
=
_FINISHED
self
.
_schedule_callbacks
()
self
.
_log_traceback
=
True
self
.
_
_
log_traceback
=
True
def
__await__
(
self
):
if
not
self
.
done
():
...
...
Lib/test/test_asyncio/test_futures.py
View file @
e0aef4f3
...
...
@@ -374,6 +374,11 @@ class BaseFutureTests:
test
()
fut
.
cancel
()
def
test_log_traceback
(
self
):
fut
=
self
.
_new_future
(
loop
=
self
.
loop
)
with
self
.
assertRaisesRegex
(
ValueError
,
'can only be set to False'
):
fut
.
_log_traceback
=
True
@
mock
.
patch
(
'asyncio.base_events.logger'
)
def
test_tb_logger_abandoned
(
self
,
m_log
):
fut
=
self
.
_new_future
(
loop
=
self
.
loop
)
...
...
Lib/test/test_asyncio/test_tasks.py
View file @
e0aef4f3
...
...
@@ -623,6 +623,15 @@ class BaseTaskTests:
t
.
cancel
()
self
.
assertRaises
(
asyncio
.
CancelledError
,
loop
.
run_until_complete
,
t
)
def
test_log_traceback
(
self
):
async
def
coro
():
pass
task
=
self
.
new_task
(
self
.
loop
,
coro
())
with
self
.
assertRaisesRegex
(
ValueError
,
'can only be set to False'
):
task
.
_log_traceback
=
True
self
.
loop
.
run_until_complete
(
task
)
def
test_wait_for_timeout_less_then_0_or_0_future_done
(
self
):
def
gen
():
when
=
yield
...
...
Misc/NEWS.d/next/Library/2017-12-25-11-09-46.bpo-31721.5gM972.rst
0 → 100644
View file @
e0aef4f3
Prevent Python crash from happening when Future._log_traceback is set to
True manually. Now it can only be set to False, or a ValueError is raised.
Modules/_asynciomodule.c
View file @
e0aef4f3
...
...
@@ -1058,6 +1058,11 @@ FutureObj_set_log_traceback(FutureObj *fut, PyObject *val)
if
(
is_true
<
0
)
{
return
-
1
;
}
if
(
is_true
)
{
PyErr_SetString
(
PyExc_ValueError
,
"_log_traceback can only be set to False"
);
return
-
1
;
}
fut
->
fut_log_tb
=
is_true
;
return
0
;
}
...
...
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