diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 22 | ||||
| -rw-r--r-- | src/load.c | 2 | ||||
| -rw-r--r-- | src/symbol.c | 43 |
3 files changed, 35 insertions, 32 deletions
diff --git a/src/class.c b/src/class.c index 85a26d343..04e1f72fa 100644 --- a/src/class.c +++ b/src/class.c @@ -26,7 +26,8 @@ union mt_ptr { struct mt_elem { union mt_ptr ptr; size_t func_p:1; - mrb_sym key:sizeof(mrb_sym)*8-1; + size_t noarg_p:1; + mrb_sym key:sizeof(mrb_sym)*8-2; }; /* method table structure */ @@ -50,7 +51,7 @@ mt_new(mrb_state *mrb) return t; } -static struct mt_elem *mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr); +static struct mt_elem *mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, size_t noarg_p, union mt_ptr ptr); static void mt_rehash(mrb_state *mrb, mt_tbl *t) @@ -71,7 +72,7 @@ mt_rehash(mrb_state *mrb, mt_tbl *t) /* key = 0 means empty or deleted */ if (slot->key != 0) { - mt_put(mrb, t, slot->key, slot->func_p, slot->ptr); + mt_put(mrb, t, slot->key, slot->func_p, slot->noarg_p, slot->ptr); } } mrb_free(mrb, old_table); @@ -81,7 +82,7 @@ mt_rehash(mrb_state *mrb, mt_tbl *t) /* Set the value for the symbol in the method table. */ static struct mt_elem* -mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) +mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, size_t noarg_p, union mt_ptr ptr) { size_t hash, pos, start; struct mt_elem *dslot = NULL; @@ -96,6 +97,7 @@ mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) if (slot->key == sym) { slot->func_p = func_p; + slot->noarg_p = noarg_p; slot->ptr = ptr; return slot; } @@ -104,6 +106,7 @@ mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) t->size++; slot->key = sym; slot->func_p = func_p; + slot->noarg_p = noarg_p; slot->ptr = ptr; return slot; } @@ -117,6 +120,7 @@ mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) t->size++; dslot->key = sym; dslot->func_p = func_p; + dslot->noarg_p = noarg_p; dslot->ptr = ptr; return dslot; } @@ -202,7 +206,7 @@ mt_copy(mrb_state *mrb, mt_tbl *t) struct mt_elem *slot = &t->table[i]; if (slot->key) { - mt_put(mrb, t2, slot->key, slot->func_p, slot->ptr); + mt_put(mrb, t2, slot->key, slot->func_p, slot->noarg_p, slot->ptr); } } return t2; @@ -238,6 +242,9 @@ mrb_mt_foreach(mrb_state *mrb, struct RClass *c, mrb_mt_foreach_func *fn, void * else { MRB_METHOD_FROM_PROC(m, slot->ptr.proc); } + if (slot->noarg_p) { + MRB_METHOD_NOARG_SET(m); + } if (fn(mrb, slot->key, m, p) != 0) return; @@ -739,7 +746,7 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_ else { ptr.func = MRB_METHOD_FUNC(m); } - mt_put(mrb, h, mid, MRB_METHOD_FUNC_P(m), ptr); + mt_put(mrb, h, mid, MRB_METHOD_FUNC_P(m), MRB_METHOD_NOARG_P(m), ptr); mc_clear(mrb); } @@ -1747,6 +1754,9 @@ mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid) else { MRB_METHOD_FROM_PROC(m, e->ptr.proc); } + if (e->noarg_p) { + MRB_METHOD_NOARG_SET(m); + } #ifndef MRB_NO_METHOD_CACHE mc->c = oc; mc->c0 = c; diff --git a/src/load.c b/src/load.c index 1ab8c1ad6..0b98fba66 100644 --- a/src/load.c +++ b/src/load.c @@ -96,7 +96,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag src += sizeof(uint16_t); /* number of child irep */ - irep->rlen = (size_t)bin_to_uint16(src); + irep->rlen = (uint8_t)bin_to_uint16(src); src += sizeof(uint16_t); /* Binary Data Section */ diff --git a/src/symbol.c b/src/symbol.c index 58decc1f1..773e980e5 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -65,17 +65,6 @@ typedef struct symbol_name { const char *name; } symbol_name; -#ifdef MRB_USE_ALL_SYMBOLS -#define SYMBOL_SHIFT 0 -# define SYMBOL_INLINE_P(sym) FALSE -# define sym_inline_pack(name, len) 0 -# define sym_inline_unpack(sym, buf, lenp) NULL -#else -#define SYMBOL_INLINE 1 -#define SYMBOL_SHIFT 1 -# define SYMBOL_INLINE_P(sym) ((sym) & SYMBOL_INLINE) -#endif - static void sym_validate_len(mrb_state *mrb, size_t len) { @@ -84,13 +73,19 @@ sym_validate_len(mrb_state *mrb, size_t len) } } -#ifndef MRB_USE_ALL_SYMBOLS +#ifdef MRB_USE_ALL_SYMBOLS +# define SYMBOL_INLINE_P(sym) FALSE +# define sym_inline_pack(name, len) 0 +# define sym_inline_unpack(sym, buf, lenp) NULL +#else +# define SYMBOL_INLINE_P(sym) ((sym) >= (1<<24)) + static const char pack_table[] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static mrb_sym sym_inline_pack(const char *name, size_t len) { - const size_t pack_length_max = (MRB_SYMBOL_BIT - 2) / 6; + const size_t pack_length_max = 5; char c; const char *p; @@ -98,6 +93,7 @@ sym_inline_pack(const char *name, size_t len) mrb_sym sym = 0; if (len > pack_length_max) return 0; /* too long */ + if (len == 0) return 0; /* empty string */ for (i=0; i<len; i++) { uint32_t bits; @@ -106,10 +102,10 @@ sym_inline_pack(const char *name, size_t len) p = strchr(pack_table, (int)c); if (p == 0) return 0; /* non alnum char */ bits = (uint32_t)(p - pack_table)+1; - if (i >= pack_length_max) break; - sym |= bits<<(i*6+SYMBOL_SHIFT); + sym |= bits<<(24-i*6); } - return sym | SYMBOL_INLINE; + mrb_assert(SYMBOL_INLINE_P(sym)); + return sym; } static const char* @@ -120,7 +116,7 @@ sym_inline_unpack(mrb_sym sym, char *buf, mrb_int *lenp) mrb_assert(SYMBOL_INLINE_P(sym)); for (i=0; i<5; i++) { - uint32_t bits = sym>>(i*6+SYMBOL_SHIFT) & ((1<<6)-1); + uint32_t bits = sym>>(24-i*6) & 0x3f; if (bits == 0) break; buf[i] = pack_table[bits-1];; } @@ -156,7 +152,7 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) #ifndef MRB_NO_PRESYM /* presym */ i = presym_find(name, len); - if (i > 0) return i<<SYMBOL_SHIFT; + if (i > 0) return i; #endif /* inline symbol */ @@ -171,14 +167,14 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) do { sname = &mrb->symtbl[i]; if (sname->len == len && memcmp(sname->name, name, len) == 0) { - return (i+MRB_PRESYM_MAX)<<SYMBOL_SHIFT; + return (i+MRB_PRESYM_MAX); } if (sname->prev == 0xff) { i -= 0xff; sname = &mrb->symtbl[i]; while (mrb->symtbl < sname) { if (sname->len == len && memcmp(sname->name, name, len) == 0) { - return (mrb_sym)((sname - mrb->symtbl)+MRB_PRESYM_MAX)<<SYMBOL_SHIFT; + return (mrb_sym)((sname - mrb->symtbl)+MRB_PRESYM_MAX); } sname--; } @@ -234,7 +230,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) } mrb->symhash[hash] = mrb->symidx = sym; - return (sym+MRB_PRESYM_MAX)<<SYMBOL_SHIFT; + return (sym+MRB_PRESYM_MAX); } MRB_API mrb_sym @@ -313,7 +309,6 @@ sym2name_len(mrb_state *mrb, mrb_sym sym, char *buf, mrb_int *lenp) { if (SYMBOL_INLINE_P(sym)) return sym_inline_unpack(sym, buf, lenp); - sym >>= SYMBOL_SHIFT; #ifndef MRB_NO_PRESYM { const char *name = presym_sym2name(sym, lenp); @@ -345,7 +340,6 @@ mrb_bool mrb_sym_static_p(mrb_state *mrb, mrb_sym sym) { if (SYMBOL_INLINE_P(sym)) return TRUE; - sym >>= SYMBOL_SHIFT; if (sym > MRB_PRESYM_MAX) return FALSE; return TRUE; } @@ -614,8 +608,7 @@ sym_name(mrb_state *mrb, mrb_sym sym, mrb_bool dump) return name; } else { - mrb_value str = SYMBOL_INLINE_P(sym) ? - mrb_str_new(mrb, name, len) : mrb_str_new_static(mrb, name, len); + mrb_value str = mrb_str_new_static(mrb, name, len); str = mrb_str_dump(mrb, str); return RSTRING_PTR(str); } |
