summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--class.c7
-rw-r--r--hash.c3
-rw-r--r--internal.h2
4 files changed, 19 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index d91b700f79..0c4f978e2b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Mon Jun 1 04:15:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (rb_class_has_methods): added to reduce depenedency
+ to internal class data structure.
+
+ * internal.h: ditto.
+
+ * hash.c (has_extra_methods): use added function.
+
Mon Jun 1 04:11:48 2015 Koichi Sasada <ko1@atdot.net>
* gc.c , gc.h (rb_obj_info): export obj_info(VALUE) for debugging.
diff --git a/class.c b/class.c
index 37ad4b542b..2409e0d68b 100644
--- a/class.c
+++ b/class.c
@@ -1985,6 +1985,13 @@ rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, V
#undef extract_kwarg
}
+int
+rb_class_has_methods(VALUE c)
+{
+ st_table *mtbl = RCLASS_M_TBL(c);
+ return mtbl && mtbl->num_entries ? TRUE : FALSE;
+}
+
/*!
* \}
*/
diff --git a/hash.c b/hash.c
index bd099ce94d..60e980763c 100644
--- a/hash.c
+++ b/hash.c
@@ -37,8 +37,7 @@ has_extra_methods(VALUE klass)
const VALUE base = rb_cHash;
VALUE c = klass;
while (c != base) {
- st_table *mtbl = RCLASS_M_TBL(c);
- if (mtbl && mtbl->num_entries) return klass;
+ if (rb_class_has_methods(c)) return klass;
c = RCLASS_SUPER(c);
}
return 0;
diff --git a/internal.h b/internal.h
index 95ce1f0daa..01485dee6c 100644
--- a/internal.h
+++ b/internal.h
@@ -667,6 +667,8 @@ VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach);
VALUE rb_singleton_class_get(VALUE obj);
void Init_class_hierarchy(void);
+int rb_class_has_methods(VALUE c);
+
/* compar.c */
VALUE rb_invcmp(VALUE, VALUE);