From 8f3d4090f037ae35fc9ba6380ee284aec837201f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Fri, 29 May 2020 16:04:53 +0900 Subject: 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). --- vm_callinfo.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'vm_callinfo.h') 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); -- cgit v1.2.3