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 @@
/* number of object per heap page */
//#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
/* default size of khash table bucket */
......
......@@ -233,7 +233,7 @@ typedef struct mrb_state {
int esize;
struct RObject *exc;
struct kh_iv *globals;
struct iv_tbl *globals;
struct mrb_irep **irep;
size_t irep_len, irep_capa;
......
......@@ -13,7 +13,7 @@ extern "C" {
struct RClass {
MRUBY_OBJECT_HEADER;
struct kh_iv *iv;
struct iv_tbl *iv;
struct kh_mt *mt;
struct RClass *super;
};
......
......@@ -18,7 +18,7 @@ struct mrb_data_type {
struct RData {
MRUBY_OBJECT_HEADER;
struct kh_iv *iv;
struct iv_tbl *iv;
struct mrb_data_type *type;
void *data;
};
......
......@@ -13,7 +13,7 @@ extern "C" {
struct RHash {
MRUBY_OBJECT_HEADER;
struct kh_iv *iv;
struct iv_tbl *iv;
struct kh_ht *ht;
};
......
......@@ -44,7 +44,7 @@ struct RBasic {
struct RObject {
MRUBY_OBJECT_HEADER;
struct kh_iv *iv;
struct iv_tbl *iv;
};
#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);
void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value);
int mrb_const_defined(mrb_state*, mrb_value, mrb_sym);
mrb_value mrb_obj_iv_get(mrb_state*, struct RObject*, mrb_sym);
void mrb_obj_iv_set(mrb_state*, struct RObject*, mrb_sym, mrb_value);
const char * mrb_class2name(mrb_state *mrb, struct RClass* klass);
mrb_value mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
void mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
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);
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);
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);
mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self);
mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym);
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_iv_inspect(mrb_state*, struct RObject*);
mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer);
/* GC functions */
void mrb_gc_mark_gv(mrb_state*);
......@@ -57,9 +61,6 @@ void mrb_gc_mark_iv(mrb_state*, struct RObject*);
size_t mrb_gc_mark_iv_size(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)
} /* extern "C" { */
#endif
......
......@@ -15,7 +15,6 @@
#include "mruby/array.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);
typedef struct fc_result {
......@@ -65,30 +64,6 @@ mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym 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
make_metaclass(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__"));
if (mrb_nil_p(path)) {
struct RClass *outer = mrb_class_outer_module(mrb, c);
mrb_sym sym = class_sym(mrb, c, outer);
if (outer && outer != mrb->object_class) {
mrb_sym sym = mrb_class_sym(mrb, c, outer);
if (sym == 0) {
return mrb_nil_value();
}
else if (outer && outer != mrb->object_class) {
mrb_value base = mrb_class_path(mrb, outer);
path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2));
name = mrb_sym2name_len(mrb, sym, &len);
mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len));
}
else if (sym == 0) {
return mrb_nil_value();
}
else {
name = mrb_sym2name_len(mrb, sym, &len);
path = mrb_str_new(mrb, name, len);
......
......@@ -8,6 +8,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <setjmp.h>
#include <string.h>
#include "error.h"
#include "mruby/variable.h"
#include "mruby/string.h"
......
......@@ -32,43 +32,6 @@ struct obj_ivar_tag {
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
mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj)
{
......@@ -96,16 +59,7 @@ mrb_value
mrb_obj_inspect(mrb_state *mrb, mrb_value obj)
{
if ((mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {
long len = ROBJECT_NUMIV(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);
return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj));
}
else if (mrb_nil_p(obj)) {
return mrb_str_new(mrb, "nil", 3);
......@@ -347,13 +301,7 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
case MRB_TT_OBJECT:
case MRB_TT_CLASS:
case MRB_TT_MODULE:
if (ROBJECT(dest)->iv) {
kh_destroy(iv, ROBJECT(dest)->iv);
ROBJECT(dest)->iv = 0;
}
if (ROBJECT(obj)->iv) {
ROBJECT(dest)->iv = kh_copy(iv, mrb, ROBJECT(obj)->iv);
}
mrb_iv_copy(mrb, dest, obj);
break;
default:
......@@ -630,19 +578,12 @@ check_iv_name(mrb_state *mrb, mrb_sym id)
mrb_value
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_get_args(mrb, "n", &mid);
check_iv_name(mrb, mid);
if (h) {
k = kh_get(iv, h, mid);
if (k != kh_end(h)) {
return mrb_true_value();
}
}
if (mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid))
return mrb_true_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