Issue #12655 has been updated by Nobuyoshi Nakada.

Description updated
Status changed from Open to Feedback

Mathieu Jobin wrote:
> it uses the following macros to find the method visibility and if it has been redefined
> 
> ```C
> UNDEFINED_METHOD_ENTRY_P(me)
> METHOD_ENTRY_VISI(me)
> ```

I'd love to add the functions, but are they really needed?

> Ideally, a ruby method that would return its visibility, should return one of the following value
> 
> ```ruby
> [:public, :protected, :private, :undefined, :overridden]
> ```

I think `:overridden` doesn't make sense in ruby.
What do you expect by it?

> we are using other ruby macros to find where the method is define, which module or class.
> 
> ```C
> RCLASS_SUPER(internal_class)
> CLASS_OF(object)
> SPECIAL_CONST_P(object)
> BUILTIN_TYPE(object)
> FL_TEST(singleton_class, FL_SINGLETON)

These would be safe.

> ```C
> RCLASS_M_TBL(klass)
> RCLASS_IV_TBL(singleton_class)

It's not recommended to directly access internal members, `m_tbl`, `iv_tbl`, etc.

> ```C
> RBASIC(module_or_included_class)->klass

It is preferable to use `RBASIC_CLASS()` instead of `RBASIC()->klass`.

> that is mostly it
> 
> you can see what I have tried for ruby 2.3
> https://github.com/oggy/looksee/pull/36/files#diff-d5ef4b0cfbd5a6712f37dfa7ffbe2130
> 
> I'm unable to use `rb_id_table_foreach` which seems like I would need to import too much of ruby code inside the extension... which I would prefer not including more C into this gem

The reason to use `id_table` seems to collect methods for each visibilities.
What differs from `rb_class_public_instance_methods` etc?

What you need are `rb_class_undefined_instance_methods` and
`rb_class_singleton_object` (provisonal names)?


----------------------------------------
Feature #12655: accessing a method visibility
https://bugs.ruby-lang.org/issues/12655#change-59968

* Author: Mathieu Jobin
* Status: Feedback
* Priority: Normal
* Assignee: 
----------------------------------------
Hello,

I took on the task to make the looksee gem work with recent ruby 2.3 and 2.4
unfortunately, some feature were not directly accessible in ruby, so a C extension was made including some of ruby internals.

for ruby 2.2 support, internal.h and method.h was included. for ruby 2.3, I found I needed id_table.h at least. but I did not fully succeeded making it work for 2.3

on a short email thread with koichi san, he suggested it would be better to request ruby to add the necessary public interface to ruby, so looksee does not need internals.

looksee creates these new methods from ruby 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 uses the following macros to find the method visibility and if it has been redefined

```C
UNDEFINED_METHOD_ENTRY_P(me)
METHOD_ENTRY_VISI(me)
```

Ideally, a ruby method that would return its visibility, should return one of the following value

```ruby
[:public, :protected, :private, :undefined, :overridden]
```

we are using other ruby macros to find where the method is define, which module or 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
```

that is mostly it

you can see what I have tried for ruby 2.3
https://github.com/oggy/looksee/pull/36/files#diff-d5ef4b0cfbd5a6712f37dfa7ffbe2130

I'm unable to use `rb_id_table_foreach` which seems like I would need to import too much of ruby code inside the extension... which I would prefer not including more C into this gem

So I am trying to extract an `st_table` from the `struct rb_id_table*` but I am getting a deferencing incomplete type error.

please help.





-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>