]> Git Repo - binutils.git/blob - gdb/python/py-prettyprint.c
Fix help text for "python" command
[binutils.git] / gdb / python / py-prettyprint.c
1 /* Python pretty-printing
2
3    Copyright (C) 2008-2018 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 "objfiles.h"
22 #include "symtab.h"
23 #include "language.h"
24 #include "valprint.h"
25 #include "extension-priv.h"
26 #include "python.h"
27 #include "python-internal.h"
28 #include "py-ref.h"
29
30 /* Return type of print_string_repr.  */
31
32 enum string_repr_result
33   {
34     /* The string method returned None.  */
35     string_repr_none,
36     /* The string method had an error.  */
37     string_repr_error,
38     /* Everything ok.  */
39     string_repr_ok
40   };
41
42 /* Helper function for find_pretty_printer which iterates over a list,
43    calls each function and inspects output.  This will return a
44    printer object if one recognizes VALUE.  If no printer is found, it
45    will return None.  On error, it will set the Python error and
46    return NULL.  */
47
48 static PyObject *
49 search_pp_list (PyObject *list, PyObject *value)
50 {
51   Py_ssize_t pp_list_size, list_index;
52
53   pp_list_size = PyList_Size (list);
54   for (list_index = 0; list_index < pp_list_size; list_index++)
55     {
56       PyObject *function = PyList_GetItem (list, list_index);
57       if (! function)
58         return NULL;
59
60       /* Skip if disabled.  */
61       if (PyObject_HasAttr (function, gdbpy_enabled_cst))
62         {
63           gdbpy_ref<> attr (PyObject_GetAttr (function, gdbpy_enabled_cst));
64           int cmp;
65
66           if (attr == NULL)
67             return NULL;
68           cmp = PyObject_IsTrue (attr.get ());
69           if (cmp == -1)
70             return NULL;
71
72           if (!cmp)
73             continue;
74         }
75
76       gdbpy_ref<> printer (PyObject_CallFunctionObjArgs (function, value,
77                                                          NULL));
78       if (printer == NULL)
79         return NULL;
80       else if (printer != Py_None)
81         return printer.release ();
82     }
83
84   Py_RETURN_NONE;
85 }
86
87 /* Subroutine of find_pretty_printer to simplify it.
88    Look for a pretty-printer to print VALUE in all objfiles.
89    The result is NULL if there's an error and the search should be terminated.
90    The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
91    Otherwise the result is the pretty-printer function, suitably inc-ref'd.  */
92
93 static PyObject *
94 find_pretty_printer_from_objfiles (PyObject *value)
95 {
96   struct objfile *obj;
97
98   ALL_OBJFILES (obj)
99   {
100     PyObject *objf = objfile_to_objfile_object (obj);
101     if (!objf)
102       {
103         /* Ignore the error and continue.  */
104         PyErr_Clear ();
105         continue;
106       }
107
108     gdbpy_ref<> pp_list (objfpy_get_printers (objf, NULL));
109     gdbpy_ref<> function (search_pp_list (pp_list.get (), value));
110
111     /* If there is an error in any objfile list, abort the search and exit.  */
112     if (function == NULL)
113       return NULL;
114
115     if (function != Py_None)
116       return function.release ();
117   }
118
119   Py_RETURN_NONE;
120 }
121
122 /* Subroutine of find_pretty_printer to simplify it.
123    Look for a pretty-printer to print VALUE in the current program space.
124    The result is NULL if there's an error and the search should be terminated.
125    The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
126    Otherwise the result is the pretty-printer function, suitably inc-ref'd.  */
127
128 static PyObject *
129 find_pretty_printer_from_progspace (PyObject *value)
130 {
131   PyObject *obj = pspace_to_pspace_object (current_program_space);
132
133   if (!obj)
134     return NULL;
135   gdbpy_ref<> pp_list (pspy_get_printers (obj, NULL));
136   return search_pp_list (pp_list.get (), value);
137 }
138
139 /* Subroutine of find_pretty_printer to simplify it.
140    Look for a pretty-printer to print VALUE in the gdb module.
141    The result is NULL if there's an error and the search should be terminated.
142    The result is Py_None, suitably inc-ref'd, if no pretty-printer was found.
143    Otherwise the result is the pretty-printer function, suitably inc-ref'd.  */
144
145 static PyObject *
146 find_pretty_printer_from_gdb (PyObject *value)
147 {
148   /* Fetch the global pretty printer list.  */
149   if (gdb_python_module == NULL
150       || ! PyObject_HasAttrString (gdb_python_module, "pretty_printers"))
151     Py_RETURN_NONE;
152   gdbpy_ref<> pp_list (PyObject_GetAttrString (gdb_python_module,
153                                                "pretty_printers"));
154   if (pp_list == NULL || ! PyList_Check (pp_list.get ()))
155     Py_RETURN_NONE;
156
157   return search_pp_list (pp_list.get (), value);
158 }
159
160 /* Find the pretty-printing constructor function for VALUE.  If no
161    pretty-printer exists, return None.  If one exists, return a new
162    reference.  On error, set the Python error and return NULL.  */
163
164 static PyObject *
165 find_pretty_printer (PyObject *value)
166 {
167   /* Look at the pretty-printer list for each objfile
168      in the current program-space.  */
169   gdbpy_ref<> function (find_pretty_printer_from_objfiles (value));
170   if (function == NULL || function != Py_None)
171     return function.release ();
172
173   /* Look at the pretty-printer list for the current program-space.  */
174   function.reset (find_pretty_printer_from_progspace (value));
175   if (function == NULL || function != Py_None)
176     return function.release ();
177
178   /* Look at the pretty-printer list in the gdb module.  */
179   return find_pretty_printer_from_gdb (value);
180 }
181
182 /* Pretty-print a single value, via the printer object PRINTER.
183    If the function returns a string, a PyObject containing the string
184    is returned.  If the function returns Py_NONE that means the pretty
185    printer returned the Python None as a value.  Otherwise, if the
186    function returns a value,  *OUT_VALUE is set to the value, and NULL
187    is returned.  On error, *OUT_VALUE is set to NULL, NULL is
188    returned, with a python exception set.  */
189
190 static gdbpy_ref<>
191 pretty_print_one_value (PyObject *printer, struct value **out_value)
192 {
193   gdbpy_ref<> result;
194
195   *out_value = NULL;
196   TRY
197     {
198       if (!PyObject_HasAttr (printer, gdbpy_to_string_cst))
199         result = gdbpy_ref<>::new_reference (Py_None);
200       else
201         {
202           result.reset (PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst,
203                                                     NULL));
204           if (result != NULL)
205             {
206               if (! gdbpy_is_string (result.get ())
207                   && ! gdbpy_is_lazy_string (result.get ())
208                   && result != Py_None)
209                 {
210                   *out_value = convert_value_from_python (result.get ());
211                   if (PyErr_Occurred ())
212                     *out_value = NULL;
213                   result = NULL;
214                 }
215             }
216         }
217     }
218   CATCH (except, RETURN_MASK_ALL)
219     {
220     }
221   END_CATCH
222
223   return result;
224 }
225
226 /* Return the display hint for the object printer, PRINTER.  Return
227    NULL if there is no display_hint method, or if the method did not
228    return a string.  On error, print stack trace and return NULL.  On
229    success, return an xmalloc()d string.  */
230 gdb::unique_xmalloc_ptr<char>
231 gdbpy_get_display_hint (PyObject *printer)
232 {
233   gdb::unique_xmalloc_ptr<char> result;
234
235   if (! PyObject_HasAttr (printer, gdbpy_display_hint_cst))
236     return NULL;
237
238   gdbpy_ref<> hint (PyObject_CallMethodObjArgs (printer, gdbpy_display_hint_cst,
239                                                 NULL));
240   if (hint != NULL)
241     {
242       if (gdbpy_is_string (hint.get ()))
243         {
244           result = python_string_to_host_string (hint.get ());
245           if (result == NULL)
246             gdbpy_print_stack ();
247         }
248     }
249   else
250     gdbpy_print_stack ();
251
252   return result;
253 }
254
255 /* A wrapper for gdbpy_print_stack that ignores MemoryError.  */
256
257 static void
258 print_stack_unless_memory_error (struct ui_file *stream)
259 {
260   if (PyErr_ExceptionMatches (gdbpy_gdb_memory_error))
261     {
262       PyObject *type, *value, *trace;
263
264       PyErr_Fetch (&type, &value, &trace);
265
266       gdbpy_ref<> type_ref (type);
267       gdbpy_ref<> value_ref (value);
268       gdbpy_ref<> trace_ref (trace);
269
270       gdb::unique_xmalloc_ptr<char>
271         msg (gdbpy_exception_to_string (type, value));
272
273       if (msg == NULL || *msg == '\0')
274         fprintf_filtered (stream, _("<error reading variable>"));
275       else
276         fprintf_filtered (stream, _("<error reading variable: %s>"),
277                           msg.get ());
278     }
279   else
280     gdbpy_print_stack ();
281 }
282
283 /* Helper for gdbpy_apply_val_pretty_printer which calls to_string and
284    formats the result.  */
285
286 static enum string_repr_result
287 print_string_repr (PyObject *printer, const char *hint,
288                    struct ui_file *stream, int recurse,
289                    const struct value_print_options *options,
290                    const struct language_defn *language,
291                    struct gdbarch *gdbarch)
292 {
293   struct value *replacement = NULL;
294   enum string_repr_result result = string_repr_ok;
295
296   gdbpy_ref<> py_str = pretty_print_one_value (printer, &replacement);
297   if (py_str != NULL)
298     {
299       if (py_str == Py_None)
300         result = string_repr_none;
301       else if (gdbpy_is_lazy_string (py_str.get ()))
302         {
303           CORE_ADDR addr;
304           long length;
305           struct type *type;
306           gdb::unique_xmalloc_ptr<char> encoding;
307           struct value_print_options local_opts = *options;
308
309           gdbpy_extract_lazy_string (py_str.get (), &addr, &type,
310                                      &length, &encoding);
311
312           local_opts.addressprint = 0;
313           val_print_string (type, encoding.get (), addr, (int) length,
314                             stream, &local_opts);
315         }
316       else
317         {
318           gdbpy_ref<> string
319             (python_string_to_target_python_string (py_str.get ()));
320           if (string != NULL)
321             {
322               char *output;
323               long length;
324               struct type *type;
325
326 #ifdef IS_PY3K
327               output = PyBytes_AS_STRING (string.get ());
328               length = PyBytes_GET_SIZE (string.get ());
329 #else
330               output = PyString_AsString (string.get ());
331               length = PyString_Size (string.get ());
332 #endif
333               type = builtin_type (gdbarch)->builtin_char;
334
335               if (hint && !strcmp (hint, "string"))
336                 LA_PRINT_STRING (stream, type, (gdb_byte *) output,
337                                  length, NULL, 0, options);
338               else
339                 fputs_filtered (output, stream);
340             }
341           else
342             {
343               result = string_repr_error;
344               print_stack_unless_memory_error (stream);
345             }
346         }
347     }
348   else if (replacement)
349     {
350       struct value_print_options opts = *options;
351
352       opts.addressprint = 0;
353       common_val_print (replacement, stream, recurse, &opts, language);
354     }
355   else
356     {
357       result = string_repr_error;
358       print_stack_unless_memory_error (stream);
359     }
360
361   return result;
362 }
363
364 #ifndef IS_PY3K
365
366 /* Create a dummy PyFrameObject, needed to work around
367    a Python-2.4 bug with generators.  */
368 class dummy_python_frame
369 {
370  public:
371
372   dummy_python_frame ();
373
374   ~dummy_python_frame ()
375   {
376     if (m_valid)
377       m_tstate->frame = m_saved_frame;
378   }
379
380   bool failed () const
381   {
382     return !m_valid;
383   }
384
385  private:
386
387   bool m_valid;
388   PyFrameObject *m_saved_frame;
389   gdbpy_ref<> m_frame;
390   PyThreadState *m_tstate;
391 };
392
393 dummy_python_frame::dummy_python_frame ()
394 : m_valid (false),
395   m_saved_frame (NULL),
396   m_tstate (NULL)
397 {
398   PyCodeObject *code;
399   PyFrameObject *frame;
400
401   gdbpy_ref<> empty_string (PyString_FromString (""));
402   if (empty_string == NULL)
403     return;
404
405   gdbpy_ref<> null_tuple (PyTuple_New (0));
406   if (null_tuple == NULL)
407     return;
408
409   code = PyCode_New (0,                   /* argcount */
410                      0,                   /* locals */
411                      0,                   /* stacksize */
412                      0,                   /* flags */
413                      empty_string.get (), /* code */
414                      null_tuple.get (),   /* consts */
415                      null_tuple.get (),   /* names */
416                      null_tuple.get (),   /* varnames */
417 #if PYTHON_API_VERSION >= 1010
418                      null_tuple.get (),   /* freevars */
419                      null_tuple.get (),   /* cellvars */
420 #endif
421                      empty_string.get (), /* filename */
422                      empty_string.get (), /* name */
423                      1,                   /* firstlineno */
424                      empty_string.get ()  /* lnotab */
425                      );
426   if (code == NULL)
427     return;
428   gdbpy_ref<> code_holder ((PyObject *) code);
429
430   gdbpy_ref<> globals (PyDict_New ());
431   if (globals == NULL)
432     return;
433
434   m_tstate = PyThreadState_GET ();
435   frame = PyFrame_New (m_tstate, code, globals.get (), NULL);
436   if (frame == NULL)
437     return;
438
439   m_frame.reset ((PyObject *) frame);
440   m_tstate->frame = frame;
441   m_saved_frame = frame->f_back;
442   m_valid = true;
443 }
444 #endif
445
446 /* Helper for gdbpy_apply_val_pretty_printer that formats children of the
447    printer, if any exist.  If is_py_none is true, then nothing has
448    been printed by to_string, and format output accordingly. */
449 static void
450 print_children (PyObject *printer, const char *hint,
451                 struct ui_file *stream, int recurse,
452                 const struct value_print_options *options,
453                 const struct language_defn *language,
454                 int is_py_none)
455 {
456   int is_map, is_array, done_flag, pretty;
457   unsigned int i;
458
459   if (! PyObject_HasAttr (printer, gdbpy_children_cst))
460     return;
461
462   /* If we are printing a map or an array, we want some special
463      formatting.  */
464   is_map = hint && ! strcmp (hint, "map");
465   is_array = hint && ! strcmp (hint, "array");
466
467   gdbpy_ref<> children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
468                                                     NULL));
469   if (children == NULL)
470     {
471       print_stack_unless_memory_error (stream);
472       return;
473     }
474
475   gdbpy_ref<> iter (PyObject_GetIter (children.get ()));
476   if (iter == NULL)
477     {
478       print_stack_unless_memory_error (stream);
479       return;
480     }
481
482   /* Use the prettyformat_arrays option if we are printing an array,
483      and the pretty option otherwise.  */
484   if (is_array)
485     pretty = options->prettyformat_arrays;
486   else
487     {
488       if (options->prettyformat == Val_prettyformat)
489         pretty = 1;
490       else
491         pretty = options->prettyformat_structs;
492     }
493
494   /* Manufacture a dummy Python frame to work around Python 2.4 bug,
495      where it insists on having a non-NULL tstate->frame when
496      a generator is called.  */
497 #ifndef IS_PY3K
498   dummy_python_frame frame;
499   if (frame.failed ())
500     {
501       gdbpy_print_stack ();
502       return;
503     }
504 #endif
505
506   done_flag = 0;
507   for (i = 0; i < options->print_max; ++i)
508     {
509       PyObject *py_v;
510       const char *name;
511
512       gdbpy_ref<> item (PyIter_Next (iter.get ()));
513       if (item == NULL)
514         {
515           if (PyErr_Occurred ())
516             print_stack_unless_memory_error (stream);
517           /* Set a flag so we can know whether we printed all the
518              available elements.  */
519           else  
520             done_flag = 1;
521           break;
522         }
523
524       if (! PyTuple_Check (item.get ()) || PyTuple_Size (item.get ()) != 2)
525         {
526           PyErr_SetString (PyExc_TypeError,
527                            _("Result of children iterator not a tuple"
528                              " of two elements."));
529           gdbpy_print_stack ();
530           continue;
531         }
532       if (! PyArg_ParseTuple (item.get (), "sO", &name, &py_v))
533         {
534           /* The user won't necessarily get a stack trace here, so provide
535              more context.  */
536           if (gdbpy_print_python_errors_p ())
537             fprintf_unfiltered (gdb_stderr,
538                                 _("Bad result from children iterator.\n"));
539           gdbpy_print_stack ();
540           continue;
541         }
542
543       /* Print initial "{".  For other elements, there are three
544          cases:
545          1. Maps.  Print a "," after each value element.
546          2. Arrays.  Always print a ",".
547          3. Other.  Always print a ",".  */
548       if (i == 0)
549         {
550          if (is_py_none)
551            fputs_filtered ("{", stream);
552          else
553            fputs_filtered (" = {", stream);
554        }
555
556       else if (! is_map || i % 2 == 0)
557         fputs_filtered (pretty ? "," : ", ", stream);
558
559       /* In summary mode, we just want to print "= {...}" if there is
560          a value.  */
561       if (options->summary)
562         {
563           /* This increment tricks the post-loop logic to print what
564              we want.  */
565           ++i;
566           /* Likewise.  */
567           pretty = 0;
568           break;
569         }
570
571       if (! is_map || i % 2 == 0)
572         {
573           if (pretty)
574             {
575               fputs_filtered ("\n", stream);
576               print_spaces_filtered (2 + 2 * recurse, stream);
577             }
578           else
579             wrap_here (n_spaces (2 + 2 *recurse));
580         }
581
582       if (is_map && i % 2 == 0)
583         fputs_filtered ("[", stream);
584       else if (is_array)
585         {
586           /* We print the index, not whatever the child method
587              returned as the name.  */
588           if (options->print_array_indexes)
589             fprintf_filtered (stream, "[%d] = ", i);
590         }
591       else if (! is_map)
592         {
593           fputs_filtered (name, stream);
594           fputs_filtered (" = ", stream);
595         }
596
597       if (gdbpy_is_lazy_string (py_v))
598         {
599           CORE_ADDR addr;
600           struct type *type;
601           long length;
602           gdb::unique_xmalloc_ptr<char> encoding;
603           struct value_print_options local_opts = *options;
604
605           gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding);
606
607           local_opts.addressprint = 0;
608           val_print_string (type, encoding.get (), addr, (int) length, stream,
609                             &local_opts);
610         }
611       else if (gdbpy_is_string (py_v))
612         {
613           gdb::unique_xmalloc_ptr<char> output;
614
615           output = python_string_to_host_string (py_v);
616           if (!output)
617             gdbpy_print_stack ();
618           else
619             fputs_filtered (output.get (), stream);
620         }
621       else
622         {
623           struct value *value = convert_value_from_python (py_v);
624
625           if (value == NULL)
626             {
627               gdbpy_print_stack ();
628               error (_("Error while executing Python code."));
629             }
630           else
631             common_val_print (value, stream, recurse + 1, options, language);
632         }
633
634       if (is_map && i % 2 == 0)
635         fputs_filtered ("] = ", stream);
636     }
637
638   if (i)
639     {
640       if (!done_flag)
641         {
642           if (pretty)
643             {
644               fputs_filtered ("\n", stream);
645               print_spaces_filtered (2 + 2 * recurse, stream);
646             }
647           fputs_filtered ("...", stream);
648         }
649       if (pretty)
650         {
651           fputs_filtered ("\n", stream);
652           print_spaces_filtered (2 * recurse, stream);
653         }
654       fputs_filtered ("}", stream);
655     }
656 }
657
658 enum ext_lang_rc
659 gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
660                                 struct type *type,
661                                 LONGEST embedded_offset, CORE_ADDR address,
662                                 struct ui_file *stream, int recurse,
663                                 struct value *val,
664                                 const struct value_print_options *options,
665                                 const struct language_defn *language)
666 {
667   struct gdbarch *gdbarch = get_type_arch (type);
668   struct value *value;
669   enum string_repr_result print_result;
670
671   if (value_lazy (val))
672     value_fetch_lazy (val);
673
674   /* No pretty-printer support for unavailable values.  */
675   if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type)))
676     return EXT_LANG_RC_NOP;
677
678   if (!gdb_python_initialized)
679     return EXT_LANG_RC_NOP;
680
681   gdbpy_enter enter_py (gdbarch, language);
682
683   /* Instantiate the printer.  */
684   value = value_from_component (val, type, embedded_offset);
685
686   gdbpy_ref<> val_obj (value_to_value_object (value));
687   if (val_obj == NULL)
688     {
689       print_stack_unless_memory_error (stream);
690       return EXT_LANG_RC_ERROR;
691     }
692
693   /* Find the constructor.  */
694   gdbpy_ref<> printer (find_pretty_printer (val_obj.get ()));
695   if (printer == NULL)
696     {
697       print_stack_unless_memory_error (stream);
698       return EXT_LANG_RC_ERROR;
699     }
700
701   if (printer == Py_None)
702     return EXT_LANG_RC_NOP;
703
704   /* If we are printing a map, we want some special formatting.  */
705   gdb::unique_xmalloc_ptr<char> hint (gdbpy_get_display_hint (printer.get ()));
706
707   /* Print the section */
708   print_result = print_string_repr (printer.get (), hint.get (), stream,
709                                     recurse, options, language, gdbarch);
710   if (print_result != string_repr_error)
711     print_children (printer.get (), hint.get (), stream, recurse, options,
712                     language, print_result == string_repr_none);
713
714   if (PyErr_Occurred ())
715     print_stack_unless_memory_error (stream);
716   return EXT_LANG_RC_OK;
717 }
718
719
720 /* Apply a pretty-printer for the varobj code.  PRINTER_OBJ is the
721    print object.  It must have a 'to_string' method (but this is
722    checked by varobj, not here) which takes no arguments and
723    returns a string.  The printer will return a value and in the case
724    of a Python string being returned, this function will return a
725    PyObject containing the string.  For any other type, *REPLACEMENT is
726    set to the replacement value and this function returns NULL.  On
727    error, *REPLACEMENT is set to NULL and this function also returns
728    NULL.  */
729 gdbpy_ref<>
730 apply_varobj_pretty_printer (PyObject *printer_obj,
731                              struct value **replacement,
732                              struct ui_file *stream)
733 {
734   *replacement = NULL;
735   gdbpy_ref<> py_str = pretty_print_one_value (printer_obj, replacement);
736
737   if (*replacement == NULL && py_str == NULL)
738     print_stack_unless_memory_error (stream);
739
740   return py_str;
741 }
742
743 /* Find a pretty-printer object for the varobj module.  Returns a new
744    reference to the object if successful; returns NULL if not.  VALUE
745    is the value for which a printer tests to determine if it
746    can pretty-print the value.  */
747 PyObject *
748 gdbpy_get_varobj_pretty_printer (struct value *value)
749 {
750   TRY
751     {
752       value = value_copy (value);
753     }
754   CATCH (except, RETURN_MASK_ALL)
755     {
756       GDB_PY_HANDLE_EXCEPTION (except);
757     }
758   END_CATCH
759
760   gdbpy_ref<> val_obj (value_to_value_object (value));
761   if (val_obj == NULL)
762     return NULL;
763
764   return find_pretty_printer (val_obj.get ());
765 }
766
767 /* A Python function which wraps find_pretty_printer and instantiates
768    the resulting class.  This accepts a Value argument and returns a
769    pretty printer instance, or None.  This function is useful as an
770    argument to the MI command -var-set-visualizer.  */
771 PyObject *
772 gdbpy_default_visualizer (PyObject *self, PyObject *args)
773 {
774   PyObject *val_obj;
775   PyObject *cons;
776   struct value *value;
777
778   if (! PyArg_ParseTuple (args, "O", &val_obj))
779     return NULL;
780   value = value_object_to_value (val_obj);
781   if (! value)
782     {
783       PyErr_SetString (PyExc_TypeError,
784                        _("Argument must be a gdb.Value."));
785       return NULL;
786     }
787
788   cons = find_pretty_printer (val_obj);
789   return cons;
790 }
This page took 0.071041 seconds and 4 git commands to generate.