5 #if defined(__x86_64__) && !defined(_ILP32) && defined(__GNUC__) 
    6 #define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movq\t%%rsp, %0" : "=r" (*(p)))
 
    7 #elif defined(__i386) && defined(__GNUC__) 
    8 #define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movl\t%%esp, %0" : "=r" (*(p)))
 
    9 #elif (defined(__powerpc__) || defined(__powerpc64__)) && defined(__GNUC__) && !defined(_AIX) && !defined(__APPLE__)  
   10 #define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr\t%0, %%r1" : "=r" (*(p)))
 
   11 #elif (defined(__powerpc__) || defined(__powerpc64__)) && defined(__GNUC__) && defined(_AIX) 
   12 #define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr %0,1" : "=r" (*(p)))
 
   13 #elif defined(__POWERPC__) && defined(__APPLE__)  
   14 #define SET_MACHINE_STACK_END(p) __asm__ volatile("mr %0, r1" : "=r" (*(p)))
 
   15 #elif defined(__aarch64__) && defined(__GNUC__) 
   16 #define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mov\t%0, sp" : "=r" (*(p)))
 
   18 NOINLINE(
void rb_gc_set_stack_end(
VALUE **stack_end_p));
 
   19 #define SET_MACHINE_STACK_END(p) rb_gc_set_stack_end(p) 
   20 #define USE_CONSERVATIVE_STACK_END 
   23 #define RB_GC_SAVE_MACHINE_CONTEXT(th)                          \ 
   25         FLUSH_REGISTER_WINDOWS;                                 \ 
   26         setjmp((th)->ec->machine.regs);                         \ 
   27         SET_MACHINE_STACK_END(&(th)->ec->machine.stack_end);    \ 
   32 #ifndef RUBY_MARK_FREE_DEBUG 
   33 #define RUBY_MARK_FREE_DEBUG 0 
   36 #if RUBY_MARK_FREE_DEBUG 
   37 extern int ruby_gc_debug_indent;
 
   40 rb_gc_debug_indent(
void)
 
   42     ruby_debug_printf(
"%*s", ruby_gc_debug_indent, 
"");
 
   46 rb_gc_debug_body(
const char *mode, 
const char *msg, 
int st, 
void *
ptr)
 
   49         ruby_gc_debug_indent--;
 
   52     ruby_debug_printf(
"%s: %s %s (%p)\n", mode, st ? 
"->" : 
"<-", msg, 
ptr);
 
   55         ruby_gc_debug_indent++;
 
   61 #define RUBY_MARK_ENTER(msg) rb_gc_debug_body("mark", (msg), 1, ptr)
 
   62 #define RUBY_MARK_LEAVE(msg) rb_gc_debug_body("mark", (msg), 0, ptr)
 
   63 #define RUBY_FREE_ENTER(msg) rb_gc_debug_body("free", (msg), 1, ptr)
 
   64 #define RUBY_FREE_LEAVE(msg) rb_gc_debug_body("free", (msg), 0, ptr)
 
   65 #define RUBY_GC_INFO         rb_gc_debug_indent(), ruby_debug_printf 
   68 #define RUBY_MARK_ENTER(msg) 
   69 #define RUBY_MARK_LEAVE(msg) 
   70 #define RUBY_FREE_ENTER(msg) 
   71 #define RUBY_FREE_LEAVE(msg) 
   72 #define RUBY_GC_INFO if(0)printf 
   75 #define RUBY_MARK_MOVABLE_UNLESS_NULL(ptr) do { \ 
   76     VALUE markobj = (ptr); \ 
   77     if (RTEST(markobj)) {rb_gc_mark_movable(markobj);} \ 
   79 #define RUBY_MARK_UNLESS_NULL(ptr) do { \ 
   80     VALUE markobj = (ptr); \ 
   81     if (RTEST(markobj)) {rb_gc_mark(markobj);} \ 
   83 #define RUBY_FREE_UNLESS_NULL(ptr) if(ptr){ruby_xfree(ptr);(ptr)=NULL;} 
   85 #if STACK_GROW_DIRECTION > 0 
   86 # define STACK_UPPER(x, a, b) (a) 
   87 #elif STACK_GROW_DIRECTION < 0 
   88 # define STACK_UPPER(x, a, b) (b) 
   91 int ruby_get_stack_grow_direction(
volatile VALUE *addr);
 
   92 # define stack_growup_p(x) (                    \ 
   93         (ruby_stack_grow_direction ?            \ 
   94          ruby_stack_grow_direction :            \ 
   95          ruby_get_stack_grow_direction(x)) > 0) 
   96 # define STACK_UPPER(x, a, b) (stack_growup_p(x) ? (a) : (b)) 
  107 #if STACK_GROW_DIRECTION 
  108 #define STACK_GROW_DIR_DETECTION 
  109 #define STACK_DIR_UPPER(a,b) STACK_UPPER(0, (a), (b)) 
  111 #define STACK_GROW_DIR_DETECTION VALUE stack_grow_dir_detection 
  112 #define STACK_DIR_UPPER(a,b) STACK_UPPER(&stack_grow_dir_detection, (a), (b)) 
  114 #define IS_STACK_DIR_UPPER() STACK_DIR_UPPER(1,0) 
  116 const char *rb_obj_info(
VALUE obj);
 
  117 const char *rb_raw_obj_info(
char *
const buff, 
const size_t buff_size, 
VALUE obj);
 
  121 size_t rb_size_pool_slot_size(
unsigned char pool_id);
 
  123 RUBY_SYMBOL_EXPORT_BEGIN
 
  126 size_t rb_objspace_data_type_memsize(
VALUE obj);
 
  127 void rb_objspace_reachable_objects_from(
VALUE obj, 
void (func)(
VALUE, 
void *), 
void *data);
 
  128 void rb_objspace_reachable_objects_from_root(
void (func)(
const char *category, 
VALUE, 
void *), 
void *data);
 
  129 int rb_objspace_markable_object_p(
VALUE obj);
 
  130 int rb_objspace_internal_object_p(
VALUE obj);
 
  131 int rb_objspace_marked_object_p(
VALUE obj);
 
  133 void rb_objspace_each_objects(
 
  134     int (*callback)(
void *start, 
void *end, 
size_t stride, 
void *data),
 
  137 void rb_objspace_each_objects_without_setup(
 
  138     int (*callback)(
void *, 
void *, 
size_t, 
void *),
 
  141 size_t rb_gc_obj_slot_size(
VALUE obj);
 
  143 VALUE rb_gc_disable_no_rest(
void);
 
  145 RUBY_SYMBOL_EXPORT_END
 
#define RUBY_EXTERN
Declaration of externally visible global variables.
char * ptr
Pointer to the underlying memory region, of at least capa bytes.
uintptr_t VALUE
Type that represents a Ruby object.