Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)
mini_builtin.c
Go to the documentation of this file.
1#include "internal.h"
2#include "internal/array.h"
3#include "iseq.h"
4#include "vm_core.h"
5#include "builtin.h"
6
7#include "miniprelude.c"
8
9// included from miniinit.c
10
11#ifndef INCLUDED_BY_BUILTIN_C
12static struct st_table *loaded_builtin_table;
13#endif
14
15rb_ast_t *rb_builtin_ast(const char *feature_name, VALUE *name_str);
16
17static const rb_iseq_t *
18builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *table)
19{
20 VALUE name_str = 0;
21 rb_ast_t *ast = rb_builtin_ast(feature_name, &name_str);
22 rb_vm_t *vm = GET_VM();
23
24 vm->builtin_function_table = table;
26 const rb_iseq_t *iseq = rb_iseq_new(&ast->body, name_str, name_str, Qnil, NULL, ISEQ_TYPE_TOP);
27 GET_VM()->builtin_function_table = NULL;
28
29 rb_ast_dispose(ast);
30
31 // for debug
32 if (0 && strcmp("prelude", feature_name) == 0) {
34 }
35
36#ifndef INCLUDED_BY_BUILTIN_C
37 st_insert(loaded_builtin_table, (st_data_t)feature_name, (st_data_t)iseq);
39#endif
40
41 return iseq;
42}
43
44void
45rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table)
46{
47 const rb_iseq_t *iseq = builtin_iseq_load(feature_name, table);
48 rb_iseq_eval(iseq);
49}
50
51#ifndef INCLUDED_BY_BUILTIN_C
52
53static int
54each_builtin_i(st_data_t key, st_data_t val, st_data_t dmy)
55{
56 const char *feature = (const char *)key;
57 const rb_iseq_t *iseq = (const rb_iseq_t *)val;
58
59 rb_yield_values(2, rb_str_new2(feature), rb_iseqw_new(iseq));
60
61 return ST_CONTINUE;
62}
63
64static VALUE
65each_builtin(VALUE self)
66{
67 st_foreach(loaded_builtin_table, each_builtin_i, 0);
68 return Qnil;
69}
70
71void
73{
74 rb_define_singleton_method(rb_cRubyVM, "each_builtin", each_builtin, 0);
75 loaded_builtin_table = st_init_strtable();
76}
77
78void
80{
81 // register for ruby
82 builtin_iseq_load("gem_prelude", NULL);
83}
84#endif
#define rb_define_singleton_method(klass, mid, func, arity)
Defines klass.mid.
Definition: cxxanyargs.hpp:668
void rb_gc_register_mark_object(VALUE obj)
Inform the garbage collector that object is a live Ruby object that should not be moved.
Definition: gc.c:8022
VALUE rb_stdout
Definition: globals.h:118
VALUE rb_iseqw_new(const rb_iseq_t *)
Definition: iseq.c:1217
Defines RBIMPL_HAS_BUILTIN.
VALUE rb_io_write(VALUE, VALUE)
Definition: io.c:1953
#define rb_str_new2
Definition: string.h:276
Internal header for Array.
rb_iseq_t * rb_iseq_new(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent, enum iseq_type type)
Definition: iseq.c:809
VALUE rb_iseq_disasm(const rb_iseq_t *iseq)
Definition: iseq.c:2335
VALUE rb_yield_values(int n,...)
Definition: vm_eval.c:1353
void Init_builtin_features(void)
Definition: mini_builtin.c:79
rb_ast_t * rb_builtin_ast(const char *feature_name, VALUE *name_str)
void Init_builtin(void)
Definition: mini_builtin.c:72
void rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table)
Definition: mini_builtin.c:45
void rb_ast_dispose(rb_ast_t *ast)
Definition: node.c:1448
#define NULL
Definition: regenc.h:69
#define Qnil
@ ST_CONTINUE
Definition: st.h:99
unsigned long st_data_t
Definition: st.h:22
#define st_foreach
Definition: st.h:142
#define st_insert
Definition: st.h:124
#define st_init_strtable
Definition: st.h:110
rb_ast_body_t body
Definition: node.h:406
int builtin_inline_index
Definition: vm_core.h:657
const struct rb_builtin_function * builtin_function_table
Definition: vm_core.h:656
Definition: st.h:79
unsigned long VALUE
Definition: value.h:38
VALUE rb_iseq_eval(const rb_iseq_t *iseq)
Definition: vm.c:2403
VALUE rb_cRubyVM
Definition: vm.c:373