LLDB  mainline
embedded_interpreter.py
Go to the documentation of this file.
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 
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 
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))
def run_one_line(local_dict, input_string)
def run_python_interpreter(local_dict)