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
b6584698
Commit
b6584698
authored
Feb 15, 2000
by
Guido van Rossum
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New stack viewer, uses a tree widget.
(XXX: the debugger doesn't yet use this.)
parent
553fa443
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
89 additions
and
230 deletions
+89
-230
Tools/idle/StackViewer.py
Tools/idle/StackViewer.py
+89
-230
No files found.
Tools/idle/StackViewer.py
View file @
b6584698
import
string
import
string
import
sys
import
os
from
Tkinter
import
*
from
Tkinter
import
*
import
linecache
import
linecache
from
repr
import
Repr
from
WindowList
import
ListedToplevel
from
ScrolledList
import
ScrolledList
from
TreeWidget
import
TreeNode
,
TreeItem
,
ScrolledCanvas
from
ObjectBrowser
import
ObjectTreeItem
,
make_objecttreeitem
from
OldStackViewer
import
StackViewer
,
NamespaceViewer
def
StackBrowser
(
root
,
flist
=
None
,
stack
=
None
):
top
=
Toplevel
(
root
)
sc
=
ScrolledCanvas
(
top
,
bg
=
"white"
,
highlightthickness
=
0
)
sc
.
frame
.
pack
(
expand
=
1
,
fill
=
"both"
)
item
=
StackTreeItem
(
flist
)
node
=
TreeNode
(
sc
.
canvas
,
None
,
item
)
node
.
expand
()
class
Stack
Browser
:
class
Stack
TreeItem
(
TreeItem
)
:
def
__init__
(
self
,
root
,
flist
,
stack
=
None
):
def
__init__
(
self
,
flist
=
None
):
self
.
top
=
top
=
ListedToplevel
(
root
)
self
.
flist
=
flist
top
.
protocol
(
"WM_DELETE_WINDOW"
,
self
.
close
)
self
.
stack
=
get_stack
()
top
.
bind
(
"<Key-Escape>"
,
self
.
close
)
self
.
text
=
get_exception
()
top
.
wm_title
(
"Stack viewer"
)
top
.
wm_iconname
(
"Stack"
)
# Create help label
self
.
helplabel
=
Label
(
top
,
text
=
"Click once to view variables; twice for source"
,
borderwidth
=
2
,
relief
=
"groove"
)
self
.
helplabel
.
pack
(
fill
=
"x"
)
#
self
.
sv
=
StackViewer
(
top
,
flist
,
self
)
if
stack
is
None
:
stack
=
get_stack
()
self
.
sv
.
load_stack
(
stack
)
def
close
(
self
,
event
=
None
):
self
.
top
.
destroy
()
localsframe
=
None
localsviewer
=
None
localsdict
=
None
globalsframe
=
None
globalsviewer
=
None
globalsdict
=
None
curframe
=
None
def
show_frame
(
self
,
(
frame
,
lineno
)):
if
frame
is
self
.
curframe
:
return
self
.
curframe
=
None
if
frame
.
f_globals
is
not
self
.
globalsdict
:
self
.
show_globals
(
frame
)
self
.
show_locals
(
frame
)
self
.
curframe
=
frame
def
show_globals
(
self
,
frame
):
title
=
"Global Variables"
if
frame
.
f_globals
.
has_key
(
"__name__"
):
try
:
name
=
str
(
frame
.
f_globals
[
"__name__"
])
+
""
except
:
name
=
""
if
name
:
title
=
title
+
" in module "
+
name
self
.
globalsdict
=
None
if
self
.
globalsviewer
:
self
.
globalsviewer
.
close
()
self
.
globalsviewer
=
None
if
not
self
.
globalsframe
:
self
.
globalsframe
=
Frame
(
self
.
top
)
self
.
globalsdict
=
frame
.
f_globals
self
.
globalsviewer
=
NamespaceViewer
(
self
.
globalsframe
,
title
,
self
.
globalsdict
)
self
.
globalsframe
.
pack
(
fill
=
"both"
,
side
=
"bottom"
)
def
show_locals
(
self
,
frame
):
def
GetText
(
self
):
self
.
localsdict
=
None
return
self
.
text
if
self
.
localsviewer
:
self
.
localsviewer
.
close
()
self
.
localsviewer
=
None
if
frame
.
f_locals
is
not
frame
.
f_globals
:
title
=
"Local Variables"
code
=
frame
.
f_code
funcname
=
code
.
co_name
if
funcname
not
in
(
"?"
,
""
,
None
):
title
=
title
+
" in "
+
funcname
if
not
self
.
localsframe
:
self
.
localsframe
=
Frame
(
self
.
top
)
self
.
localsdict
=
frame
.
f_locals
self
.
localsviewer
=
NamespaceViewer
(
self
.
localsframe
,
title
,
self
.
localsdict
)
self
.
localsframe
.
pack
(
fill
=
"both"
,
side
=
"top"
)
else
:
if
self
.
localsframe
:
self
.
localsframe
.
forget
()
def
GetSubList
(
self
):
sublist
=
[]
for
info
in
self
.
stack
:
item
=
FrameTreeItem
(
info
,
self
.
flist
)
sublist
.
append
(
item
)
return
sublist
class
StackViewer
(
ScrolledList
):
class
FrameTreeItem
(
TreeItem
):
def
__init__
(
self
,
master
,
flist
,
browser
):
def
__init__
(
self
,
info
,
flist
):
ScrolledList
.
__init__
(
self
,
master
,
width
=
80
)
self
.
info
=
info
self
.
flist
=
flist
self
.
flist
=
flist
self
.
browser
=
browser
self
.
stack
=
[]
def
load_stack
(
self
,
stack
,
index
=
None
):
def
GetText
(
self
):
self
.
stack
=
stack
frame
,
lineno
=
self
.
info
self
.
clear
()
try
:
## if len(stack) > 10:
modname
=
frame
.
f_globals
[
"__name__"
]
## l["height"] = 10
except
:
## self.topframe.pack(expand=1)
modname
=
"?"
## else:
code
=
frame
.
f_code
## l["height"] = len(stack)
filename
=
code
.
co_filename
## self.topframe.pack(expand=0)
funcname
=
code
.
co_name
for
i
in
range
(
len
(
stack
)):
sourceline
=
linecache
.
getline
(
filename
,
lineno
)
frame
,
lineno
=
stack
[
i
]
sourceline
=
string
.
strip
(
sourceline
)
try
:
if
funcname
in
(
"?"
,
""
,
None
):
modname
=
frame
.
f_globals
[
"__name__"
]
item
=
"%s, line %d: %s"
%
(
modname
,
lineno
,
sourceline
)
except
:
else
:
modname
=
"?"
item
=
"%s.%s(...), line %d: %s"
%
(
modname
,
funcname
,
code
=
frame
.
f_code
lineno
,
sourceline
)
filename
=
code
.
co_filename
## if i == index:
funcname
=
code
.
co_name
## item = "> " + item
sourceline
=
linecache
.
getline
(
filename
,
lineno
)
return
item
sourceline
=
string
.
strip
(
sourceline
)
if
funcname
in
(
"?"
,
""
,
None
):
def
GetSubList
(
self
):
item
=
"%s, line %d: %s"
%
(
modname
,
lineno
,
sourceline
)
frame
,
lineno
=
self
.
info
else
:
sublist
=
[]
item
=
"%s.%s(), line %d: %s"
%
(
modname
,
funcname
,
if
frame
.
f_globals
is
not
frame
.
f_locals
:
lineno
,
sourceline
)
item
=
VariablesTreeItem
(
"<locals>"
,
frame
.
f_locals
,
self
.
flist
)
if
i
==
index
:
sublist
.
append
(
item
)
item
=
"> "
+
item
item
=
VariablesTreeItem
(
"<globals>"
,
frame
.
f_globals
,
self
.
flist
)
self
.
append
(
item
)
sublist
.
append
(
item
)
if
index
is
not
None
:
return
sublist
self
.
select
(
index
)
def
OnDoubleClick
(
self
):
def
popup_event
(
self
,
event
):
if
self
.
flist
:
if
self
.
stack
:
frame
,
lineno
=
self
.
info
return
ScrolledList
.
popup_event
(
self
,
event
)
filename
=
frame
.
f_code
.
co_filename
edit
=
self
.
flist
.
open
(
filename
)
def
fill_menu
(
self
):
edit
.
gotoline
(
lineno
)
menu
=
self
.
menu
menu
.
add_command
(
label
=
"Go to source line"
,
command
=
self
.
goto_source_line
)
menu
.
add_command
(
label
=
"Show stack frame"
,
command
=
self
.
show_stack_frame
)
def
on_select
(
self
,
index
):
if
0
<=
index
<
len
(
self
.
stack
):
self
.
browser
.
show_frame
(
self
.
stack
[
index
])
def
on_double
(
self
,
index
):
class
VariablesTreeItem
(
ObjectTreeItem
):
self
.
show_source
(
index
)
def
goto_source_line
(
self
):
def
GetText
(
self
):
index
=
self
.
listbox
.
index
(
"active"
)
return
self
.
labeltext
self
.
show_source
(
index
)
def
show_stack_frame
(
self
):
def
GetLabelText
(
self
):
index
=
self
.
listbox
.
index
(
"active"
)
return
None
if
0
<=
index
<
len
(
self
.
stack
):
self
.
browser
.
show_frame
(
self
.
stack
[
index
])
def
show_source
(
self
,
index
):
def
IsExpandable
(
self
):
if
not
(
0
<=
index
<
len
(
self
.
stack
)):
return
len
(
self
.
object
)
>
0
return
frame
,
lineno
=
self
.
stack
[
index
]
code
=
frame
.
f_code
filename
=
code
.
co_filename
if
os
.
path
.
isfile
(
filename
):
edit
=
self
.
flist
.
open
(
filename
)
if
edit
:
edit
.
gotoline
(
lineno
)
def
keys
(
self
):
return
self
.
object
.
keys
()
def
GetSubList
(
self
):
sublist
=
[]
for
key
in
self
.
keys
():
try
:
value
=
self
.
object
[
key
]
except
KeyError
:
continue
def
setfunction
(
value
,
key
=
key
,
object
=
self
.
object
):
object
[
key
]
=
value
item
=
make_objecttreeitem
(
key
+
" ="
,
value
,
setfunction
)
sublist
.
append
(
item
)
return
sublist
def
get_stack
(
t
=
None
,
f
=
None
):
def
get_stack
(
t
=
None
,
f
=
None
):
if
t
is
None
:
if
t
is
None
:
t
=
sys
.
last_traceback
t
=
sys
.
last_traceback
...
@@ -189,8 +118,7 @@ def get_stack(t=None, f=None):
...
@@ -189,8 +118,7 @@ def get_stack(t=None, f=None):
t
=
t
.
tb_next
t
=
t
.
tb_next
return
stack
return
stack
def
get_exception
(
type
=
None
,
value
=
None
):
def
getexception
(
type
=
None
,
value
=
None
):
if
type
is
None
:
if
type
is
None
:
type
=
sys
.
last_type
type
=
sys
.
last_type
value
=
sys
.
last_value
value
=
sys
.
last_value
...
@@ -201,76 +129,7 @@ def getexception(type=None, value=None):
...
@@ -201,76 +129,7 @@ def getexception(type=None, value=None):
s
=
s
+
": "
+
str
(
value
)
s
=
s
+
": "
+
str
(
value
)
return
s
return
s
if
__name__
==
"__main__"
:
class
NamespaceViewer
:
root
=
Tk
()
root
.
withdraw
()
def
__init__
(
self
,
master
,
title
,
dict
=
None
):
StackBrowser
(
root
)
width
=
0
height
=
40
if
dict
:
height
=
20
*
len
(
dict
)
# XXX 20 == observed height of Entry widget
self
.
master
=
master
self
.
title
=
title
self
.
repr
=
Repr
()
self
.
repr
.
maxstring
=
60
self
.
repr
.
maxother
=
60
self
.
frame
=
frame
=
Frame
(
master
)
self
.
frame
.
pack
(
expand
=
1
,
fill
=
"both"
)
self
.
label
=
Label
(
frame
,
text
=
title
,
borderwidth
=
2
,
relief
=
"groove"
)
self
.
label
.
pack
(
fill
=
"x"
)
self
.
vbar
=
vbar
=
Scrollbar
(
frame
,
name
=
"vbar"
)
vbar
.
pack
(
side
=
"right"
,
fill
=
"y"
)
self
.
canvas
=
canvas
=
Canvas
(
frame
,
height
=
min
(
300
,
max
(
40
,
height
)),
scrollregion
=
(
0
,
0
,
width
,
height
))
canvas
.
pack
(
side
=
"left"
,
fill
=
"both"
,
expand
=
1
)
vbar
[
"command"
]
=
canvas
.
yview
canvas
[
"yscrollcommand"
]
=
vbar
.
set
self
.
subframe
=
subframe
=
Frame
(
canvas
)
self
.
sfid
=
canvas
.
create_window
(
0
,
0
,
window
=
subframe
,
anchor
=
"nw"
)
self
.
load_dict
(
dict
)
dict
=
-
1
def
load_dict
(
self
,
dict
,
force
=
0
):
if
dict
is
self
.
dict
and
not
force
:
return
subframe
=
self
.
subframe
frame
=
self
.
frame
for
c
in
subframe
.
children
.
values
():
c
.
destroy
()
self
.
dict
=
None
if
not
dict
:
l
=
Label
(
subframe
,
text
=
"None"
)
l
.
grid
(
row
=
0
,
column
=
0
)
else
:
names
=
dict
.
keys
()
names
.
sort
()
row
=
0
for
name
in
names
:
value
=
dict
[
name
]
svalue
=
self
.
repr
.
repr
(
value
)
# repr(value)
l
=
Label
(
subframe
,
text
=
name
)
l
.
grid
(
row
=
row
,
column
=
0
,
sticky
=
"nw"
)
## l = Label(subframe, text=svalue, justify="l", wraplength=300)
l
=
Entry
(
subframe
,
width
=
0
,
borderwidth
=
0
)
l
.
insert
(
0
,
svalue
)
## l["state"] = "disabled"
l
.
grid
(
row
=
row
,
column
=
1
,
sticky
=
"nw"
)
row
=
row
+
1
self
.
dict
=
dict
# XXX Could we use a <Configure> callback for the following?
subframe
.
update_idletasks
()
# Alas!
width
=
subframe
.
winfo_reqwidth
()
height
=
subframe
.
winfo_reqheight
()
canvas
=
self
.
canvas
self
.
canvas
[
"scrollregion"
]
=
(
0
,
0
,
width
,
height
)
if
height
>
300
:
canvas
[
"height"
]
=
300
frame
.
pack
(
expand
=
1
)
else
:
canvas
[
"height"
]
=
height
frame
.
pack
(
expand
=
0
)
def
close
(
self
):
self
.
frame
.
destroy
()
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