aboutsummaryrefslogtreecommitdiffstats
path: root/vm_callinfo.h
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-05-29 16:04:53 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-06-09 09:52:46 +0900
commit8f3d4090f037ae35fc9ba6380ee284aec837201f (patch)
treefcdc79400e8c8f05d99e018bde2f3002b3fa2c08 /vm_callinfo.h
parent77293cef91a9aa424c086ae05f03211d9a8a87d3 (diff)
downloadruby-8f3d4090f037ae35fc9ba6380ee284aec837201f.tar.gz
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).
Diffstat (limited to 'vm_callinfo.h')
-rw-r--r--vm_callinfo.h13
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);