From 16f7018af1f278a9f0cc368e224258860ea4cb8c Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 6 Dec 2018 23:26:24 +0000 Subject: deduplicate strings VM-wide in Ruby 2.5+ String#-@ deduplicates strings starting with Ruby 2.5.0 Hash#[]= deduplicates strings starting in Ruby 2.6.0-rc1 This allows us to save a small amount of memory by sharing objects with other parts of the stack (e.g. Rack). --- ext/unicorn_http/extconf.rb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'ext/unicorn_http/extconf.rb') diff --git a/ext/unicorn_http/extconf.rb b/ext/unicorn_http/extconf.rb index 2fc60fe..d5f81fb 100644 --- a/ext/unicorn_http/extconf.rb +++ b/ext/unicorn_http/extconf.rb @@ -8,4 +8,34 @@ have_func("rb_str_set_len", "ruby.h") or abort 'Ruby 1.9.3+ required' have_func("rb_hash_clear", "ruby.h") # Ruby 2.0+ have_func("gmtime_r", "time.h") +message('checking if String#-@ (str_uminus) dedupes... ') +begin + a = -(%w(t e s t).join) + b = -(%w(t e s t).join) + if a.equal?(b) + $CPPFLAGS += ' -DSTR_UMINUS_DEDUPE=1 ' + message("yes\n") + else + $CPPFLAGS += ' -DSTR_UMINUS_DEDUPE=0 ' + message("no, needs Ruby 2.5+\n") + end +rescue NoMethodError + $CPPFLAGS += ' -DSTR_UMINUS_DEDUPE=0 ' + message("no, String#-@ not available\n") +end + +message('checking if Hash#[]= (rb_hash_aset) dedupes... ') +h = {} +x = {} +r = rand.to_s +h[%W(#{r}).join('')] = :foo +x[%W(#{r}).join('')] = :foo +if x.keys[0].equal?(h.keys[0]) + $CPPFLAGS += ' -DHASH_ASET_DEDUPE=1 ' + message("yes\n") +else + $CPPFLAGS += ' -DHASH_ASET_DEDUPE=0 ' + message("no, needs Ruby 2.6+\n") +end + create_makefile("unicorn_http") -- cgit v1.2.3-24-ge0c7