26#define MRBC_DEFINE_SYMBOL_TABLE
27#include "_autogen_builtin_symbol.h"
28#undef MRBC_DEFINE_SYMBOL_TABLE
32#if !defined(MRBC_SYMBOL_SEARCH_LINEAR) && !defined(MRBC_SYMBOL_SEARCH_BTREE)
33#define MRBC_SYMBOL_SEARCH_BTREE
36#if MAX_SYMBOLS_COUNT <= UCHAR_MAX
37#define MRBC_SYMBOL_TABLE_INDEX_TYPE uint8_t
39#define MRBC_SYMBOL_TABLE_INDEX_TYPE uint16_t
42#define OFFSET_BUILTIN_SYMBOL 256
43#if OFFSET_BUILTIN_SYMBOL <= MRBC_BUILTIN_SYMBOL_MAX
44# error OFFSET_BUILTIN_SYMBOL overflow. Please increase the value.
52#ifdef MRBC_SYMBOL_SEARCH_BTREE
80 while( *str !=
'\0' ) {
96 int right =
sizeof(builtin_symbols) /
sizeof(builtin_symbols[0]);
100 const unsigned char *p1 = (
const unsigned char *)builtin_symbols[mid];
101 const unsigned char *p2 = (
const unsigned char *)str;
134#ifdef MRBC_SYMBOL_SEARCH_LINEAR
143#ifdef MRBC_SYMBOL_SEARCH_BTREE
177#ifdef MRBC_SYMBOL_SEARCH_BTREE
224 if( sym_id >= 0 )
return sym_id;
228 if( sym_id < 0 ) sym_id =
add_index( h, str );
229 if( sym_id < 0 )
return sym_id;
245 return builtin_symbols[sym_id];
249 if( sym_id < 0 )
return "";
265 if( sym_id >= 0 )
return sym_id;
269 if( sym_id < 0 )
return sym_id;
284 static const int w =
sizeof(
mrbc_sym) * 2;
285 char *p = buf + w * 2;
289 for( i = w; i > 0; i-- ) {
290 *--p =
'0' + (id2 & 0x0f);
294 for( i = w; i > 0; i-- ) {
295 *--p =
'0' + (id1 & 0x0f);
311 static const int w =
sizeof(
mrbc_sym) * 2;
315 if( id2 != NULL ) *id2 = 0;
316 if( *s == 0 )
return;
319 assert( strlen(s) == w*2 );
323 *id1 = (*id1 << 4) + (s[i++] -
'0');
326 if( id2 == NULL )
return;
328 *id2 = (*id2 << 4) + (s[i++] -
'0');
343 if( sym_id >= 0 )
goto DONE;
346 int size = strlen(str) + 1;
349 memcpy(buf, str, size);
353 "Overflow MAX_SYMBOLS_COUNT for '%s'", str );
369static void c_symbol_all_symbols(
struct VM *vm,
mrbc_value v[],
int argc)
373 for(
int i = 0; i <
sizeof(builtin_symbols) /
sizeof(builtin_symbols[0]); i++ ) {
388static void c_symbol_inspect(
struct VM *vm,
mrbc_value v[],
int argc)
397 if( strchr(s,
':') ) {
411static void c_symbol_to_s(
struct VM *vm,
mrbc_value v[],
int argc)
436#include "_autogen_class_symbol.h"
440#if defined(MRBC_DEBUG)
447void mrbc_debug_dump_symbol(
void)
474void mrbc_symbol_statistics(
int *total_used )
void * mrbc_raw_alloc_no_free(unsigned int size)
#define mrbc_symbol_value(n)
struct RObject mrbc_value
Value object. Default version.
int mrbc_array_push(mrbc_value *ary, mrbc_value *set_val)
mrbc_value mrbc_array_new(mrbc_vm *vm, int size)
void mrbc_object_inspect(mrbc_vm *vm, mrbc_value v[], int argc)
static int mrbc_string_append_cstr(mrbc_value *s1, const char *s2)
static mrbc_value mrbc_string_new_cstr(mrbc_vm *vm, const char *src)
void mrbc_printf(const char *fstr,...)
void mrbc_print_symbol(mrbc_sym sym_id)
void mrbc_raisef(struct VM *vm, struct RClass *exc_cls, const char *fstr,...)
Include at once the necessary header files.
uint16_t hash
hash value, returned by calc_hash().
MRBC_SYMBOL_TABLE_INDEX_TYPE right
const char * cstr
point to the symbol string.
MRBC_SYMBOL_TABLE_INDEX_TYPE left
mrbc_sym mrbc_search_symid(const char *str)
mrbc_value mrbc_symbol_new(struct VM *vm, const char *str)
mrbc_sym mrbc_str_to_symid(const char *str)
static int search_index(uint16_t hash, const char *str)
static int add_index(uint16_t hash, const char *str)
void mrbc_separate_nested_symid(mrbc_sym sym_id, mrbc_sym *id1, mrbc_sym *id2)
#define MRBC_SYMBOL_TABLE_INDEX_TYPE
void mrbc_cleanup_symbol(void)
static uint16_t calc_hash(const char *str)
const char * mrbc_symid_to_str(mrbc_sym sym_id)
void make_nested_symbol_s(char *buf, mrbc_sym id1, mrbc_sym id2)
#define OFFSET_BUILTIN_SYMBOL
static struct SYM_INDEX sym_index[MAX_SYMBOLS_COUNT]
static int search_builtin_symbol(const char *str)
static int mrbc_is_nested_symid(mrbc_sym sym_id)
int16_t mrbc_sym
mruby/c symbol ID
Global configuration of mruby/c VM's.
#define MAX_SYMBOLS_COUNT