load.c: loaded_features_index st_table

* load.c (rb_feature_p), vm_core.h (rb_vm_struct): turn
  loaded_features_index into st_table.  patches by tmm1 (Aman Gupta)
  in [ruby-core:53251] and [ruby-core:53274] [Bug #8048]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2013-03-22 08:38:51 +00:00
Родитель 81cb1f6394
Коммит 228b29a697
4 изменённых файлов: 35 добавлений и 14 удалений

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

@ -1,3 +1,9 @@
Fri Mar 22 17:38:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* load.c (rb_feature_p), vm_core.h (rb_vm_struct): turn
loaded_features_index into st_table. patches by tmm1 (Aman Gupta)
in [ruby-core:53251] and [ruby-core:53274] [Bug #8048]
Fri Mar 22 10:29:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/bigdecimal/bigdecimal.c: Fix style.

37
load.c
Просмотреть файл

@ -171,7 +171,7 @@ reset_loaded_features_snapshot(void)
rb_ary_replace(vm->loaded_features_snapshot, vm->loaded_features);
}
static VALUE
static struct st_table *
get_loaded_features_index_raw(void)
{
return GET_VM()->loaded_features_index;
@ -186,12 +186,19 @@ get_loading_table(void)
static void
features_index_add_single(VALUE short_feature, VALUE offset)
{
VALUE features_index, this_feature_index;
struct st_table *features_index;
VALUE this_feature_index = Qnil;
char *short_feature_cstr;
Check_Type(offset, T_FIXNUM);
Check_Type(short_feature, T_STRING);
short_feature_cstr = StringValueCStr(short_feature);
features_index = get_loaded_features_index_raw();
this_feature_index = rb_hash_lookup(features_index, short_feature);
st_lookup(features_index, (st_data_t)short_feature_cstr, (st_data_t *)&this_feature_index);
if (NIL_P(this_feature_index)) {
rb_hash_aset(features_index, short_feature, offset);
st_insert(features_index, (st_data_t)ruby_strdup(short_feature_cstr), (st_data_t)offset);
}
else if (RB_TYPE_P(this_feature_index, T_FIXNUM)) {
VALUE feature_indexes[2];
@ -199,7 +206,7 @@ features_index_add_single(VALUE short_feature, VALUE offset)
feature_indexes[1] = offset;
this_feature_index = rb_ary_tmp_new(numberof(feature_indexes));
rb_ary_cat(this_feature_index, feature_indexes, numberof(feature_indexes));
rb_hash_aset(features_index, short_feature, this_feature_index);
st_insert(features_index, (st_data_t)short_feature_cstr, (st_data_t)this_feature_index);
}
else {
Check_Type(this_feature_index, T_ARRAY);
@ -254,7 +261,14 @@ features_index_add(VALUE feature, VALUE offset)
}
}
static VALUE
static int
loaded_features_index_clear_i(st_data_t key, st_data_t val, st_data_t arg)
{
xfree((char *)key);
return ST_DELETE;
}
static st_table *
get_loaded_features_index(void)
{
VALUE features;
@ -264,7 +278,7 @@ get_loaded_features_index(void)
if (!rb_ary_shared_with_p(vm->loaded_features_snapshot, vm->loaded_features)) {
/* The sharing was broken; something (other than us in rb_provide_feature())
modified loaded_features. Rebuild the index. */
rb_hash_clear(vm->loaded_features_index);
st_foreach(vm->loaded_features_index, loaded_features_index_clear_i, 0);
features = vm->loaded_features;
for (i = 0; i < RARRAY_LEN(features); i++) {
VALUE entry, as_str;
@ -357,10 +371,10 @@ loaded_feature_path_i(st_data_t v, st_data_t b, st_data_t f)
static int
rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const char **fn)
{
VALUE features, features_index, feature_val, this_feature_index, v, p, load_path = 0;
VALUE features, feature_val, this_feature_index = Qnil, v, p, load_path = 0;
const char *f, *e;
long i, len, elen, n;
st_table *loading_tbl;
st_table *loading_tbl, *features_index;
st_data_t data;
int type;
@ -379,7 +393,7 @@ rb_feature_p(const char *feature, const char *ext, int rb, int expanded, const c
features_index = get_loaded_features_index();
feature_val = rb_str_new(feature, len);
this_feature_index = rb_hash_lookup(features_index, feature_val);
st_lookup(features_index, (st_data_t)feature, (st_data_t *)&this_feature_index);
/* We search `features` for an entry such that either
"#{features[i]}" == "#{load_path[j]}/#{feature}#{e}"
for some j, or
@ -1120,8 +1134,7 @@ Init_load()
rb_define_virtual_variable("$LOADED_FEATURES", get_loaded_features, 0);
vm->loaded_features = rb_ary_new();
vm->loaded_features_snapshot = rb_ary_tmp_new(0);
vm->loaded_features_index = rb_hash_new();
RBASIC(vm->loaded_features_index)->klass = 0;
vm->loaded_features_index = st_init_strtable();
rb_define_global_function("load", rb_f_load, -1);
rb_define_global_function("require", rb_f_require, 1);

4
vm.c
Просмотреть файл

@ -1565,7 +1565,6 @@ rb_vm_mark(void *ptr)
RUBY_MARK_UNLESS_NULL(vm->expanded_load_path);
RUBY_MARK_UNLESS_NULL(vm->loaded_features);
RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
RUBY_MARK_UNLESS_NULL(vm->loaded_features_index);
RUBY_MARK_UNLESS_NULL(vm->top_self);
RUBY_MARK_UNLESS_NULL(vm->coverages);
rb_gc_mark_locations(vm->special_exceptions, vm->special_exceptions + ruby_special_error_count);
@ -1573,6 +1572,9 @@ rb_vm_mark(void *ptr)
if (vm->loading_table) {
rb_mark_tbl(vm->loading_table);
}
if (vm->loaded_features_index) {
rb_mark_tbl(vm->loaded_features_index);
}
rb_vm_trace_mark_event_hooks(&vm->event_hooks);

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

@ -367,7 +367,7 @@ typedef struct rb_vm_struct {
VALUE expanded_load_path;
VALUE loaded_features;
VALUE loaded_features_snapshot;
VALUE loaded_features_index;
struct st_table *loaded_features_index;
struct st_table *loading_table;
/* signal */