aboutsummaryrefslogtreecommitdiffstats
path: root/internal/debug.h
blob: 276991027c87847ca7633473af7a85f32ace5d47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef INTERNAL_DEBUG_H /* -*- C -*- */
#define INTERNAL_DEBUG_H
/**
 * @file
 * @brief      Internal header for debugging.
 * @author     \@shyouhei
 * @copyright  This  file  is   a  part  of  the   programming  language  Ruby.
 *             Permission  is hereby  granted,  to  either redistribute  and/or
 *             modify this file, provided that  the conditions mentioned in the
 *             file COPYING are met.  Consult the file for details.
 */
#include "ruby/config.h"
#include <stdio.h>              /* for fprintf */
#include "ruby/ruby.h"          /* for VALUE */

/* MRI debug support */

/* gc.c */
void rb_obj_info_dump(VALUE obj);
void rb_obj_info_dump_loc(VALUE obj, const char *file, int line, const char *func);

/* debug.c */
void ruby_debug_breakpoint(void);
PRINTF_ARGS(void ruby_debug_printf(const char*, ...), 1, 2);

// show obj data structure without any side-effect
#define rp(obj) rb_obj_info_dump_loc((VALUE)(obj), __FILE__, __LINE__, __func__)

// same as rp, but add message header
#define rp_m(msg, obj) do { \
    fprintf(stderr, "%s", (msg)); \
    rb_obj_info_dump((VALUE)obj); \
} while (0)

// `ruby_debug_breakpoint()` does nothing,
// but breakpoint is set in run.gdb, so `make gdb` can stop here.
#define bp() ruby_debug_breakpoint()

#endif /* INTERNAL_DEBUG_H */