mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "internal.h"
 | 
						|
#include "vm_core.h"
 | 
						|
#include "iseq.h"
 | 
						|
#include "builtin.h"
 | 
						|
 | 
						|
#ifdef CROSS_COMPILING
 | 
						|
 | 
						|
#define INCLUDED_BY_BUILTIN_C 1
 | 
						|
#include "mini_builtin.c"
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
#include "builtin_binary.inc"
 | 
						|
 | 
						|
static const unsigned char *
 | 
						|
bin4feature(const struct builtin_binary *bb, const char *feature, size_t *psize)
 | 
						|
{
 | 
						|
    *psize = bb->bin_size;
 | 
						|
    return strcmp(bb->feature, feature) ? NULL : bb->bin;
 | 
						|
}
 | 
						|
 | 
						|
static const unsigned char*
 | 
						|
builtin_lookup(const char *feature, size_t *psize)
 | 
						|
{
 | 
						|
    static int index = 0;
 | 
						|
    const unsigned char *bin = bin4feature(&builtin_binary[index++], feature, psize);
 | 
						|
 | 
						|
    // usually, `builtin_binary` order is loading order at miniruby.
 | 
						|
    for (const struct builtin_binary *bb = &builtin_binary[0]; bb->feature &&! bin; bb++) {
 | 
						|
        bin = bin4feature(bb++, feature, psize);
 | 
						|
    }
 | 
						|
    return bin;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table)
 | 
						|
{
 | 
						|
    // search binary
 | 
						|
    size_t size;
 | 
						|
    const unsigned char *bin = builtin_lookup(feature_name, &size);
 | 
						|
    if (! bin) {
 | 
						|
        rb_bug("builtin_lookup: can not find %s\n", feature_name);
 | 
						|
    }
 | 
						|
 | 
						|
    // load binary
 | 
						|
    rb_vm_t *vm = GET_VM();
 | 
						|
    if (vm->builtin_function_table != NULL) rb_bug("vm->builtin_function_table should be NULL.");
 | 
						|
    vm->builtin_function_table = table;
 | 
						|
    vm->builtin_inline_index = 0;
 | 
						|
    const rb_iseq_t *iseq = rb_iseq_ibf_load_bytes((const char *)bin, size);
 | 
						|
    vm->builtin_function_table = NULL;
 | 
						|
 | 
						|
    // exec
 | 
						|
    rb_iseq_eval(rb_iseq_check(iseq));
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
void
 | 
						|
Init_builtin(void)
 | 
						|
{
 | 
						|
    // nothing
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
Init_builtin_features(void)
 | 
						|
{
 | 
						|
    rb_load_with_builtin_functions("gem_prelude", NULL);
 | 
						|
}
 |