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

ruby-changes:4379

From: ko1@a...
Date: Tue, 1 Apr 2008 02:58:51 +0900 (JST)
Subject: [ruby-changes:4379] nobu - Ruby:r15870 (ruby_1_8): * configure.in (RUBY_SETJMP, RUBY_LONGJMP, RUBY_JMP_BUF): prefers

nobu	2008-04-01 02:58:14 +0900 (Tue, 01 Apr 2008)

  New Revision: 15870

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/configure.in
    branches/ruby_1_8/eval.c
    branches/ruby_1_8/gc.c
    branches/ruby_1_8/node.h

  Log:
    * configure.in (RUBY_SETJMP, RUBY_LONGJMP, RUBY_JMP_BUF): prefers
      __builtin_setjmp, _setjmp over setjmp and sigsetjmp.
      [ruby-core:16023], [ruby-core:16086]
    
    * configure.in (--with-setjmp-type): new option to override the
      default rule in the above.
    
    * eval.c (ruby_setjmp, ruby_longjmp), gc.c (rb_setjmp),
      node.h (rb_jmpbuf_t): use RUBY_SETJMP, RUBY_LONGJMP and
      RUBY_JMP_BUF.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/configure.in?r1=15870&r2=15869&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=15870&r2=15869&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/node.h?r1=15870&r2=15869&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/gc.c?r1=15870&r2=15869&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/eval.c?r1=15870&r2=15869&diff_format=u

Index: ruby_1_8/configure.in
===================================================================
--- ruby_1_8/configure.in	(revision 15869)
+++ ruby_1_8/configure.in	(revision 15870)
@@ -572,6 +572,54 @@
 	      sigaction sigsetjmp _setjmp setsid telldir seekdir fchmod\
 	      mktime timegm gettimeofday\
 	      cosh sinh tanh round setuid setgid setenv unsetenv)
+
+AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp,
+[AC_TRY_LINK([@%:@include <setjmp.h>
+    jmp_buf jb; void t() {__builtin_longjmp(jb, 1);}],
+    [__builtin_setjmp(jb);],
+    [ac_cv_func___builtin_setjmp=yes],
+    [ac_cv_func___builtin_setjmp=no])
+])
+
+AC_MSG_CHECKING(for setjmp type)
+AC_ARG_WITH(setjmp-type, 
+	[  --with-setjmp-type      select setjmp type], [
+	case $withval in
+	__builtin_setjmp) setjmp_prefix=__builtin_;;
+	_setjmp) setjmp_prefix=_;;
+	sigsetjmp) setjmp_prefix=sig;;
+	setjmp) setjmp_prefix=;;
+	'') unset setjmp_prefix;;
+	*)   AC_MSG_ERROR(invalid setjmp type: $withval);;
+	esac], [unset setjmp_prefix])
+if test ${setjmp_prefix+set}; then
+    if test "${setjmp_prefix}" && eval test '$ac_cv_'${setjmp_prefix}setjmp = no; then
+	AC_MSG_ERROR(${setjmp_prefix}setjmp is not available)
+    fi
+elif test "$ac_cv_func___builtin_setjmp" = yes; then
+    setjmp_prefix=__builtin_
+elif test "$ac_cv_func__setjmp" = yes; then
+    setjmp_prefix=_
+elif test "$ac_cv_func_sigsetjmp" = yes; then
+    case $target_os in
+    solaris*|cygwin*)
+	setjmp_prefix=;;
+    *)
+	setjmp_prefix=sig;;
+    esac
+else
+    setjmp_prefix=
+fi
+if test $setjmp_prefix = sig; then
+    setjmp_sigmask=yes
+else
+    unset setjmp_sigmask
+fi
+AC_MSG_RESULT(${setjmp_prefix}setjmp)
+AC_DEFINE_UNQUOTED([RUBY_SETJMP(env)], [${setjmp_prefix}setjmp(env${setjmp_sigmask+,0})])
+AC_DEFINE_UNQUOTED([RUBY_LONGJMP(env,val)], [${setjmp_prefix}longjmp(env,val)])
+AC_DEFINE_UNQUOTED(RUBY_JMP_BUF, ${setjmp_sigmask+${setjmp_prefix}}jmp_buf)
+
 AC_ARG_ENABLE(setreuid,
        [  --enable-setreuid       use setreuid()/setregid() according to need even if obsolete.],
        [use_setreuid=$enableval])
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 15869)
+++ ruby_1_8/ChangeLog	(revision 15870)
@@ -1,3 +1,16 @@
+Tue Apr  1 02:58:13 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* configure.in (RUBY_SETJMP, RUBY_LONGJMP, RUBY_JMP_BUF): prefers
+	  __builtin_setjmp, _setjmp over setjmp and sigsetjmp.
+	  [ruby-core:16023], [ruby-core:16086]
+
+	* configure.in (--with-setjmp-type): new option to override the
+	  default rule in the above.
+
+	* eval_intern.h (ruby_setjmp, ruby_longjmp), gc.c (rb_setjmp),
+	  vm_core.h (rb_jmpbuf_t): use RUBY_SETJMP, RUBY_LONGJMP and
+	  RUBY_JMP_BUF.
+
 Tue Apr  1 01:55:52 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/resolv.rb (Resolv::Config.default_config_hash): requires
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 15869)
+++ ruby_1_8/eval.c	(revision 15870)
@@ -193,14 +193,11 @@
      POST_GETCONTEXT, \
      (j)->status)
 #else
