]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/source/Interpreter/embedded_interpreter.py
THIS BRANCH IS OBSOLETE, PLEASE READ:
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / source / Interpreter / embedded_interpreter.py
1 import sys
2 if sys.version_info[0] < 3:
3     import __builtin__ as builtins
4 else:
5     import builtins
6 import code
7 import lldb
8 import traceback
9
10 try:
11     import readline
12     import rlcompleter
13 except ImportError:
14     have_readline = False
15 except AttributeError:
16     # This exception gets hit by the rlcompleter when Linux is using
17     # the readline suppression import.
18     have_readline = False
19 else:
20     have_readline = True
21     if 'libedit' in readline.__doc__:
22         readline.parse_and_bind('bind ^I rl_complete')
23     else:
24         readline.parse_and_bind('tab: complete')
25
26 g_builtin_override_called = False
27
28
29 class LLDBQuitter(object):
30
31     def __init__(self, name):
32         self.name = name
33
34     def __repr__(self):
35         self()
36
37     def __call__(self, code=None):
38         global g_builtin_override_called
39         g_builtin_override_called = True
40         raise SystemExit(-1)
41
42
43 def setquit():
44     '''Redefine builtin functions 'quit()' and 'exit()' to print a message and raise an EOFError exception.'''
45     # This function will be called prior to each interactive
46     # interpreter loop or each single line, so we set the global
47     # g_builtin_override_called to False so we know if a SystemExit
48     # is thrown, we can catch it and tell the difference between
49     # a call to "quit()" or "exit()" and something like
50     # "sys.exit(123)"
51     global g_builtin_override_called
52     g_builtin_override_called = False
53     builtins.quit = LLDBQuitter('quit')
54     builtins.exit = LLDBQuitter('exit')
55
56 # When running one line, we might place the string to run in this string
57 # in case it would be hard to correctly escape a string's contents
58
59 g_run_one_line_str = None
60
61
62 def get_terminal_size(fd):
63     try:
64         import fcntl
65         import termios
66         import struct
67         hw = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))
68     except:
69         hw = (0, 0)
70     return hw
71
72
73 def readfunc_stdio(prompt):
74     sys.stdout.write(prompt)
75     sys.stdout.flush()
76     line = sys.stdin.readline()
77     # Readline always includes a trailing newline character unless the file
78     # ends with an incomplete line. An empty line indicates EOF.
79     if not line:
80         raise EOFError
81     return line.rstrip()
82
83
84 def run_python_interpreter(local_dict):
85     # Pass in the dictionary, for continuity from one session to the next.
86     setquit()
87     try:
88         fd = sys.stdin.fileno()
89         interacted = False
90         if get_terminal_size(fd)[1] == 0:
91             try:
92                 import termios
93                 old = termios.tcgetattr(fd)
94                 if old[3] & termios.ECHO:
95                     # Need to turn off echoing and restore
96                     new = termios.tcgetattr(fd)
97                     new[3] = new[3] & ~termios.ECHO
98                     try:
99                         termios.tcsetattr(fd, termios.TCSADRAIN, new)
100                         interacted = True
101                         code.interact(
102                             banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()'.",
103                             readfunc=readfunc_stdio,
104                             local=local_dict)
105                     finally:
106                         termios.tcsetattr(fd, termios.TCSADRAIN, old)
107             except:
108                 pass
109             # Don't need to turn off echoing
110             if not interacted:
111                 code.interact(
112                     banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.",
113                     readfunc=readfunc_stdio,
114                     local=local_dict)
115         else:
116             # We have a real interactive terminal
117             code.interact(
118                 banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.",
119                 local=local_dict)
120     except SystemExit as e:
121         global g_builtin_override_called
122         if not g_builtin_override_called:
123             print('Script exited with %s' % (e))
124
125
126 def run_one_line(local_dict, input_string):
127     global g_run_one_line_str
128     setquit()
129     try:
130         repl = code.InteractiveConsole(local_dict)
131         if input_string:
132             repl.runsource(input_string)
133         elif g_run_one_line_str:
134             repl.runsource(g_run_one_line_str)
135
136     except SystemExit as e:
137         global g_builtin_override_called
138         if not g_builtin_override_called:
139             print('Script exited with %s' % (e))