[前][次][番号順一覧][スレッド一覧]

ruby-changes:11384

From: nobu <ko1@a...>
Date: Thu, 19 Mar 2009 18:49:57 +0900 (JST)
Subject: [ruby-changes:11384] Ruby:r23005 (trunk): * configure.in (RUBY_CHECK_SIZEOF): allows qualified name.

nobu	2009-03-19 18:49:51 +0900 (Thu, 19 Mar 2009)

  New Revision: 23005

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23005

  Log:
    * configure.in (RUBY_CHECK_SIZEOF): allows qualified name.
    * configure.in (RUBY_REPLACE_TYPE): checks more strictly.
    
    * configure.in (struct stat.st_size, struct stat.st_blocks),
      (struct stat.st_ino): check for size.
    
    * lib/mkmf.rb (check_sizeof): allows qualified name.
    
    * file.c (rb_stat_ino, rb_stat_blocks): check by size.

  Modified files:
    trunk/configure.in
    trunk/file.c
    trunk/lib/mkmf.rb
    trunk/version.h

Index: configure.in
===================================================================
--- configure.in	(revision 23004)
+++ configure.in	(revision 23005)
@@ -359,14 +359,19 @@
 
 dnl RUBY_CHECK_SIZEOF [typename], [maybe same size types], [macros], [include]
 AC_DEFUN([RUBY_CHECK_SIZEOF],
-[if test "$universal_binary" = yes; then
+[m4_bmatch([$1], [\.], [], [if test "$universal_binary" = yes; then])
 AC_CACHE_CHECK([size of $1], [AS_TR_SH([ac_cv_sizeof_$1])], [
     unset AS_TR_SH(ac_cv_sizeof_$1)
+    rbcv_var="
+typedef m4_bpatsubst([$1], [\..*]) ac__type_sizeof_;
+static ac__type_sizeof_ *rbcv_ptr;
+@%:@define AS_TR_CPP(SIZEOF_$1) sizeof((*rbcv_ptr)[]m4_bmatch([$1], [\.], .m4_bpatsubst([$1], [^[^.]*\.])))
+"
     m4_ifval([$2], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && {
     for t in $2; do
 	AC_COMPILE_IFELSE(
-	    [AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT],
-		[sizeof($1) == sizeof($t)])], [
+	    [AC_LANG_BOOL_COMPILE_TRY(AC_INCLUDES_DEFAULT([$rbcv_var]),
+		[AS_TR_CPP(SIZEOF_$1) == sizeof($t)])], [
 		AS_TR_SH(ac_cv_sizeof_$1)=AS_TR_CPP([SIZEOF_]$t)
 		break])
     done
@@ -384,8 +389,9 @@
 @%:@ define AS_TR_CPP(HAVE_$1) 0
 @%:@endif])"
 	    AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr], [!AS_TR_CPP(HAVE_$1)])], [continue])
-	    AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr],
-				[AS_TR_CPP(HAVE_$1) == (sizeof($1) == ([$[s / rb_cv_char_bit]]))])],
+	    AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr]
+				[$rbcv_var],
+				[AS_TR_CPP(HAVE_$1) == (AS_TR_CPP(SIZEOF_$1) == ([$[s / rb_cv_char_bit]]))])],
 		[AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}${s}"])
 	done
     done
@@ -396,8 +402,7 @@
     _AC_COMPUTE_INT_COMPILE(AS_TR_CPP(SIZEOF_$1), [t], [AC_INCLUDES_DEFAULT([$4])]
 [${cond+$cond
 @%:@else}
-typedef $1 ac__type_sizeof_;
-@%:@define AS_TR_CPP(SIZEOF_$1) sizeof(ac__type_sizeof_)
+$rbcv_var
 ${cond+@%:@endif}
 @%:@ifndef AS_TR_CPP(SIZEOF_$1)
 @%:@define AS_TR_CPP(SIZEOF_$1) 0
@@ -427,9 +432,9 @@
     done
     ${cond+echo "@%:@endif"}
 } >> confdefs.h
-else
+m4_bmatch([$1], [\.], [], [else
 AC_CHECK_SIZEOF([$1], 0, [$4])
-fi
+fi])
 ])
 
 RUBY_CHECK_SIZEOF(int, [], [ILP])
@@ -454,31 +459,32 @@
 	    u=U;;
 	  when(*)
 	    AC_COMPILE_IFELSE(
-		[AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT]
-					  [$4], [($n)-1 > 0])],
+		[AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])], [($n)-1 > 0])],
 		[u=U]);;
 	esac
