Ruby 4.1.0dev (2026-08-28 revision 5eb9a6925b805a17dced976d5b741afe5086aab1)
box.h
1#ifndef INTERNAL_BOX_H /*-*-C-*-vi:se ft=c:*/
2#define INTERNAL_BOX_H
3
4#include "ruby/ruby.h" /* for VALUE */
5
15 /*
16 * To retrieve Ruby::Box object that provides #require and so on.
17 * That is used from load.c, etc., that uses rb_box_t internally.
18 */
19 VALUE box_object;
20 long box_id; // box_id to generate ext filenames
21
22 VALUE top_self;
23
24 VALUE load_path;
25 VALUE load_path_snapshot;
26 VALUE load_path_check_cache;
27 VALUE expanded_load_path;
28 long expanded_load_path_maxlen;
29 VALUE loaded_features;
30 VALUE loaded_features_snapshot;
31 VALUE loaded_features_realpaths;
32 VALUE loaded_features_realpath_map;
33 struct st_table *loaded_features_index;
34 struct st_table *loading_table;
35 VALUE ruby_dln_libmap;
36
37 VALUE gvar_tbl;
38 struct st_table *classext_cow_classes;
39
40 bool is_root;
41 bool is_user;
42 bool is_optional;
43};
44typedef struct rb_box_struct rb_box_t;
45
47 bool gem;
48 bool error_highlight;
49 bool did_you_mean;
50 bool syntax_suggest;
51};
53
54#define BOX_OBJ_P(obj) (rb_obj_class(obj) == rb_cBox)
55
56#define BOX_MASTER_P(box) (box && !box->is_root && !box->is_user)
57#define BOX_MUTABLE_P(box) (box && (box->is_root || box->is_user))
58#define BOX_ROOT_P(box) (box && box->is_root)
59#define BOX_USER_P(box) (box && box->is_user)
60#define BOX_OPTIONAL_P(box) (box && box->is_optional)
61#define BOX_MAIN_P(box) (box && box->is_user && !box->is_optional)
62
63#define BOX_METHOD_DEFINITION(mdef) (mdef ? mdef->ns : NULL)
64#define BOX_METHOD_ENTRY(me) (me ? BOX_METHOD_DEFINITION(me->def) : NULL)
65#define BOX_CC(cc) (cc ? BOX_METHOD_ENTRY(cc->cme_) : NULL)
66#define BOX_CC_ENTRIES(ccs) (ccs ? BOX_METHOD_ENTRY(ccs->cme) : NULL)
67
68RUBY_EXTERN bool ruby_box_enabled;
69RUBY_EXTERN bool ruby_box_init_done;
70RUBY_EXTERN bool ruby_box_crashed;
71
72static inline bool
73rb_box_available(void)
74{
75 return ruby_box_enabled;
76}
77
78const rb_box_t * rb_master_box(void);
79const rb_box_t * rb_root_box(void);
80const rb_box_t * rb_main_box(void);
81const rb_box_t * rb_current_box(void);
82const rb_box_t * rb_loading_box(void);
83const rb_box_t * rb_current_box_in_crash_report(void);
84
85void rb_box_entry_mark(void *);
86void rb_box_gc_update_references(void *ptr);
87
88rb_box_t * rb_get_box_t(VALUE ns);
89VALUE rb_get_box_object(rb_box_t *ns);
90
91VALUE rb_box_local_extension(VALUE box, VALUE fname, VALUE path, VALUE *cleanup);
92void rb_box_cleanup_local_extension(VALUE cleanup);
93void rb_box_defer_unload_local_extension(void *handle);
94void rb_box_unload_local_extensions(void);
95
96void rb_initialize_mandatory_boxes(void);
97void rb_box_init_done(void);
98void rb_box_set_gem_flags(rb_box_gem_flags_t *);
99
100/* variable.c */
101void rb_autoload_copy_table_for_box(st_table *, const rb_box_t *);
102
103#endif /* INTERNAL_BOX_H */
#define RUBY_EXTERN
Declaration of externally visible global variables.
Definition dllexport.h:45
Internal header for Ruby Box.
Definition box.h:14
Definition st.h:79
uintptr_t VALUE
Type that represents a Ruby object.
Definition value.h:40