Commit c9fe903f authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

now segmented list can be used as instance variable tables by...

now segmented list can be used as instance variable tables by -DMRB_USE_IV_SEGLIST; we still need to measure the performance and memory consumption
parent 3fe4b641
...@@ -19,7 +19,10 @@ ...@@ -19,7 +19,10 @@
/* number of object per heap page */ /* number of object per heap page */
//#define MRB_HEAP_PAGE_SIZE 1024 //#define MRB_HEAP_PAGE_SIZE 1024
/* initial size for IV khash */ /* use segmented list for IV table */
//#define MRB_USE_IV_SEGLIST
/* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */
//#define MRB_IV_INITIAL_SIZE 8 //#define MRB_IV_INITIAL_SIZE 8
/* default size of khash table bucket */ /* default size of khash table bucket */
......
...@@ -233,7 +233,7 @@ typedef struct mrb_state { ...@@ -233,7 +233,7 @@ typedef struct mrb_state {
int esize; int esize;
struct RObject *exc; struct RObject *exc;
struct kh_iv *globals; struct iv_tbl *globals;
struct mrb_irep **irep; struct mrb_irep **irep;
size_t irep_len, irep_capa; size_t irep_len, irep_capa;
......
...@@ -13,7 +13,7 @@ extern "C" { ...@@ -13,7 +13,7 @@ extern "C" {
struct RClass { struct RClass {
MRUBY_OBJECT_HEADER; MRUBY_OBJECT_HEADER;
struct kh_iv *iv; struct iv_tbl *iv;
struct kh_mt *mt; struct kh_mt *mt;
struct RClass *super; struct RClass *super;
}; };
......
...@@ -18,7 +18,7 @@ struct mrb_data_type { ...@@ -18,7 +18,7 @@ struct mrb_data_type {
struct RData { struct RData {
MRUBY_OBJECT_HEADER; MRUBY_OBJECT_HEADER;
struct kh_iv *iv; struct iv_tbl *iv;
struct mrb_data_type *type; struct mrb_data_type *type;
void *data; void *data;
}; };
......
...@@ -13,7 +13,7 @@ extern "C" { ...@@ -13,7 +13,7 @@ extern "C" {
struct RHash { struct RHash {
MRUBY_OBJECT_HEADER; MRUBY_OBJECT_HEADER;
struct kh_iv *iv; struct iv_tbl *iv;
struct kh_ht *ht; struct kh_ht *ht;
}; };
......
...@@ -44,7 +44,7 @@ struct RBasic { ...@@ -44,7 +44,7 @@ struct RBasic {
struct RObject { struct RObject {
MRUBY_OBJECT_HEADER; MRUBY_OBJECT_HEADER;
struct kh_iv *iv; struct iv_tbl *iv;
}; };
#define mrb_obj_ptr(v) ((struct RObject*)((v).value.p)) #define mrb_obj_ptr(v) ((struct RObject*)((v).value.p))
......
...@@ -38,17 +38,21 @@ mrb_value mrb_const_get(mrb_state*, mrb_value, mrb_sym); ...@@ -38,17 +38,21 @@ mrb_value mrb_const_get(mrb_state*, mrb_value, mrb_sym);
void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value); void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value);
int mrb_const_defined(mrb_state*, mrb_value, mrb_sym); int mrb_const_defined(mrb_state*, mrb_value, mrb_sym);
mrb_value mrb_obj_iv_get(mrb_state*, struct RObject*, mrb_sym); mrb_value mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
void mrb_obj_iv_set(mrb_state*, struct RObject*, mrb_sym, mrb_value); void mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
const char * mrb_class2name(mrb_state *mrb, struct RClass* klass); int mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym); mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym);
void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v); void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v);
int mrb_iv_defined(mrb_state*, mrb_value, mrb_sym);
mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym); mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym);
void mrb_iv_copy(mrb_state *mrb, mrb_value dst, mrb_value src);
int mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id); int mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id);
mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self); mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self);
mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym); mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym);
void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val); void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value); mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value);
mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*);
mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer);
/* GC functions */ /* GC functions */
void mrb_gc_mark_gv(mrb_state*); void mrb_gc_mark_gv(mrb_state*);
...@@ -57,9 +61,6 @@ void mrb_gc_mark_iv(mrb_state*, struct RObject*); ...@@ -57,9 +61,6 @@ void mrb_gc_mark_iv(mrb_state*, struct RObject*);
size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*); size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*);
void mrb_gc_free_iv(mrb_state*, struct RObject*); void mrb_gc_free_iv(mrb_state*, struct RObject*);
#include "mruby/khash.h"
KHASH_DECLARE(iv, mrb_sym, mrb_value, 1)
#if defined(__cplusplus) #if defined(__cplusplus)
} /* extern "C" { */ } /* extern "C" { */
#endif #endif
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "mruby/array.h" #include "mruby/array.h"
#include "error.h" #include "error.h"
KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal);
KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal); KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal);
typedef struct fc_result { typedef struct fc_result {
...@@ -65,30 +64,6 @@ mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name) ...@@ -65,30 +64,6 @@ mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
mrb_intern(mrb, "__classid__"), mrb_symbol_value(name)); mrb_intern(mrb, "__classid__"), mrb_symbol_value(name));
} }
static mrb_sym
class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer)
{
mrb_value name;
name = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classid__"));
if (mrb_nil_p(name)) {
khash_t(iv)* h;
khiter_t k;
mrb_value v;
if (!outer) outer = mrb->object_class;
h = outer->iv;
for (k = kh_begin(h); k != kh_end(h); k++) {
if (!kh_exist(h,k)) continue;
v = kh_value(h,k);
if (mrb_type(v) == c->tt && mrb_class_ptr(v) == c) {
return kh_key(h,k);
}
}
}
return SYM2ID(name);
}
static void static void
make_metaclass(mrb_state *mrb, struct RClass *c) make_metaclass(mrb_state *mrb, struct RClass *c)
{ {
...@@ -1114,16 +1089,16 @@ mrb_class_path(mrb_state *mrb, struct RClass *c) ...@@ -1114,16 +1089,16 @@ mrb_class_path(mrb_state *mrb, struct RClass *c)
path = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__")); path = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"));
if (mrb_nil_p(path)) { if (mrb_nil_p(path)) {
struct RClass *outer = mrb_class_outer_module(mrb, c); struct RClass *outer = mrb_class_outer_module(mrb, c);
mrb_sym sym = class_sym(mrb, c, outer); mrb_sym sym = mrb_class_sym(mrb, c, outer);
if (outer && outer != mrb->object_class) { if (sym == 0) {
return mrb_nil_value();
}
else if (outer && outer != mrb->object_class) {
mrb_value base = mrb_class_path(mrb, outer); mrb_value base = mrb_class_path(mrb, outer);
path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2)); path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2));
name = mrb_sym2name_len(mrb, sym, &len); name = mrb_sym2name_len(mrb, sym, &len);
mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len)); mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len));
} }
else if (sym == 0) {
return mrb_nil_value();
}
else { else {
name = mrb_sym2name_len(mrb, sym, &len); name = mrb_sym2name_len(mrb, sym, &len);
path = mrb_str_new(mrb, name, len); path = mrb_str_new(mrb, name, len);
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <setjmp.h> #include <setjmp.h>
#include <string.h>
#include "error.h" #include "error.h"
#include "mruby/variable.h" #include "mruby/variable.h"
#include "mruby/string.h" #include "mruby/string.h"
......
...@@ -32,43 +32,6 @@ struct obj_ivar_tag { ...@@ -32,43 +32,6 @@ struct obj_ivar_tag {
void * arg; void * arg;
}; };
static mrb_value
inspect_obj(mrb_state *mrb, mrb_value obj, mrb_value str, int recur)
{
if (recur) {
mrb_str_cat2(mrb, str, " ...");
}
else {
khiter_t k;
kh_iv_t *h = RCLASS_IV_TBL(obj);
if (h) {
for (k = kh_begin(h); k != kh_end(h); k++) {
if (kh_exist(h, k)){
mrb_sym id = kh_key(h, k);
mrb_value value = kh_value(h, k);
/* need not to show internal data */
if (RSTRING_PTR(str)[0] == '-') { /* first element */
RSTRING_PTR(str)[0] = '#';
mrb_str_cat2(mrb, str, " ");
}
else {
mrb_str_cat2(mrb, str, ", ");
}
mrb_str_cat2(mrb, str, mrb_sym2name(mrb, id));
mrb_str_cat2(mrb, str, "=");
mrb_str_append(mrb, str, mrb_inspect(mrb, value));
}
}
}
}
mrb_str_cat2(mrb, str, ">");
RSTRING_PTR(str)[0] = '#';
return str;
}
int int
mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj)
{ {
...@@ -96,16 +59,7 @@ mrb_value ...@@ -96,16 +59,7 @@ mrb_value
mrb_obj_inspect(mrb_state *mrb, mrb_value obj) mrb_obj_inspect(mrb_state *mrb, mrb_value obj)
{ {
if ((mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) { if ((mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {
long len = ROBJECT_NUMIV(obj); return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj));
if (len > 0) {
mrb_value str;
const char *c = mrb_obj_classname(mrb, obj);
str = mrb_sprintf(mrb, "-<%s:%p", c, (void*)&obj);
return inspect_obj(mrb, obj, str, 0);
}
return mrb_any_to_s(mrb, obj);
} }
else if (mrb_nil_p(obj)) { else if (mrb_nil_p(obj)) {
return mrb_str_new(mrb, "nil", 3); return mrb_str_new(mrb, "nil", 3);
...@@ -347,13 +301,7 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) ...@@ -347,13 +301,7 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
case MRB_TT_OBJECT: case MRB_TT_OBJECT:
case MRB_TT_CLASS: case MRB_TT_CLASS:
case MRB_TT_MODULE: case MRB_TT_MODULE:
if (ROBJECT(dest)->iv) { mrb_iv_copy(mrb, dest, obj);
kh_destroy(iv, ROBJECT(dest)->iv);
ROBJECT(dest)->iv = 0;
}
if (ROBJECT(obj)->iv) {
ROBJECT(dest)->iv = kh_copy(iv, mrb, ROBJECT(obj)->iv);
}
break; break;
default: default:
...@@ -630,19 +578,12 @@ check_iv_name(mrb_state *mrb, mrb_sym id) ...@@ -630,19 +578,12 @@ check_iv_name(mrb_state *mrb, mrb_sym id)
mrb_value mrb_value
mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)
{ {
khiter_t k;
kh_iv_t *h = RCLASS_IV_TBL(self);
mrb_sym mid; mrb_sym mid;
mrb_get_args(mrb, "n", &mid); mrb_get_args(mrb, "n", &mid);
check_iv_name(mrb, mid); check_iv_name(mrb, mid);
if (mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid))
if (h) {
k = kh_get(iv, h, mid);
if (k != kh_end(h)) {
return mrb_true_value(); return mrb_true_value();
}
}
return mrb_false_value(); return mrb_false_value();
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment