Ruby 2.7.7p221 (2022-11-24 revision 168ec2b1e5ad0e4688e963d9de019557c78feed9)
mini_builtin.c
Go to the documentation of this file.
1#include "internal.h"
2#include "vm_core.h"
3#include "iseq.h"
4#include "builtin.h"
5
6#include "miniprelude.c"
7
8// included from miniinit.c
9
10#ifndef INCLUDED_BY_BUILTIN_C
11static struct st_table *loaded_builtin_table;
12#endif
13
14rb_ast_t *rb_builtin_ast(const char *feature_name, VALUE *name_str);
15
16static const rb_iseq_t *
17builtin_iseq_load(const char *feature_name, const struct rb_builtin_function *table)
18{
19 VALUE name_str = 0;
20 rb_ast_t *ast = rb_builtin_ast(feature_name, &name_str);
21 rb_vm_t *vm = GET_VM();
22
23 vm->builtin_function_table = table;
25 const rb_iseq_t *iseq = rb_iseq_new(&ast->body, name_str, name_str, Qnil, NULL, ISEQ_TYPE_TOP);
26 GET_VM()->builtin_function_table = NULL;
27
28 rb_ast_dispose(ast);
29
30 // for debug
31 if (0 && strcmp("prelude", feature_name) == 0) {
33 }
34
35#ifndef INCLUDED_BY_BUILTIN_C
36 st_insert(loaded_builtin_table, (st_data_t)feature_name, (st_data_t)iseq);
38#endif
39
40 return iseq;
41}
42
43void
44rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table)
45{
46 const rb_iseq_t *iseq = builtin_iseq_load(feature_name, table);
48}
49
50#ifndef INCLUDED_BY_BUILTIN_C
51
52static int
53each_builtin_i(st_data_t key, st_data_t val, st_data_t dmy)
54{
55 const char *feature = (const char *)key;
56 const rb_iseq_t *iseq = (const rb_iseq_t *)val;
57
59
60 return ST_CONTINUE;
61}
62
63static VALUE
64each_builtin(VALUE self)
65{
66 st_foreach(loaded_builtin_table, each_builtin_i, 0);
67 return Qnil;
68}
69
70void
72{
73 rb_define_singleton_method(rb_cRubyVM, "each_builtin", each_builtin, 0);
74 loaded_builtin_table = st_init_strtable();
75}
76
77void
79{
80 // register for ruby
81 builtin_iseq_load("gem_prelude", NULL);
82}
83#endif
void Init_builtin_features(void)
Definition: mini_builtin.c:78
rb_ast_t * rb_builtin_ast(const char *feature_name, VALUE *name_str)
void Init_builtin(void)
Definition: mini_builtin.c:71
void rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table)
Definition: mini_builtin.c:44
#define rb_str_new2
void rb_ast_dispose(rb_ast_t *)
Definition: node.c:1387
#define NULL
unsigned long st_data_t
int strcmp(const char *, const char *)
#define rb_yield_values(argc,...)
void rb_gc_register_mark_object(VALUE)
Definition: gc.c:7079
VALUE rb_io_write(VALUE, VALUE)
Definition: io.c:1804
VALUE rb_cRubyVM
Definition: vm.c:365
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)
Definition: iseq.c:761
#define GET_VM()
VALUE rb_iseqw_new(const rb_iseq_t *iseq)
Definition: iseq.c:1157
void rb_define_singleton_method(VALUE, const char *, VALUE(*)(), int)
const rb_iseq_t * iseq
#define Qnil
VALUE rb_iseq_disasm(const rb_iseq_t *iseq)
Definition: iseq.c:2278
int const void const char VALUE rb_iseq_eval(const rb_iseq_t *iseq)
Definition: vm.c:2163
VALUE rb_stdout
unsigned long VALUE
Definition: ruby.h:102
st_table * st_init_strtable(void)
Definition: st.c:668
int st_insert(st_table *tab, st_data_t key, st_data_t value)
Definition: st.c:1171
int st_foreach(st_table *tab, st_foreach_callback_func *func, st_data_t arg)
Definition: st.c:1717
const struct rb_builtin_function * builtin_function_table