]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Interpreter/embedded_interpreter.py
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / 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     return sys.stdin.readline().rstrip()
76
77
78 def run_python_interpreter(local_dict):
79     # Pass in the dictionary, for continuity from one session to the next.
80     setquit()
81     try:
82         fd = sys.stdin.fileno()
83         interacted = False
84         if get_terminal_size(fd)[1] == 0:
85             try:
86                 import termios
87                 old = termios.tcgetattr(fd)
88                 if old[3] & termios.ECHO:
89                     # Need to turn off echoing and restore
90                     new = termios.tcgetattr(fd)
91                     new[3] = new[3] & ~termios.ECHO
92                     try:
93                         termios.tcsetattr(fd, termios.TCSADRAIN, new)
94                         interacted = True
95                         code.interact(
96                             banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()'.",
97                             readfunc=readfunc_stdio,
98                             local=local_dict)
99                     finally:
100                         termios.tcsetattr(fd, termios.TCSADRAIN, old)
101             except:
102                 pass
103             # Don't need to turn off echoing
104             if not interacted:
105                 code.interact(
106                     banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.",
107                     readfunc=readfunc_stdio,
108                     local=local_dict)
109         else:
110             # We have a real interactive terminal
111             code.interact(
112                 banner="Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.",
113                 local=local_dict)
114     except SystemExit as e:
115         global g_builtin_override_called
116         if not g_builtin_override_called:
117             print('Script exited with %s' % (e))
118
119
120 def run_one_line(local_dict, input_string):
121     global g_run_one_line_str
122     setquit()
123     try:
124         repl = code.InteractiveConsole(local_dict)
125         if input_string:
126             repl.runsource(input_string)
127         elif g_run_one_line_str:
128             repl.runsource(g_run_one_line_str)
129
130     except SystemExit as e:
131         global g_builtin_override_called
132         if not g_builtin_override_called:
133             print('Script exited with %s' % (e))