+	if test x"$t" = x; then
+	    for t in "long long" long int short; do
+		test -n "$u" && t="unsigned $t"
+		AC_COMPILE_IFELSE(
+		    [AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])]
+			[typedef $n rbcv_conftest_target_type;
+			typedef $t rbcv_conftest_replace_type;
+			extern rbcv_conftest_target_type rbcv_conftest_var;
+			extern rbcv_conftest_replace_type rbcv_conftest_var;
+			extern rbcv_conftest_target_type rbcv_conftest_func(void);
+			extern rbcv_conftest_replace_type rbcv_conftest_func(void);
+			], [sizeof(rbcv_conftest_target_type) == sizeof(rbcv_conftest_replace_type)])],
+		    [n="$t"; break])
+	    done
+	fi
 	case " $n " in
 	  when(*" long long "*)
 	    t=LL;;
 	  when(*" long "*)
 	    t=LONG;;
+	  when(*)
+	    t=INT;;
 	esac
-	if test x"$t" = x; then
-	    AC_COMPILE_IFELSE(
-		[AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT]
-					  [$4], [sizeof($n) > sizeof(long)])],
-		[t=LL])
-	fi
-	if test x"$t" = x; then
-	    AC_COMPILE_IFELSE(
-		[AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT]
-					  [$4], [sizeof($n) == sizeof(long)])],
-		[t=LONG])
-	fi
-	if test x"$t" = x; then
-	    t=INT
-	fi
 	rb_cv_[$1]_convertible=${u}${t}])
     m4_ifval([$2], AC_DEFINE_UNQUOTED(rb_[$1], $n))
     AC_DEFINE_UNQUOTED([$3]2NUM[(v)], [${rb_cv_[$1]_convertible}2NUM(v)])
@@ -914,33 +920,15 @@
   #include <stdio.h>
 ])
 
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_DEFUN([RUBY_CHECK_HUGE],
-    [AC_CACHE_CHECK([whether $1 is huge], AS_TR_SH(rb_cv_huge_$1),
-[AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY(
-[AC_INCLUDES_DEFAULT([$4])
-static m4_bpatsubst([$1], [\..*]) rbcv_var;],
-[dnl
-sizeof(rbcv_var[]m4_bmatch([$1], [\.], .m4_bpatsubst([$1], [^[^.]*\.])))>sizeof(long)]
-)],
-[AS_TR_SH(rb_cv_huge_$1)=yes],
-[AS_TR_SH(rb_cv_huge_$1)=no])])
-if test "${AS_TR_SH(rb_cv_huge_$1)}" = yes; then
-    m4_ifval([$2], [$2], [AC_DEFINE(AS_TR_CPP(HUGE_$1))])
-m4_ifval([$3], [else
-$3
-])
-fi])
-
 AC_TYPE_SIZE_T
 RUBY_CHECK_SIZEOF(size_t, [int long void*])
 RUBY_CHECK_SIZEOF(ptrdiff_t, size_t)
 AC_STRUCT_ST_BLKSIZE
 AC_STRUCT_ST_BLOCKS
 AC_STRUCT_ST_RDEV
-RUBY_CHECK_HUGE([struct stat.st_size])
+RUBY_CHECK_SIZEOF([struct stat.st_size], [int long "long long"])
 if test "$ac_cv_member_struct_stat_st_blocks" = yes; then
-    RUBY_CHECK_HUGE(struct stat.st_blocks)
+    RUBY_CHECK_SIZEOF([struct stat.st_blocks], [int long "long long"])
 fi
 AC_CHECK_MEMBERS([struct stat.st_atim])
 AC_CHECK_MEMBERS([struct stat.st_atimespec])
@@ -1356,8 +1344,7 @@
   fi
 fi
 
