diff options
| -rw-r--r-- | doc/api/mruby.h.md | 2 | ||||
| -rw-r--r-- | doc/mrbconf/README.md | 37 | ||||
| -rw-r--r-- | mrbgems/mruby-objectspace/src/mruby_objectspace.c | 10 | ||||
| -rw-r--r-- | mrbgems/mruby-objectspace/test/objectspace.rb | 4 | ||||
| -rw-r--r-- | src/error.c | 45 |
5 files changed, 62 insertions, 36 deletions
diff --git a/doc/api/mruby.h.md b/doc/api/mruby.h.md index bd844a749..5df0b6f04 100644 --- a/doc/api/mruby.h.md +++ b/doc/api/mruby.h.md @@ -66,4 +66,4 @@ char|mruby type|retrieve types|note <code>|</code>|optional||After this spec following specs would be optional. `?`|optional given|`mrb_bool`|True if preceding argument is given. Used to check optional argument is given. -The passing variadic arguments must be a pointer of retreiving type. +The passing variadic arguments must be a pointer of retrieving type. diff --git a/doc/mrbconf/README.md b/doc/mrbconf/README.md index 698d2526f..8e5cb3b74 100644 --- a/doc/mrbconf/README.md +++ b/doc/mrbconf/README.md @@ -82,10 +82,14 @@ will be defined as `mrb_int`. * Useful tracking unnecessary mruby object allocation. `MRB_GC_ARENA_SIZE` -* Default value is 100. +* Default value is `100`. * Ignored when `MRB_GC_FIXED_ARENA` isn't defined. * Defines fixed GC arena size. +`MRB_HEAP_PAGE_SIZE` +* Defines value is `1024`. +* Specifies number of `RBasic` per each heap page. + ## Memory pool configuration. `POOL_ALIGNMENT` @@ -123,3 +127,34 @@ largest value of required alignment. `MRB_WORD_BOXING` * If defined represent `mrb_value` as a word. * If defined `Float` will be a mruby object with `RBasic`. + +## Instance variable configuration. +`MRB_USE_IV_SEGLIST` +* If defined enable segmented list in instance variable table instead of khash. +* Segmented list is a linked list of key and value segments. +* It will linear search instead of hash search. + +`MRB_SEGMENT_SIZE` +* Default value is `4`. +* Specifies size of each segment in segment list. +* Ignored when `MRB_USE_IV_SEGLIST` isn't defined. + +`MRB_IVHASH_INIT_SIZE` +* Default value is `8`. +* Specifies initial size for instance variable table. +* Ignored when `MRB_USE_IV_SEGLIST` is defined. + +## Other configuration. +`MRB_FUNCALL_ARGC_MAX` +* Default value is `16`. +* Specifies 4th argument(`argc`) max value of `mrb_funcall`. +* Raises `ArgumentError` when the `argc` argument is bigger then this value `mrb_funcall`. + +`KHASH_DEFAULT_SIZE` +* Default value is `32`. +* Specifies default size of khash table bucket. +* Used in `kh_init_ ## name` function. + +`MRB_STR_BUF_MIN_SIZE` +* Default value is `128`. +* Specifies initial capacity of `RString` created by `mrb_str_buf_new` function.. diff --git a/mrbgems/mruby-objectspace/src/mruby_objectspace.c b/mrbgems/mruby-objectspace/src/mruby_objectspace.c index ba22fc990..e4d26221f 100644 --- a/mrbgems/mruby-objectspace/src/mruby_objectspace.c +++ b/mrbgems/mruby-objectspace/src/mruby_objectspace.c @@ -119,6 +119,16 @@ os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud) return; } + /* filter internal objects */ + switch (obj->tt) { + case MRB_TT_ENV: + case MRB_TT_ICLASS: + return; + } + + /* filter half baked (or internal) objects */ + if (!obj->c) return; + /* filter class kind if target module defined */ if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) { return; diff --git a/mrbgems/mruby-objectspace/test/objectspace.rb b/mrbgems/mruby-objectspace/test/objectspace.rb index f792c165d..4731d53b5 100644 --- a/mrbgems/mruby-objectspace/test/objectspace.rb +++ b/mrbgems/mruby-objectspace/test/objectspace.rb @@ -54,3 +54,7 @@ assert('ObjectSpace.each_object') do assert_equal arys.length, arys_count assert_true arys.length < objs.length end + +assert 'Check class pointer of ObjectSpace.each_object.' do + ObjectSpace.each_object { |obj| !obj } +end diff --git a/src/error.c b/src/error.c index 5ca013527..dcb6063f8 100644 --- a/src/error.c +++ b/src/error.c @@ -20,14 +20,15 @@ mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len) { - return mrb_funcall(mrb, mrb_obj_value(c), "new", 1, mrb_str_new(mrb, ptr, len)); + mrb_value arg = mrb_str_new(mrb, ptr, len); + return mrb_obj_new(mrb, c, 1, &arg); } mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str) { str = mrb_str_to_str(mrb, str); - return mrb_funcall(mrb, mrb_obj_value(c), "new", 1, str); + return mrb_obj_new(mrb, c, 1, &str); } /* @@ -90,8 +91,15 @@ static mrb_value exc_to_s(mrb_state *mrb, mrb_value exc) { mrb_value mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg")); + struct RObject *p; - if (mrb_nil_p(mesg)) return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc)); + if (!mrb_string_p(mesg)) { + return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc)); + } + p = mrb_obj_ptr(mesg); + if (!p->c) { + p->c = mrb->string_class; + } return mesg; } @@ -166,36 +174,6 @@ exc_inspect(mrb_state *mrb, mrb_value exc) } -static mrb_value -exc_equal(mrb_state *mrb, mrb_value exc) -{ - mrb_value obj; - mrb_value mesg; - mrb_bool equal_p; - mrb_sym id_mesg = mrb_intern_lit(mrb, "mesg"); - - mrb_get_args(mrb, "o", &obj); - if (mrb_obj_equal(mrb, exc, obj)) { - equal_p = TRUE; - } - else { - if (mrb_obj_class(mrb, exc) != mrb_obj_class(mrb, obj)) { - if (mrb_respond_to(mrb, obj, mrb_intern_lit(mrb, "message"))) { - mesg = mrb_funcall(mrb, obj, "message", 0); - } - else - return mrb_false_value(); - } - else { - mesg = mrb_attr_get(mrb, obj, id_mesg); - } - - equal_p = mrb_equal(mrb, mrb_attr_get(mrb, exc, id_mesg), mesg); - } - - return mrb_bool_value(equal_p); -} - static void exc_debug_info(mrb_state *mrb, struct RObject *exc) { @@ -467,7 +445,6 @@ mrb_init_exception(mrb_state *mrb) mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_ANY()); mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ANY()); mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_ANY()); - mrb_define_method(mrb, exception, "==", exc_equal, MRB_ARGS_REQ(1)); mrb_define_method(mrb, exception, "to_s", exc_to_s, MRB_ARGS_NONE()); mrb_define_method(mrb, exception, "message", exc_message, MRB_ARGS_NONE()); mrb_define_method(mrb, exception, "inspect", exc_inspect, MRB_ARGS_NONE()); |
