Feature #12655
Updated by sawa (Tsuyoshi Sawada) almost 5 years ago
Hello, I took on the task to make the looksee gem work with recent ruby 2.3 and 2.4. Unfortunately, 2.4 unfortunately, some features feature were not directly accessible in ruby, so a C extension was made, which includes made including some of ruby internals. For for ruby 2.2 support, internal.h and method.h were was included. For for ruby 2.3, I found I need needed id_table.h at least, least. but I did not fully succeed succeeded making it work. work for 2.3 In on a short email thread, thread with koichi san san, he suggested it would be better to request ruby to add the necessary public interface to ruby ruby, so that looksee would does not need internals. looksee creates these new methods from ruby internals: internals ```C rb_define_method(mMRI, "internal_superclass", Looksee_internal_superclass, 1); rb_define_method(mMRI, "internal_class", Looksee_internal_class, 1); rb_define_method(mMRI, "internal_public_instance_methods", Looksee_internal_public_instance_methods, 1); rb_define_method(mMRI, "internal_protected_instance_methods", Looksee_internal_protected_instance_methods, 1); rb_define_method(mMRI, "internal_private_instance_methods", Looksee_internal_private_instance_methods, 1); rb_define_method(mMRI, "internal_undefined_instance_methods", Looksee_internal_undefined_instance_methods, 1); rb_define_method(mMRI, "included_class?", Looksee_included_class_p, 1); rb_define_method(mMRI, "singleton_class?", Looksee_singleton_class_p, 1); rb_define_method(mMRI, "singleton_instance", Looksee_singleton_instance, 1); rb_define_method(mMRI, "real_module", Looksee_real_module, 1); rb_define_method(mMRI, "module_name", Looksee_module_name, 1); ``` It it uses the following macros to find the method visibility and whether if it has been redefined: redefined ```C UNDEFINED_METHOD_ENTRY_P(me) METHOD_ENTRY_VISI(me) ``` Ideally, a ruby method that returns visibility would return its visibility, should return one of the following values: value ```ruby [:public, :protected, :private, :undefined, :overridden] ``` We we are using other ruby macros to find where and within the method is define, which module or class the method is defined. class. ```C RCLASS_SUPER(internal_class) CLASS_OF(object) RCLASS_M_TBL(klass) SPECIAL_CONST_P(object) BUILTIN_TYPE(object) FL_TEST(singleton_class, FL_SINGLETON) RCLASS_IV_TBL(singleton_class) RBASIC(module_or_included_class)->klass ``` You that is mostly it you can see what I have tried for ruby 2.3: 2.3 https://github.com/oggy/looksee/pull/36/files#diff-d5ef4b0cfbd5a6712f37dfa7ffbe2130 I cannot I'm unable to use `rb_id_table_foreach`, `rb_id_table_foreach` which suggests that seems like I would need to import too much of ruby code into inside the extension. extension... which I would prefer not to include including more C into this gem. gem So I am trying to extract an `st_table` from the `struct rb_id_table*`, rb_id_table*` but I am getting a deferencing incomplete type error. Please please help.