mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	rbconfig/sizeof: calculate at compilation time
* ext/rbconfig/sizeof/extconf.rb: just check the existence of each types, to reduce configuration time, especially cross-compiling. * template/sizes.c.tmpl: calculate sizes of checked types at compilation time. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									75a5dcf170
								
							
						
					
					
						commit
						a7dd094791
					
				
					 3 changed files with 58 additions and 31 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,11 @@
 | 
			
		|||
Mon Apr 25 14:39:11 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* ext/rbconfig/sizeof/extconf.rb: just check the existence of each
 | 
			
		||||
	  types, to reduce configuration time, especially cross-compiling.
 | 
			
		||||
 | 
			
		||||
	* template/sizes.c.tmpl: calculate sizes of checked types at
 | 
			
		||||
	  compilation time.
 | 
			
		||||
 | 
			
		||||
Mon Apr 25 11:27:27 2016  Marcus Stollsteimer  <sto.mar@web.de>
 | 
			
		||||
 | 
			
		||||
	* doc/extension.rdoc: Improvements to english grammers.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,35 +2,35 @@
 | 
			
		|||
$srcs = %w[sizes.c]
 | 
			
		||||
$distcleanfiles.concat($srcs)
 | 
			
		||||
 | 
			
		||||
check_sizeof('int_least8_t')
 | 
			
		||||
check_sizeof('int_least16_t')
 | 
			
		||||
check_sizeof('int_least32_t')
 | 
			
		||||
check_sizeof('int_least64_t')
 | 
			
		||||
check_sizeof('int_fast8_t')
 | 
			
		||||
check_sizeof('int_fast16_t')
 | 
			
		||||
check_sizeof('int_fast32_t')
 | 
			
		||||
check_sizeof('int_fast64_t')
 | 
			
		||||
check_sizeof('intmax_t')
 | 
			
		||||
check_sizeof('sig_atomic_t', %w[signal.h])
 | 
			
		||||
check_sizeof('wchar_t')
 | 
			
		||||
check_sizeof('wint_t', %w[wctype.h])
 | 
			
		||||
check_sizeof('wctrans_t', %w[wctype.h])
 | 
			
		||||
check_sizeof('wctype_t', %w[wctype.h])
 | 
			
		||||
check_sizeof('_Bool')
 | 
			
		||||
check_sizeof('long double')
 | 
			
		||||
check_sizeof('float _Complex')
 | 
			
		||||
check_sizeof('double _Complex')
 | 
			
		||||
check_sizeof('long double _Complex')
 | 
			
		||||
check_sizeof('float _Imaginary')
 | 
			
		||||
check_sizeof('double _Imaginary')
 | 
			
		||||
check_sizeof('long double _Imaginary')
 | 
			
		||||
check_sizeof('__int128') # x86_64 ABI (optional)
 | 
			
		||||
check_sizeof('__float128') # x86_64 ABI (optional)
 | 
			
		||||
check_sizeof('_Decimal32') # x86_64 ABI
 | 
			
		||||
check_sizeof('_Decimal64') # x86_64 ABI
 | 
			
		||||
check_sizeof('_Decimal128') # x86_64 ABI
 | 
			
		||||
check_sizeof('__m64') # x86_64 ABI (optional)
 | 
			
		||||
check_sizeof('__m128') # x86_64 ABI (optional)
 | 
			
		||||
check_sizeof('__float80') # gcc x86
 | 
			
		||||
have_type('int_least8_t')
 | 
			
		||||
have_type('int_least16_t')
 | 
			
		||||
have_type('int_least32_t')
 | 
			
		||||
have_type('int_least64_t')
 | 
			
		||||
have_type('int_fast8_t')
 | 
			
		||||
have_type('int_fast16_t')
 | 
			
		||||
have_type('int_fast32_t')
 | 
			
		||||
have_type('int_fast64_t')
 | 
			
		||||
have_type('intmax_t')
 | 
			
		||||
have_type('sig_atomic_t', %w[signal.h])
 | 
			
		||||
have_type('wchar_t')
 | 
			
		||||
