[前][次][番号順一覧][スレッド一覧]

ruby-changes:67752

From: =E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3 <ko1@a...>
Date: Fri, 10 Sep 2021 20:01:25 +0900 (JST)
Subject: [ruby-changes:67752] 7c28330ca0 (master): include/ruby/internal/core/rclass.h: add doxygen

https://git.ruby-lang.org/ruby.git/commit/?id=7c28330ca0

From 7c28330ca03d124068f608e9d8d1a4e07ba5dd7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?=
 <shyouhei@r...>
Date: Tue, 2 Feb 2021 16:34:14 +0900
Subject: include/ruby/internal/core/rclass.h: add doxygen

Must not be a bad idea to improve documents. [ci skip]
---
 include/ruby/internal/core/rclass.h | 97 ++++++++++++++++++++++++++++++++++++-
 object.c                            |  7 ---
 2 files changed, 95 insertions(+), 9 deletions(-)

diff --git a/include/ruby/internal/core/rclass.h b/include/ruby/internal/core/rclass.h
index 2e4288f..13a33a2 100644
--- a/include/ruby/internal/core/rclass.h
+++ b/include/ruby/internal/core/rclass.h
@@ -18,30 +18,123 @@ https://github.com/ruby/ruby/blob/trunk/include/ruby/internal/core/rclass.h#L18
  *             Do not  expect for  instance `__VA_ARGS__` is  always available.
  *             We assume C99  for ruby itself but we don't  assume languages of
  *             extension libraries.  They could be written in C++98.
- * @brief      Routines to manipulate struct ::RClass.
+ * @brief      Routines to manipulate struct RClass.
+ * @note       The struct RClass itself is opaque.
  */
 #include "ruby/internal/dllexport.h"
 #include "ruby/internal/value.h"
 #include "ruby/internal/cast.h"
 
+/** @cond INTERNAL_MACRO */
 #define RMODULE_IS_OVERLAID              RMODULE_IS_OVERLAID
 #define RMODULE_IS_REFINEMENT            RMODULE_IS_REFINEMENT
 #define RMODULE_INCLUDED_INTO_REFINEMENT RMODULE_INCLUDED_INTO_REFINEMENT
+/** @endcond */
 
+/**
+ * Convenient casting macro.
+ *
+ * @param   obj  An object, which is in fact an RClass.
+ * @return  The passed object casted to RClass.
+ */
 #define RCLASS(obj)  RBIMPL_CAST((struct RClass *)(obj))
+
+/** @alias{RCLASS} */
 #define RMODULE      RCLASS
+
+/** @alias{rb_class_get_superclass} */
 #define RCLASS_SUPER rb_class_get_superclass
 
+/**
+ * @private
+ *
+ * Bits that you can set to ::RBasic::flags.
+ *
+ * @internal
+ *
+ * Why is it here, given RClass itself is not?
+ */
 enum ruby_rmodule_flags {
+
+    /**
+     * This flag has something to do with refinements... I guess?  It is set on
+     * occasions  for modules  that are  refined by  refinements, but  it seems
+     * ...  nobody cares  about  such things?   Not sure  but  this flag  could
+     * perhaps be a write-only information.
+     */
     RMODULE_IS_OVERLAID              = RUBY_FL_USER2,
+
+    /**
+     * This flag has something to do  with refinements.  A module created using
+     * rb_mod_refine()  has this  flag set.   This  is the  bit which  controls
+     * difference between normal inclusion versus refinements.
+     */
     RMODULE_IS_REFINEMENT            = RUBY_FL_USER3,
+
+    /**
+     * This flag  has something  to do  with refinements.  This  is set  when a
+     * (non-refinement)  module is  included into  another module,  which is  a
+     * refinement.  This amends the way `super` searches for a super method.
+     *
+     * ```ruby
+     * class Foo
+     *   def foo
+     *     "Foo"
+     *   end
+     * end
+     *
+     * module Bar
+     *   def foo
+     *     "[#{super}]" # this
+     *   end
+     * end
+     *
+     * module Baz
+     *   refine Foo do
+     *     include Bar
+     *     def foo
+     *       "<#{super}>"
+     *     end
+     *   end
+     * end
+     *
+     * using Baz
+     * Foo.new.foo # => "[<Foo>]"
+     * ```
+     *
+     * The  `super`  marked  with  "this"   comment  shall  look  for  overlaid
+     * `Foo#foo`, which is not the ordinal method lookup direction.
+     */
     RMODULE_INCLUDED_INTO_REFINEMENT = RUBY_FL_USER4
 };
 
 struct RClass; /* Opaque, declared here for RCLASS() macro. */
 
 RBIMPL_SYMBOL_EXPORT_BEGIN()
-VALUE rb_class_get_superclass(VALUE);
+/**
+ * Returns the superclass of a class.
+ * @param[in]  klass        An object of RClass.
+ * @retval     RUBY_Qfalse  `klass` has no super class.
+ * @retval     otherwise    Raw superclass of `klass`
+ * @see        rb_class_superclass
+ *
+ * ### Q&A ###
+ *
+ * - Q: How can a class have no super class?
+ *
+ * - A: `klass` could be a module.  Or it could be ::rb_cBasicObject.
+ *
+ * - Q: What do you mean by "raw" superclass?
+ *
+ * - A: This  is a  really good  question.  The  answer is  that this  function
+ *      returns something  different from what  you would normally  expect.  On
+ *      occasions  ruby  inserts  hidden  classes   in  a  hierarchy  of  class
+ *      inheritance behind-the-scene.   Such classes are called  "iclass"es and
+ *      distinguished  using  ::RUBY_T_ICLASS  in  C  level.   They  are  truly
+ *      transparent from Ruby  level but can be accessed from  C, by using this
+ *      API.
+ */
+VALUE rb_class_get_superclass(VALUE klass);
 RBIMPL_SYMBOL_EXPORT_END()
 
 #endif /* RBIMPL_RCLASS_H */
diff --git a/object.c b/object.c
index 6631e99..6dc3a8e 100644
--- a/object.c
+++ b/object.c
@@ -2192,13 +2192,6 @@ rb_class_superclass(VALUE klass) https://github.com/ruby/ruby/blob/trunk/object.c#L2192
     return super;
 }
 
-/**
- * Returns the superclass of \a klass
- * The return value might be an iclass of a module, unlike rb_class_superclass.
- *
- * Also it returns Qfalse when \a klass does not have a parent class.
- * \sa rb_class_superclass
- */
 VALUE
 rb_class_get_superclass(VALUE klass)
 {
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]