-RUBY_CHECK_HUGE([struct stat.st_ino],
-  [AC_DEFINE(HUGE_ST_INO)], [], [@%:@include <sys/stat.h>])
+RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
 
 if test "$ac_cv_func_sysconf" = yes; then
   AC_DEFUN([RUBY_CHECK_SYSCONF], [dnl
@@ -2364,6 +2351,10 @@
 	    RUBY_DEFINE_IF([defined __${archs}__], RUBY_PLATFORM_CPU, ["${cpu}"])
 	done
     fi
+    ints='long int'
+    test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
+    AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
+    AC_SUBST(UNIVERSAL_INTS, "${ints}")
     AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}")
     AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-"RUBY_PLATFORM_OS)
     AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal."RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS)
Index: lib/mkmf.rb
===================================================================
--- lib/mkmf.rb	(revision 23004)
+++ lib/mkmf.rb	(revision 23005)
@@ -65,6 +65,7 @@
 $beos = /beos/ =~ RUBY_PLATFORM
 $haiku = /haiku/ =~ RUBY_PLATFORM
 $solaris = /solaris/ =~ RUBY_PLATFORM
+$universal = /universal/ =~ RUBY_PLATFORM
 $dest_prefix_pattern = (File::PATH_SEPARATOR == ';' ? /\A([[:alpha:]]:)?/ : /\A/)
 
 # :stopdoc:
@@ -440,7 +441,7 @@
 def cpp_include(header)
   if header
     header = [header] unless header.kind_of? Array
-    header.map {|h| "#include <#{h}>\n"}.join
+    header.map {|h| String === h ? "#include <#{h}>\n" : h}.join
   else
     ""
   end
@@ -977,14 +978,23 @@
 # SIZEOF_MYSTRUCT=12 preprocessor macro would be passed to the compiler.
 #
 def check_sizeof(type, headers = nil, &b)
-  expr = "sizeof(#{type})"
-  fmt = "%d"
+  typename, member = type.split('.', 2)
+  prelude = cpp_include(headers).split(/$/)
+  prelude << "typedef #{typename} rbcv_typedef_;\n"
+  prelude << "static rbcv_typedef_ *rbcv_ptr_;\n"
+  prelude = [prelude]
+  expr = "sizeof((*rbcv_ptr_)#{"."<<member if member})"
+  fmt = "%s"
   def fmt.%(x)
     x ? super : "failed"
   end
   checking_for checking_message("size of #{type}", headers), fmt do
-    if size = try_constant(expr, headers, &b)
-      $defs.push(format("-DSIZEOF_%s=%d", type.tr_cpp, size))
+    if (($universal and
+         size = UNIVERSAL_INTS.find {|t|
+           try_static_assert("#{expr} == sizeof(#{t})", prelude, &b)
+         }) or
+        size = try_constant(expr, prelude, &b))
+      $defs.push(format("-DSIZEOF_%s=%s", type.tr_cpp, size))
       size
     end
   end
@@ -1725,7 +1735,7 @@
       dirs.uniq!
       unless dirs.empty?
         mfile.print("clean-rb#{sfx}::\n")
-        for dir in dirs.sort_by {|dir| -dir.count('/')}
+        for dir in dirs.sort_by {|d| -d.count('/')}
           mfile.print("\t@-$(RMDIRS) #{fseprepl[dir]}\n")
         end
       end
@@ -1936,6 +1946,7 @@
 RPATHFLAG = config_string('RPATHFLAG') || ''
 LIBARG = config_string('LIBARG') || '-l%s'
 MAIN_DOES_NOTHING = config_string('MAIN_DOES_NOTHING') || 'int main() {return 0;}'
+UNIVERSAL_INTS = config_string('UNIVERSAL_INTS') {|s| Shellwords.shellwords(s)} if $universal
 
 sep = config_string('BUILD_FILE_SEPARATOR') {|s| ":/=#{s}" if s != "/"} || ""
 CLEANINGS = "
Index: version.h
===================================================================
--- version.h	(revision 23004)
+++ version.h	(revision 23005)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_RELEASE_DATE "2009-03-18"
+#define RUBY_RELEASE_DATE "2009-03-19"
 #define RUBY_PATCHLEVEL -1
 #define RUBY_BRANCH_NAME "trunk"
 
@@ -8,7 +8,7 @@
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2009
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_DAY 19
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
Index: file.c
===================================================================
--- file.c	(revision 23004)
+++ file.c	(revision 23005)
@@ -310,7 +310,7 @@
 static VALUE
 rb_stat_ino(VALUE self)
 {
-#ifdef HUGE_ST_INO
+#if SIZEOF_STRUCT_STAT_ST_INO > SIZEOF_LONG
     return ULL2NUM(get_stat(self)->st_ino);
 #else
     return ULONG2NUM(get_stat(self)->st_ino);
@@ -503,7 +503,7 @@
 rb_stat_blocks(VALUE self)
 {
 #ifdef HAVE_STRUCT_STAT_ST_BLOCKS
-# ifdef HUGE_STRUCT_STAT_ST_BLOCKS
+# if SIZEOF_STRUCT_STAT_ST_BLOCKS > SIZEOF_LONG
     return ULL2NUM(get_stat(self)->st_blocks);
 # else
     return ULONG2NUM(get_stat(self)->st_blocks);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]