ruby/internal
John Hawthorn b13a7c8e36 Constant time class to class ancestor lookup
Previously when checking ancestors, we would walk all the way up the
ancestry chain checking each parent for a matching class or module.

I believe this was especially unfriendly to CPU cache since for each
step we need to check two cache lines (the class and class ext).

This check is used quite often in:
* case statements
* rescue statements
* Calling protected methods
* Class#is_a?
* Module#===
* Module#<=>

I believe it's most common to check a class against a parent class, to
this commit aims to improve that (unfortunately does not help checking
for an included Module).

This is done by storing on each class the number and an array of all
parent classes, in order (BasicObject is at index 0). Using this we can
check whether a class is a subclass of another in constant time since we
know the location to expect it in the hierarchy.
2022-02-23 19:57:42 -08:00
..
array.h Add comments about special runtime routines YJIT calls 2021-10-20 18:19:43 -04:00
bignum.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
bits.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
class.h Constant time class to class ancestor lookup 2022-02-23 19:57:42 -08:00
cmdlineopt.h * expand tabs. [ci skip] 2022-01-15 20:10:30 +09:00
compar.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
compile.h `RubyVM.keep_script_lines` 2021-10-21 16:17:39 +09:00
compilers.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
complex.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
cont.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
dir.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
enc.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
encoding.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
enum.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
enumerator.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
error.h suppress GCC's -Wsuggest-attribute=format 2021-09-10 20:00:06 +09:00
eval.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
file.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
fixnum.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
gc.h Change darray size to size_t and add functions that use GC malloc 2022-02-16 09:50:29 -05:00
hash.h Restore Hash#compare_by_identity mode [Bug #18171] 2021-10-02 11:43:35 +09:00
imemo.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
inits.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
io.h Move some function declaration to internal/io.h 2021-09-28 18:08:08 +13:00
load.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
loadpath.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
math.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
missing.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
numeric.h Embed bare `double` if `sizeof(double) == sizeof(VALUE)` 2021-10-27 02:05:06 +09:00
object.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
parse.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
proc.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
process.h process.c: Add Process._fork (#5017) 2021-10-25 20:47:19 +09:00
random.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
range.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
rational.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
re.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
sanitizers.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
serial.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
signal.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
static_assert.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
string.h Add comments about special runtime routines YJIT calls 2021-10-20 18:19:43 -04:00
struct.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
symbol.h Assign temporary ID to anonymous ID [Bug #18250] 2021-11-23 21:03:19 +09:00
thread.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
time.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
transcode.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
util.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00
variable.h Extract yjit_force_iv_index and make it work when object is frozen 2021-10-20 18:19:43 -04:00
vm.h Mark `rb_clear_constant_cache` as internal use only 2022-01-20 13:54:37 +09:00
warnings.h internal/*.h: skip doxygen 2021-09-10 20:00:06 +09:00