OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [gdb/] [python/] [py-objfile.c] - Blame information for rev 330

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Python interface to objfiles.
2
 
3
   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
4
 
5
   This file is part of GDB.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
 
20
#include "defs.h"
21
#include "python-internal.h"
22
#include "charset.h"
23
#include "objfiles.h"
24
#include "language.h"
25
 
26
typedef struct
27
{
28
  PyObject_HEAD
29
 
30
  /* The corresponding objfile.  */
31
  struct objfile *objfile;
32
 
33
  /* The pretty-printer list of functions.  */
34
  PyObject *printers;
35
} objfile_object;
36
 
37
static PyTypeObject objfile_object_type;
38
 
39
static const struct objfile_data *objfpy_objfile_data_key;
40
 
41
 
42
 
43
/* An Objfile method which returns the objfile's file name, or None.  */
44
static PyObject *
45
objfpy_get_filename (PyObject *self, void *closure)
46
{
47
  objfile_object *obj = (objfile_object *) self;
48
 
49
  if (obj->objfile && obj->objfile->name)
50
    return PyString_Decode (obj->objfile->name, strlen (obj->objfile->name),
51
                            host_charset (), NULL);
52
  Py_RETURN_NONE;
53
}
54
 
55
static void
56
objfpy_dealloc (PyObject *o)
57
{
58
  objfile_object *self = (objfile_object *) o;
59
 
60
  Py_XDECREF (self->printers);
61
  self->ob_type->tp_free ((PyObject *) self);
62
}
63
 
64
static PyObject *
65
objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
66
{
67
  objfile_object *self = (objfile_object *) type->tp_alloc (type, 0);
68
 
69
  if (self)
70
    {
71
      self->objfile = NULL;
72
 
73
      self->printers = PyList_New (0);
74
      if (!self->printers)
75
        {
76
          Py_DECREF (self);
77
          return NULL;
78
        }
79
    }
80
  return (PyObject *) self;
81
}
82
 
83
PyObject *
84
objfpy_get_printers (PyObject *o, void *ignore)
85
{
86
  objfile_object *self = (objfile_object *) o;
87
 
88
  Py_INCREF (self->printers);
89
  return self->printers;
90
}
91
 
92
static int
93
objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
94
{
95
  PyObject *tmp;
96
  objfile_object *self = (objfile_object *) o;
97
 
98
  if (! value)
99
    {
100
      PyErr_SetString (PyExc_TypeError,
101
                       _("Cannot delete the pretty_printers attribute."));
102
      return -1;
103
    }
104
 
105
  if (! PyList_Check (value))
106
    {
107
      PyErr_SetString (PyExc_TypeError,
108
                       _("The pretty_printers attribute must be a list."));
109
      return -1;
110
    }
111
 
112
  /* Take care in case the LHS and RHS are related somehow.  */
113
  tmp = self->printers;
114
  Py_INCREF (value);
115
  self->printers = value;
116
  Py_XDECREF (tmp);
117
 
118
  return 0;
119
}
120
 
121
 
122
 
123
/* Clear the OBJFILE pointer in an Objfile object and remove the
124
   reference.  */
125
static void
126
py_free_objfile (struct objfile *objfile, void *datum)
127
{
128
  struct cleanup *cleanup;
129
  objfile_object *object = datum;
130
 
131
  cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
132
  object->objfile = NULL;
133
  Py_DECREF ((PyObject *) object);
134
  do_cleanups (cleanup);
135
}
136
 
137
/* Return a borrowed reference to the Python object of type Objfile
138
   representing OBJFILE.  If the object has already been created,
139
   return it.  Otherwise, create it.  Return NULL and set the Python
140
   error on failure.  */
141
PyObject *
142
objfile_to_objfile_object (struct objfile *objfile)
143
{
144
  objfile_object *object;
145
 
146
  object = objfile_data (objfile, objfpy_objfile_data_key);
147
  if (!object)
148
    {
149
      object = PyObject_New (objfile_object, &objfile_object_type);
150
      if (object)
151
        {
152
          object->objfile = objfile;
153
 
154
          object->printers = PyList_New (0);
155
          if (!object->printers)
156
            {
157
              Py_DECREF (object);
158
              return NULL;
159
            }
160
 
161
          set_objfile_data (objfile, objfpy_objfile_data_key, object);
162
        }
163
    }
164
 
165
  return (PyObject *) object;
166
}
167
 
168
void
169
gdbpy_initialize_objfile (void)
170
{
171
  objfpy_objfile_data_key
172
    = register_objfile_data_with_cleanup (NULL, py_free_objfile);
173
 
174
  if (PyType_Ready (&objfile_object_type) < 0)
175
    return;
176
 
177
  Py_INCREF (&objfile_object_type);
178
  PyModule_AddObject (gdb_module, "Objfile", (PyObject *) &objfile_object_type);
179
}
180
 
181
 
182
 
183
static PyGetSetDef objfile_getset[] =
184
{
185
  { "filename", objfpy_get_filename, NULL,
186
    "The objfile's filename, or None.", NULL },
187
  { "pretty_printers", objfpy_get_printers, objfpy_set_printers,
188
    "Pretty printers.", NULL },
189
  { NULL }
190
};
191
 
192
static PyTypeObject objfile_object_type =
193
{
194
  PyObject_HEAD_INIT (NULL)
195
  0,                               /*ob_size*/
196
  "gdb.Objfile",                  /*tp_name*/
197
  sizeof (objfile_object),        /*tp_basicsize*/
198
  0,                               /*tp_itemsize*/
199
  objfpy_dealloc,                 /*tp_dealloc*/
200
  0,                               /*tp_print*/
201
  0,                               /*tp_getattr*/
202
  0,                               /*tp_setattr*/
203
  0,                               /*tp_compare*/
204
  0,                               /*tp_repr*/
205
  0,                               /*tp_as_number*/
206
  0,                               /*tp_as_sequence*/
207
  0,                               /*tp_as_mapping*/
208
  0,                               /*tp_hash */
209
  0,                               /*tp_call*/
210
  0,                               /*tp_str*/
211
  0,                               /*tp_getattro*/
212
  0,                               /*tp_setattro*/
213
  0,                               /*tp_as_buffer*/
214
  Py_TPFLAGS_DEFAULT,             /*tp_flags*/
215
  "GDB objfile object",           /* tp_doc */
216
  0,                               /* tp_traverse */
217
  0,                               /* tp_clear */
218
  0,                               /* tp_richcompare */
219
  0,                               /* tp_weaklistoffset */
220
  0,                               /* tp_iter */
221
  0,                               /* tp_iternext */
222
  0,                               /* tp_methods */
223
  0,                               /* tp_members */
224
  objfile_getset,                 /* tp_getset */
225
  0,                               /* tp_base */
226
  0,                               /* tp_dict */
227
  0,                               /* tp_descr_get */
228
  0,                               /* tp_descr_set */
229
  0,                               /* tp_dictoffset */
230
  0,                               /* tp_init */
231
  0,                               /* tp_alloc */
232
  objfpy_new,                     /* tp_new */
233
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.