summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/api/mruby.h.md2
-rw-r--r--doc/mrbconf/README.md37
-rw-r--r--mrbgems/mruby-objectspace/src/mruby_objectspace.c10
-rw-r--r--mrbgems/mruby-objectspace/test/objectspace.rb4
-rw-r--r--src/error.c45
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>&#124;</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());