]> Git Repo - binutils.git/blob - gdb/python/py-prettyprint.c
ac0506f3e11eeb56be9252dd8ca481778d264bb8
[binutils.git] / gdb / python / py-prettyprint.c
1 /* Python pretty-printing
2
3    Copyright (C) 2008-2019 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 gdbpy_ref<>
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;
82     }
83
84   return gdbpy_ref<>::new_reference (Py_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     gdbpy_ref<> objf = objfile_to_objfile_object (obj);
101     if (objf == NULL)
102       {
103         /* Ignore the error and continue.  */
104         PyErr_Clear ();
105         continue;
106       }
107
108     gdbpy_ref<> pp_list (objfpy_get_printers (objf.get (), 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 gdbpy_ref<>
129 find_pretty_printer_from_progspace (PyObject *value)
130 {
131   gdbpy_ref<> obj = pspace_to_pspace_object (current_program_space);
132
133   if (obj == NULL)
134     return NULL;
135   gdbpy_ref<> pp_list (pspy_get_printers (obj.get (), 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 gdbpy_ref<>
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     return gdbpy_ref<>::new_reference (Py_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     return gdbpy_ref<>::new_reference (Py_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 gdbpy_ref<>
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;
172
173   /* Look at the pretty-printer list for the current program-space.  */
174   function = find_pretty_printer_from_progspace (value);
175   if (function == NULL || function != Py_None)
176     return function;
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       gdbpy_err_fetch fetched_error;
263       gdb::unique_xmalloc_ptr<char> msg = fetched_error.to_string ();
264
265       if (msg == NULL || *msg == '\0')
266         fprintf_filtered (stream, _("<error reading variable>"));
267       else
268         fprintf_filtered (stream, _("<error reading variable: %s>"),
269                           msg.get ());
270     }
271   else
272     gdbpy_print_stack ();
273 }
274
275 /* Helper for gdbpy_apply_val_pretty_printer which calls to_string and
276    formats the result.  */
277
278 static enum string_repr_result
279 print_string_repr (PyObject *printer, const char *hint,
280                    struct ui_file *stream, int recurse,
281                    const struct value_print_options *options,
282                    const struct language_defn *language,
283                    struct gdbarch *gdbarch)
284 {
285   struct value *replacement = NULL;
286   enum string_repr_result result = string_repr_ok;
287
288   gdbpy_ref<> py_str = pretty_print_one_value (printer, &replacement);
289   if (py_str != NULL)
290     {
291       if (py_str == Py_None)
292         result = string_repr_none;
293       else if (gdbpy_is_lazy_string (py_str.get ()))
294         {
295           CORE_ADDR addr;
296           long length;
297           struct type *type;
298           gdb::unique_xmalloc_ptr<char> encoding;
299           struct value_print_options local_opts = *options;
300
301           gdbpy_extract_lazy_string (py_str.get (), &addr, &type,
302                                      &length, &encoding);
303
304           local_opts.addressprint = 0;
305           val_print_string (type, encoding.get (), addr, (int) length,
306                             stream, &local_opts);
307         }
308       else
309         {
310           gdbpy_ref<> string
311             = python_string_to_target_python_string (py_str.get ());
312           if (string != NULL)
313             {
314               char *output;
315               long length;
316               struct type *type;
317
318 #ifdef IS_PY3K
319               output = PyBytes_AS_STRING (string.get ());
320               length = PyBytes_GET_SIZE (string.get ());
321 #else
322               output = PyString_AsString (string.get ());
323               length = PyString_Size (string.get ());
324 #endif
325               type = builtin_type (gdbarch)->builtin_char;
326
327               if (hint && !strcmp (hint, "string"))
328                 LA_PRINT_STRING (stream, type, (gdb_byte *) output,
329                                  length, NULL, 0, options);
330               else
331                 fputs_filtered (output, stream);
332             }
333           else
334             {
335               result = string_repr_error;
336               print_stack_unless_memory_error (stream);
337             }
338         }
339     }
340   else if (replacement)
341     {
342       struct value_print_options opts = *options;
343
344       opts.addressprint = 0;
345       common_val_print (replacement, stream, recurse, &opts, language);
346     }
347   else
348     {
349       result = string_repr_error;
350       print_stack_unless_memory_error (stream);
351     }
352
353   return result;
354 }
355
356 #ifndef IS_PY3K
357
358 /* Create a dummy PyFrameObject, needed to work around
359    a Python-2.4 bug with generators.  */
360 class dummy_python_frame
361 {
362  public:
363
364   dummy_python_frame ();
365
366   ~dummy_python_frame ()
367   {
368     if (m_valid)
369       m_tstate->frame = m_saved_frame;
370   }
371
372   bool failed () const
373   {
374     return !m_valid;
375   }
376
377  private:
378
379   bool m_valid;
380   PyFrameObject *m_saved_frame;
381   gdbpy_ref<> m_frame;
382   PyThreadState *m_tstate;
383 };
384
385 dummy_python_frame::dummy_python_frame ()
386 : m_valid (false),
387   m_saved_frame (NULL),
388   m_tstate (NULL)
389 {
390   PyCodeObject *code;
391   PyFrameObject *frame;
392
393   gdbpy_ref<> empty_string (PyString_FromString (""));
394   if (empty_string == NULL)
395     return;
396
397   gdbpy_ref<> null_tuple (PyTuple_New (0));
398   if (null_tuple == NULL)
399     return;
400
401   code = PyCode_New (0,                   /* argcount */
402                      0,                   /* locals */
403                      0,                   /* stacksize */
404                      0,                   /* flags */
405                      empty_string.get (), /* code */
406                      null_tuple.get (),   /* consts */
407                      null_tuple.get (),   /* names */
408                      null_tuple.get (),   /* varnames */
409 #if PYTHON_API_VERSION >= 1010
410                      null_tuple.get (),   /* freevars */
411                      null_tuple.get (),   /* cellvars */
412 #endif
413                      empty_string.get (), /* filename */
414                      empty_string.get (), /* name */
415                      1,                   /* firstlineno */
416                      empty_string.get ()  /* lnotab */
417                      );
418   if (code == NULL)
419     return;
420   gdbpy_ref<> code_holder ((PyObject *) code);
421
422   gdbpy_ref<> globals (PyDict_New ());
423   if (globals == NULL)
424     return;
425
426   m_tstate = PyThreadState_GET ();
427   frame = PyFrame_New (m_tstate, code, globals.get (), NULL);
428   if (frame == NULL)
429     return;
430
431   m_frame.reset ((PyObject *) frame);
432   m_tstate->frame = frame;
433   m_saved_frame = frame->f_back;
434   m_valid = true;
435 }
436 #endif
437
438 /* Helper for gdbpy_apply_val_pretty_printer that formats children of the
439    printer, if any exist.  If is_py_none is true, then nothing has
440    been printed by to_string, and format output accordingly. */
441 static void
442 print_children (PyObject *printer, const char *hint,
443                 struct ui_file *stream, int recurse,
444                 const struct value_print_options *options,
445                 const struct language_defn *language,
446                 int is_py_none)
447 {
448   int is_map, is_array, done_flag, pretty;
449   unsigned int i;
450
451   if (! PyObject_HasAttr (printer, gdbpy_children_cst))
452     return;
453
454   /* If we are printing a map or an array, we want some special
455      formatting.  */
456   is_map = hint && ! strcmp (hint, "map");
457   is_array = hint && ! strcmp (hint, "array");
458
459   gdbpy_ref<> children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst,
460                                                     NULL));
461   if (children == NULL)
462     {
463       print_stack_unless_memory_error (stream);
464       return;
465     }
466
467   gdbpy_ref<> iter (PyObject_GetIter (children.get ()));
468   if (iter == NULL)
469     {
470       print_stack_unless_memory_error (stream);
471       return;
472     }
473
474   /* Use the prettyformat_arrays option if we are printing an array,
475      and the pretty option otherwise.  */
476   if (is_array)
477     pretty = options->prettyformat_arrays;
478   else
479     {
480       if (options->prettyformat == Val_prettyformat)
481         pretty = 1;
482       else
483         pretty = options->prettyformat_structs;
484     }
485
486   /* Manufacture a dummy Python frame to work around Python 2.4 bug,
487      where it insists on having a non-NULL tstate->frame when
488      a generator is called.  */
489 #ifndef IS_PY3K
490   dummy_python_frame frame;
491   if (frame.failed ())
492     {
493       gdbpy_print_stack ();
494       return;
495     }
496 #endif
497
498   done_flag = 0;
499   for (i = 0; i < options->print_max; ++i)
500     {
501       PyObject *py_v;
502       const char *name;
503
504       gdbpy_ref<> item (PyIter_Next (iter.get ()));
505       if (item == NULL)
506         {
507           if (PyErr_Occurred ())
508             print_stack_unless_memory_error (stream);
509           /* Set a flag so we can know whether we printed all the
510              available elements.  */
511           else  
512             done_flag = 1;
513           break;
514         }
515
516       if (! PyTuple_Check (item.get ()) || PyTuple_Size (item.get ()) != 2)
517         {
518           PyErr_SetString (PyExc_TypeError,
519                            _("Result of children iterator not a tuple"
520                              " of two elements."));
521           gdbpy_print_stack ();
522           continue;
523         }
524       if (! PyArg_ParseTuple (item.get (), "sO", &name, &py_v))
525         {
526           /* The user won't necessarily get a stack trace here, so provide
527              more context.  */
528           if (gdbpy_print_python_errors_p ())
529             fprintf_unfiltered (gdb_stderr,
530                                 _("Bad result from children iterator.\n"));
531           gdbpy_print_stack ();
532           continue;
533         }
534
535       /* Print initial "{".  For other elements, there are three
536          cases:
537          1. Maps.  Print a "," after each value element.
538          2. Arrays.  Always print a ",".
539          3. Other.  Always print a ",".  */
540       if (i == 0)
541         {
542          if (is_py_none)
543            fputs_filtered ("{", stream);
544          else
545            fputs_filtered (" = {", stream);
546        }
547
548       else if (! is_map || i % 2 == 0)
549         fputs_filtered (pretty ? "," : ", ", stream);
550
551       /* In summary mode, we just want to print "= {...}" if there is
552          a value.  */
553       if (options->summary)
554         {
555           /* This increment tricks the post-loop logic to print what
556              we want.  */
557           ++i;
558           /* Likewise.  */
559           pretty = 0;
560           break;
561         }
562
563       if (! is_map || i % 2 == 0)
564         {
565           if (pretty)
566             {
567               fputs_filtered ("\n", stream);
568               print_spaces_filtered (2 + 2 * recurse, stream);
569             }
570           else
571             wrap_here (n_spaces (2 + 2 *recurse));
572         }
573
574       if (is_map && i % 2 == 0)
575         fputs_filtered ("[", stream);
576       else if (is_array)
577         {
578           /* We print the index, not whatever the child method
579              returned as the name.  */
580           if (options->print_array_indexes)
581             fprintf_filtered (stream, "[%d] = ", i);
582         }
583       else if (! is_map)
584         {
585           fputs_filtered (name, stream);
586           fputs_filtered (" = ", stream);
587         }
588
589       if (gdbpy_is_lazy_string (py_v))
590         {
591           CORE_ADDR addr;
592           struct type *type;
593           long length;
594           gdb::unique_xmalloc_ptr<char> encoding;
595           struct value_print_options local_opts = *options;
596
597           gdbpy_extract_lazy_string (py_v, &addr, &type, &length, &encoding);
598
599           local_opts.addressprint = 0;
600           val_print_string (type, encoding.get (), addr, (int) length, stream,
601                             &local_opts);
602         }
603       else if (gdbpy_is_string (py_v))
604         {
605           gdb::unique_xmalloc_ptr<char> output;
606
607           output = python_string_to_host_string (py_v);
608           if (!output)
609             gdbpy_print_stack ();
610           else
611             fputs_filtered (output.get (), stream);
612         }
613       else
614         {
615           struct value *value = convert_value_from_python (py_v);
616
617           if (value == NULL)
618             {
619               gdbpy_print_stack ();
620               error (_("Error while executing Python code."));
621             }
622           else
623             common_val_print (value, stream, recurse + 1, options, language);
624         }
625
626       if (is_map && i % 2 == 0)
627         fputs_filtered ("] = ", stream);
628     }
629
630   if (i)
631     {
632       if (!done_flag)
633         {
634           if (pretty)
635             {
636               fputs_filtered ("\n", stream);
637               print_spaces_filtered (2 + 2 * recurse, stream);
638             }
639           fputs_filtered ("...", stream);
640         }
641       if (pretty)
642         {
643           fputs_filtered ("\n", stream);
644           print_spaces_filtered (2 * recurse, stream);
645         }
646       fputs_filtered ("}", stream);
647     }
648 }
649
650 enum ext_lang_rc
651 gdbpy_apply_val_pretty_printer (const struct extension_language_defn *extlang,
652                                 struct type *type,
653                                 LONGEST embedded_offset, CORE_ADDR address,
654                                 struct ui_file *stream, int recurse,
655                                 struct value *val,
656                                 const struct value_print_options *options,
657                                 const struct language_defn *language)
658 {
659   struct gdbarch *gdbarch = get_type_arch (type);
660   struct value *value;
661   enum string_repr_result print_result;
662
663   if (value_lazy (val))
664     value_fetch_lazy (val);
665
666   /* No pretty-printer support for unavailable values.  */
667   if (!value_bytes_available (val, embedded_offset, TYPE_LENGTH (type)))
668     return EXT_LANG_RC_NOP;
669
670   if (!gdb_python_initialized)
671     return EXT_LANG_RC_NOP;
672
673   gdbpy_enter enter_py (gdbarch, language);
674
675   /* Instantiate the printer.  */
676   value = value_from_component (val, type, embedded_offset);
677
678   gdbpy_ref<> val_obj (value_to_value_object (value));
679   if (val_obj == NULL)
680     {
681       print_stack_unless_memory_error (stream);
682       return EXT_LANG_RC_ERROR;
683     }
684
685   /* Find the constructor.  */
686   gdbpy_ref<> printer (find_pretty_printer (val_obj.get ()));
687   if (printer == NULL)
688     {
689       print_stack_unless_memory_error (stream);
690       return EXT_LANG_RC_ERROR;
691     }
692
693   if (printer == Py_None)
694     return EXT_LANG_RC_NOP;
695
696   /* If we are printing a map, we want some special formatting.  */
697   gdb::unique_xmalloc_ptr<char> hint (gdbpy_get_display_hint (printer.get ()));
698
699   /* Print the section */
700   print_result = print_string_repr (printer.get (), hint.get (), stream,
701                                     recurse, options, language, gdbarch);
702   if (print_result != string_repr_error)
703     print_children (printer.get (), hint.get (), stream, recurse, options,
704                     language, print_result == string_repr_none);
705
706   if (PyErr_Occurred ())
707     print_stack_unless_memory_error (stream);
708   return EXT_LANG_RC_OK;
709 }
710
711
712 /* Apply a pretty-printer for the varobj code.  PRINTER_OBJ is the
713    print object.  It must have a 'to_string' method (but this is
714    checked by varobj, not here) which takes no arguments and
715    returns a string.  The printer will return a value and in the case
716    of a Python string being returned, this function will return a
717    PyObject containing the string.  For any other type, *REPLACEMENT is
718    set to the replacement value and this function returns NULL.  On
719    error, *REPLACEMENT is set to NULL and this function also returns
720    NULL.  */
721 gdbpy_ref<>
722 apply_varobj_pretty_printer (PyObject *printer_obj,
723                              struct value **replacement,
724                              struct ui_file *stream)
725 {
726   *replacement = NULL;
727   gdbpy_ref<> py_str = pretty_print_one_value (printer_obj, replacement);
728
729   if (*replacement == NULL && py_str == NULL)
730     print_stack_unless_memory_error (stream);
731
732   return py_str;
733 }
734
735 /* Find a pretty-printer object for the varobj module.  Returns a new
736    reference to the object if successful; returns NULL if not.  VALUE
737    is the value for which a printer tests to determine if it
738    can pretty-print the value.  */
739 gdbpy_ref<>
740 gdbpy_get_varobj_pretty_printer (struct value *value)
741 {
742   TRY
743     {
744       value = value_copy (value);
745     }
746   CATCH (except, RETURN_MASK_ALL)
747     {
748       GDB_PY_HANDLE_EXCEPTION (except);
749     }
750   END_CATCH
751
752   gdbpy_ref<> val_obj (value_to_value_object (value));
753   if (val_obj == NULL)
754     return NULL;
755
756   return find_pretty_printer (val_obj.get ());
757 }
758
759 /* A Python function which wraps find_pretty_printer and instantiates
760    the resulting class.  This accepts a Value argument and returns a
761    pretty printer instance, or None.  This function is useful as an
762    argument to the MI command -var-set-visualizer.  */
763 PyObject *
764 gdbpy_default_visualizer (PyObject *self, PyObject *args)
765 {
766   PyObject *val_obj;
767   struct value *value;
768
769   if (! PyArg_ParseTuple (args, "O", &val_obj))
770     return NULL;
771   value = value_object_to_value (val_obj);
772   if (! value)
773     {
774       PyErr_SetString (PyExc_TypeError,
775                        _("Argument must be a gdb.Value."));
776       return NULL;
777     }
778
779   return find_pretty_printer (val_obj).release ();
780 }
This page took 0.060046 seconds and 2 git commands to generate.