URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/gnu-old/gdb-7.1/gdb/python
- from Rev 816 to Rev 834
- ↔ Reverse comparison
Rev 816 → Rev 834
/py-frame.c
File deleted
py-frame.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-objfile.c
===================================================================
--- py-objfile.c (revision 816)
+++ py-objfile.c (nonexistent)
@@ -1,230 +0,0 @@
-/* Python interface to objfiles.
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "python-internal.h"
-#include "charset.h"
-#include "objfiles.h"
-#include "language.h"
-
-typedef struct
-{
- PyObject_HEAD
-
- /* The corresponding objfile. */
- struct objfile *objfile;
-
- /* The pretty-printer list of functions. */
- PyObject *printers;
-} objfile_object;
-
-static PyTypeObject objfile_object_type;
-
-static const struct objfile_data *objfpy_objfile_data_key;
-
-
-
-/* An Objfile method which returns the objfile's file name, or None. */
-static PyObject *
-objfpy_get_filename (PyObject *self, void *closure)
-{
- objfile_object *obj = (objfile_object *) self;
- if (obj->objfile && obj->objfile->name)
- return PyString_Decode (obj->objfile->name, strlen (obj->objfile->name),
- host_charset (), NULL);
- Py_RETURN_NONE;
-}
-
-static void
-objfpy_dealloc (PyObject *o)
-{
- objfile_object *self = (objfile_object *) o;
- Py_XDECREF (self->printers);
- self->ob_type->tp_free ((PyObject *) self);
-}
-
-static PyObject *
-objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
-{
- objfile_object *self = (objfile_object *) type->tp_alloc (type, 0);
- if (self)
- {
- self->objfile = NULL;
-
- self->printers = PyList_New (0);
- if (!self->printers)
- {
- Py_DECREF (self);
- return NULL;
- }
- }
- return (PyObject *) self;
-}
-
-PyObject *
-objfpy_get_printers (PyObject *o, void *ignore)
-{
- objfile_object *self = (objfile_object *) o;
- Py_INCREF (self->printers);
- return self->printers;
-}
-
-static int
-objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
-{
- PyObject *tmp;
- objfile_object *self = (objfile_object *) o;
- if (! value)
- {
- PyErr_SetString (PyExc_TypeError,
- "cannot delete the pretty_printers attribute");
- return -1;
- }
-
- if (! PyList_Check (value))
- {
- PyErr_SetString (PyExc_TypeError,
- "the pretty_printers attribute must be a list");
- return -1;
- }
-
- /* Take care in case the LHS and RHS are related somehow. */
- tmp = self->printers;
- Py_INCREF (value);
- self->printers = value;
- Py_XDECREF (tmp);
-
- return 0;
-}
-
-
-
-/* Clear the OBJFILE pointer in an Objfile object and remove the
- reference. */
-static void
-py_free_objfile (struct objfile *objfile, void *datum)
-{
- struct cleanup *cleanup;
- objfile_object *object = datum;
-
- cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
- object->objfile = NULL;
- Py_DECREF ((PyObject *) object);
- do_cleanups (cleanup);
-}
-
-/* Return a borrowed reference to the Python object of type Objfile
- representing OBJFILE. If the object has already been created,
- return it. Otherwise, create it. Return NULL and set the Python
- error on failure. */
-PyObject *
-objfile_to_objfile_object (struct objfile *objfile)
-{
- objfile_object *object;
-
- object = objfile_data (objfile, objfpy_objfile_data_key);
- if (!object)
- {
- object = PyObject_New (objfile_object, &objfile_object_type);
- if (object)
- {
- PyObject *dict;
-
- object->objfile = objfile;
-
- object->printers = PyList_New (0);
- if (!object->printers)
- {
- Py_DECREF (object);
- return NULL;
- }
-
- set_objfile_data (objfile, objfpy_objfile_data_key, object);
- }
- }
-
- return (PyObject *) object;
-}
-
-void
-gdbpy_initialize_objfile (void)
-{
- objfpy_objfile_data_key
- = register_objfile_data_with_cleanup (NULL, py_free_objfile);
-
- if (PyType_Ready (&objfile_object_type) < 0)
- return;
-
- Py_INCREF (&objfile_object_type);
- PyModule_AddObject (gdb_module, "Objfile", (PyObject *) &objfile_object_type);
-}
-
-
-
-static PyGetSetDef objfile_getset[] =
-{
- { "filename", objfpy_get_filename, NULL,
- "The objfile's filename, or None.", NULL },
- { "pretty_printers", objfpy_get_printers, objfpy_set_printers,
- "Pretty printers.", NULL },
- { NULL }
-};
-
-static PyTypeObject objfile_object_type =
-{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.Objfile", /*tp_name*/
- sizeof (objfile_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- objfpy_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- "GDB objfile object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- objfile_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- objfpy_new, /* tp_new */
-};
py-objfile.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: python-internal.h
===================================================================
--- python-internal.h (revision 816)
+++ python-internal.h (nonexistent)
@@ -1,141 +0,0 @@
-/* Gdb/Python header for private use by Python module.
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#ifndef GDB_PYTHON_INTERNAL_H
-#define GDB_PYTHON_INTERNAL_H
-
-/* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t
- needed by pyport.h. */
-#include
-
-/* /usr/include/features.h on linux systems will define _POSIX_C_SOURCE
- if it sees _GNU_SOURCE (which config.h will define).
- pyconfig.h defines _POSIX_C_SOURCE to a different value than
- /usr/include/features.h does causing compilation to fail.
- To work around this, undef _POSIX_C_SOURCE before we include Python.h. */
-#undef _POSIX_C_SOURCE
-
-#if HAVE_LIBPYTHON2_4
-#include "python2.4/Python.h"
-#include "python2.4/frameobject.h"
-/* Py_ssize_t is not defined until 2.5.
- Logical type for Py_ssize_t is Py_intptr_t, but that fails in 64-bit
- compilation due to several apparent mistakes in python2.4 API, so we
- use 'int' instead. */
-typedef int Py_ssize_t;
-#elif HAVE_LIBPYTHON2_5
-#include "python2.5/Python.h"
-#include "python2.5/frameobject.h"
-#elif HAVE_LIBPYTHON2_6
-#include "python2.6/Python.h"
-#include "python2.6/frameobject.h"
-#else
-#error "Unable to find usable Python.h"
-#endif
-
-/* If Python.h does not define WITH_THREAD, then the various
- GIL-related functions will not be defined. However,
- PyGILState_STATE will be. */
-#ifndef WITH_THREAD
-#define PyGILState_Ensure() ((PyGILState_STATE) 0)
-#define PyGILState_Release(ARG) ((void)(ARG))
-#define PyEval_InitThreads() 0
-#define PyThreadState_Swap(ARG) ((void)(ARG))
-#define PyEval_InitThreads() 0
-#define PyEval_ReleaseLock() 0
-#endif
-
-struct value;
-struct language_defn;
-
-extern PyObject *gdb_module;
-extern PyTypeObject value_object_type;
-
-PyObject *gdbpy_history (PyObject *self, PyObject *args);
-PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *);
-PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args);
-PyObject *gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw);
-PyObject *gdbpy_create_lazy_string_object (CORE_ADDR address, long length,
- const char *encoding, struct type *type);
-
-PyObject *value_to_value_object (struct value *v);
-PyObject *type_to_type_object (struct type *);
-PyObject *objfile_to_objfile_object (struct objfile *);
-
-PyObject *objfpy_get_printers (PyObject *, void *);
-
-struct value *value_object_to_value (PyObject *self);
-struct value *convert_value_from_python (PyObject *obj);
-struct type *type_object_to_type (PyObject *obj);
-
-void gdbpy_initialize_values (void);
-void gdbpy_initialize_frames (void);
-void gdbpy_initialize_commands (void);
-void gdbpy_initialize_types (void);
-void gdbpy_initialize_functions (void);
-void gdbpy_initialize_objfile (void);
-void gdbpy_initialize_lazy_string (void);
-
-struct cleanup *make_cleanup_py_decref (PyObject *py);
-
-struct cleanup *ensure_python_env (struct gdbarch *gdbarch,
- const struct language_defn *language);
-
-extern struct gdbarch *python_gdbarch;
-extern const struct language_defn *python_language;
-
-/* Use this after a TRY_EXCEPT to throw the appropriate Python
- exception. */
-#define GDB_PY_HANDLE_EXCEPTION(Exception) \
- do { \
- if (Exception.reason < 0) \
- return PyErr_Format (Exception.reason == RETURN_QUIT \
- ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \
- "%s", Exception.message); \
- } while (0)
-
-
-void gdbpy_print_stack (void);
-
-PyObject *python_string_to_unicode (PyObject *obj);
-char *unicode_to_target_string (PyObject *unicode_str);
-char *python_string_to_target_string (PyObject *obj);
-PyObject *python_string_to_target_python_string (PyObject *obj);
-char *python_string_to_host_string (PyObject *obj);
-PyObject *target_string_to_unicode (const gdb_byte *str, int length);
-int gdbpy_is_string (PyObject *obj);
-int gdbpy_is_lazy_string (PyObject *result);
-gdb_byte *gdbpy_extract_lazy_string (PyObject *string,
- struct type **str_type,
- long *length, char **encoding);
-
-/* Note that these are declared here, and not in python.h with the
- other pretty-printer functions, because they refer to PyObject. */
-PyObject *apply_varobj_pretty_printer (PyObject *print_obj,
- struct value **replacement);
-PyObject *gdbpy_get_varobj_pretty_printer (struct value *value);
-char *gdbpy_get_display_hint (PyObject *printer);
-PyObject *gdbpy_default_visualizer (PyObject *self, PyObject *args);
-
-extern PyObject *gdbpy_doc_cst;
-extern PyObject *gdbpy_children_cst;
-extern PyObject *gdbpy_to_string_cst;
-extern PyObject *gdbpy_display_hint_cst;
-
-#endif /* GDB_PYTHON_INTERNAL_H */
python-internal.h
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: python.c
===================================================================
--- python.c (revision 816)
+++ python.c (nonexistent)
@@ -1,741 +0,0 @@
-/* General python/gdb code
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "arch-utils.h"
-#include "command.h"
-#include "ui-out.h"
-#include "cli/cli-script.h"
-#include "gdbcmd.h"
-#include "objfiles.h"
-#include "observer.h"
-#include "value.h"
-#include "language.h"
-#include "exceptions.h"
-
-#include
-
-/* True if we should print the stack when catching a Python error,
- false otherwise. */
-static int gdbpy_should_print_stack = 1;
-
-/* This is true if we should auto-load python code when an objfile is
- opened, false otherwise. */
-static int gdbpy_auto_load = 1;
-
-#ifdef HAVE_PYTHON
-
-#include "python.h"
-#include "libiberty.h"
-#include "cli/cli-decode.h"
-#include "charset.h"
-#include "top.h"
-#include "python-internal.h"
-#include "version.h"
-#include "target.h"
-#include "gdbthread.h"
-
-static PyMethodDef GdbMethods[];
-
-PyObject *gdb_module;
-
-/* Some string constants we may wish to use. */
-PyObject *gdbpy_to_string_cst;
-PyObject *gdbpy_children_cst;
-PyObject *gdbpy_display_hint_cst;
-PyObject *gdbpy_doc_cst;
-
-
-/* Architecture and language to be used in callbacks from
- the Python interpreter. */
-struct gdbarch *python_gdbarch;
-const struct language_defn *python_language;
-
-/* Restore global language and architecture and Python GIL state
- when leaving the Python interpreter. */
-
-struct python_env
-{
- PyGILState_STATE state;
- struct gdbarch *gdbarch;
- const struct language_defn *language;
-};
-
-static void
-restore_python_env (void *p)
-{
- struct python_env *env = (struct python_env *)p;
- PyGILState_Release (env->state);
- python_gdbarch = env->gdbarch;
- python_language = env->language;
- xfree (env);
-}
-
-/* Called before entering the Python interpreter to install the
- current language and architecture to be used for Python values. */
-
-struct cleanup *
-ensure_python_env (struct gdbarch *gdbarch,
- const struct language_defn *language)
-{
- struct python_env *env = xmalloc (sizeof *env);
-
- env->state = PyGILState_Ensure ();
- env->gdbarch = python_gdbarch;
- env->language = python_language;
-
- python_gdbarch = gdbarch;
- python_language = language;
-
- return make_cleanup (restore_python_env, env);
-}
-
-
-/* Given a command_line, return a command string suitable for passing
- to Python. Lines in the string are separated by newlines. The
- return value is allocated using xmalloc and the caller is
- responsible for freeing it. */
-
-static char *
-compute_python_string (struct command_line *l)
-{
- struct command_line *iter;
- char *script = NULL;
- int size = 0;
- int here;
-
- for (iter = l; iter; iter = iter->next)
- size += strlen (iter->line) + 1;
-
- script = xmalloc (size + 1);
- here = 0;
- for (iter = l; iter; iter = iter->next)
- {
- int len = strlen (iter->line);
- strcpy (&script[here], iter->line);
- here += len;
- script[here++] = '\n';
- }
- script[here] = '\0';
- return script;
-}
-
-/* Take a command line structure representing a 'python' command, and
- evaluate its body using the Python interpreter. */
-
-void
-eval_python_from_control_command (struct command_line *cmd)
-{
- int ret;
- char *script;
- struct cleanup *cleanup;
-
- if (cmd->body_count != 1)
- error (_("Invalid \"python\" block structure."));
-
- cleanup = ensure_python_env (get_current_arch (), current_language);
-
- script = compute_python_string (cmd->body_list[0]);
- ret = PyRun_SimpleString (script);
- xfree (script);
- if (ret)
- {
- gdbpy_print_stack ();
- error (_("Error while executing Python code."));
- }
-
- do_cleanups (cleanup);
-}
-
-/* Implementation of the gdb "python" command. */
-
-static void
-python_command (char *arg, int from_tty)
-{
- struct cleanup *cleanup;
- cleanup = ensure_python_env (get_current_arch (), current_language);
-
- while (arg && *arg && isspace (*arg))
- ++arg;
- if (arg && *arg)
- {
- if (PyRun_SimpleString (arg))
- {
- gdbpy_print_stack ();
- error (_("Error while executing Python code."));
- }
- }
- else
- {
- struct command_line *l = get_command_line (python_control, "");
- make_cleanup_free_command_lines (&l);
- execute_control_command_untraced (l);
- }
-
- do_cleanups (cleanup);
-}
-
-
-
-/* Transform a gdb parameters's value into a Python value. May return
- NULL (and set a Python exception) on error. Helper function for
- get_parameter. */
-
-static PyObject *
-parameter_to_python (struct cmd_list_element *cmd)
-{
- switch (cmd->var_type)
- {
- case var_string:
- case var_string_noescape:
- case var_optional_filename:
- case var_filename:
- case var_enum:
- {
- char *str = * (char **) cmd->var;
- if (! str)
- str = "";
- return PyString_Decode (str, strlen (str), host_charset (), NULL);
- }
-
- case var_boolean:
- {
- if (* (int *) cmd->var)
- Py_RETURN_TRUE;
- else
- Py_RETURN_FALSE;
- }
-
- case var_auto_boolean:
- {
- enum auto_boolean ab = * (enum auto_boolean *) cmd->var;
- if (ab == AUTO_BOOLEAN_TRUE)
- Py_RETURN_TRUE;
- else if (ab == AUTO_BOOLEAN_FALSE)
- Py_RETURN_FALSE;
- else
- Py_RETURN_NONE;
- }
-
- case var_integer:
- if ((* (int *) cmd->var) == INT_MAX)
- Py_RETURN_NONE;
- /* Fall through. */
- case var_zinteger:
- return PyLong_FromLong (* (int *) cmd->var);
-
- case var_uinteger:
- {
- unsigned int val = * (unsigned int *) cmd->var;
- if (val == UINT_MAX)
- Py_RETURN_NONE;
- return PyLong_FromUnsignedLong (val);
- }
- }
-
- return PyErr_Format (PyExc_RuntimeError, "programmer error: unhandled type");
-}
-
-/* A Python function which returns a gdb parameter's value as a Python
- value. */
-
-static PyObject *
-gdbpy_parameter (PyObject *self, PyObject *args)
-{
- struct cmd_list_element *alias, *prefix, *cmd;
- char *arg, *newarg;
- int found = -1;
- volatile struct gdb_exception except;
-
- if (! PyArg_ParseTuple (args, "s", &arg))
- return NULL;
-
- newarg = concat ("show ", arg, (char *) NULL);
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- found = lookup_cmd_composition (newarg, &alias, &prefix, &cmd);
- }
- xfree (newarg);
- GDB_PY_HANDLE_EXCEPTION (except);
- if (!found)
- return PyErr_Format (PyExc_RuntimeError,
- "could not find parameter `%s'", arg);
-
- if (! cmd->var)
- return PyErr_Format (PyExc_RuntimeError, "`%s' is not a parameter", arg);
- return parameter_to_python (cmd);
-}
-
-/* A Python function which evaluates a string using the gdb CLI. */
-
-static PyObject *
-execute_gdb_command (PyObject *self, PyObject *args)
-{
- struct cmd_list_element *alias, *prefix, *cmd;
- char *arg, *newarg;
- PyObject *from_tty_obj = NULL;
- int from_tty;
- int cmp;
- volatile struct gdb_exception except;
-
- if (! PyArg_ParseTuple (args, "s|O!", &arg, &PyBool_Type, &from_tty_obj))
- return NULL;
-
- from_tty = 0;
- if (from_tty_obj)
- {
- cmp = PyObject_IsTrue (from_tty_obj);
- if (cmp < 0)
- return NULL;
- from_tty = cmp;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- /* Copy the argument text in case the command modifies it. */
- char *copy = xstrdup (arg);
- struct cleanup *cleanup = make_cleanup (xfree, copy);
- execute_command (copy, from_tty);
- do_cleanups (cleanup);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- /* Do any commands attached to breakpoint we stopped at. */
- bpstat_do_actions ();
-
- Py_RETURN_NONE;
-}
-
-/* Parse a string and evaluate it as an expression. */
-static PyObject *
-gdbpy_parse_and_eval (PyObject *self, PyObject *args)
-{
- char *expr_str;
- struct value *result = NULL;
- volatile struct gdb_exception except;
-
- if (!PyArg_ParseTuple (args, "s", &expr_str))
- return NULL;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- result = parse_and_eval (expr_str);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return value_to_value_object (result);
-}
-
-/* Read a file as Python code. STREAM is the input file; FILE is the
- name of the file. */
-
-void
-source_python_script (FILE *stream, char *file)
-{
- PyGILState_STATE state;
-
- state = PyGILState_Ensure ();
-
- PyRun_SimpleFile (stream, file);
-
- fclose (stream);
- PyGILState_Release (state);
-}
-
-
-
-/* Printing. */
-
-/* A python function to write a single string using gdb's filtered
- output stream. */
-static PyObject *
-gdbpy_write (PyObject *self, PyObject *args)
-{
- char *arg;
- if (! PyArg_ParseTuple (args, "s", &arg))
- return NULL;
- printf_filtered ("%s", arg);
- Py_RETURN_NONE;
-}
-
-/* A python function to flush gdb's filtered output stream. */
-static PyObject *
-gdbpy_flush (PyObject *self, PyObject *args)
-{
- gdb_flush (gdb_stdout);
- Py_RETURN_NONE;
-}
-
-/* Print a python exception trace, or print nothing and clear the
- python exception, depending on gdbpy_should_print_stack. Only call
- this if a python exception is set. */
-void
-gdbpy_print_stack (void)
-{
- if (gdbpy_should_print_stack)
- PyErr_Print ();
- else
- PyErr_Clear ();
-}
-
-
-
-/* The "current" objfile. This is set when gdb detects that a new
- objfile has been loaded. It is only set for the duration of a call
- to gdbpy_new_objfile; it is NULL at other times. */
-static struct objfile *gdbpy_current_objfile;
-
-/* The file name we attempt to read. */
-#define GDBPY_AUTO_FILENAME "-gdb.py"
-
-/* This is a new_objfile observer callback which loads python code
- based on the path to the objfile. */
-static void
-gdbpy_new_objfile (struct objfile *objfile)
-{
- char *realname;
- char *filename, *debugfile;
- int len;
- FILE *input;
- struct cleanup *cleanups;
-
- if (!gdbpy_auto_load || !objfile || !objfile->name)
- return;
-
- cleanups = ensure_python_env (get_objfile_arch (objfile), current_language);
-
- gdbpy_current_objfile = objfile;
-
- realname = gdb_realpath (objfile->name);
- len = strlen (realname);
- filename = xmalloc (len + sizeof (GDBPY_AUTO_FILENAME));
- memcpy (filename, realname, len);
- strcpy (filename + len, GDBPY_AUTO_FILENAME);
-
- input = fopen (filename, "r");
- debugfile = filename;
-
- make_cleanup (xfree, filename);
- make_cleanup (xfree, realname);
-
- if (!input && debug_file_directory)
- {
- /* Also try the same file in the separate debug info directory. */
- debugfile = xmalloc (strlen (filename)
- + strlen (debug_file_directory) + 1);
- strcpy (debugfile, debug_file_directory);
- /* FILENAME is absolute, so we don't need a "/" here. */
- strcat (debugfile, filename);
-
- make_cleanup (xfree, debugfile);
- input = fopen (debugfile, "r");
- }
-
- if (!input && gdb_datadir)
- {
- /* Also try the same file in a subdirectory of gdb's data
- directory. */
- debugfile = xmalloc (strlen (gdb_datadir) + strlen (filename)
- + strlen ("/auto-load") + 1);
- strcpy (debugfile, gdb_datadir);
- strcat (debugfile, "/auto-load");
- /* FILENAME is absolute, so we don't need a "/" here. */
- strcat (debugfile, filename);
-
- make_cleanup (xfree, debugfile);
- input = fopen (debugfile, "r");
- }
-
- if (input)
- {
- /* We don't want to throw an exception here -- but the user
- would like to know that something went wrong. */
- if (PyRun_SimpleFile (input, debugfile))
- gdbpy_print_stack ();
- fclose (input);
- }
-
- do_cleanups (cleanups);
- gdbpy_current_objfile = NULL;
-}
-
-/* Return the current Objfile, or None if there isn't one. */
-static PyObject *
-gdbpy_get_current_objfile (PyObject *unused1, PyObject *unused2)
-{
- PyObject *result;
-
- if (! gdbpy_current_objfile)
- Py_RETURN_NONE;
-
- result = objfile_to_objfile_object (gdbpy_current_objfile);
- if (result)
- Py_INCREF (result);
- return result;
-}
-
-/* Return a sequence holding all the Objfiles. */
-static PyObject *
-gdbpy_objfiles (PyObject *unused1, PyObject *unused2)
-{
- struct objfile *objf;
- PyObject *list;
-
- list = PyList_New (0);
- if (!list)
- return NULL;
-
- ALL_OBJFILES (objf)
- {
- PyObject *item = objfile_to_objfile_object (objf);
- if (!item || PyList_Append (list, item) == -1)
- {
- Py_DECREF (list);
- return NULL;
- }
- }
-
- return list;
-}
-
-#else /* HAVE_PYTHON */
-
-/* Dummy implementation of the gdb "python" command. */
-
-static void
-python_command (char *arg, int from_tty)
-{
- while (arg && *arg && isspace (*arg))
- ++arg;
- if (arg && *arg)
- error (_("Python scripting is not supported in this copy of GDB."));
- else
- {
- struct command_line *l = get_command_line (python_control, "");
- struct cleanup *cleanups = make_cleanup_free_command_lines (&l);
- execute_control_command_untraced (l);
- do_cleanups (cleanups);
- }
-}
-
-void
-eval_python_from_control_command (struct command_line *cmd)
-{
- error (_("Python scripting is not supported in this copy of GDB."));
-}
-
-void
-source_python_script (FILE *stream, char *file)
-{
- fclose (stream);
- throw_error (UNSUPPORTED_ERROR,
- _("Python scripting is not supported in this copy of GDB."));
-}
-
-#endif /* HAVE_PYTHON */
-
-
-
-/* Lists for 'maint set python' commands. */
-
-static struct cmd_list_element *set_python_list;
-static struct cmd_list_element *show_python_list;
-
-/* Function for use by 'maint set python' prefix command. */
-
-static void
-set_python (char *args, int from_tty)
-{
- help_list (set_python_list, "maintenance set python ", -1, gdb_stdout);
-}
-
-/* Function for use by 'maint show python' prefix command. */
-
-static void
-show_python (char *args, int from_tty)
-{
- cmd_show_list (show_python_list, from_tty, "");
-}
-
-/* Initialize the Python code. */
-
-/* Provide a prototype to silence -Wmissing-prototypes. */
-extern initialize_file_ftype _initialize_python;
-
-void
-_initialize_python (void)
-{
- add_com ("python", class_obscure, python_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\
-\n\
-If no argument is given, the following lines are read and used\n\
-as the Python commands. Type a line containing \"end\" to indicate\n\
-the end of the command.")
-#else /* HAVE_PYTHON */
- _("\
-Evaluate a Python command.\n\
-\n\
-Python scripting is not supported in this copy of GDB.\n\
-This command is only a placeholder.")
-#endif /* HAVE_PYTHON */
- );
-
- add_prefix_cmd ("python", no_class, show_python,
- _("Prefix command for python maintenance settings."),
- &show_python_list, "maintenance show python ", 0,
- &maintenance_show_cmdlist);
- add_prefix_cmd ("python", no_class, set_python,
- _("Prefix command for python maintenance settings."),
- &set_python_list, "maintenance set python ", 0,
- &maintenance_set_cmdlist);
-
- add_setshow_boolean_cmd ("print-stack", class_maintenance,
- &gdbpy_should_print_stack, _("\
-Enable or disable printing of Python stack dump on error."), _("\
-Show whether Python stack will be printed on error."), _("\
-Enables or disables printing of Python stack traces."),
- NULL, NULL,
- &set_python_list,
- &show_python_list);
-
- add_setshow_boolean_cmd ("auto-load", class_maintenance,
- &gdbpy_auto_load, _("\
-Enable or disable auto-loading of Python code when an object is opened."), _("\
-Show whether Python code will be auto-loaded when an object is opened."), _("\
-Enables or disables auto-loading of Python code when an object is opened."),
- NULL, NULL,
- &set_python_list,
- &show_python_list);
-
-#ifdef HAVE_PYTHON
- Py_Initialize ();
- PyEval_InitThreads ();
-
- gdb_module = Py_InitModule ("gdb", GdbMethods);
-
- /* The casts to (char*) are for python 2.4. */
- PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version);
- PyModule_AddStringConstant (gdb_module, "HOST_CONFIG", (char*) host_name);
- PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG", (char*) target_name);
-
- gdbpy_initialize_values ();
- gdbpy_initialize_frames ();
- gdbpy_initialize_commands ();
- gdbpy_initialize_functions ();
- gdbpy_initialize_types ();
- gdbpy_initialize_objfile ();
- gdbpy_initialize_lazy_string ();
-
- PyRun_SimpleString ("import gdb");
- PyRun_SimpleString ("gdb.pretty_printers = []");
-
- observer_attach_new_objfile (gdbpy_new_objfile);
-
- gdbpy_to_string_cst = PyString_FromString ("to_string");
- gdbpy_children_cst = PyString_FromString ("children");
- gdbpy_display_hint_cst = PyString_FromString ("display_hint");
- gdbpy_doc_cst = PyString_FromString ("__doc__");
-
- /* Create a couple objects which are used for Python's stdout and
- stderr. */
- PyRun_SimpleString ("\
-import sys\n\
-class GdbOutputFile:\n\
- def close(self):\n\
- # Do nothing.\n\
- return None\n\
-\n\
- def isatty(self):\n\
- return False\n\
-\n\
- def write(self, s):\n\
- gdb.write(s)\n\
-\n\
- def writelines(self, iterable):\n\
- for line in iterable:\n\
- self.write(line)\n\
-\n\
- def flush(self):\n\
- gdb.flush()\n\
-\n\
-sys.stderr = GdbOutputFile()\n\
-sys.stdout = GdbOutputFile()\n\
-");
-
- /* Release the GIL while gdb runs. */
- PyThreadState_Swap (NULL);
- PyEval_ReleaseLock ();
-
-#endif /* HAVE_PYTHON */
-}
-
-
-
-#if HAVE_PYTHON
-
-static PyMethodDef GdbMethods[] =
-{
- { "history", gdbpy_history, METH_VARARGS,
- "Get a value from history" },
- { "execute", execute_gdb_command, METH_VARARGS,
- "Execute a gdb command" },
- { "parameter", gdbpy_parameter, METH_VARARGS,
- "Return a gdb parameter's value" },
-
- { "default_visualizer", gdbpy_default_visualizer, METH_VARARGS,
- "Find the default visualizer for a Value." },
-
- { "current_objfile", gdbpy_get_current_objfile, METH_NOARGS,
- "Return the current Objfile being loaded, or None." },
- { "objfiles", gdbpy_objfiles, METH_NOARGS,
- "Return a sequence of all loaded objfiles." },
-
- { "selected_frame", gdbpy_selected_frame, METH_NOARGS,
- "selected_frame () -> gdb.Frame.\n\
-Return the selected frame object." },
- { "frame_stop_reason_string", gdbpy_frame_stop_reason_string, METH_VARARGS,
- "stop_reason_string (Integer) -> String.\n\
-Return a string explaining unwind stop reason." },
-
- { "lookup_type", (PyCFunction) gdbpy_lookup_type,
- METH_VARARGS | METH_KEYWORDS,
- "lookup_type (name [, block]) -> type\n\
-Return a Type corresponding to the given name." },
-
- { "parse_and_eval", gdbpy_parse_and_eval, METH_VARARGS,
- "parse_and_eval (String) -> Value.\n\
-Parse String as an expression, evaluate it, and return the result as a Value."
- },
-
- { "write", gdbpy_write, METH_VARARGS,
- "Write a string using gdb's filtered stream." },
- { "flush", gdbpy_flush, METH_NOARGS,
- "Flush gdb's filtered stdout stream." },
-
- {NULL, NULL, 0, NULL}
-};
-
-#endif /* HAVE_PYTHON */
python.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-value.c
===================================================================
--- py-value.c (revision 816)
+++ py-value.c (nonexistent)
@@ -1,1132 +0,0 @@
-/* Python interface to values.
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "gdb_assert.h"
-#include "charset.h"
-#include "value.h"
-#include "exceptions.h"
-#include "language.h"
-#include "dfp.h"
-#include "valprint.h"
-
-#ifdef HAVE_PYTHON
-
-#include "python-internal.h"
-
-/* Even though Python scalar types directly map to host types, we use
- target types here to remain consistent with the the values system in
- GDB (which uses target arithmetic). */
-
-/* Python's integer type corresponds to C's long type. */
-#define builtin_type_pyint builtin_type (python_gdbarch)->builtin_long
-
-/* Python's float type corresponds to C's double type. */
-#define builtin_type_pyfloat builtin_type (python_gdbarch)->builtin_double
-
-/* Python's long type corresponds to C's long long type. */
-#define builtin_type_pylong builtin_type (python_gdbarch)->builtin_long_long
-
-#define builtin_type_pybool \
- language_bool_type (python_language, python_gdbarch)
-
-#define builtin_type_pychar \
- language_string_char_type (python_language, python_gdbarch)
-
-typedef struct value_object {
- PyObject_HEAD
- struct value_object *next;
- struct value_object *prev;
- struct value *value;
- PyObject *address;
- PyObject *type;
-} value_object;
-
-/* List of all values which are currently exposed to Python. It is
- maintained so that when an objfile is discarded, preserve_values
- can copy the values' types if needed. */
-/* This variable is unnecessarily initialized to NULL in order to
- work around a linker bug on MacOS. */
-static value_object *values_in_python = NULL;
-
-/* Called by the Python interpreter when deallocating a value object. */
-static void
-valpy_dealloc (PyObject *obj)
-{
- value_object *self = (value_object *) obj;
-
- /* Remove SELF from the global list. */
- if (self->prev)
- self->prev->next = self->next;
- else
- {
- gdb_assert (values_in_python == self);
- values_in_python = self->next;
- }
- if (self->next)
- self->next->prev = self->prev;
-
- value_free (self->value);
-
- if (self->address)
- /* Use braces to appease gcc warning. *sigh* */
- {
- Py_DECREF (self->address);
- }
-
- if (self->type)
- {
- Py_DECREF (self->type);
- }
-
- self->ob_type->tp_free (self);
-}
-
-/* Helper to push a Value object on the global list. */
-static void
-note_value (value_object *value_obj)
-{
- value_obj->next = values_in_python;
- if (value_obj->next)
- value_obj->next->prev = value_obj;
- value_obj->prev = NULL;
- values_in_python = value_obj;
-}
-
-/* Called when a new gdb.Value object needs to be allocated. */
-static PyObject *
-valpy_new (PyTypeObject *subtype, PyObject *args, PyObject *keywords)
-{
- struct value *value = NULL; /* Initialize to appease gcc warning. */
- value_object *value_obj;
-
- if (PyTuple_Size (args) != 1)
- {
- PyErr_SetString (PyExc_TypeError, _("Value object creation takes only "
- "1 argument"));
- return NULL;
- }
-
- value_obj = (value_object *) subtype->tp_alloc (subtype, 1);
- if (value_obj == NULL)
- {
- PyErr_SetString (PyExc_MemoryError, _("Could not allocate memory to "
- "create Value object."));
- return NULL;
- }
-
- value = convert_value_from_python (PyTuple_GetItem (args, 0));
- if (value == NULL)
- {
- subtype->tp_free (value_obj);
- return NULL;
- }
-
- value_obj->value = value;
- value_incref (value);
- value_obj->address = NULL;
- value_obj->type = NULL;
- note_value (value_obj);
-
- return (PyObject *) value_obj;
-}
-
-/* Iterate over all the Value objects, calling preserve_one_value on
- each. */
-void
-preserve_python_values (struct objfile *objfile, htab_t copied_types)
-{
- value_object *iter;
-
- for (iter = values_in_python; iter; iter = iter->next)
- preserve_one_value (iter->value, objfile, copied_types);
-}
-
-/* Given a value of a pointer type, apply the C unary * operator to it. */
-static PyObject *
-valpy_dereference (PyObject *self, PyObject *args)
-{
- struct value *res_val = NULL; /* Initialize to appease gcc warning. */
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- res_val = value_ind (((value_object *) self)->value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return value_to_value_object (res_val);
-}
-
-/* Return "&value". */
-static PyObject *
-valpy_get_address (PyObject *self, void *closure)
-{
- struct value *res_val = NULL; /* Initialize to appease gcc warning. */
- value_object *val_obj = (value_object *) self;
- volatile struct gdb_exception except;
-
- if (!val_obj->address)
- {
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- res_val = value_addr (val_obj->value);
- }
- if (except.reason < 0)
- {
- val_obj->address = Py_None;
- Py_INCREF (Py_None);
- }
- else
- val_obj->address = value_to_value_object (res_val);
- }
-
- Py_INCREF (val_obj->address);
-
- return val_obj->address;
-}
-
-/* Return type of the value. */
-static PyObject *
-valpy_get_type (PyObject *self, void *closure)
-{
- value_object *obj = (value_object *) self;
- if (!obj->type)
- {
- obj->type = type_to_type_object (value_type (obj->value));
- if (!obj->type)
- {
- obj->type = Py_None;
- Py_INCREF (obj->type);
- }
- }
- Py_INCREF (obj->type);
- return obj->type;
-}
-
-/* Implementation of gdb.Value.lazy_string ([encoding] [, length]) ->
- string. Return a PyObject representing a lazy_string_object type.
- A lazy string is a pointer to a string with an optional encoding and
- length. If ENCODING is not given, encoding is set to None. If an
- ENCODING is provided the encoding parameter is set to ENCODING, but
- the string is not encoded. If LENGTH is provided then the length
- parameter is set to LENGTH, otherwise length will be set to -1 (first
- null of appropriate with). */
-static PyObject *
-valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw)
-{
- int length = -1;
- struct value *value = ((value_object *) self)->value;
- const char *user_encoding = NULL;
- static char *keywords[] = { "encoding", "length", NULL };
- PyObject *str_obj;
-
- if (!PyArg_ParseTupleAndKeywords (args, kw, "|si", keywords,
- &user_encoding, &length))
- return NULL;
-
- if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR)
- value = value_ind (value);
-
- str_obj = gdbpy_create_lazy_string_object (value_address (value), length,
- user_encoding, value_type (value));
-
- return (PyObject *) str_obj;
-}
-
-/* Implementation of gdb.Value.string ([encoding] [, errors]
- [, length]) -> string. Return Unicode string with value contents.
- If ENCODING is not given, the string is assumed to be encoded in
- the target's charset. If LENGTH is provided, only fetch string to
- the length provided. */
-
-static PyObject *
-valpy_string (PyObject *self, PyObject *args, PyObject *kw)
-{
- int length = -1, ret = 0;
- gdb_byte *buffer;
- struct value *value = ((value_object *) self)->value;
- volatile struct gdb_exception except;
- PyObject *unicode;
- const char *encoding = NULL;
- const char *errors = NULL;
- const char *user_encoding = NULL;
- const char *la_encoding = NULL;
- struct type *char_type;
- static char *keywords[] = { "encoding", "errors", "length", NULL };
-
- if (!PyArg_ParseTupleAndKeywords (args, kw, "|ssi", keywords,
- &user_encoding, &errors, &length))
- return NULL;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- LA_GET_STRING (value, &buffer, &length, &char_type, &la_encoding);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- encoding = (user_encoding && *user_encoding) ? user_encoding : la_encoding;
- unicode = PyUnicode_Decode (buffer, length * TYPE_LENGTH (char_type),
- encoding, errors);
- xfree (buffer);
-
- return unicode;
-}
-
-/* Cast a value to a given type. */
-static PyObject *
-valpy_cast (PyObject *self, PyObject *args)
-{
- PyObject *type_obj;
- struct type *type;
- struct value *res_val = NULL; /* Initialize to appease gcc warning. */
- volatile struct gdb_exception except;
-
- if (! PyArg_ParseTuple (args, "O", &type_obj))
- return NULL;
-
- type = type_object_to_type (type_obj);
- if (! type)
- {
- PyErr_SetString (PyExc_RuntimeError, "argument must be a Type");
- return NULL;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- res_val = value_cast (type, ((value_object *) self)->value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return value_to_value_object (res_val);
-}
-
-static Py_ssize_t
-valpy_length (PyObject *self)
-{
- /* We don't support getting the number of elements in a struct / class. */
- PyErr_SetString (PyExc_NotImplementedError,
- "Invalid operation on gdb.Value.");
- return -1;
-}
-
-/* Given string name of an element inside structure, return its value
- object. */
-static PyObject *
-valpy_getitem (PyObject *self, PyObject *key)
-{
- value_object *self_value = (value_object *) self;
- char *field = NULL;
- struct value *res_val = NULL;
- volatile struct gdb_exception except;
-
- if (gdbpy_is_string (key))
- {
- field = python_string_to_host_string (key);
- if (field == NULL)
- return NULL;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- struct value *tmp = self_value->value;
-
- if (field)
- res_val = value_struct_elt (&tmp, NULL, field, 0, NULL);
- else
- {
- /* Assume we are attempting an array access, and let the
- value code throw an exception if the index has an invalid
- type. */
- struct value *idx = convert_value_from_python (key);
- if (idx != NULL)
- {
- /* Check the value's type is something that can be accessed via
- a subscript. */
- struct type *type;
- tmp = coerce_ref (tmp);
- type = check_typedef (value_type (tmp));
- if (TYPE_CODE (type) != TYPE_CODE_ARRAY
- && TYPE_CODE (type) != TYPE_CODE_PTR)
- error( _("Cannot subscript requested type"));
- else
- res_val = value_subscript (tmp, value_as_long (idx));
- }
- }
- }
-
- xfree (field);
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return res_val ? value_to_value_object (res_val) : NULL;
-}
-
-static int
-valpy_setitem (PyObject *self, PyObject *key, PyObject *value)
-{
- PyErr_Format (PyExc_NotImplementedError,
- _("Setting of struct elements is not currently supported."));
- return -1;
-}
-
-/* Called by the Python interpreter to obtain string representation
- of the object. */
-static PyObject *
-valpy_str (PyObject *self)
-{
- char *s = NULL;
- struct ui_file *stb;
- struct cleanup *old_chain;
- PyObject *result;
- struct value_print_options opts;
- volatile struct gdb_exception except;
-
- get_user_print_options (&opts);
- opts.deref_ref = 0;
-
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- common_val_print (((value_object *) self)->value, stb, 0,
- &opts, python_language);
- s = ui_file_xstrdup (stb, NULL);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- do_cleanups (old_chain);
-
- result = PyUnicode_Decode (s, strlen (s), host_charset (), NULL);
- xfree (s);
-
- return result;
-}
-
-/* Implements gdb.Value.is_optimized_out. */
-static PyObject *
-valpy_get_is_optimized_out (PyObject *self, void *closure)
-{
- struct value *value = ((value_object *) self)->value;
-
- if (value_optimized_out (value))
- Py_RETURN_TRUE;
-
- Py_RETURN_FALSE;
-}
-
-enum valpy_opcode
-{
- VALPY_ADD,
- VALPY_SUB,
- VALPY_MUL,
- VALPY_DIV,
- VALPY_REM,
- VALPY_POW,
- VALPY_LSH,
- VALPY_RSH,
- VALPY_BITAND,
- VALPY_BITOR,
- VALPY_BITXOR
-};
-
-/* If TYPE is a reference, return the target; otherwise return TYPE. */
-#define STRIP_REFERENCE(TYPE) \
- ((TYPE_CODE (TYPE) == TYPE_CODE_REF) ? (TYPE_TARGET_TYPE (TYPE)) : (TYPE))
-
-/* Returns a value object which is the result of applying the operation
- specified by OPCODE to the given arguments. */
-static PyObject *
-valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other)
-{
- struct value *res_val = NULL; /* Initialize to appease gcc warning. */
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- struct value *arg1, *arg2;
-
- /* If the gdb.Value object is the second operand, then it will be passed
- to us as the OTHER argument, and SELF will be an entirely different
- kind of object, altogether. Because of this, we can't assume self is
- a gdb.Value object and need to convert it from python as well. */
- arg1 = convert_value_from_python (self);
- if (arg1 == NULL)
- break;
-
- arg2 = convert_value_from_python (other);
- if (arg2 == NULL)
- break;
-
- switch (opcode)
- {
- case VALPY_ADD:
- {
- struct type *ltype = value_type (arg1);
- struct type *rtype = value_type (arg2);
-
- CHECK_TYPEDEF (ltype);
- ltype = STRIP_REFERENCE (ltype);
- CHECK_TYPEDEF (rtype);
- rtype = STRIP_REFERENCE (rtype);
-
- if (TYPE_CODE (ltype) == TYPE_CODE_PTR
- && is_integral_type (rtype))
- res_val = value_ptradd (arg1, value_as_long (arg2));
- else if (TYPE_CODE (rtype) == TYPE_CODE_PTR
- && is_integral_type (ltype))
- res_val = value_ptradd (arg2, value_as_long (arg1));
- else
- res_val = value_binop (arg1, arg2, BINOP_ADD);
- }
- break;
- case VALPY_SUB:
- {
- struct type *ltype = value_type (arg1);
- struct type *rtype = value_type (arg2);
-
- CHECK_TYPEDEF (ltype);
- ltype = STRIP_REFERENCE (ltype);
- CHECK_TYPEDEF (rtype);
- rtype = STRIP_REFERENCE (rtype);
-
- if (TYPE_CODE (ltype) == TYPE_CODE_PTR
- && TYPE_CODE (rtype) == TYPE_CODE_PTR)
- /* A ptrdiff_t for the target would be preferable here. */
- res_val = value_from_longest (builtin_type_pyint,
- value_ptrdiff (arg1, arg2));
- else if (TYPE_CODE (ltype) == TYPE_CODE_PTR
- && is_integral_type (rtype))
- res_val = value_ptradd (arg1, - value_as_long (arg2));
- else
- res_val = value_binop (arg1, arg2, BINOP_SUB);
- }
- break;
- case VALPY_MUL:
- res_val = value_binop (arg1, arg2, BINOP_MUL);
- break;
- case VALPY_DIV:
- res_val = value_binop (arg1, arg2, BINOP_DIV);
- break;
- case VALPY_REM:
- res_val = value_binop (arg1, arg2, BINOP_REM);
- break;
- case VALPY_POW:
- res_val = value_binop (arg1, arg2, BINOP_EXP);
- break;
- case VALPY_LSH:
- res_val = value_binop (arg1, arg2, BINOP_LSH);
- break;
- case VALPY_RSH:
- res_val = value_binop (arg1, arg2, BINOP_RSH);
- break;
- case VALPY_BITAND:
- res_val = value_binop (arg1, arg2, BINOP_BITWISE_AND);
- break;
- case VALPY_BITOR:
- res_val = value_binop (arg1, arg2, BINOP_BITWISE_IOR);
- break;
- case VALPY_BITXOR:
- res_val = value_binop (arg1, arg2, BINOP_BITWISE_XOR);
- break;
- }
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return res_val ? value_to_value_object (res_val) : NULL;
-}
-
-static PyObject *
-valpy_add (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_ADD, self, other);
-}
-
-static PyObject *
-valpy_subtract (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_SUB, self, other);
-}
-
-static PyObject *
-valpy_multiply (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_MUL, self, other);
-}
-
-static PyObject *
-valpy_divide (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_DIV, self, other);
-}
-
-static PyObject *
-valpy_remainder (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_REM, self, other);
-}
-
-static PyObject *
-valpy_power (PyObject *self, PyObject *other, PyObject *unused)
-{
- /* We don't support the ternary form of pow. I don't know how to express
- that, so let's just throw NotImplementedError to at least do something
- about it. */
- if (unused != Py_None)
- {
- PyErr_SetString (PyExc_NotImplementedError,
- "Invalid operation on gdb.Value.");
- return NULL;
- }
-
- return valpy_binop (VALPY_POW, self, other);
-}
-
-static PyObject *
-valpy_negative (PyObject *self)
-{
- struct value *val = NULL;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- val = value_neg (((value_object *) self)->value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return value_to_value_object (val);
-}
-
-static PyObject *
-valpy_positive (PyObject *self)
-{
- return value_to_value_object (((value_object *) self)->value);
-}
-
-static PyObject *
-valpy_absolute (PyObject *self)
-{
- struct value *value = ((value_object *) self)->value;
- if (value_less (value, value_zero (value_type (value), not_lval)))
- return valpy_negative (self);
- else
- return valpy_positive (self);
-}
-
-/* Implements boolean evaluation of gdb.Value. */
-static int
-valpy_nonzero (PyObject *self)
-{
- value_object *self_value = (value_object *) self;
- struct type *type;
-
- type = check_typedef (value_type (self_value->value));
-
- if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR)
- return !!value_as_long (self_value->value);
- else if (TYPE_CODE (type) == TYPE_CODE_FLT)
- return value_as_double (self_value->value) != 0;
- else if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
- return !decimal_is_zero (value_contents (self_value->value),
- TYPE_LENGTH (type),
- gdbarch_byte_order (get_type_arch (type)));
- else
- {
- PyErr_SetString (PyExc_TypeError, _("Attempted truth testing on invalid "
- "gdb.Value type."));
- return 0;
- }
-}
-
-/* Implements ~ for value objects. */
-static PyObject *
-valpy_invert (PyObject *self)
-{
- struct value *val = NULL;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- val = value_complement (((value_object *) self)->value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return value_to_value_object (val);
-}
-
-/* Implements left shift for value objects. */
-static PyObject *
-valpy_lsh (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_LSH, self, other);
-}
-
-/* Implements right shift for value objects. */
-static PyObject *
-valpy_rsh (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_RSH, self, other);
-}
-
-/* Implements bitwise and for value objects. */
-static PyObject *
-valpy_and (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_BITAND, self, other);
-}
-
-/* Implements bitwise or for value objects. */
-static PyObject *
-valpy_or (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_BITOR, self, other);
-}
-
-/* Implements bitwise xor for value objects. */
-static PyObject *
-valpy_xor (PyObject *self, PyObject *other)
-{
- return valpy_binop (VALPY_BITXOR, self, other);
-}
-
-/* Implements comparison operations for value objects. */
-static PyObject *
-valpy_richcompare (PyObject *self, PyObject *other, int op)
-{
- int result = 0;
- struct value *value_other;
- volatile struct gdb_exception except;
-
- if (other == Py_None)
- /* Comparing with None is special. From what I can tell, in Python
- None is smaller than anything else. */
- switch (op) {
- case Py_LT:
- case Py_LE:
- case Py_EQ:
- Py_RETURN_FALSE;
- case Py_NE:
- case Py_GT:
- case Py_GE:
- Py_RETURN_TRUE;
- default:
- /* Can't happen. */
- PyErr_SetString (PyExc_NotImplementedError,
- "Invalid operation on gdb.Value.");
- return NULL;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- value_other = convert_value_from_python (other);
- if (value_other == NULL)
- {
- result = -1;
- break;
- }
-
- switch (op) {
- case Py_LT:
- result = value_less (((value_object *) self)->value, value_other);
- break;
- case Py_LE:
- result = value_less (((value_object *) self)->value, value_other)
- || value_equal (((value_object *) self)->value, value_other);
- break;
- case Py_EQ:
- result = value_equal (((value_object *) self)->value, value_other);
- break;
- case Py_NE:
- result = !value_equal (((value_object *) self)->value, value_other);
- break;
- case Py_GT:
- result = value_less (value_other, ((value_object *) self)->value);
- break;
- case Py_GE:
- result = value_less (value_other, ((value_object *) self)->value)
- || value_equal (((value_object *) self)->value, value_other);
- break;
- default:
- /* Can't happen. */
- PyErr_SetString (PyExc_NotImplementedError,
- "Invalid operation on gdb.Value.");
- result = -1;
- break;
- }
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- /* In this case, the Python exception has already been set. */
- if (result < 0)
- return NULL;
-
- if (result == 1)
- Py_RETURN_TRUE;
-
- Py_RETURN_FALSE;
-}
-
-/* Helper function to determine if a type is "int-like". */
-static int
-is_intlike (struct type *type, int ptr_ok)
-{
- CHECK_TYPEDEF (type);
- return (TYPE_CODE (type) == TYPE_CODE_INT
- || TYPE_CODE (type) == TYPE_CODE_ENUM
- || TYPE_CODE (type) == TYPE_CODE_BOOL
- || TYPE_CODE (type) == TYPE_CODE_CHAR
- || (ptr_ok && TYPE_CODE (type) == TYPE_CODE_PTR));
-}
-
-/* Implements conversion to int. */
-static PyObject *
-valpy_int (PyObject *self)
-{
- struct value *value = ((value_object *) self)->value;
- struct type *type = value_type (value);
- LONGEST l = 0;
- volatile struct gdb_exception except;
-
- CHECK_TYPEDEF (type);
- if (!is_intlike (type, 0))
- {
- PyErr_SetString (PyExc_RuntimeError, "cannot convert value to int");
- return NULL;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- l = value_as_long (value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
-#ifdef HAVE_LONG_LONG /* Defined by Python. */
- /* If we have 'long long', and the value overflows a 'long', use a
- Python Long; otherwise use a Python Int. */
- if (sizeof (l) > sizeof (long) && (l > PyInt_GetMax ()
- || l < (- (LONGEST) PyInt_GetMax ()) - 1))
- return PyLong_FromLongLong (l);
-#endif
- return PyInt_FromLong (l);
-}
-
-/* Implements conversion to long. */
-static PyObject *
-valpy_long (PyObject *self)
-{
- struct value *value = ((value_object *) self)->value;
- struct type *type = value_type (value);
- LONGEST l = 0;
- volatile struct gdb_exception except;
-
- if (!is_intlike (type, 1))
- {
- PyErr_SetString (PyExc_RuntimeError, "cannot convert value to long");
- return NULL;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- l = value_as_long (value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
-#ifdef HAVE_LONG_LONG /* Defined by Python. */
- return PyLong_FromLongLong (l);
-#else
- return PyLong_FromLong (l);
-#endif
-}
-
-/* Implements conversion to float. */
-static PyObject *
-valpy_float (PyObject *self)
-{
- struct value *value = ((value_object *) self)->value;
- struct type *type = value_type (value);
- double d = 0;
- volatile struct gdb_exception except;
-
- CHECK_TYPEDEF (type);
- if (TYPE_CODE (type) != TYPE_CODE_FLT)
- {
- PyErr_SetString (PyExc_RuntimeError, "cannot convert value to float");
- return NULL;
- }
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- d = value_as_double (value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return PyFloat_FromDouble (d);
-}
-
-/* Returns an object for a value which is released from the all_values chain,
- so its lifetime is not bound to the execution of a command. */
-PyObject *
-value_to_value_object (struct value *val)
-{
- value_object *val_obj;
-
- val_obj = PyObject_New (value_object, &value_object_type);
- if (val_obj != NULL)
- {
- val_obj->value = val;
- value_incref (val);
- val_obj->address = NULL;
- val_obj->type = NULL;
- note_value (val_obj);
- }
-
- return (PyObject *) val_obj;
-}
-
-/* Returns a borrowed reference to the struct value corresponding to
- the given value object. */
-struct value *
-value_object_to_value (PyObject *self)
-{
- value_object *real;
- if (! PyObject_TypeCheck (self, &value_object_type))
- return NULL;
- real = (value_object *) self;
- return real->value;
-}
-
-/* Try to convert a Python value to a gdb value. If the value cannot
- be converted, set a Python exception and return NULL. Returns a
- reference to a new value on the all_values chain. */
-
-struct value *
-convert_value_from_python (PyObject *obj)
-{
- struct value *value = NULL; /* -Wall */
- PyObject *target_str, *unicode_str;
- struct cleanup *old;
- volatile struct gdb_exception except;
- int cmp;
-
- gdb_assert (obj != NULL);
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- if (PyBool_Check (obj))
- {
- cmp = PyObject_IsTrue (obj);
- if (cmp >= 0)
- value = value_from_longest (builtin_type_pybool, cmp);
- }
- else if (PyInt_Check (obj))
- {
- long l = PyInt_AsLong (obj);
-
- if (! PyErr_Occurred ())
- value = value_from_longest (builtin_type_pyint, l);
- }
- else if (PyLong_Check (obj))
- {
- LONGEST l = PyLong_AsLongLong (obj);
-
- if (! PyErr_Occurred ())
- value = value_from_longest (builtin_type_pylong, l);
- }
- else if (PyFloat_Check (obj))
- {
- double d = PyFloat_AsDouble (obj);
-
- if (! PyErr_Occurred ())
- value = value_from_double (builtin_type_pyfloat, d);
- }
- else if (gdbpy_is_string (obj))
- {
- char *s;
-
- s = python_string_to_target_string (obj);
- if (s != NULL)
- {
- old = make_cleanup (xfree, s);
- value = value_cstring (s, strlen (s), builtin_type_pychar);
- do_cleanups (old);
- }
- }
- else if (PyObject_TypeCheck (obj, &value_object_type))
- value = value_copy (((value_object *) obj)->value);
- else if (gdbpy_is_lazy_string (obj))
- {
- PyObject *result;
- PyObject *function = PyString_FromString ("value");
- result = PyObject_CallMethodObjArgs (obj, function, NULL);
- value = value_copy (((value_object *) result)->value);
- }
- else
- PyErr_Format (PyExc_TypeError, _("Could not convert Python object: %s"),
- PyString_AsString (PyObject_Str (obj)));
- }
- if (except.reason < 0)
- {
- PyErr_Format (except.reason == RETURN_QUIT
- ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
- "%s", except.message);
- return NULL;
- }
-
- return value;
-}
-
-/* Returns value object in the ARGth position in GDB's history. */
-PyObject *
-gdbpy_history (PyObject *self, PyObject *args)
-{
- int i;
- struct value *res_val = NULL; /* Initialize to appease gcc warning. */
- volatile struct gdb_exception except;
-
- if (!PyArg_ParseTuple (args, "i", &i))
- return NULL;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- res_val = access_value_history (i);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return value_to_value_object (res_val);
-}
-
-void
-gdbpy_initialize_values (void)
-{
- if (PyType_Ready (&value_object_type) < 0)
- return;
-
- Py_INCREF (&value_object_type);
- PyModule_AddObject (gdb_module, "Value", (PyObject *) &value_object_type);
-
- values_in_python = NULL;
-}
-
-
-
-static PyGetSetDef value_object_getset[] = {
- { "address", valpy_get_address, NULL, "The address of the value.",
- NULL },
- { "is_optimized_out", valpy_get_is_optimized_out, NULL,
- "Boolean telling whether the value is optimized out (i.e., not available).",
- NULL },
- { "type", valpy_get_type, NULL, "Type of the value.", NULL },
- {NULL} /* Sentinel */
-};
-
-static PyMethodDef value_object_methods[] = {
- { "cast", valpy_cast, METH_VARARGS, "Cast the value to the supplied type." },
- { "dereference", valpy_dereference, METH_NOARGS, "Dereferences the value." },
- { "lazy_string", (PyCFunction) valpy_lazy_string, METH_VARARGS | METH_KEYWORDS,
- "lazy_string ([encoding] [, length]) -> lazy_string\n\
-Return a lazy string representation of the value." },
- { "string", (PyCFunction) valpy_string, METH_VARARGS | METH_KEYWORDS,
- "string ([encoding] [, errors] [, length]) -> string\n\
-Return Unicode string representation of the value." },
- {NULL} /* Sentinel */
-};
-
-static PyNumberMethods value_object_as_number = {
- valpy_add,
- valpy_subtract,
- valpy_multiply,
- valpy_divide,
- valpy_remainder,
- NULL, /* nb_divmod */
- valpy_power, /* nb_power */
- valpy_negative, /* nb_negative */
- valpy_positive, /* nb_positive */
- valpy_absolute, /* nb_absolute */
- valpy_nonzero, /* nb_nonzero */
- valpy_invert, /* nb_invert */
- valpy_lsh, /* nb_lshift */
- valpy_rsh, /* nb_rshift */
- valpy_and, /* nb_and */
- valpy_xor, /* nb_xor */
- valpy_or, /* nb_or */
- NULL, /* nb_coerce */
- valpy_int, /* nb_int */
- valpy_long, /* nb_long */
- valpy_float, /* nb_float */
- NULL, /* nb_oct */
- NULL /* nb_hex */
-};
-
-static PyMappingMethods value_object_as_mapping = {
- valpy_length,
- valpy_getitem,
- valpy_setitem
-};
-
-PyTypeObject value_object_type = {
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.Value", /*tp_name*/
- sizeof (value_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- valpy_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- &value_object_as_number, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- &value_object_as_mapping, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- valpy_str, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
- "GDB value object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- valpy_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- value_object_methods, /* tp_methods */
- 0, /* tp_members */
- value_object_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- valpy_new /* tp_new */
-};
-
-#else
-
-void
-preserve_python_values (struct objfile *objfile, htab_t copied_types)
-{
- /* Nothing. */
-}
-
-#endif /* HAVE_PYTHON */
py-value.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-utils.c
===================================================================
--- py-utils.c (revision 816)
+++ py-utils.c (nonexistent)
@@ -1,221 +0,0 @@
-/* General utility routines for GDB/Python.
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "charset.h"
-#include "python-internal.h"
-
-
-/* This is a cleanup function which decrements the refcount on a
- Python object. */
-
-static void
-py_decref (void *p)
-{
- PyObject *py = p;
- /* Note that we need the extra braces in this 'if' to avoid a
- warning from gcc. */
- if (py)
- {
- Py_DECREF (py);
- }
-}
-
-/* Return a new cleanup which will decrement the Python object's
- refcount when run. */
-
-struct cleanup *
-make_cleanup_py_decref (PyObject *py)
-{
- return make_cleanup (py_decref, (void *) py);
-}
-
-/* Converts a Python 8-bit string to a unicode string object. Assumes the
- 8-bit string is in the host charset. If an error occurs during conversion,
- returns NULL with a python exception set.
-
- As an added bonus, the functions accepts a unicode string and returns it
- right away, so callers don't need to check which kind of string they've
- got.
-
- If the given object is not one of the mentioned string types, NULL is
- returned, with the TypeError python exception set. */
-PyObject *
-python_string_to_unicode (PyObject *obj)
-{
- PyObject *unicode_str;
-
- /* If obj is already a unicode string, just return it.
- I wish life was always that simple... */
- if (PyUnicode_Check (obj))
- {
- unicode_str = obj;
- Py_INCREF (obj);
- }
-
- else if (PyString_Check (obj))
- unicode_str = PyUnicode_FromEncodedObject (obj, host_charset (), NULL);
- else
- {
- PyErr_SetString (PyExc_TypeError,
- _("Expected a string or unicode object."));
- unicode_str = NULL;
- }
-
- return unicode_str;
-}
-
-/* Returns a newly allocated string with the contents of the given unicode
- string object converted to CHARSET. If an error occurs during the
- conversion, NULL will be returned and a python exception will be set.
-
- The caller is responsible for xfree'ing the string. */
-static char *
-unicode_to_encoded_string (PyObject *unicode_str, const char *charset)
-{
- char *result;
- PyObject *string;
-
- /* Translate string to named charset. */
- string = PyUnicode_AsEncodedString (unicode_str, charset, NULL);
- if (string == NULL)
- return NULL;
-
- result = xstrdup (PyString_AsString (string));
-
- Py_DECREF (string);
-
- return result;
-}
-
-/* Returns a PyObject with the contents of the given unicode string
- object converted to a named charset. If an error occurs during
- the conversion, NULL will be returned and a python exception will
- be set. */
-static PyObject *
-unicode_to_encoded_python_string (PyObject *unicode_str, const char *charset)
-{
- PyObject *string;
-
- /* Translate string to named charset. */
- string = PyUnicode_AsEncodedString (unicode_str, charset, NULL);
- if (string == NULL)
- return NULL;
-
- return string;
-}
-
-/* Returns a newly allocated string with the contents of the given unicode
- string object converted to the target's charset. If an error occurs during
- the conversion, NULL will be returned and a python exception will be set.
-
- The caller is responsible for xfree'ing the string. */
-char *
-unicode_to_target_string (PyObject *unicode_str)
-{
- return unicode_to_encoded_string (unicode_str, target_charset ());
-}
-
-/* Returns a PyObject with the contents of the given unicode string
- object converted to the target's charset. If an error occurs
- during the conversion, NULL will be returned and a python exception
- will be set. */
-PyObject *
-unicode_to_target_python_string (PyObject *unicode_str)
-{
- return unicode_to_encoded_python_string (unicode_str, target_charset ());
-}
-
-/* Converts a python string (8-bit or unicode) to a target string in
- the target's charset. Returns NULL on error, with a python exception set.
-
- The caller is responsible for xfree'ing the string. */
-char *
-python_string_to_target_string (PyObject *obj)
-{
- PyObject *str;
- char *result;
-
- str = python_string_to_unicode (obj);
- if (str == NULL)
- return NULL;
-
- result = unicode_to_target_string (str);
- Py_DECREF (str);
- return result;
-}
-
-/* Converts a python string (8-bit or unicode) to a target string in the
- target's charset. Returns NULL on error, with a python exception
- set. */
-PyObject *
-python_string_to_target_python_string (PyObject *obj)
-{
- PyObject *str;
- PyObject *result;
-
- str = python_string_to_unicode (obj);
- if (str == NULL)
- return NULL;
-
- result = unicode_to_target_python_string (str);
- Py_DECREF (str);
- return result;
-}
-
-/* Converts a python string (8-bit or unicode) to a target string in
- the host's charset. Returns NULL on error, with a python exception set.
-
- The caller is responsible for xfree'ing the string. */
-char *
-python_string_to_host_string (PyObject *obj)
-{
- PyObject *str;
- char *result;
-
- str = python_string_to_unicode (obj);
- if (str == NULL)
- return NULL;
-
- result = unicode_to_encoded_string (str, host_charset ());
- Py_DECREF (str);
- return result;
-}
-
-/* Converts a target string of LENGTH bytes in the target's charset to a
- Python Unicode string. If LENGTH is -1, convert until a null byte is found.
-
- Returns NULL on error, with a python exception set. */
-PyObject *
-target_string_to_unicode (const gdb_byte *str, int length)
-{
- if (length == -1)
- length = strlen (str);
-
- return PyUnicode_Decode (str, length, target_charset (), NULL);
-}
-
-/* Return true if OBJ is a Python string or unicode object, false
- otherwise. */
-
-int
-gdbpy_is_string (PyObject *obj)
-{
- return PyString_Check (obj) || PyUnicode_Check (obj);
-}
py-utils.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: python.h
===================================================================
--- python.h (revision 816)
+++ python.h (nonexistent)
@@ -1,37 +0,0 @@
-/* Python/gdb header for generic use in gdb
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#ifndef GDB_PYTHON_H
-#define GDB_PYTHON_H
-
-#include "value.h"
-
-void eval_python_from_control_command (struct command_line *);
-
-void source_python_script (FILE *stream, char *file);
-
-int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
- int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language);
-
-void preserve_python_values (struct objfile *objfile, htab_t copied_types);
-
-#endif /* GDB_PYTHON_H */
python.h
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-type.c
===================================================================
--- py-type.c (revision 816)
+++ py-type.c (nonexistent)
@@ -1,875 +0,0 @@
-/* Python interface to types.
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "value.h"
-#include "exceptions.h"
-#include "python-internal.h"
-#include "charset.h"
-#include "gdbtypes.h"
-#include "cp-support.h"
-#include "demangle.h"
-#include "objfiles.h"
-#include "language.h"
-
-typedef struct pyty_type_object
-{
- PyObject_HEAD
- struct type *type;
-
- /* If a Type object is associated with an objfile, it is kept on a
- doubly-linked list, rooted in the objfile. This lets us copy the
- underlying struct type when the objfile is deleted. */
- struct pyty_type_object *prev;
- struct pyty_type_object *next;
-} type_object;
-
-static PyTypeObject type_object_type;
-
-/* A Field object. */
-typedef struct pyty_field_object
-{
- PyObject_HEAD
-
- /* Dictionary holding our attributes. */
- PyObject *dict;
-} field_object;
-
-static PyTypeObject field_object_type;
-
-/* This is used to initialize various gdb.TYPE_ constants. */
-struct pyty_code
-{
- /* The code. */
- enum type_code code;
- /* The name. */
- const char *name;
-};
-
-#define ENTRY(X) { X, #X }
-
-static struct pyty_code pyty_codes[] =
-{
- ENTRY (TYPE_CODE_PTR),
- ENTRY (TYPE_CODE_ARRAY),
- ENTRY (TYPE_CODE_STRUCT),
- ENTRY (TYPE_CODE_UNION),
- ENTRY (TYPE_CODE_ENUM),
- ENTRY (TYPE_CODE_FLAGS),
- ENTRY (TYPE_CODE_FUNC),
- ENTRY (TYPE_CODE_INT),
- ENTRY (TYPE_CODE_FLT),
- ENTRY (TYPE_CODE_VOID),
- ENTRY (TYPE_CODE_SET),
- ENTRY (TYPE_CODE_RANGE),
- ENTRY (TYPE_CODE_STRING),
- ENTRY (TYPE_CODE_BITSTRING),
- ENTRY (TYPE_CODE_ERROR),
- ENTRY (TYPE_CODE_METHOD),
- ENTRY (TYPE_CODE_METHODPTR),
- ENTRY (TYPE_CODE_MEMBERPTR),
- ENTRY (TYPE_CODE_REF),
- ENTRY (TYPE_CODE_CHAR),
- ENTRY (TYPE_CODE_BOOL),
- ENTRY (TYPE_CODE_COMPLEX),
- ENTRY (TYPE_CODE_TYPEDEF),
- ENTRY (TYPE_CODE_NAMESPACE),
- ENTRY (TYPE_CODE_DECFLOAT),
- ENTRY (TYPE_CODE_INTERNAL_FUNCTION),
- { TYPE_CODE_UNDEF, NULL }
-};
-
-
-
-static void
-field_dealloc (PyObject *obj)
-{
- field_object *f = (field_object *) obj;
- Py_XDECREF (f->dict);
- f->ob_type->tp_free (obj);
-}
-
-static PyObject *
-field_new (void)
-{
- field_object *result = PyObject_New (field_object, &field_object_type);
- if (result)
- {
- result->dict = PyDict_New ();
- if (!result->dict)
- {
- Py_DECREF (result);
- result = NULL;
- }
- }
- return (PyObject *) result;
-}
-
-
-
-/* Return the code for this type. */
-static PyObject *
-typy_get_code (PyObject *self, void *closure)
-{
- struct type *type = ((type_object *) self)->type;
- return PyInt_FromLong (TYPE_CODE (type));
-}
-
-/* Helper function for typy_fields which converts a single field to a
- dictionary. Returns NULL on error. */
-static PyObject *
-convert_field (struct type *type, int field)
-{
- PyObject *result = field_new ();
- PyObject *arg;
-
- if (!result)
- return NULL;
-
- if (!field_is_static (&TYPE_FIELD (type, field)))
- {
- arg = PyLong_FromLong (TYPE_FIELD_BITPOS (type, field));
- if (!arg)
- goto fail;
-
- if (PyObject_SetAttrString (result, "bitpos", arg) < 0)
- goto failarg;
- }
-
- if (TYPE_FIELD_NAME (type, field))
- arg = PyString_FromString (TYPE_FIELD_NAME (type, field));
- else
- {
- arg = Py_None;
- Py_INCREF (arg);
- }
- if (!arg)
- goto fail;
- if (PyObject_SetAttrString (result, "name", arg) < 0)
- goto failarg;
-
- arg = TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False;
- Py_INCREF (arg);
- if (PyObject_SetAttrString (result, "artificial", arg) < 0)
- goto failarg;
-
- if (TYPE_CODE (type) == TYPE_CODE_CLASS)
- arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False;
- else
- arg = Py_False;
- Py_INCREF (arg);
- if (PyObject_SetAttrString (result, "is_base_class", arg) < 0)
- goto failarg;
-
- arg = PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field));
- if (!arg)
- goto fail;
- if (PyObject_SetAttrString (result, "bitsize", arg) < 0)
- goto failarg;
-
- /* A field can have a NULL type in some situations. */
- if (TYPE_FIELD_TYPE (type, field) == NULL)
- {
- arg = Py_None;
- Py_INCREF (arg);
- }
- else
- arg = type_to_type_object (TYPE_FIELD_TYPE (type, field));
- if (!arg)
- goto fail;
- if (PyObject_SetAttrString (result, "type", arg) < 0)
- goto failarg;
-
- return result;
-
- failarg:
- Py_DECREF (arg);
- fail:
- Py_DECREF (result);
- return NULL;
-}
-
-/* Return a sequence of all fields. Each field is a dictionary with
- some pre-defined keys. */
-static PyObject *
-typy_fields (PyObject *self, PyObject *args)
-{
- PyObject *result;
- int i;
- struct type *type = ((type_object *) self)->type;
-
- /* We would like to make a tuple here, make fields immutable, and
- then memoize the result (and perhaps make Field.type() lazy).
- However, that can lead to cycles. */
- result = PyList_New (0);
-
- for (i = 0; i < TYPE_NFIELDS (type); ++i)
- {
- PyObject *dict = convert_field (type, i);
- if (!dict)
- {
- Py_DECREF (result);
- return NULL;
- }
- if (PyList_Append (result, dict))
- {
- Py_DECREF (dict);
- Py_DECREF (result);
- return NULL;
- }
- }
-
- return result;
-}
-
-/* Return the type's tag, or None. */
-static PyObject *
-typy_get_tag (PyObject *self, void *closure)
-{
- struct type *type = ((type_object *) self)->type;
- if (!TYPE_TAG_NAME (type))
- Py_RETURN_NONE;
- return PyString_FromString (TYPE_TAG_NAME (type));
-}
-
-/* Return the type, stripped of typedefs. */
-static PyObject *
-typy_strip_typedefs (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
-
- return type_to_type_object (check_typedef (type));
-}
-
-/* Return a Type object which represents a pointer to SELF. */
-static PyObject *
-typy_pointer (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- type = lookup_pointer_type (type);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return type_to_type_object (type);
-}
-
-/* Return the range of a type represented by SELF. The return type is
- a tuple. The first element of the tuple contains the low bound,
- while the second element of the tuple contains the high bound. */
-static PyObject *
-typy_range (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
- PyObject *result;
- PyObject *low_bound = NULL, *high_bound = NULL;
- /* Initialize these to appease GCC warnings. */
- LONGEST low = 0, high = 0;
-
- if (TYPE_CODE (type) != TYPE_CODE_ARRAY
- && TYPE_CODE (type) != TYPE_CODE_STRING
- && TYPE_CODE (type) != TYPE_CODE_RANGE)
- {
- PyErr_SetString (PyExc_RuntimeError,
- "This type does not have a range.");
- return NULL;
- }
-
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_ARRAY:
- case TYPE_CODE_STRING:
- low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
- high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type));
- break;
- case TYPE_CODE_RANGE:
- low = TYPE_LOW_BOUND (type);
- high = TYPE_HIGH_BOUND (type);
- break;
- }
-
- low_bound = PyLong_FromLong (low);
- if (!low_bound)
- goto failarg;
-
- high_bound = PyLong_FromLong (high);
- if (!high_bound)
- goto failarg;
-
- result = PyTuple_New (2);
- if (!result)
- goto failarg;
-
- if (PyTuple_SetItem (result, 0, low_bound) != 0)
- {
- Py_DECREF (result);
- goto failarg;
- }
- if (PyTuple_SetItem (result, 1, high_bound) != 0)
- {
- Py_DECREF (high_bound);
- Py_DECREF (result);
- return NULL;
- }
- return result;
-
- failarg:
- Py_XDECREF (high_bound);
- Py_XDECREF (low_bound);
- return NULL;
-}
-
-/* Return a Type object which represents a reference to SELF. */
-static PyObject *
-typy_reference (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- type = lookup_reference_type (type);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return type_to_type_object (type);
-}
-
-/* Return a Type object which represents the target type of SELF. */
-static PyObject *
-typy_target (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
-
- if (!TYPE_TARGET_TYPE (type))
- {
- PyErr_SetString (PyExc_RuntimeError, "type does not have a target");
- return NULL;
- }
-
- return type_to_type_object (TYPE_TARGET_TYPE (type));
-}
-
-/* Return a const-qualified type variant. */
-static PyObject *
-typy_const (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- type = make_cv_type (1, 0, type, NULL);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return type_to_type_object (type);
-}
-
-/* Return a volatile-qualified type variant. */
-static PyObject *
-typy_volatile (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- type = make_cv_type (0, 1, type, NULL);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return type_to_type_object (type);
-}
-
-/* Return an unqualified type variant. */
-static PyObject *
-typy_unqualified (PyObject *self, PyObject *args)
-{
- struct type *type = ((type_object *) self)->type;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- type = make_cv_type (0, 0, type, NULL);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- return type_to_type_object (type);
-}
-
-/* Return the size of the type represented by SELF, in bytes. */
-static PyObject *
-typy_get_sizeof (PyObject *self, void *closure)
-{
- struct type *type = ((type_object *) self)->type;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- check_typedef (type);
- }
- /* Ignore exceptions. */
-
- return PyLong_FromLong (TYPE_LENGTH (type));
-}
-
-static struct type *
-typy_lookup_typename (char *type_name)
-{
- struct type *type = NULL;
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- if (!strncmp (type_name, "struct ", 7))
- type = lookup_struct (type_name + 7, NULL);
- else if (!strncmp (type_name, "union ", 6))
- type = lookup_union (type_name + 6, NULL);
- else if (!strncmp (type_name, "enum ", 5))
- type = lookup_enum (type_name + 5, NULL);
- else
- type = lookup_typename (python_language, python_gdbarch,
- type_name, NULL, 0);
- }
- if (except.reason < 0)
- {
- PyErr_Format (except.reason == RETURN_QUIT
- ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
- "%s", except.message);
- return NULL;
- }
-
- return type;
-}
-
-static struct type *
-typy_lookup_type (struct demangle_component *demangled)
-{
- struct type *type;
- char *type_name;
- enum demangle_component_type demangled_type;
-
- /* Save the type: typy_lookup_type() may (indirectly) overwrite
- memory pointed by demangled. */
- demangled_type = demangled->type;
-
- if (demangled_type == DEMANGLE_COMPONENT_POINTER
- || demangled_type == DEMANGLE_COMPONENT_REFERENCE
- || demangled_type == DEMANGLE_COMPONENT_CONST
- || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
- {
- type = typy_lookup_type (demangled->u.s_binary.left);
- if (! type)
- return NULL;
-
- switch (demangled_type)
- {
- case DEMANGLE_COMPONENT_REFERENCE:
- return lookup_reference_type (type);
- case DEMANGLE_COMPONENT_POINTER:
- return lookup_pointer_type (type);
- case DEMANGLE_COMPONENT_CONST:
- return make_cv_type (1, 0, type, NULL);
- case DEMANGLE_COMPONENT_VOLATILE:
- return make_cv_type (0, 1, type, NULL);
- }
- }
-
- type_name = cp_comp_to_string (demangled, 10);
- type = typy_lookup_typename (type_name);
- xfree (type_name);
-
- return type;
-}
-
-static PyObject *
-typy_template_argument (PyObject *self, PyObject *args)
-{
- int i, argno, n_pointers;
- struct type *type = ((type_object *) self)->type;
- struct demangle_component *demangled;
- const char *err;
- struct type *argtype;
-
- if (! PyArg_ParseTuple (args, "i", &argno))
- return NULL;
-
- type = check_typedef (type);
- if (TYPE_CODE (type) == TYPE_CODE_REF)
- type = check_typedef (TYPE_TARGET_TYPE (type));
-
- if (TYPE_NAME (type) == NULL)
- {
- PyErr_SetString (PyExc_RuntimeError, "null type name");
- return NULL;
- }
-
- /* Note -- this is not thread-safe. */
- demangled = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
- if (! demangled)
- {
- PyErr_SetString (PyExc_RuntimeError, err);
- return NULL;
- }
-
- /* Strip off component names. */
- while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
- || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
- demangled = demangled->u.s_binary.right;
-
- if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
- {
- PyErr_SetString (PyExc_RuntimeError, "type is not a template");
- return NULL;
- }
-
- /* Skip from the template to the arguments. */
- demangled = demangled->u.s_binary.right;
-
- for (i = 0; demangled && i < argno; ++i)
- demangled = demangled->u.s_binary.right;
-
- if (! demangled)
- {
- PyErr_Format (PyExc_RuntimeError, "no argument %d in template",
- argno);
- return NULL;
- }
-
- argtype = typy_lookup_type (demangled->u.s_binary.left);
- if (! argtype)
- return NULL;
-
- return type_to_type_object (argtype);
-}
-
-static PyObject *
-typy_str (PyObject *self)
-{
- volatile struct gdb_exception except;
- char *thetype = NULL;
- long length = 0;
- PyObject *result;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- struct cleanup *old_chain;
- struct ui_file *stb;
-
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
-
- type_print (type_object_to_type (self), "", stb, -1);
-
- thetype = ui_file_xstrdup (stb, &length);
- do_cleanups (old_chain);
- }
- if (except.reason < 0)
- {
- xfree (thetype);
- GDB_PY_HANDLE_EXCEPTION (except);
- }
-
- result = PyUnicode_Decode (thetype, length, host_charset (), NULL);
- xfree (thetype);
-
- return result;
-}
-
-
-
-static const struct objfile_data *typy_objfile_data_key;
-
-static void
-save_objfile_types (struct objfile *objfile, void *datum)
-{
- type_object *obj = datum;
- htab_t copied_types;
- struct cleanup *cleanup;
-
- /* This prevents another thread from freeing the objects we're
- operating on. */
- cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
-
- copied_types = create_copied_types_hash (objfile);
-
- while (obj)
- {
- type_object *next = obj->next;
-
- htab_empty (copied_types);
-
- obj->type = copy_type_recursive (objfile, obj->type, copied_types);
-
- obj->next = NULL;
- obj->prev = NULL;
-
- obj = next;
- }
-
- htab_delete (copied_types);
-
- do_cleanups (cleanup);
-}
-
-static void
-set_type (type_object *obj, struct type *type)
-{
- obj->type = type;
- obj->prev = NULL;
- if (type && TYPE_OBJFILE (type))
- {
- struct objfile *objfile = TYPE_OBJFILE (type);
-
- obj->next = objfile_data (objfile, typy_objfile_data_key);
- if (obj->next)
- obj->next->prev = obj;
- set_objfile_data (objfile, typy_objfile_data_key, obj);
- }
- else
- obj->next = NULL;
-}
-
-static void
-typy_dealloc (PyObject *obj)
-{
- type_object *type = (type_object *) obj;
-
- if (type->prev)
- type->prev->next = type->next;
- else if (type->type && TYPE_OBJFILE (type->type))
- {
- /* Must reset head of list. */
- struct objfile *objfile = TYPE_OBJFILE (type->type);
- if (objfile)
- set_objfile_data (objfile, typy_objfile_data_key, type->next);
- }
- if (type->next)
- type->next->prev = type->prev;
-
- type->ob_type->tp_free (type);
-}
-
-/* Create a new Type referring to TYPE. */
-PyObject *
-type_to_type_object (struct type *type)
-{
- type_object *type_obj;
-
- type_obj = PyObject_New (type_object, &type_object_type);
- if (type_obj)
- set_type (type_obj, type);
-
- return (PyObject *) type_obj;
-}
-
-struct type *
-type_object_to_type (PyObject *obj)
-{
- if (! PyObject_TypeCheck (obj, &type_object_type))
- return NULL;
- return ((type_object *) obj)->type;
-}
-
-
-
-/* Implementation of gdb.lookup_type. */
-PyObject *
-gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
-{
- static char *keywords[] = { "name", NULL };
- char *type_name = NULL;
- struct type *type = NULL;
-
- if (! PyArg_ParseTupleAndKeywords (args, kw, "s", keywords, &type_name))
- return NULL;
-
- type = typy_lookup_typename (type_name);
- if (! type)
- return NULL;
-
- return (PyObject *) type_to_type_object (type);
-}
-
-void
-gdbpy_initialize_types (void)
-{
- int i;
-
- typy_objfile_data_key
- = register_objfile_data_with_cleanup (save_objfile_types, NULL);
-
- if (PyType_Ready (&type_object_type) < 0)
- return;
- if (PyType_Ready (&field_object_type) < 0)
- return;
-
- for (i = 0; pyty_codes[i].name; ++i)
- {
- if (PyModule_AddIntConstant (gdb_module,
- /* Cast needed for Python 2.4. */
- (char *) pyty_codes[i].name,
- pyty_codes[i].code) < 0)
- return;
- }
-
- Py_INCREF (&type_object_type);
- PyModule_AddObject (gdb_module, "Type", (PyObject *) &type_object_type);
-
- Py_INCREF (&field_object_type);
- PyModule_AddObject (gdb_module, "Field", (PyObject *) &field_object_type);
-}
-
-
-
-static PyGetSetDef type_object_getset[] =
-{
- { "code", typy_get_code, NULL,
- "The code for this type.", NULL },
- { "sizeof", typy_get_sizeof, NULL,
- "The size of this type, in bytes.", NULL },
- { "tag", typy_get_tag, NULL,
- "The tag name for this type, or None.", NULL },
- { NULL }
-};
-
-static PyMethodDef type_object_methods[] =
-{
- { "const", typy_const, METH_NOARGS,
- "const () -> Type\n\
-Return a const variant of this type." },
- { "fields", typy_fields, METH_NOARGS,
- "field () -> list\n\
-Return a sequence holding all the fields of this type.\n\
-Each field is a dictionary." },
- { "pointer", typy_pointer, METH_NOARGS,
- "pointer () -> Type\n\
-Return a type of pointer to this type." },
- { "range", typy_range, METH_NOARGS,
- "range () -> tuple\n\
-Return a tuple containing the lower and upper range for this type."},
- { "reference", typy_reference, METH_NOARGS,
- "reference () -> Type\n\
-Return a type of reference to this type." },
- { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
- "strip_typedefs () -> Type\n\
-Return a type formed by stripping this type of all typedefs."},
- { "target", typy_target, METH_NOARGS,
- "target () -> Type\n\
-Return the target type of this type." },
- { "template_argument", typy_template_argument, METH_VARARGS,
- "template_argument (arg) -> Type\n\
-Return the type of a template argument." },
- { "unqualified", typy_unqualified, METH_NOARGS,
- "unqualified () -> Type\n\
-Return a variant of this type without const or volatile attributes." },
- { "volatile", typy_volatile, METH_NOARGS,
- "volatile () -> Type\n\
-Return a volatile variant of this type" },
- { NULL }
-};
-
-static PyTypeObject type_object_type =
-{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.Type", /*tp_name*/
- sizeof (type_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- typy_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- typy_str, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
- "GDB type object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- type_object_methods, /* tp_methods */
- 0, /* tp_members */
- type_object_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
-};
-
-static PyTypeObject field_object_type =
-{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.Field", /*tp_name*/
- sizeof (field_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- field_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
- "GDB field object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- offsetof (field_object, dict), /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
-};
py-type.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-cmd.c
===================================================================
--- py-cmd.c (revision 816)
+++ py-cmd.c (nonexistent)
@@ -1,585 +0,0 @@
-/* gdb commands implemented in Python
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-
-#include "defs.h"
-#include "arch-utils.h"
-#include "value.h"
-#include "exceptions.h"
-#include "python-internal.h"
-#include "charset.h"
-#include "gdbcmd.h"
-#include "cli/cli-decode.h"
-#include "completer.h"
-#include "language.h"
-
-/* Struct representing built-in completion types. */
-struct cmdpy_completer
-{
- /* Python symbol name. */
- char *name;
- /* Completion function. */
- char **(*completer) (struct cmd_list_element *, char *, char *);
-};
-
-static struct cmdpy_completer completers[] =
-{
- { "COMPLETE_NONE", noop_completer },
- { "COMPLETE_FILENAME", filename_completer },
- { "COMPLETE_LOCATION", location_completer },
- { "COMPLETE_COMMAND", command_completer },
- { "COMPLETE_SYMBOL", make_symbol_completion_list_fn },
-};
-
-#define N_COMPLETERS (sizeof (completers) / sizeof (completers[0]))
-
-/* A gdb command. For the time being only ordinary commands (not
- set/show commands) are allowed. */
-struct cmdpy_object
-{
- PyObject_HEAD
-
- /* The corresponding gdb command object, or NULL if the command is
- no longer installed. */
- struct cmd_list_element *command;
-
- /* A prefix command requires storage for a list of its sub-commands.
- A pointer to this is passed to add_prefix_command, and to add_cmd
- for sub-commands of that prefix. If this Command is not a prefix
- command, then this field is unused. */
- struct cmd_list_element *sub_list;
-};
-
-typedef struct cmdpy_object cmdpy_object;
-
-static PyTypeObject cmdpy_object_type;
-
-
-/* Constants used by this module. */
-static PyObject *invoke_cst;
-static PyObject *complete_cst;
-
-
-
-/* Python function which wraps dont_repeat. */
-static PyObject *
-cmdpy_dont_repeat (PyObject *self, PyObject *args)
-{
- dont_repeat ();
- Py_RETURN_NONE;
-}
-
-
-
-/* Called if the gdb cmd_list_element is destroyed. */
-static void
-cmdpy_destroyer (struct cmd_list_element *self, void *context)
-{
- cmdpy_object *cmd;
- struct cleanup *cleanup;
-
- cleanup = ensure_python_env (get_current_arch (), current_language);
-
- /* Release our hold on the command object. */
- cmd = (cmdpy_object *) context;
- cmd->command = NULL;
- Py_DECREF (cmd);
-
- /* We allocated the name, doc string, and perhaps the prefix
- name. */
- xfree (self->name);
- xfree (self->doc);
- xfree (self->prefixname);
-
- do_cleanups (cleanup);
-}
-
-/* Called by gdb to invoke the command. */
-static void
-cmdpy_function (struct cmd_list_element *command, char *args, int from_tty)
-{
- cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
- PyObject *argobj, *ttyobj, *result;
- struct cleanup *cleanup;
-
- cleanup = ensure_python_env (get_current_arch (), current_language);
-
- if (! obj)
- error (_("Invalid invocation of Python command object."));
- if (! PyObject_HasAttr ((PyObject *) obj, invoke_cst))
- {
- if (obj->command->prefixname)
- {
- /* A prefix command does not need an invoke method. */
- do_cleanups (cleanup);
- return;
- }
- error (_("Python command object missing 'invoke' method."));
- }
-
- if (! args)
- args = "";
- argobj = PyUnicode_Decode (args, strlen (args), host_charset (), NULL);
- if (! argobj)
- error (_("Could not convert arguments to Python string."));
-
- ttyobj = from_tty ? Py_True : Py_False;
- Py_INCREF (ttyobj);
- result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj,
- ttyobj, NULL);
- Py_DECREF (argobj);
- Py_DECREF (ttyobj);
- if (! result)
- {
- PyObject *ptype, *pvalue, *ptraceback;
- char *s, *str;
-
- PyErr_Fetch (&ptype, &pvalue, &ptraceback);
-
- if (pvalue && PyString_Check (pvalue))
- {
- /* Make a temporary copy of the string data. */
- char *s = PyString_AsString (pvalue);
- char *copy = alloca (strlen (s) + 1);
- strcpy (copy, s);
-
- PyErr_Restore (ptype, pvalue, ptraceback);
- gdbpy_print_stack ();
- error (_("Error occurred in Python command: %s"), copy);
- }
- else
- {
- PyErr_Restore (ptype, pvalue, ptraceback);
- gdbpy_print_stack ();
- error (_("Error occurred in Python command."));
- }
- }
- Py_DECREF (result);
- do_cleanups (cleanup);
-}
-
-/* Called by gdb for command completion. */
-static char **
-cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
-{
- cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
- PyObject *textobj, *wordobj, *resultobj = NULL;
- char **result = NULL;
- struct cleanup *cleanup;
-
- cleanup = ensure_python_env (get_current_arch (), current_language);
-
- if (! obj)
- error (_("Invalid invocation of Python command object."));
- if (! PyObject_HasAttr ((PyObject *) obj, complete_cst))
- {
- /* If there is no complete method, don't error -- instead, just
- say that there are no completions. */
- goto done;
- }
-
- textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL);
- if (! textobj)
- error (_("Could not convert argument to Python string."));
- wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL);
- if (! wordobj)
- error (_("Could not convert argument to Python string."));
-
- resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst,
- textobj, wordobj, NULL);
- Py_DECREF (textobj);
- Py_DECREF (wordobj);
- if (! resultobj)
- {
- /* Just swallow errors here. */
- PyErr_Clear ();
- goto done;
- }
- make_cleanup_py_decref (resultobj);
-
- result = NULL;
- if (PySequence_Check (resultobj))
- {
- Py_ssize_t i, len = PySequence_Size (resultobj);
- Py_ssize_t out;
- if (len < 0)
- goto done;
-
- result = (char **) xmalloc ((len + 1) * sizeof (char *));
- for (i = out = 0; i < len; ++i)
- {
- int l;
- PyObject *elt = PySequence_GetItem (resultobj, i);
- if (elt == NULL || ! gdbpy_is_string (elt))
- {
- /* Skip problem elements. */
- PyErr_Clear ();
- continue;
- }
- result[out] = python_string_to_host_string (elt);
- ++out;
- }
- result[out] = NULL;
- }
- else if (PyInt_Check (resultobj))
- {
- /* User code may also return one of the completion constants,
- thus requesting that sort of completion. */
- long value = PyInt_AsLong (resultobj);
- if (value >= 0 && value < (long) N_COMPLETERS)
- result = completers[value].completer (command, text, word);
- }
-
- done:
-
- do_cleanups (cleanup);
-
- return result;
-}
-
-/* Helper for cmdpy_init which locates the command list to use and
- pulls out the command name.
-
- TEXT is the command name list. The final word in the list is the
- name of the new command. All earlier words must be existing prefix
- commands.
-
- *BASE_LIST is set to the final prefix command's list of
- *sub-commands.
-
- This function returns the xmalloc()d name of the new command. On
- error sets the Python error and returns NULL. */
-static char *
-parse_command_name (char *text, struct cmd_list_element ***base_list)
-{
- struct cmd_list_element *elt;
- int len = strlen (text);
- int i, lastchar;
- char *prefix_text;
- char *result;
-
- /* Skip trailing whitespace. */
- for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
- ;
- if (i < 0)
- {
- PyErr_SetString (PyExc_RuntimeError, _("no command name found"));
- return NULL;
- }
- lastchar = i;
-
- /* Find first character of the final word. */
- for (; i > 0 && (isalnum (text[i - 1])
- || text[i - 1] == '-'
- || text[i - 1] == '_');
- --i)
- ;
- result = xmalloc (lastchar - i + 2);
- memcpy (result, &text[i], lastchar - i + 1);
- result[lastchar - i + 1] = '\0';
-
- /* Skip whitespace again. */
- for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
- ;
- if (i < 0)
- {
- *base_list = &cmdlist;
- return result;
- }
-
- prefix_text = xmalloc (i + 2);
- memcpy (prefix_text, text, i + 1);
- prefix_text[i + 1] = '\0';
-
- text = prefix_text;
- elt = lookup_cmd_1 (&text, cmdlist, NULL, 1);
- if (!elt || elt == (struct cmd_list_element *) -1)
- {
- PyErr_Format (PyExc_RuntimeError, _("could not find command prefix %s"),
- prefix_text);
- xfree (prefix_text);
- xfree (result);
- return NULL;
- }
-
- if (elt->prefixlist)
- {
- xfree (prefix_text);
- *base_list = elt->prefixlist;
- return result;
- }
-
- PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command"),
- prefix_text);
- xfree (prefix_text);
- xfree (result);
- return NULL;
-}
-
-/* Object initializer; sets up gdb-side structures for command.
-
- Use: __init__(NAME, COMMAND_CLASS [, COMPLETER_CLASS][, PREFIX]]).
-
- NAME is the name of the command. It may consist of multiple words,
- in which case the final word is the name of the new command, and
- earlier words must be prefix commands.
-
- COMMAND_CLASS is the kind of command. It should be one of the COMMAND_*
- constants defined in the gdb module.
-
- COMPLETER_CLASS is the kind of completer. If not given, the
- "complete" method will be used. Otherwise, it should be one of the
- COMPLETE_* constants defined in the gdb module.
-
- If PREFIX is True, then this command is a prefix command.
-
- The documentation for the command is taken from the doc string for
- the python class.
-
-*/
-static int
-cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
-{
- cmdpy_object *obj = (cmdpy_object *) self;
- char *name;
- int cmdtype;
- int completetype = -1;
- char *docstring = NULL;
- volatile struct gdb_exception except;
- struct cmd_list_element **cmd_list;
- char *cmd_name, *pfx_name;
- static char *keywords[] = { "name", "command_class", "completer_class",
- "prefix", NULL };
- PyObject *is_prefix = NULL;
- int cmp;
-
- if (obj->command)
- {
- /* Note: this is apparently not documented in Python. We return
- 0 for success, -1 for failure. */
- PyErr_Format (PyExc_RuntimeError,
- _("command object already initialized"));
- return -1;
- }
-
- if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO", keywords, &name, &cmdtype,
- &completetype, &is_prefix))
- return -1;
-
- if (cmdtype != no_class && cmdtype != class_run
- && cmdtype != class_vars && cmdtype != class_stack
- && cmdtype != class_files && cmdtype != class_support
- && cmdtype != class_info && cmdtype != class_breakpoint
- && cmdtype != class_trace && cmdtype != class_obscure
- && cmdtype != class_maintenance)
- {
- PyErr_Format (PyExc_RuntimeError, _("invalid command class argument"));
- return -1;
- }
-
- if (completetype < -1 || completetype >= (int) N_COMPLETERS)
- {
- PyErr_Format (PyExc_RuntimeError, _("invalid completion type argument"));
- return -1;
- }
-
- cmd_name = parse_command_name (name, &cmd_list);
- if (! cmd_name)
- return -1;
-
- pfx_name = NULL;
- if (is_prefix != NULL)
- {
- cmp = PyObject_IsTrue (is_prefix);
- if (cmp == 1)
- {
- int i, out;
-
- /* Make a normalized form of the command name. */
- pfx_name = xmalloc (strlen (name) + 2);
-
- i = 0;
- out = 0;
- while (name[i])
- {
- /* Skip whitespace. */
- while (name[i] == ' ' || name[i] == '\t')
- ++i;
- /* Copy non-whitespace characters. */
- while (name[i] && name[i] != ' ' && name[i] != '\t')
- pfx_name[out++] = name[i++];
- /* Add a single space after each word -- including the final
- word. */
- pfx_name[out++] = ' ';
- }
- pfx_name[out] = '\0';
- }
- else if (cmp < 0)
- return -1;
- }
- if (PyObject_HasAttr (self, gdbpy_doc_cst))
- {
- PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst);
- if (ds_obj && gdbpy_is_string (ds_obj))
- docstring = python_string_to_host_string (ds_obj);
- }
- if (! docstring)
- docstring = xstrdup (_("This command is not documented."));
-
- Py_INCREF (self);
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- struct cmd_list_element *cmd;
-
- if (pfx_name)
- {
- int allow_unknown;
-
- /* If we have our own "invoke" method, then allow unknown
- sub-commands. */
- allow_unknown = PyObject_HasAttr (self, invoke_cst);
- cmd = add_prefix_cmd (cmd_name, (enum command_class) cmdtype,
- NULL, docstring, &obj->sub_list,
- pfx_name, allow_unknown, cmd_list);
- }
- else
- cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL,
- docstring, cmd_list);
-
- /* There appears to be no API to set this. */
- cmd->func = cmdpy_function;
- cmd->destroyer = cmdpy_destroyer;
-
- obj->command = cmd;
- set_cmd_context (cmd, self);
- set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer
- : completers[completetype].completer));
- }
- if (except.reason < 0)
- {
- xfree (cmd_name);
- xfree (docstring);
- xfree (pfx_name);
- Py_DECREF (self);
- PyErr_Format (except.reason == RETURN_QUIT
- ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
- "%s", except.message);
- return -1;
- }
- return 0;
-}
-
-
-
-/* Initialize the 'commands' code. */
-void
-gdbpy_initialize_commands (void)
-{
- int i;
-
- if (PyType_Ready (&cmdpy_object_type) < 0)
- return;
-
- /* Note: alias and user are special; pseudo appears to be unused,
- and there is no reason to expose tui or xdb, I think. */
- if (PyModule_AddIntConstant (gdb_module, "COMMAND_NONE", no_class) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_RUNNING", class_run) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_DATA", class_vars) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_STACK", class_stack) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_FILES", class_files) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_SUPPORT",
- class_support) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_STATUS", class_info) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_BREAKPOINTS",
- class_breakpoint) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_TRACEPOINTS",
- class_trace) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
- class_obscure) < 0
- || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
- class_maintenance) < 0)
- return;
-
- for (i = 0; i < N_COMPLETERS; ++i)
- {
- if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0)
- return;
- }
-
- Py_INCREF (&cmdpy_object_type);
- PyModule_AddObject (gdb_module, "Command",
- (PyObject *) &cmdpy_object_type);
-
- invoke_cst = PyString_FromString ("invoke");
- complete_cst = PyString_FromString ("complete");
-}
-
-
-
-static PyMethodDef cmdpy_object_methods[] =
-{
- { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS,
- "Prevent command repetition when user enters empty line." },
-
- { 0 }
-};
-
-static PyTypeObject cmdpy_object_type =
-{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.Command", /*tp_name*/
- sizeof (cmdpy_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "GDB command object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- cmdpy_object_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- cmdpy_init, /* tp_init */
- 0, /* tp_alloc */
- PyType_GenericNew /* tp_new */
-};
py-cmd.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-lazy-string.c
===================================================================
--- py-lazy-string.c (revision 816)
+++ py-lazy-string.c (nonexistent)
@@ -1,291 +0,0 @@
-/* Python interface to lazy strings.
-
- Copyright (C) 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "python-internal.h"
-#include "charset.h"
-#include "value.h"
-#include "exceptions.h"
-#include "valprint.h"
-#include "language.h"
-
-typedef struct {
- PyObject_HEAD
- /* Holds the address of the lazy string. */
- CORE_ADDR address;
-
- /* Holds the encoding that will be applied to the string
- when the string is printed by GDB. If the encoding is set
- to None then GDB will select the most appropriate
- encoding when the sting is printed. */
- char *encoding;
-
- /* Holds the length of the string in characters. If the
- length is -1, then the string will be fetched and encoded up to
- the first null of appropriate width. */
- long length;
-
- /* This attribute holds the type that is represented by the lazy
- string's type. */
- struct type *type;
-} lazy_string_object;
-
-static PyTypeObject lazy_string_object_type;
-
-static PyObject *
-stpy_get_address (PyObject *self, void *closure)
-{
- lazy_string_object *self_string = (lazy_string_object *) self;
- return PyLong_FromUnsignedLongLong (self_string->address);
-}
-
-static PyObject *
-stpy_get_encoding (PyObject *self, void *closure)
-{
- lazy_string_object *self_string = (lazy_string_object *) self;
- PyObject *result;
-
- /* An encoding can be set to NULL by the user, so check before
- attempting a Python FromString call. If NULL return Py_None. */
- if (self_string->encoding)
- result = PyString_FromString (self_string->encoding);
- else
- {
- result = Py_None;
- Py_INCREF (result);
- }
-
- return result;
-}
-
-static PyObject *
-stpy_get_length (PyObject *self, void *closure)
-{
- lazy_string_object *self_string = (lazy_string_object *) self;
- return PyLong_FromLong (self_string->length);
-}
-
-PyObject *
-stpy_get_type (PyObject *self, void *closure)
-{
- lazy_string_object *str_obj = (lazy_string_object *) self;
- return type_to_type_object (str_obj->type);
-}
-
-static PyObject *
-stpy_convert_to_value (PyObject *self, PyObject *args)
-{
- lazy_string_object *self_string = (lazy_string_object *) self;
- struct value *val;
-
- val = value_at_lazy (self_string->type, self_string->address);
- return value_to_value_object (val);
-}
-
-static void
-stpy_dealloc (PyObject *self)
-{
- lazy_string_object *self_string = (lazy_string_object *) self;
- xfree (self_string->encoding);
-}
-
-PyObject *
-gdbpy_create_lazy_string_object (CORE_ADDR address, long length,
- const char *encoding, struct type *type)
-{
- lazy_string_object *str_obj = NULL;
-
- if (address == 0)
- {
- PyErr_SetString (PyExc_MemoryError,
- "Cannot create a lazy string from a GDB-side string.");
- return NULL;
- }
-
- if (!type)
- {
- PyErr_SetString (PyExc_RuntimeError,
- "A lazy string's type cannot be NULL.");
- return NULL;
- }
-
- str_obj = PyObject_New (lazy_string_object, &lazy_string_object_type);
- if (!str_obj)
- return NULL;
-
- str_obj->address = address;
- str_obj->length = length;
- if (encoding == NULL || !strcmp (encoding, ""))
- str_obj->encoding = NULL;
- else
- str_obj->encoding = xstrdup (encoding);
- str_obj->type = type;
-
- return (PyObject *) str_obj;
-}
-
-void
-gdbpy_initialize_lazy_string (void)
-{
- if (PyType_Ready (&lazy_string_object_type) < 0)
- return;
-
- Py_INCREF (&lazy_string_object_type);
-}
-
-/* Determine whether the printer object pointed to by OBJ is a
- Python lazy string. */
-int
-gdbpy_is_lazy_string (PyObject *result)
-{
- return PyObject_TypeCheck (result, &lazy_string_object_type);
-}
-
-/* Extract and return the actual string from the lazy string object
- STRING. Addtionally, the string type is written to *STR_TYPE, the
- string length is written to *LENGTH, and the string encoding is
- written to *ENCODING. On error, NULL is returned. The caller is
- responsible for freeing the returned buffer. */
-gdb_byte *
-gdbpy_extract_lazy_string (PyObject *string, struct type **str_type,
- long *length, char **encoding)
-{
- int width;
- int bytes_read;
- gdb_byte *buffer = NULL;
- int errcode = 0;
- CORE_ADDR addr;
- struct gdbarch *gdbarch;
- enum bfd_endian byte_order;
- PyObject *py_len = NULL, *py_encoding = NULL;
- PyObject *py_addr = NULL, *py_type = NULL;
- volatile struct gdb_exception except;
-
- py_len = PyObject_GetAttrString (string, "length");
- py_encoding = PyObject_GetAttrString (string, "encoding");
- py_addr = PyObject_GetAttrString (string, "address");
- py_type = PyObject_GetAttrString (string, "type");
-
- /* A NULL encoding, length, address or type is not ok. */
- if (!py_len || !py_encoding || !py_addr || !py_type)
- goto error;
-
- *length = PyLong_AsLong (py_len);
- addr = PyLong_AsUnsignedLongLong (py_addr);
-
- /* If the user supplies Py_None an encoding, set encoding to NULL.
- This will trigger the resulting LA_PRINT_CALL to automatically
- select an encoding. */
- if (py_encoding == Py_None)
- *encoding = NULL;
- else
- *encoding = xstrdup (PyString_AsString (py_encoding));
-
- *str_type = type_object_to_type (py_type);
- gdbarch = get_type_arch (*str_type);
- byte_order = gdbarch_byte_order (gdbarch);
- width = TYPE_LENGTH (*str_type);
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- errcode = read_string (addr, *length, width,
- *length, byte_order, &buffer,
- &bytes_read);
- }
- if (except.reason < 0)
- {
- PyErr_Format (except.reason == RETURN_QUIT \
- ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \
- "%s", except.message); \
- goto error;
-
- }
-
- if (errcode)
- goto error;
-
- *length = bytes_read / width;
-
- Py_DECREF (py_encoding);
- Py_DECREF (py_len);
- Py_DECREF (py_addr);
- Py_DECREF (py_type);
- return buffer;
-
- error:
- Py_XDECREF (py_encoding);
- Py_XDECREF (py_len);
- Py_XDECREF (py_addr);
- Py_XDECREF (py_type);
- xfree (buffer);
- *length = 0;
- *str_type = NULL;
- return NULL;
-}
-
-
-
-static PyMethodDef lazy_string_object_methods[] = {
- { "value", stpy_convert_to_value, METH_NOARGS,
- "Create a (lazy) value that contains a pointer to the string." },
- {NULL} /* Sentinel */
-};
-
-
-static PyGetSetDef lazy_string_object_getset[] = {
- { "address", stpy_get_address, NULL, "Address of the string.", NULL },
- { "encoding", stpy_get_encoding, NULL, "Encoding of the string.", NULL },
- { "length", stpy_get_length, NULL, "Length of the string.", NULL },
- { "type", stpy_get_type, NULL, "Type associated with the string.", NULL },
- { NULL } /* Sentinel */
-};
-
-static PyTypeObject lazy_string_object_type = {
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.LazyString", /*tp_name*/
- sizeof (lazy_string_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- stpy_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- "GDB lazy string object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- lazy_string_object_methods, /* tp_methods */
- 0, /* tp_members */
- lazy_string_object_getset /* tp_getset */
-};
py-lazy-string.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-prettyprint.c
===================================================================
--- py-prettyprint.c (revision 816)
+++ py-prettyprint.c (nonexistent)
@@ -1,661 +0,0 @@
-/* Python pretty-printing
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-#include "defs.h"
-#include "exceptions.h"
-#include "objfiles.h"
-#include "symtab.h"
-#include "language.h"
-#include "valprint.h"
-
-#include "python.h"
-
-#ifdef HAVE_PYTHON
-#include "python-internal.h"
-
-
-/* Helper function for find_pretty_printer which iterates over a list,
- calls each function and inspects output. This will return a
- printer object if one recognizes VALUE. If no printer is found, it
- will return None. On error, it will set the Python error and
- return NULL. */
-static PyObject *
-search_pp_list (PyObject *list, PyObject *value)
-{
- Py_ssize_t pp_list_size, list_index;
- PyObject *function, *printer = NULL;
-
- pp_list_size = PyList_Size (list);
- for (list_index = 0; list_index < pp_list_size; list_index++)
- {
- function = PyList_GetItem (list, list_index);
- if (! function)
- return NULL;
-
- printer = PyObject_CallFunctionObjArgs (function, value, NULL);
- if (! printer)
- return NULL;
- else if (printer != Py_None)
- return printer;
-
- Py_DECREF (printer);
- }
-
- Py_RETURN_NONE;
-}
-
-/* Find the pretty-printing constructor function for VALUE. If no
- pretty-printer exists, return None. If one exists, return a new
- reference. On error, set the Python error and return NULL. */
-static PyObject *
-find_pretty_printer (PyObject *value)
-{
- PyObject *pp_list = NULL;
- PyObject *function = NULL;
- struct objfile *obj;
- volatile struct gdb_exception except;
-
- /* Look at the pretty-printer dictionary for each objfile. */
- ALL_OBJFILES (obj)
- {
- PyObject *objf = objfile_to_objfile_object (obj);
- if (!objf)
- {
- /* Ignore the error and continue. */
- PyErr_Clear ();
- continue;
- }
-
- pp_list = objfpy_get_printers (objf, NULL);
- function = search_pp_list (pp_list, value);
-
- /* If there is an error in any objfile list, abort the search and
- exit. */
- if (! function)
- {
- Py_XDECREF (pp_list);
- return NULL;
- }
-
- if (function != Py_None)
- goto done;
-
- Py_DECREF (function);
- Py_XDECREF (pp_list);
- }
-
- pp_list = NULL;
- /* Fetch the global pretty printer dictionary. */
- if (! PyObject_HasAttrString (gdb_module, "pretty_printers"))
- {
- function = Py_None;
- Py_INCREF (function);
- goto done;
- }
- pp_list = PyObject_GetAttrString (gdb_module, "pretty_printers");
- if (! pp_list)
- goto done;
- if (! PyList_Check (pp_list))
- goto done;
-
- function = search_pp_list (pp_list, value);
-
- done:
- Py_XDECREF (pp_list);
-
- return function;
-}
-
-
-/* Pretty-print a single value, via the printer object PRINTER.
- If the function returns a string, a PyObject containing the string
- is returned. Otherwise, if the function returns a value,
- *OUT_VALUE is set to the value, and NULL is returned. On error,
- *OUT_VALUE is set to NULL, and NULL is returned. */
-static PyObject *
-pretty_print_one_value (PyObject *printer, struct value **out_value)
-{
- volatile struct gdb_exception except;
- PyObject *result = NULL;
-
- *out_value = NULL;
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL);
- if (result)
- {
- if (! gdbpy_is_string (result) && ! gdbpy_is_lazy_string (result))
- {
- *out_value = convert_value_from_python (result);
- if (PyErr_Occurred ())
- *out_value = NULL;
- Py_DECREF (result);
- result = NULL;
- }
- }
- }
-
- return result;
-}
-
-/* Return the display hint for the object printer, PRINTER. Return
- NULL if there is no display_hint method, or if the method did not
- return a string. On error, print stack trace and return NULL. On
- success, return an xmalloc()d string. */
-char *
-gdbpy_get_display_hint (PyObject *printer)
-{
- PyObject *hint;
- char *result = NULL;
-
- if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst))
- return NULL;
-
- hint = PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst, NULL);
- if (gdbpy_is_string (hint))
- result = python_string_to_host_string (hint);
- if (hint)
- Py_DECREF (hint);
- else
- gdbpy_print_stack ();
-
- return result;
-}
-
-/* Helper for apply_val_pretty_printer which calls to_string and
- formats the result. */
-static void
-print_string_repr (PyObject *printer, const char *hint,
- struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language,
- struct gdbarch *gdbarch)
-{
- struct value *replacement = NULL;
- PyObject *py_str = NULL;
-
- py_str = pretty_print_one_value (printer, &replacement);
- if (py_str)
- {
- gdb_byte *output = NULL;
- long length;
- struct type *type;
- char *encoding = NULL;
- PyObject *string = NULL;
- int is_lazy;
-
- is_lazy = gdbpy_is_lazy_string (py_str);
- if (is_lazy)
- output = gdbpy_extract_lazy_string (py_str, &type, &length, &encoding);
- else
- {
- string = python_string_to_target_python_string (py_str);
- if (string)
- {
- output = PyString_AsString (string);
- length = PyString_Size (string);
- type = builtin_type (gdbarch)->builtin_char;
- }
- else
- gdbpy_print_stack ();
-
- }
-
- if (output)
- {
- if (is_lazy || (hint && !strcmp (hint, "string")))
- LA_PRINT_STRING (stream, type, output, length, encoding,
- 0, options);
- else
- fputs_filtered (output, stream);
- }
- else
- gdbpy_print_stack ();
-
- if (string)
- Py_DECREF (string);
- else
- xfree (output);
-
- xfree (encoding);
- Py_DECREF (py_str);
- }
- else if (replacement)
- {
- struct value_print_options opts = *options;
-
- opts.addressprint = 0;
- common_val_print (replacement, stream, recurse, &opts, language);
- }
- else
- gdbpy_print_stack ();
-}
-
-static void
-py_restore_tstate (void *p)
-{
- PyFrameObject *frame = p;
- PyThreadState *tstate = PyThreadState_GET ();
- tstate->frame = frame;
-}
-
-/* Create a dummy PyFrameObject, needed to work around
- a Python-2.4 bug with generators. */
-static PyObject *
-push_dummy_python_frame ()
-{
- PyObject *empty_string, *null_tuple, *globals;
- PyCodeObject *code;
- PyFrameObject *frame;
- PyThreadState *tstate;
-
- empty_string = PyString_FromString ("");
- if (!empty_string)
- return NULL;
-
- null_tuple = PyTuple_New (0);
- if (!null_tuple)
- {
- Py_DECREF (empty_string);
- return NULL;
- }
-
- code = PyCode_New (0, /* argcount */
- 0, /* nlocals */
- 0, /* stacksize */
- 0, /* flags */
- empty_string, /* code */
- null_tuple, /* consts */
- null_tuple, /* names */
- null_tuple, /* varnames */
-#if PYTHON_API_VERSION >= 1010
- null_tuple, /* freevars */
- null_tuple, /* cellvars */
-#endif
- empty_string, /* filename */
- empty_string, /* name */
- 1, /* firstlineno */
- empty_string /* lnotab */
- );
-
- Py_DECREF (empty_string);
- Py_DECREF (null_tuple);
-
- if (!code)
- return NULL;
-
- globals = PyDict_New ();
- if (!globals)
- {
- Py_DECREF (code);
- return NULL;
- }
-
- tstate = PyThreadState_GET ();
-
- frame = PyFrame_New (tstate, code, globals, NULL);
-
- Py_DECREF (globals);
- Py_DECREF (code);
-
- if (!frame)
- return NULL;
-
- tstate->frame = frame;
- make_cleanup (py_restore_tstate, frame->f_back);
- return (PyObject *) frame;
-}
-
-/* Helper for apply_val_pretty_printer that formats children of the
- printer, if any exist. */
-static void
-print_children (PyObject *printer, const char *hint,
- struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language)
-{
- int is_map, is_array, done_flag, pretty;
- unsigned int i;
- PyObject *children, *iter, *frame;
- struct cleanup *cleanups;
-
- if (! PyObject_HasAttr (printer, gdbpy_children_cst))
- return;
-
- /* If we are printing a map or an array, we want some special
- formatting. */
- is_map = hint && ! strcmp (hint, "map");
- is_array = hint && ! strcmp (hint, "array");
-
- children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
- NULL);
- if (! children)
- {
- gdbpy_print_stack ();
- return;
- }
-
- cleanups = make_cleanup_py_decref (children);
-
- iter = PyObject_GetIter (children);
- if (!iter)
- {
- gdbpy_print_stack ();
- goto done;
- }
- make_cleanup_py_decref (iter);
-
- /* Use the prettyprint_arrays option if we are printing an array,
- and the pretty option otherwise. */
- pretty = is_array ? options->prettyprint_arrays : options->pretty;
-
- /* Manufacture a dummy Python frame to work around Python 2.4 bug,
- where it insists on having a non-NULL tstate->frame when
- a generator is called. */
- frame = push_dummy_python_frame ();
- if (!frame)
- {
- gdbpy_print_stack ();
- goto done;
- }
- make_cleanup_py_decref (frame);
-
- done_flag = 0;
- for (i = 0; i < options->print_max; ++i)
- {
- PyObject *py_v, *item = PyIter_Next (iter);
- char *name;
- struct cleanup *inner_cleanup;
-
- if (! item)
- {
- if (PyErr_Occurred ())
- gdbpy_print_stack ();
- /* Set a flag so we can know whether we printed all the
- available elements. */
- else
- done_flag = 1;
- break;
- }
-
- if (! PyArg_ParseTuple (item, "sO", &name, &py_v))
- {
- gdbpy_print_stack ();
- Py_DECREF (item);
- continue;
- }
- inner_cleanup = make_cleanup_py_decref (item);
-
- /* Print initial "{". For other elements, there are three
- cases:
- 1. Maps. Print a "," after each value element.
- 2. Arrays. Always print a ",".
- 3. Other. Always print a ",". */
- if (i == 0)
- fputs_filtered (" = {", stream);
- else if (! is_map || i % 2 == 0)
- fputs_filtered (pretty ? "," : ", ", stream);
-
- /* In summary mode, we just want to print "= {...}" if there is
- a value. */
- if (options->summary)
- {
- /* This increment tricks the post-loop logic to print what
- we want. */
- ++i;
- /* Likewise. */
- pretty = 0;
- break;
- }
-
- if (! is_map || i % 2 == 0)
- {
- if (pretty)
- {
- fputs_filtered ("\n", stream);
- print_spaces_filtered (2 + 2 * recurse, stream);
- }
- else
- wrap_here (n_spaces (2 + 2 *recurse));
- }
-
- if (is_map && i % 2 == 0)
- fputs_filtered ("[", stream);
- else if (is_array)
- {
- /* We print the index, not whatever the child method
- returned as the name. */
- if (options->print_array_indexes)
- fprintf_filtered (stream, "[%d] = ", i);
- }
- else if (! is_map)
- {
- fputs_filtered (name, stream);
- fputs_filtered (" = ", stream);
- }
-
- if (gdbpy_is_lazy_string (py_v) || gdbpy_is_string (py_v))
- {
- gdb_byte *output = NULL;
-
- if (gdbpy_is_lazy_string (py_v))
- {
- struct type *type;
- long length;
- char *encoding = NULL;
-
- output = gdbpy_extract_lazy_string (py_v, &type,
- &length, &encoding);
- if (!output)
- gdbpy_print_stack ();
- LA_PRINT_STRING (stream, type, output, length, encoding,
- 0, options);
- xfree (encoding);
- xfree (output);
- }
- else
- {
- output = python_string_to_host_string (py_v);
- fputs_filtered (output, stream);
- xfree (output);
- }
- }
- else
- {
- struct value *value = convert_value_from_python (py_v);
-
- if (value == NULL)
- {
- gdbpy_print_stack ();
- error (_("Error while executing Python code."));
- }
- else
- common_val_print (value, stream, recurse + 1, options, language);
- }
-
- if (is_map && i % 2 == 0)
- fputs_filtered ("] = ", stream);
-
- do_cleanups (inner_cleanup);
- }
-
- if (i)
- {
- if (!done_flag)
- {
- if (pretty)
- {
- fputs_filtered ("\n", stream);
- print_spaces_filtered (2 + 2 * recurse, stream);
- }
- fputs_filtered ("...", stream);
- }
- if (pretty)
- {
- fputs_filtered ("\n", stream);
- print_spaces_filtered (2 * recurse, stream);
- }
- fputs_filtered ("}", stream);
- }
-
- done:
- do_cleanups (cleanups);
-}
-
-int
-apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
- int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language)
-{
- struct gdbarch *gdbarch = get_type_arch (type);
- PyObject *printer = NULL;
- PyObject *val_obj = NULL;
- struct value *value;
- char *hint = NULL;
- struct cleanup *cleanups;
- int result = 0;
-
- cleanups = ensure_python_env (gdbarch, language);
-
- /* Instantiate the printer. */
- if (valaddr)
- valaddr += embedded_offset;
- value = value_from_contents_and_address (type, valaddr,
- address + embedded_offset);
-
- val_obj = value_to_value_object (value);
- if (! val_obj)
- goto done;
-
- /* Find the constructor. */
- printer = find_pretty_printer (val_obj);
- Py_DECREF (val_obj);
- make_cleanup_py_decref (printer);
- if (! printer || printer == Py_None)
- goto done;
-
- /* If we are printing a map, we want some special formatting. */
- hint = gdbpy_get_display_hint (printer);
- make_cleanup (free_current_contents, &hint);
-
- /* Print the section */
- print_string_repr (printer, hint, stream, recurse, options, language,
- gdbarch);
- print_children (printer, hint, stream, recurse, options, language);
- result = 1;
-
-
- done:
- if (PyErr_Occurred ())
- gdbpy_print_stack ();
- do_cleanups (cleanups);
- return result;
-}
-
-
-/* Apply a pretty-printer for the varobj code. PRINTER_OBJ is the
- print object. It must have a 'to_string' method (but this is
- checked by varobj, not here) which takes no arguments and
- returns a string. The printer will return a value and in the case
- of a Python string being returned, this function will return a
- PyObject containing the string. For any other type, *REPLACEMENT is
- set to the replacement value and this function returns NULL. On
- error, *REPLACEMENT is set to NULL and this function also returns
- NULL. */
-PyObject *
-apply_varobj_pretty_printer (PyObject *printer_obj,
- struct value **replacement)
-{
- int size = 0;
- PyObject *py_str = NULL;
-
- *replacement = NULL;
- py_str = pretty_print_one_value (printer_obj, replacement);
-
- if (*replacement == NULL && py_str == NULL)
- gdbpy_print_stack ();
-
- return py_str;
-}
-
-/* Find a pretty-printer object for the varobj module. Returns a new
- reference to the object if successful; returns NULL if not. VALUE
- is the value for which a printer tests to determine if it
- can pretty-print the value. */
-PyObject *
-gdbpy_get_varobj_pretty_printer (struct value *value)
-{
- PyObject *val_obj;
- PyObject *pretty_printer = NULL;
- volatile struct gdb_exception except;
-
- TRY_CATCH (except, RETURN_MASK_ALL)
- {
- value = value_copy (value);
- }
- GDB_PY_HANDLE_EXCEPTION (except);
-
- val_obj = value_to_value_object (value);
- if (! val_obj)
- return NULL;
-
- pretty_printer = find_pretty_printer (val_obj);
- Py_DECREF (val_obj);
- return pretty_printer;
-}
-
-/* A Python function which wraps find_pretty_printer and instantiates
- the resulting class. This accepts a Value argument and returns a
- pretty printer instance, or None. This function is useful as an
- argument to the MI command -var-set-visualizer. */
-PyObject *
-gdbpy_default_visualizer (PyObject *self, PyObject *args)
-{
- PyObject *val_obj;
- PyObject *cons, *printer = NULL;
- struct value *value;
-
- if (! PyArg_ParseTuple (args, "O", &val_obj))
- return NULL;
- value = value_object_to_value (val_obj);
- if (! value)
- {
- PyErr_SetString (PyExc_TypeError, "argument must be a gdb.Value");
- return NULL;
- }
-
- cons = find_pretty_printer (val_obj);
- return cons;
-}
-
-#else /* HAVE_PYTHON */
-
-int
-apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
- int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int recurse,
- const struct value_print_options *options,
- const struct language_defn *language)
-{
- return 0;
-}
-
-#endif /* HAVE_PYTHON */
py-prettyprint.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
Index: py-function.c
===================================================================
--- py-function.c (revision 816)
+++ py-function.c (nonexistent)
@@ -1,179 +0,0 @@
-/* Convenience functions implemented in Python.
-
- Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see . */
-
-
-#include "defs.h"
-#include "value.h"
-#include "exceptions.h"
-#include "python-internal.h"
-#include "charset.h"
-#include "gdbcmd.h"
-#include "cli/cli-decode.h"
-#include "completer.h"
-#include "expression.h"
-#include "language.h"
-
-static PyTypeObject fnpy_object_type;
-
-
-
-static PyObject *
-convert_values_to_python (int argc, struct value **argv)
-{
- int i;
- PyObject *result = PyTuple_New (argc);
- for (i = 0; i < argc; ++i)
- {
- PyObject *elt = value_to_value_object (argv[i]);
- if (! elt)
- {
- Py_DECREF (result);
- error (_("Could not convert value to Python object."));
- }
- PyTuple_SetItem (result, i, elt);
- }
- return result;
-}
-
-/* Call a Python function object's invoke method. */
-
-static struct value *
-fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
- void *cookie, int argc, struct value **argv)
-{
- int i;
- struct value *value = NULL;
- PyObject *result, *callable, *args;
- struct cleanup *cleanup;
-
- cleanup = ensure_python_env (gdbarch, language);
-
- args = convert_values_to_python (argc, argv);
-
- callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
- if (! callable)
- {
- Py_DECREF (args);
- error (_("No method named 'invoke' in object."));
- }
-
- result = PyObject_Call (callable, args, NULL);
- Py_DECREF (callable);
- Py_DECREF (args);
-
- if (!result)
- {
- gdbpy_print_stack ();
- error (_("Error while executing Python code."));
- }
-
- value = convert_value_from_python (result);
- if (value == NULL)
- {
- Py_DECREF (result);
- gdbpy_print_stack ();
- error (_("Error while executing Python code."));
- }
-
- Py_DECREF (result);
- do_cleanups (cleanup);
-
- return value;
-}
-
-/* Initializer for a Function object. It takes one argument, the name
- of the function. */
-
-static int
-fnpy_init (PyObject *self, PyObject *args, PyObject *kwds)
-{
- char *name, *docstring = NULL;
- if (! PyArg_ParseTuple (args, "s", &name))
- return -1;
- Py_INCREF (self);
-
- if (PyObject_HasAttrString (self, "__doc__"))
- {
- PyObject *ds_obj = PyObject_GetAttrString (self, "__doc__");
- if (ds_obj && gdbpy_is_string (ds_obj))
- docstring = python_string_to_host_string (ds_obj);
- }
- if (! docstring)
- docstring = xstrdup (_("This function is not documented."));
-
- add_internal_function (name, docstring, fnpy_call, self);
- return 0;
-}
-
-/* Initialize internal function support. */
-
-void
-gdbpy_initialize_functions (void)
-{
- if (PyType_Ready (&fnpy_object_type) < 0)
- return;
-
- Py_INCREF (&fnpy_object_type);
- PyModule_AddObject (gdb_module, "Function", (PyObject *) &fnpy_object_type);
-}
-
-
-
-static PyTypeObject fnpy_object_type =
-{
- PyObject_HEAD_INIT (NULL)
- 0, /*ob_size*/
- "gdb.Function", /*tp_name*/
- sizeof (PyObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- "GDB function object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- fnpy_init, /* tp_init */
- 0, /* tp_alloc */
- PyType_GenericNew /* tp_new */
-};
py-function.c
Property changes :
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property