* vm_eval.c (local_var_list_add): use symbol identity, and get rid
  of method calls.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45855 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-05-07 04:26:51 +00:00
Родитель 766478f6a7
Коммит c8221b4cb6
1 изменённых файлов: 12 добавлений и 1 удалений

Просмотреть файл

@ -1874,12 +1874,22 @@ rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr)
return val;
}
static int
local_var_list_update(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
{
if (existing) return ST_STOP;
*value = (st_data_t)Qtrue; /* INT2FIX(arg) */
return ST_CONTINUE;
}
static void
local_var_list_add(const struct local_var_list *vars, ID lid)
{
if (lid && rb_id2str(lid)) {
/* should skip temporary variable */
rb_hash_aset(vars->tbl, ID2SYM(lid), Qtrue);
st_table *tbl = RHASH_TBL_RAW(vars->tbl);
st_data_t idx = 0; /* tbl->num_entries */
st_update(tbl, ID2SYM(lid), local_var_list_update, idx);
}
}
@ -1907,6 +1917,7 @@ rb_f_local_variables(void)
int i;
vars.tbl = rb_hash_new();
RHASH(vars.tbl)->ntbl = st_init_numtable(); /* compare_by_identity */
while (cfp) {
if (cfp->iseq) {
for (i = 0; i < cfp->iseq->local_table_size; i++) {