-#  if !defined(setjmp) && defined(HAVE__SETJMP) && !defined(sigsetjmp) && !defined(HAVE_SIGSETJMP)
-#    define ruby_setjmp(just_before_setjmp, env) \
-       ((just_before_setjmp), _setjmp(env))
-#    define ruby_longjmp(env,val) _longjmp(env,val)
-#  else
-#    define ruby_setjmp(just_before_setjmp, env) \
-       ((just_before_setjmp), setjmp(env))
-#    define ruby_longjmp(env,val) longjmp(env,val)
+#  define ruby_setjmp(just_before_setjmp, env) \
+     ((just_before_setjmp), RUBY_SETJMP(env))
+#  define ruby_longjmp(env,val) RUBY_LONGJMP(env,val)
+#  ifdef __CYGWIN__
+int _setjmp(), _longjmp();
 #  endif
 #endif
 
Index: ruby_1_8/gc.c
===================================================================
--- ruby_1_8/gc.c	(revision 15869)
+++ ruby_1_8/gc.c	(revision 15870)
@@ -37,8 +37,10 @@
 void re_free_registers _((struct re_registers*));
 void rb_io_fptr_finalize _((struct OpenFile*));
 
-#if !defined(setjmp) && defined(HAVE__SETJMP) && !defined(sigsetjmp) && !defined(HAVE_SIGSETJMP)
-#define setjmp(env) _setjmp(env)
+#define rb_setjmp(env) RUBY_SETJMP(env)
+#define rb_jmp_buf rb_jmpbuf_t
+#ifdef __CYGWIN__
+int _setjmp(), _longjmp();
 #endif
 
 /* Make alloca work the best possible way.  */
@@ -1283,6 +1285,8 @@
 
 #ifdef __GNUC__
 #if defined(__human68k__) || defined(DJGPP)
+#undef rb_setjmp
+#undef rb_jmp_buf
 #if defined(__human68k__)
 typedef unsigned long rb_jmp_buf[8];
 __asm__ (".even\n\
@@ -1291,9 +1295,6 @@
 	movem.l	d3-d7/a3-a5,(a0)\n\
 	moveq.l	#0,d0\n\
 	rts");
-#ifdef setjmp
-#undef setjmp
-#endif
 #else
 #if defined(DJGPP)
 typedef unsigned long rb_jmp_buf[6];
@@ -1314,8 +1315,6 @@
 #endif
 #endif
 int rb_setjmp (rb_jmp_buf);
-#define jmp_buf rb_jmp_buf
-#define setjmp rb_setjmp
 #endif /* __human68k__ or DJGPP */
 #endif /* __GNUC__ */
 
@@ -1364,7 +1363,7 @@
 
     FLUSH_REGISTER_WINDOWS;
     /* This assumes that all registers are saved into the jmp_buf (and stack) */
-    setjmp(save_regs_gc_mark);
+    rb_setjmp(save_regs_gc_mark);
     mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
 #if STACK_GROW_DIRECTION < 0
     rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start);
Index: ruby_1_8/node.h
===================================================================
--- ruby_1_8/node.h	(revision 15869)
+++ ruby_1_8/node.h	(revision 15870)
@@ -387,7 +387,7 @@
     volatile int status;
 } rb_jmpbuf_t[1];
 #else
-typedef jmp_buf rb_jmpbuf_t;
+typedef RUBY_JMP_BUF rb_jmpbuf_t;
 #endif
 
 enum rb_thread_status {

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

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