Ruby  3.1.4p223 (2023-03-30 revision HEAD)
vm.h
1 #ifndef INTERNAL_VM_H /*-*-C-*-vi:se ft=c:*/
2 #define INTERNAL_VM_H
11 #include "ruby/internal/stdbool.h" /* for bool */
12 #include "internal/serial.h" /* for rb_serial_t */
13 #include "internal/static_assert.h" /* for STATIC_ASSERT */
14 #include "ruby/ruby.h" /* for ID */
15 #include "ruby/st.h" /* for st_table */
16 
17 #ifdef rb_funcallv
18 # undef rb_funcallv
19 #endif
20 
21 #ifdef rb_method_basic_definition_p
22 # undef rb_method_basic_definition_p
23 #endif
24 
25 struct rb_callable_method_entry_struct; /* in method.h */
26 struct rb_method_definition_struct; /* in method.h */
27 struct rb_execution_context_struct; /* in vm_core.h */
28 struct rb_control_frame_struct; /* in vm_core.h */
29 struct rb_callinfo; /* in vm_core.h */
30 
31 enum method_missing_reason {
32  MISSING_NOENTRY = 0x00,
33  MISSING_PRIVATE = 0x01,
34  MISSING_PROTECTED = 0x02,
35  MISSING_FCALL = 0x04,
36  MISSING_VCALL = 0x08,
37  MISSING_SUPER = 0x10,
38  MISSING_MISSING = 0x20,
39  MISSING_NONE = 0x40
40 };
41 
42 /* vm_insnhelper.h */
43 rb_serial_t rb_next_class_serial(void);
44 
45 /* vm.c */
46 VALUE rb_obj_is_thread(VALUE obj);
47 void rb_vm_mark(void *ptr);
48 void rb_vm_each_stack_value(void *ptr, void (*cb)(VALUE, void*), void *ctx);
49 PUREFUNC(VALUE rb_vm_top_self(void));
50 void rb_vm_inc_const_missing_count(void);
51 const void **rb_vm_get_insns_address_table(void);
52 VALUE rb_source_location(int *pline);
53 const char *rb_source_location_cstr(int *pline);
54 MJIT_STATIC void rb_vm_pop_cfunc_frame(void);
55 int rb_vm_add_root_module(VALUE module);
56 void rb_vm_check_redefinition_by_prepend(VALUE klass);
57 int rb_vm_check_optimizable_mid(VALUE mid);
58 VALUE rb_yield_refine_block(VALUE refinement, VALUE refinements);
59 MJIT_STATIC VALUE ruby_vm_special_exception_copy(VALUE);
60 PUREFUNC(st_table *rb_vm_fstring_table(void));
61 
62 MJIT_SYMBOL_EXPORT_BEGIN
63 VALUE vm_exec(struct rb_execution_context_struct *, bool); /* used in JIT-ed code */
64 MJIT_SYMBOL_EXPORT_END
65 
66 /* vm_eval.c */
67 VALUE rb_current_realfilepath(void);
68 VALUE rb_check_block_call(VALUE, ID, int, const VALUE *, rb_block_call_func_t, VALUE);
69 typedef void rb_check_funcall_hook(int, VALUE, ID, int, const VALUE *, VALUE);
70 VALUE rb_check_funcall_with_hook(VALUE recv, ID mid, int argc, const VALUE *argv,
71  rb_check_funcall_hook *hook, VALUE arg);
72 VALUE rb_check_funcall_with_hook_kw(VALUE recv, ID mid, int argc, const VALUE *argv,
73  rb_check_funcall_hook *hook, VALUE arg, int kw_splat);
74 const char *rb_type_str(enum ruby_value_type type);
75 VALUE rb_check_funcall_default(VALUE, ID, int, const VALUE *, VALUE);
76 VALUE rb_check_funcall_basic_kw(VALUE, ID, VALUE, int, const VALUE*, int);
77 VALUE rb_yield_1(VALUE val);
78 VALUE rb_yield_force_blockarg(VALUE values);
79 VALUE rb_lambda_call(VALUE obj, ID mid, int argc, const VALUE *argv,
80  rb_block_call_func_t bl_proc, int min_argc, int max_argc,
81  VALUE data2);
82 void rb_check_stack_overflow(void);
83 
84 /* vm_insnhelper.c */
85 VALUE rb_equal_opt(VALUE obj1, VALUE obj2);
86 VALUE rb_eql_opt(VALUE obj1, VALUE obj2);
87 
88 struct rb_iseq_struct;
89 MJIT_SYMBOL_EXPORT_BEGIN
90 const struct rb_callcache *rb_vm_search_method_slowpath(const struct rb_callinfo *ci, VALUE klass);
91 MJIT_SYMBOL_EXPORT_END
92 
93 /* vm_method.c */
95 MJIT_SYMBOL_EXPORT_BEGIN
96 int rb_ec_obj_respond_to(struct rb_execution_context_struct *ec, VALUE obj, ID id, int priv);
97 MJIT_SYMBOL_EXPORT_END
98 
99 /* vm_dump.c */
100 void rb_print_backtrace(void);
101 
102 /* vm_backtrace.c */
103 VALUE rb_vm_thread_backtrace(int argc, const VALUE *argv, VALUE thval);
104 VALUE rb_vm_thread_backtrace_locations(int argc, const VALUE *argv, VALUE thval);
105 VALUE rb_vm_backtrace(int argc, const VALUE * argv, struct rb_execution_context_struct * ec);
106 VALUE rb_vm_backtrace_locations(int argc, const VALUE * argv, struct rb_execution_context_struct * ec);
108 void rb_backtrace_print_as_bugreport(void);
109 int rb_backtrace_p(VALUE obj);
110 VALUE rb_backtrace_to_str_ary(VALUE obj);
111 VALUE rb_backtrace_to_location_ary(VALUE obj);
112 void rb_backtrace_each(VALUE (*iter)(VALUE recv, VALUE str), VALUE output);
113 int rb_frame_info_p(VALUE obj);
114 int rb_get_node_id_from_frame_info(VALUE obj);
115 const struct rb_iseq_struct *rb_get_iseq_from_frame_info(VALUE obj);
116 
117 MJIT_SYMBOL_EXPORT_BEGIN
118 VALUE rb_ec_backtrace_object(const struct rb_execution_context_struct *ec);
119 void rb_backtrace_use_iseq_first_lineno_for_last_location(VALUE self);
120 MJIT_SYMBOL_EXPORT_END
121 
122 #define RUBY_DTRACE_CREATE_HOOK(name, arg) \
123  RUBY_DTRACE_HOOK(name##_CREATE, arg)
124 #define RUBY_DTRACE_HOOK(name, arg) \
125 do { \
126  if (UNLIKELY(RUBY_DTRACE_##name##_ENABLED())) { \
127  int dtrace_line; \
128  const char *dtrace_file = rb_source_location_cstr(&dtrace_line); \
129  if (!dtrace_file) dtrace_file = ""; \
130  RUBY_DTRACE_##name(arg, dtrace_file, dtrace_line); \
131  } \
132 } while (0)
133 #endif /* INTERNAL_VM_H */
VALUE rb_make_backtrace(void)
Creates the good old fashioned array-of-strings style backtrace info.
rb_block_call_func * rb_block_call_func_t
Shorthand type that represents an iterator-written-in-C function pointer.
Definition: iterator.h:88
VALUE type(ANYARGS)
ANYARGS-ed function type.
Definition: cxxanyargs.hpp:56
C99 shim for <stdbool.h>
Definition: method.h:62
Definition: st.h:79
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
Definition: value.h:52
uintptr_t VALUE
Type that represents a Ruby object.
Definition: value.h:40
ruby_value_type
C-level type of an object.
Definition: value_type.h:112