summaryrefslogtreecommitdiff
path: root/template
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-25 05:39:12 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-25 05:39:12 (GMT)
commita7dd0947916d84e2179b164a64da644e755a4e90 (patch)
treee83df381ed2457b103acd40d2d44f0f1f792d840 /template
parent75a5dcf170049bcae15b18350ff7c7950f598f01 (diff)
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
Diffstat (limited to 'template')
-rw-r--r--template/sizes.c.tmpl21
1 files changed, 20 insertions, 1 deletions
diff --git a/template/sizes.c.tmpl b/template/sizes.c.tmpl
index bd4a7c5..2d23cac 100644
--- a/template/sizes.c.tmpl
+++ b/template/sizes.c.tmpl
@@ -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 %>);