have_type('wint_t', %w[wctype.h])
 | 
			
		||||
have_type('wctrans_t', %w[wctype.h])
 | 
			
		||||
have_type('wctype_t', %w[wctype.h])
 | 
			
		||||
have_type('_Bool')
 | 
			
		||||
have_type('long double')
 | 
			
		||||
have_type('float _Complex')
 | 
			
		||||
have_type('double _Complex')
 | 
			
		||||
have_type('long double _Complex')
 | 
			
		||||
have_type('float _Imaginary')
 | 
			
		||||
have_type('double _Imaginary')
 | 
			
		||||
have_type('long double _Imaginary')
 | 
			
		||||
have_type('__int128') # x86_64 ABI (optional)
 | 
			
		||||
have_type('__float128') # x86_64 ABI (optional)
 | 
			
		||||
have_type('_Decimal32') # x86_64 ABI
 | 
			
		||||
have_type('_Decimal64') # x86_64 ABI
 | 
			
		||||
have_type('_Decimal128') # x86_64 ABI
 | 
			
		||||
have_type('__m64') # x86_64 ABI (optional)
 | 
			
		||||
have_type('__m128') # x86_64 ABI (optional)
 | 
			
		||||
have_type('__float80') # gcc x86
 | 
			
		||||
 | 
			
		||||
create_makefile('rbconfig/sizeof')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,13 +6,25 @@ class String
 | 
			
		|||
    strip.upcase.tr_s("^A-Z0-9_*", "_").tr_s("*", "P")
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
headers = Hash.new {[]}
 | 
			
		||||
sizes = {}
 | 
			
		||||
types = ARGF.grep(/^\s*RUBY_CHECK_SIZEOF\((\w[^\[\],#]*)[^#]*\)|
 | 
			
		||||
                   ^\s*RUBY_DEFINT\((\w[^\[\],#]*)[^#]*\)|
 | 
			
		||||
                   ^\s*check_sizeof\('(.+?)'/x) {$+}
 | 
			
		||||
                   ^\s*have_type\('(.+?)'(?:,\s*%w\[(.+)\])?\)/x) do
 | 
			
		||||
  sizes[type = $3] = true
 | 
			
		||||
  hdrs = $4 and hdrs.split.each {|h| headers[h] <<= type}
 | 
			
		||||
  type || $+
 | 
			
		||||
end
 | 
			
		||||
conditions = {
 | 
			
		||||
  "long long" => 'defined(HAVE_TRUE_LONG_LONG)',
 | 
			
		||||
}
 | 
			
		||||
%>
 | 
			
		||||
% headers.each do |h, type|
 | 
			
		||||
#if <%= type.map {|t| "defined(HAVE_TYPE_#{t.tr_cpp})"}.join(' || ') %>
 | 
			
		||||
# include <<%= h %>>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
void
 | 
			
		||||
Init_sizeof(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +32,15 @@ Init_sizeof(void)
 | 
			
		|||
    rb_define_const(rb_define_module("RbConfig"), "SIZEOF", s);
 | 
			
		||||
 | 
			
		||||
#define DEFINE(type, size) rb_hash_aset(s, rb_str_new_cstr(#type), INT2FIX(SIZEOF_##size))
 | 
			
		||||
#define DEFINE_SIZE(type) rb_hash_aset(s, rb_str_new_cstr(#type), INT2FIX(sizeof(type)))
 | 
			
		||||
 | 
			
		||||
% types.each do |type|
 | 
			
		||||
%   if sizes[type]
 | 
			
		||||
#ifdef HAVE_TYPE_<%= type.tr_cpp %>
 | 
			
		||||
    DEFINE_SIZE(<%= type %>);
 | 
			
		||||
#endif
 | 
			
		||||
%     next
 | 
			
		||||
%   end
 | 
			
		||||
%   cond = conditions[type]
 | 
			
		||||
#if SIZEOF_<%= type.tr_cpp %> != 0<%= " && #{cond}" if cond %>
 | 
			
		||||
    DEFINE(<%= type %>, <%= type.tr_cpp %>);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue