diff options
author | 卜部昌平 <shyouhei@ruby-lang.org> | 2020-05-29 16:04:53 +0900 |
---|---|---|
committer | 卜部昌平 <shyouhei@ruby-lang.org> | 2020-06-09 09:52:46 +0900 |
commit | 8f3d4090f037ae35fc9ba6380ee284aec837201f (patch) | |
tree | fcdc79400e8c8f05d99e018bde2f3002b3fa2c08 /vm_callinfo.h | |
parent | 77293cef91a9aa424c086ae05f03211d9a8a87d3 (diff) |
rb_equal_opt: fully static call data
This changeset reduces the generated binary of rb_equal_opt from 129 bytes
to 17 bytes on my machine, according to nm(1).
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3179
Diffstat (limited to 'vm_callinfo.h')
-rw-r--r-- | vm_callinfo.h | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/vm_callinfo.h b/vm_callinfo.h index 14027fc112..7c73194fca 100644 --- a/vm_callinfo.h +++ b/vm_callinfo.h @@ -180,15 +180,20 @@ vm_ci_dump(const struct rb_callinfo *ci) #define vm_ci_new(mid, flag, argc, kwarg) vm_ci_new_(mid, flag, argc, kwarg, __FILE__, __LINE__) #define vm_ci_new_runtime(mid, flag, argc, kwarg) vm_ci_new_runtime_(mid, flag, argc, kwarg, __FILE__, __LINE__) +#/* This is passed to STATIC_ASSERT. Cannot be an inline function. */ +#define VM_CI_EMBEDDABLE_P(mid, flag, argc, kwarg) \ + (((mid ) & ~CI_EMBED_ID_MASK) ? false : \ + ((flag) & ~CI_EMBED_FLAG_MASK) ? false : \ + ((argc) & ~CI_EMBED_ARGC_MASK) ? false : \ + (kwarg) ? false : true) + static inline const struct rb_callinfo * vm_ci_new_(ID mid, unsigned int flag, unsigned int argc, const struct rb_callinfo_kwarg *kwarg, const char *file, int line) { #if USE_EMBED_CI - if ((mid & ~CI_EMBED_ID_MASK) == 0 && - (argc & ~CI_EMBED_ARGC_MASK) == 0 && - kwarg == NULL) { + if (VM_CI_EMBEDDABLE_P(mid, flag, argc, kwarg)) { VALUE embed_ci = - 1L | + RUBY_FIXNUM_FLAG | ((VALUE)argc << CI_EMBED_ARGC_SHFT) | ((VALUE)flag << CI_EMBED_FLAG_SHFT) | ((VALUE)mid << CI_EMBED_ID_SHFT); |