Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH 1/4]: Make "python" start a standard Python prompt
@ 2012-07-16 20:47 Khoo Yit Phang
  2012-07-24 21:19 ` Khoo Yit Phang
  2012-07-25  6:45 ` Phil Muldoon
  0 siblings, 2 replies; 26+ messages in thread
From: Khoo Yit Phang @ 2012-07-16 20:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: Khoo Yit Phang

[-- Attachment #1: Type: text/plain, Size: 574 bytes --]

Hi,

I'd like to resubmit my patches to make the "python" command start a standard Python prompt (I've completed the copyright assignment). As discussed back in January-February (http://permalink.gmane.org/gmane.comp.gdb.patches/71971), I've updated my patch to move the old "python" to "python-block".

This is the first of four patches. I'll post more patches that will: 1) update the testsuite to use "python-block"; 2) make Ctrl-C work under Python by raising KeyboardInterrupt; and 3) enable readline under the Python prompt.

Thank you,

Yit
July 16, 2012


[-- Attachment #2: python-interactive --]
[-- Type: application/octet-stream, Size: 6927 bytes --]

# HG changeset patch
# Parent 721a6806846d0e943d1728645c5536fb9cf9a079
Make the "python" command resemble the standard Python interpreter, and move the old behavior to "python-block".
- Use Py_single_input mode to interpret "python" with arguments, so that results of expressions are printed.
- Use Python's built-in interactive loop for "python" without arguments.

gdb/ChangeLog:

2012-07-16  Khoo Yit Phang <khooyp@cs.umd.edu>

	Make the "python" command resemble the standard Python interpreter.
	* doc/gdb.texinfo (Python Commands): Document the new "python"
	command and rename the old "python" to "python-block".
	* python/python.c (eval_python_command): New function.
	(python_command): For "python" with arguments, call
	eval_python_command.  For "python" without arguments, call
	PyRun_InteractiveLoop.
	(python_block_command): New function, copied from the old
	python_command.
	(_initialize_python): Add "python" command with "py" as alias, and
	rename the old "python" to "python-block".

diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
--- a/gdb/cli/cli-script.c
+++ b/gdb/cli/cli-script.c
@@ -243,7 +243,7 @@
 
       if (list->control_type == python_control)
 	{
-	  ui_out_field_string (uiout, NULL, "python");
+	  ui_out_field_string (uiout, NULL, "python-block");
 	  ui_out_text (uiout, "\n");
 	  /* Don't indent python code at all.  */
 	  print_command_lines (uiout, *list->body_list, 0);
@@ -1002,7 +1002,7 @@
 	    first_arg++;
 	  *command = build_command_line (commands_control, first_arg);
 	}
-      else if (p_end - p == 6 && !strncmp (p, "python", 6))
+      else if (p_end - p == 12 && !strncmp (p, "python-block", 12))
 	{
 	  /* Note that we ignore the inline "python command" form
 	     here.  */
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -22524,30 +22524,44 @@
 @cindex python commands
 @cindex commands to access python
 
-@value{GDBN} provides one command for accessing the Python interpreter,
+@value{GDBN} provides two command for accessing the Python interpreter,
 and one related setting:
 
 @table @code
 @kindex python
 @item python @r{[}@var{code}@r{]}
-The @code{python} command can be used to evaluate Python code.
-
-If given an argument, the @code{python} command will evaluate the
-argument as a Python command.  For example:
-
-@smallexample
-(@value{GDBP}) python print 23
+The @code{python} command can be used to start an interactive Python
+prompt.
+
+Alternatively, a single-line Python command can be given as an
+argument, and if the command is an expression, the result will be
+printed.  For example:
+
+@smallexample
+(@value{GDBP}) python 2 + 3
+5
+@end smallexample
+
+@kindex python-block
+@item python-block @r{[}@var{code}@r{]}
+The @code{python-block} command can be used to evaluate Python code.
+
+If given an argument, the @code{python-block} command will evaluate
+the argument as a Python command.  For example:
+
+@smallexample
+(@value{GDBP}) python-block print 23
 23
 @end smallexample
 
-If you do not provide an argument to @code{python}, it will act as a
-multi-line command, like @code{define}.  In this case, the Python
+If you do not provide an argument to @code{python-block}, it will act
+as a multi-line command, like @code{define}.  In this case, the Python
 script is made up of subsequent command lines, given after the
-@code{python} command.  This command list is terminated using a line
-containing @code{end}.  For example:
-
-@smallexample
-(@value{GDBP}) python
+@code{python-block} command.  This command list is terminated using a
+line containing @code{end}.  For example:
+
+@smallexample
+(@value{GDBP}) python-block
 Type python script
 End with a line saying just "end".
 >print 23
diff --git a/gdb/python/python.c b/gdb/python/python.c
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -200,6 +200,68 @@
   return make_cleanup (restore_python_env, env);
 }
 
+/* Evaluate a Python command like PyRun_SimpleString, but uses
+   Py_single_input which prints the result of expressions, and does
+   not automatically print the stack on errors.  */
+
+static int
+eval_python_command (const char *command)
+{
+  PyObject *m, *d, *v;
+
+  m = PyImport_AddModule ("__main__");
+  if (m == NULL)
+    return -1;
+
+  d = PyModule_GetDict (m);
+  if (d == NULL)
+    return -1;
+  v = PyRun_StringFlags (command, Py_single_input, d, d, NULL);
+  if (v == NULL)
+    return -1;
+
+  Py_DECREF (v);
+  if (Py_FlushLine ())
+    PyErr_Clear ();
+
+  return 0;
+}
+
+/* Implementation of the gdb "python" command.  */
+
+static void
+python_command (char *arg, int from_tty)
+{
+  struct cleanup *cleanup;
+  int err;
+
+  cleanup = make_cleanup_restore_integer (&interpreter_async);
+  interpreter_async = 0;
+
+  while (arg && *arg && isspace (*arg))
+    ++arg;
+
+  ensure_python_env (get_current_arch (), current_language);
+
+  if (arg && *arg)
+  {
+    err = eval_python_command (arg);
+  }
+  else
+  {
+    err = PyRun_InteractiveLoop(instream, "<stdin>");
+    dont_repeat ();
+  }
+
+  if (err)
+  {
+    gdbpy_print_stack ();
+    error (_("Error while executing Python code."));
+  }
+
+  do_cleanups (cleanup);
+}
+
 /* A wrapper around PyRun_SimpleFile.  FILE is the Python script to run
    named FILENAME.
 
@@ -302,10 +362,10 @@
   do_cleanups (cleanup);
 }
 
-/* Implementation of the gdb "python" command.  */
+/* Implementation of the gdb "python-block" command.  */
 
 static void
-python_command (char *arg, int from_tty)
+python_block_command (char *arg, int from_tty)
 {
   struct cleanup *cleanup;
 
@@ -1137,7 +1197,7 @@
 
 #else /* HAVE_PYTHON */
 
-/* Dummy implementation of the gdb "python" command.  */
+/* Dummy implementation of the gdb "python/python-block" command.  */
 
 static void
 python_command (char *arg, int from_tty)
@@ -1156,6 +1216,12 @@
     }
 }
 
+static void
+python_block_command (char *arg, int from_tty)
+{
+  python_command (arg, from_tty);
+}
+
 void
 eval_python_from_control_command (struct command_line *cmd)
 {
@@ -1225,11 +1291,33 @@
   add_com ("python", class_obscure, python_command,
 #ifdef HAVE_PYTHON
 	   _("\
+Start a Python interactive prompt.\n\
+\n\
+Alternatively, a single-line Python command can be given as an\n\
+argument, and if the command is an expression, the result will be\n\
+printed.  For example:\n\
+\n\
+    (gdb) python 2 + 3\n\
+    5\n\
+")
+#else /* HAVE_PYTHON */
+	   _("\
+Start a Python interactive prompt.\n\
+\n\
+Python scripting is not supported in this copy of GDB.\n\
+This command is only a placeholder.")
+#endif /* HAVE_PYTHON */
+	   );
+  add_com_alias ("py", "python", class_obscure, 1);
+
+  add_com ("python-block", class_obscure, python_block_command,
+#ifdef HAVE_PYTHON
+	   _("\
 Evaluate a Python command.\n\
 \n\
 The command can be given as an argument, for instance:\n\
 \n\
-    python print 23\n\
+    python-block print 23\n\
 \n\

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2012-08-22 17:59 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-16 20:47 [PATCH 1/4]: Make "python" start a standard Python prompt Khoo Yit Phang
2012-07-24 21:19 ` Khoo Yit Phang
2012-07-25  6:45 ` Phil Muldoon
2012-07-25 16:18   ` Tom Tromey
2012-07-25 16:58     ` Khoo Yit Phang
2012-07-25 17:20       ` Matt Rice
2012-07-25 17:29         ` Khoo Yit Phang
2012-07-25 17:43       ` Tom Tromey
2012-07-25 17:55         ` Khoo Yit Phang
2012-07-25 17:59           ` Tom Tromey
2012-07-25 21:07             ` Khoo Yit Phang
2012-07-26 17:38               ` Tom Tromey
2012-07-26 17:52                 ` Khoo Yit Phang
2012-07-26 18:06                   ` Eli Zaretskii
2012-07-26 18:10                     ` Khoo Yit Phang
2012-07-27  2:32                       ` Khoo Yit Phang
2012-07-27 19:23                         ` Tom Tromey
2012-07-28  6:53                         ` Eli Zaretskii
2012-07-28 14:35                           ` Khoo Yit Phang
2012-07-28 15:05                             ` Eli Zaretskii
2012-07-28 15:14                               ` Khoo Yit Phang
2012-07-31 22:04                                 ` Khoo Yit Phang
2012-08-01 15:46                                   ` Tom Tromey
2012-08-10 17:28                                     ` Khoo Yit Phang
2012-08-22 17:44                                   ` Khoo Yit Phang
2012-08-22 17:59                                     ` Eli Zaretskii

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox