From 6212cfb9c53bd93fda08915f9916a7c3ebace289 Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 22 Nov 2003 04:00:03 +0000 Subject: * gc.c (Init_stack): stack region is far smaller than usual if pthread is used. * marshal.c (w_extended): singleton methods should not be checked when dumping via marshal_dump() or _dump(). [ruby-talk:85909] * file.c (getcwdofdrv): avoid using getcwd() directly, use my_getcwd() instead. * merged NeXT, OpenStep, Rhapsody ports patch from Eric Sunshine . [ruby-core:01596] * marshal.c (w_object): LINK check earlier than anything else, i.e. do not dump TYPE_IVAR for already dumped objects. (ruby-bugs PR#1220) * eval.c (rb_eval): call "inherited" only when a new class is generated; not on reopening. * eval.c (eval): prepend error position in evaluating string to * configure.in: revived NextStep, OpenStep, and Rhapsody ports which had become unbuildable; enhanced --enable-fat-binary option so that it accepts a list of desired architectures (rather than assuming a fixed list), or defaults to a platform-appropriate list if user does not provide an explicit list; made the default list of architectures for MAB (fat binary) more comprehensive; now uses -fno-common even when building the interpreter (in addition to using it for extensions), thus allowing the interpreter to be embedded into a plugin module of an external project (in addition to allowing embedding directly into an application); added checks for (needed by `socket' extension) and getcwd(); now ensures that -I/usr/local/include is employed when extensions' extconf.rb scripts invoke have_header() since extension checks on NextStep and OpenStep will fail without it if the desired resource resides in the /usr/local tree; fixed formatting of --help message. * Makefile.in: $(LIBRUBY_A) rule now deletes the archive before invoking $(AR) since `ar' on Apple/NeXT can not "update" MAB archives (see configure's --enable-fat-binary option); added rule for new missing/getcwd.c. * defines.h: fixed endian handling during MAB build (see configure's --enable-fat-binary option) to ensure that all portions of the project see the correct WORDS_BIGENDIAN value (some extension modules were getting the wrong endian setting); added missing constants GETPGRP_VOID, WNOHANG, WUNTRACED, X_OK, and type pid_t for NextStep and OpenStep; removed unnecessary and problematic HAVE_SYS_WAIT_H define in NeXT section. * dir.c: do not allow NAMLEN() macro to trust dirent::d_namlen on NextStep since, on some installations, this value always resolves uselessly to zero. * dln.c: added error reporting to NextStep extension loader since the previous behavior of failing silently was not useful; now ensures that NSLINKMODULE_OPTION_BINDNOW compatibility constant is defined for OpenStep and Rhapsody; no longer includes twice on Rhapsody since this header lacks multiple-include protection, which resulted in "redefinition" compilation errors. * main.c: also create hard reference to objc_msgSend() on NeXT platforms (in addition to Apple platforms). * lib/mkmf.rb: now exports XCFLAGS from configure script to extension makefiles so that extensions can be built MAB (see configure's --enable-fat-binary option); also utilize XCFLAGS in cc_command() (but not cpp_command() because MAB flags are incompatible with direct invocation of `cpp'). * ext/curses/extconf.rb: now additionally checks for presence of these curses functions which are not present on NextStep or Openstep: bkgd(), bkgdset(), color(), curs(), getbkgd(), init(), scrl(), set(), setscrreg(), wattroff(), wattron(), wattrset(), wbkgd(), wbkgdset(), wscrl(), wsetscrreg() * ext/curses/curses.c: added appropriate #ifdef's for additional set of curses functions now checked by extconf.rb; fixed curses_bkgd() and window_bkgd() to correctly return boolean result rather than numeric result; fixed window_getbkgd() to correctly signal an error by returning nil rather than -1. * ext/etc/etc.c: setup_passwd() and setup_group() now check for null pointers before invoking rb_tainted_str_new2() upon fields extracted from `struct passwd' and `struct group' since null pointers in some fields are common on NextStep/OpenStep (especially so for the `pw_comment' field) and rb_tainted_str_new2() throws an exception when it receives a null pointer. * ext/pty/pty.c: include "util.h" for strdup()/ruby_strdup() for platforms such as NextStep and OpenStep which lack strdup(). * ext/socket/getaddrinfo.c: cast first argument of getservbyname(), gethostbyaddr(), and gethostbyname() from (const char*) to non-const (char*) for older platforms such as NextStep and OpenStep. * ext/socket/socket.c: include "util.h" for strdup()/ruby_strdup() for platforms such as NextStep and OpenStep which lack strdup(); include if present for NextStep and OpenStep; cast first argument of gethostbyaddr() and getservbyname() from (const char*) to non-const (char*) for older platforms. * ext/syslog/syslog.c: include "util.h" for strdup()/ruby_strdup() for platforms such as NextStep and OpenStep which lack strdup(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5002 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 111 ++++++++++++++++++++++++++++++++++++++++ Makefile.in | 4 ++ configure.in | 115 +++++++++++++++++++++++------------------- defines.h | 20 +++++--- dir.c | 7 ++- dln.c | 26 +++++++--- error.c | 11 +++- eval.c | 10 ++-- ext/curses/curses.c | 128 ++++++++++++++++++++++++++++++++++++++++++++--- ext/curses/extconf.rb | 2 +- ext/etc/etc.c | 30 +++++++---- ext/pty/pty.c | 1 + ext/socket/getaddrinfo.c | 6 +-- ext/socket/socket.c | 8 ++- ext/syslog/syslog.c | 1 + file.c | 24 +++++---- gc.c | 3 ++ lib/cgi.rb | 2 +- lib/fileutils.rb | 2 +- lib/mkmf.rb | 6 ++- lib/xsd/charset.rb | 2 +- main.c | 2 +- marshal.c | 39 ++++++++------- test/csv/test_csv.rb | 3 +- test/ruby/test_file.rb | 2 +- test/yaml/test_yaml.rb | 3 +- util.c | 13 ++++- variable.c | 9 +++- 28 files changed, 456 insertions(+), 134 deletions(-) diff --git a/ChangeLog b/ChangeLog index ce13d39c7e..058d86b4f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Nov 22 11:28:48 2003 Yukihiro Matsumoto + + * gc.c (Init_stack): stack region is far smaller than usual if + pthread is used. + Sat Nov 22 07:30:00 2003 Nathaniel Talbott * lib/test/unit/util/backtracefilter.rb: fixed a bug that occurred @@ -20,6 +25,11 @@ Fri Nov 21 14:49:42 2003 Minero Aoki * ruby.1: wrote about ruby related environment variables. +Fri Nov 21 12:28:03 2003 Yukihiro Matsumoto + + * marshal.c (w_extended): singleton methods should not be checked + when dumping via marshal_dump() or _dump(). [ruby-talk:85909] + Fri Nov 21 01:40:00 2003 Hidetoshi NAGAI * configure.in: check @@ -154,6 +164,14 @@ Tue Nov 18 14:06:35 2003 Minero Aoki * test/fileutils/fileasserts.rb: assert_is_directory -> assert_directory. +Mon Nov 17 19:38:49 2003 Yukihiro Matsumoto + + * file.c (getcwdofdrv): avoid using getcwd() directly, use + my_getcwd() instead. + + * merged NeXT, OpenStep, Rhapsody ports patch from Eric Sunshine + . [ruby-core:01596] + Mon Nov 17 10:50:27 2003 Nobuyoshi Nakada * lib/optparse.rb (OptionParser::Completion::complete): allow least @@ -176,6 +194,13 @@ Sun Nov 16 18:10:57 2003 Nobuyoshi Nakada Sun Nov 16 13:26:07 2003 Yukihiro Matsumoto + * marshal.c (w_object): LINK check earlier than anything else, + i.e. do not dump TYPE_IVAR for already dumped objects. + (ruby-bugs PR#1220) + + * eval.c (rb_eval): call "inherited" only when a new class is + generated; not on reopening. + * eval.c (eval): prepend error position in evaluating string to "mesg" attribute string only when it's available and is a string. @@ -2233,6 +2258,92 @@ Wed Sep 10 22:41:54 2003 Tietew * eval.c (win32_get_exception_list): avoid VC7 warning. [ruby-win32:577] +Thu Oct 9 12:05:46 2003 Eric Sunshine + + * configure.in: revived NextStep, OpenStep, and Rhapsody ports which + had become unbuildable; enhanced --enable-fat-binary option so that + it accepts a list of desired architectures (rather than assuming a + fixed list), or defaults to a platform-appropriate list if user does + not provide an explicit list; made the default list of architectures + for MAB (fat binary) more comprehensive; now uses -fno-common even + when building the interpreter (in addition to using it for + extensions), thus allowing the interpreter to be embedded into a + plugin module of an external project (in addition to allowing + embedding directly into an application); added checks for + (needed by `socket' extension) and getcwd(); now + ensures that -I/usr/local/include is employed when extensions' + extconf.rb scripts invoke have_header() since extension checks on + NextStep and OpenStep will fail without it if the desired resource + resides in the /usr/local tree; fixed formatting of --help message. + + * Makefile.in: $(LIBRUBY_A) rule now deletes the archive before + invoking $(AR) since `ar' on Apple/NeXT can not "update" MAB archives + (see configure's --enable-fat-binary option); added rule for new + missing/getcwd.c. + + * defines.h: fixed endian handling during MAB build (see configure's + --enable-fat-binary option) to ensure that all portions of the + project see the correct WORDS_BIGENDIAN value (some extension modules + were getting the wrong endian setting); added missing constants + GETPGRP_VOID, WNOHANG, WUNTRACED, X_OK, and type pid_t for NextStep + and OpenStep; removed unnecessary and problematic HAVE_SYS_WAIT_H + define in NeXT section. + + * dir.c: do not allow NAMLEN() macro to trust dirent::d_namlen on + NextStep since, on some installations, this value always resolves + uselessly to zero. + + * dln.c: added error reporting to NextStep extension loader since the + previous behavior of failing silently was not useful; now ensures + that NSLINKMODULE_OPTION_BINDNOW compatibility constant is defined + for OpenStep and Rhapsody; no longer includes twice + on Rhapsody since this header lacks multiple-include protection, + which resulted in "redefinition" compilation errors. + + * main.c: also create hard reference to objc_msgSend() on NeXT + platforms (in addition to Apple platforms). + + * lib/mkmf.rb: now exports XCFLAGS from configure script to extension + makefiles so that extensions can be built MAB (see configure's + --enable-fat-binary option); also utilize XCFLAGS in cc_command() + (but not cpp_command() because MAB flags are incompatible with + direct invocation of `cpp'). + + * ext/curses/extconf.rb: now additionally checks for presence of these + curses functions which are not present on NextStep or Openstep: + bkgd(), bkgdset(), color(), curs(), getbkgd(), init(), scrl(), set(), + setscrreg(), wattroff(), wattron(), wattrset(), wbkgd(), wbkgdset(), + wscrl(), wsetscrreg() + + * ext/curses/curses.c: added appropriate #ifdef's for additional set of + curses functions now checked by extconf.rb; fixed curses_bkgd() and + window_bkgd() to correctly return boolean result rather than numeric + result; fixed window_getbkgd() to correctly signal an error by + returning nil rather than -1. + + * ext/etc/etc.c: setup_passwd() and setup_group() now check for null + pointers before invoking rb_tainted_str_new2() upon fields extracted + from `struct passwd' and `struct group' since null pointers in some + fields are common on NextStep/OpenStep (especially so for the + `pw_comment' field) and rb_tainted_str_new2() throws an exception + when it receives a null pointer. + + * ext/pty/pty.c: include "util.h" for strdup()/ruby_strdup() for + platforms such as NextStep and OpenStep which lack strdup(). + + * ext/socket/getaddrinfo.c: cast first argument of getservbyname(), + gethostbyaddr(), and gethostbyname() from (const char*) to non-const + (char*) for older platforms such as NextStep and OpenStep. + + * ext/socket/socket.c: include "util.h" for strdup()/ruby_strdup() for + platforms such as NextStep and OpenStep which lack strdup(); include + if present for NextStep and OpenStep; cast first + argument of gethostbyaddr() and getservbyname() from (const char*) to + non-const (char*) for older platforms. + + * ext/syslog/syslog.c: include "util.h" for strdup()/ruby_strdup() for + platforms such as NextStep and OpenStep which lack strdup(). + Tue Sep 9 10:39:51 2003 Nobuyoshi Nakada * eval.c (struct tag): dst should be VALUE. diff --git a/Makefile.in b/Makefile.in index cf51111a74..d0c6e82255 100644 --- a/Makefile.in +++ b/Makefile.in @@ -121,7 +121,11 @@ $(PROGRAM): $(LIBRUBY) $(MAINOBJ) $(EXTOBJS) $(SETUP) miniruby$(EXEEXT) @rm -f $@ $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@ +# We must `rm' the library each time this rule is invoked because "updating" a +# MAB library on Apple/NeXT (see --enable-fat-binary in configure) is not +# supported. $(LIBRUBY_A): $(OBJS) $(DMYEXT) + @rm -f $@ @AR@ rcu $@ $(OBJS) $(DMYEXT) @-@RANLIB@ $@ 2> /dev/null || true diff --git a/configure.in b/configure.in index 53daac0220..ceca4641d7 100644 --- a/configure.in +++ b/configure.in @@ -74,48 +74,57 @@ fi AC_CANONICAL_TARGET dnl checks for fat-binary -fat_binary=no AC_ARG_ENABLE(fat-binary, - [ --enable-fat-binary build a NeXT/Apple Multi Architecture Binary. ], - [fat_binary=$enableval]) - if test "$fat_binary" = yes ; then + [ --enable-fat-binary=ARCHS + build an Apple/NeXT Multi Architecture Binary (MAB); + ARCHS is a comma-delimited list of architectures for + which to build; if ARCHS is omitted, then the package + will be built for all architectures supported by the + platform ("ppc" for MacOS/X and Darwin; "ppc,i386" + for Rhapsody; "m68k,i386,sparc" for OpenStep; + "m68k,i386,sparc,hppa" for NextStep); if this option + is disabled or omitted entirely, then the package + will be built only for the target platform], + [fat_binary=$enableval], [fat_binary=no]) + if test "$fat_binary" != no; then + + AC_MSG_CHECKING([target architectures]) + + # Respect TARGET_ARCHS setting from environment if available. + if test -z "$TARGET_ARCHS"; then + # Respect ARCH given to --enable-fat-binary if present. + if test "$fat_binary" != yes; then + TARGET_ARCHS=`echo "$fat_binary" | tr ',' ' '` + else + # Choose a default set of architectures based upon platform. + case "$target_os" in + darwin*) + TARGET_ARCHS="ppc" + ;; + rhapsody*) + TARGET_ARCHS="ppc i386" + ;; + openstep*) + TARGET_ARCHS="m68k i386 sparc" + ;; + nextstep*) + TARGET_ARCHS="m68k i386 sparc hppa" + ;; + *) + TARGET_ARCHS=`arch` + esac + fi + fi - AC_MSG_CHECKING(target architecture) + AC_MSG_RESULT([$TARGET_ARCHS]) - case "$target_os" in - rhapsody*) - echo -n "MacOS X Server: " - if test "$TARGET_ARCHS" = "" ; then - TARGET_ARCHS="ppc i386" - fi - ;; - nextstep*|openstep*) - echo -n "NeXTSTEP/OPENSTEP: " - if test "$TARGET_ARCHS" = "" ; then - if test `/usr/bin/arch` = "m68k" ; then - TARGET_ARCHS="m68k i486" - else # Black and Native one - TARGET_ARCHS="m68k `/usr/bin/arch`" - fi - fi - # to ensure AC_HEADER_SYS_WAIT works - AC_DEFINE(_POSIX_SOURCE) - ;; - macos*|darwin*) - echo -n "MacOS X (Darwin): " - if test "$TARGET_ARCHS" = "" ; then - TARGET_ARCHS="ppc i386" - fi - ;; - esac # /usr/lib/arch_tool -archify_list $TARGET_ARCHS + ARCH_FLAG= for archs in $TARGET_ARCHS do - ARCH_FLAG="$ARCH_FLAG -arch $archs " - echo -n " $archs" + ARCH_FLAG="$ARCH_FLAG -arch $archs" done AC_DEFINE(NEXT_FAT_BINARY) - echo "." fi case $target_cpu in @@ -350,7 +359,7 @@ AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(stdlib.h string.h unistd.h limits.h sys/file.h sys/ioctl.h\ fcntl.h sys/fcntl.h sys/select.h sys/time.h sys/times.h sys/param.h\ syscall.h pwd.h grp.h a.out.h utime.h memory.h direct.h sys/resource.h \ - sys/mkdev.h sys/utime.h float.h pthread.h) + sys/mkdev.h sys/utime.h netinet/in_systm.h float.h pthread.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_UID_T @@ -367,7 +376,7 @@ AC_FUNC_MEMCMP AC_FUNC_FSEEKO AC_CHECK_FUNCS(ftello) AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\ - strchr strstr strtoul crypt flock vsnprintf\ + strchr strstr strtoul getcwd crypt flock vsnprintf\ isinf isnan finite hypot acosh erf) AC_CHECK_FUNCS(fmod killpg wait4 waitpid syscall chroot fsync\ truncate chsize times utimes fcntl lockf lstat symlink readlink\ @@ -735,9 +744,6 @@ AC_ARG_WITH(dln-a-out, *) with_dln_a_out=no;; esac], [with_dln_a_out=no]) -AC_SUBST(XCFLAGS)dnl -AC_SUBST(XLDFLAGS)dnl - AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf, [AC_TRY_RUN([ /* Test for whether ELF binaries are produced */ @@ -801,9 +807,9 @@ if test "$with_dln_a_out" != yes; then AC_MSG_CHECKING(whether OS depend dynamic link works) if test "$GCC" = yes; then case "$target_os" in - nextstep*) ;; - openstep*) ;; - rhapsody*) ;; + nextstep*) CCDLFLAGS=-fno-common;; + openstep*) CCDLFLAGS=-fno-common;; + rhapsody*) CCDLFLAGS=-fno-common;; darwin*) CCDLFLAGS=-fno-common;; human*) ;; bsdi*) ;; @@ -1094,7 +1100,7 @@ if test "$prefix" = NONE; then prefix=$ac_default_prefix fi -if test "$fat_binary" = yes ; then +if test "$fat_binary" != no ; then XCFLAGS="$ARCH_FLAG" fi @@ -1225,17 +1231,22 @@ case "$target_os" in netbsd*) CFLAGS="$CFLAGS -pipe" ;; - nextstep*) - CFLAGS="$CFLAGS -pipe" - ;; - openstep*) - CFLAGS="$CFLAGS -pipe" + nextstep*|openstep*) + # The -fno-common is needed if we wish to embed the Ruby interpreter + # into a plugin module of some project (as opposed to embedding it + # within the project's application). The -I/usr/local/include is + # needed because CPP as discovered by configure (cc -E -traditional) + # fails to consult /usr/local/include by default. This causes + # mkmf.rb's have_header() to fail if the desired resource happens to be + # installed in the /usr/local tree. + CFLAGS="$CFLAGS -pipe -fno-common" + CPPFLAGS="$CPPFLAGS -I/usr/local/include" ;; rhapsody*) - CFLAGS="$CFLAGS -pipe -no-precomp" + CFLAGS="$CFLAGS -pipe -no-precomp -fno-common" ;; darwin*) - CFLAGS="$CFLAGS -pipe" + CFLAGS="$CFLAGS -pipe -fno-common" ;; os2-emx) CFLAGS="$CFLAGS -DOS2 -Zmts" @@ -1314,6 +1325,8 @@ case "$build_os" in *msdosdjgpp*) FIRSTMAKEFILE=GNUmakefile:djgpp/GNUmakefile.in;; esac +AC_SUBST(XCFLAGS)dnl +AC_SUBST(XLDFLAGS)dnl AC_SUBST(LIBRUBY_LDSHARED) AC_SUBST(LIBRUBY_DLDFLAGS) AC_SUBST(RUBY_INSTALL_NAME) @@ -1390,7 +1403,7 @@ AC_SUBST(sitedir)dnl configure_args=$ac_configure_args AC_SUBST(configure_args)dnl -if test "$fat_binary" = yes ; then +if test "$fat_binary" != no ; then arch="fat-${target_os}" AC_DEFINE_UNQUOTED(RUBY_THIN_ARCHLIB, diff --git a/defines.h b/defines.h index 1cc659a8c6..0e2c9b36aa 100644 --- a/defines.h +++ b/defines.h @@ -98,15 +98,23 @@ void xfree _((void*)); #endif #endif -#ifdef NeXT -#define DYNAMIC_ENDIAN /* determine endian at runtime */ +#ifdef __NeXT__ +#define S_IXGRP 0000010 /* execute/search permission, group */ +#define S_IXOTH 0000001 /* execute/search permission, other */ #ifndef __APPLE__ #define S_IXUSR _S_IXUSR /* execute/search permission, owner */ +#define GETPGRP_VOID 1 +#define WNOHANG 01 +#define WUNTRACED 02 +#define X_OK 1 +typedef int pid_t; +/* Do not trust WORDS_BIGENDIAN from configure since -arch compiler flag may + result in a different endian. */ +#undef WORDS_BIGENDIAN +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN +#endif #endif -#define S_IXGRP 0000010 /* execute/search permission, group */ -#define S_IXOTH 0000001 /* execute/search permission, other */ - -#define HAVE_SYS_WAIT_H /* configure fails to find this */ #endif /* NeXT */ #ifdef __CYGWIN__ diff --git a/dir.c b/dir.c index b31096f515..d16e311a11 100644 --- a/dir.c +++ b/dir.c @@ -29,7 +29,12 @@ # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct -# define NAMLEN(dirent) (dirent)->d_namlen +# if !defined __NeXT__ +# define NAMLEN(dirent) (dirent)->d_namlen +# else +# /* On some versions of NextStep, d_namlen is always zero, so avoid it. */ +# define NAMLEN(dirent) strlen((dirent)->d_name) +# endif # if HAVE_SYS_NDIR_H # include # endif diff --git a/dln.c b/dln.c index eb907cbef2..88f623d22c 100644 --- a/dln.c +++ b/dln.c @@ -1139,12 +1139,15 @@ dln_sym(name) #include #else #include +#ifndef NSLINKMODULE_OPTION_BINDNOW +#define NSLINKMODULE_OPTION_BINDNOW 1 #endif #endif +#else #ifdef __APPLE__ #include #endif - +#endif #if defined _WIN32 && !defined __CYGWIN__ #include @@ -1389,30 +1392,41 @@ dln_load(file) Special Thanks... Yu tomoak-i@is.aist-nara.ac.jp, Mi hisho@tasihara.nest.or.jp, + sunshine@sunshineco.com, and... Miss ARAI Akino(^^;) ----------------------------------------------------*/ #if defined(NeXT) && (NS_TARGET_MAJOR < 4)/* NeXTSTEP rld functions */ { + NXStream* s; unsigned long init_address; char *object_files[2] = {NULL, NULL}; void (*init_fct)(); - object_files[0] = file; + object_files[0] = (char*)file; + s = NXOpenFile(2,NX_WRITEONLY); + /* Load object file, if return value ==0 , load failed*/ - if(rld_load(NULL, NULL, object_files, NULL) == 0) { + if(rld_load(s, NULL, object_files, NULL) == 0) { + NXFlush(s); + NXClose(s); rb_loaderror("Failed to load %.200s", file); } /* lookup the initial function */ - if(rld_lookup(NULL, buf, &init_address) == 0) { + if(rld_lookup(s, buf, &init_address) == 0) { + NXFlush(s); + NXClose(s); rb_loaderror("Failed to lookup Init function %.200s", file); } - /* Cannot call *init_address directory, so copy this value to - funtion pointer */ + NXFlush(s); + NXClose(s); + + /* Cannot call *init_address directory, so copy this value to + funtion pointer */ init_fct = (void(*)())init_address; (*init_fct)(); return (void*)init_address; diff --git a/error.c b/error.c index b5b14decae..d6b8be4c4d 100644 --- a/error.c +++ b/error.c @@ -363,6 +363,13 @@ exc_to_s(exc) return mesg; } +static VALUE +exc_to_str(exc) + VALUE exc; +{ + return rb_funcall(exc, rb_intern("to_s"), 0, 0); +} + static VALUE exc_inspect(exc) VALUE exc; @@ -645,8 +652,8 @@ Init_Exception() rb_define_method(rb_eException, "exception", exc_exception, -1); rb_define_method(rb_eException, "initialize", exc_initialize, -1); rb_define_method(rb_eException, "to_s", exc_to_s, 0); - rb_define_method(rb_eException, "to_str", exc_to_s, 0); - rb_define_method(rb_eException, "message", exc_to_s, 0); + rb_define_method(rb_eException, "to_str", exc_to_str, 0); + rb_define_method(rb_eException, "message", exc_to_str, 0); rb_define_method(rb_eException, "inspect", exc_inspect, 0); rb_define_method(rb_eException, "backtrace", exc_backtrace, 0); rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1); diff --git a/eval.c b/eval.c index ecb1725cc1..9737c7d7ec 100644 --- a/eval.c +++ b/eval.c @@ -3589,6 +3589,7 @@ rb_eval(self, n) { VALUE super, klass, tmp, cbase; ID cname; + int gen = Qfalse; if (NIL_P(ruby_cbase)) { rb_raise(rb_eTypeError, "no outer class/module"); @@ -3625,12 +3626,15 @@ rb_eval(self, n) klass = rb_define_class_id(cname, super); rb_set_class_path(klass, cbase, rb_id2name(cname)); rb_const_set(cbase, cname, klass); + gen = Qtrue; } if (ruby_wrapper) { rb_extend_object(klass, ruby_wrapper); rb_include_module(klass, ruby_wrapper); } - if (super) rb_class_inherited(super, klass); + if (super && gen) { + rb_class_inherited(super, klass); + } result = module_setup(klass, node); } break; @@ -5596,12 +5600,12 @@ eval(self, src, scope, file, line) if (strcmp(file, "(eval)") == 0) { VALUE mesg, errat; + errat = get_backtrace(ruby_errinfo); mesg = rb_attr_get(ruby_errinfo, rb_intern("mesg")); if (!NIL_P(mesg) && TYPE(mesg) == T_STRING) { - errat = get_backtrace(ruby_errinfo); rb_str_update(mesg, 0, 0, RARRAY(errat)->ptr[0]); - RARRAY(errat)->ptr[0] = RARRAY(backtrace(-2))->ptr[0]; } + RARRAY(errat)->ptr[0] = RARRAY(backtrace(-2))->ptr[0]; } rb_exc_raise(ruby_errinfo); } diff --git a/ext/curses/curses.c b/ext/curses/curses.c index 8aa095e5a5..7900573df7 100644 --- a/ext/curses/curses.c +++ b/ext/curses/curses.c @@ -477,22 +477,34 @@ curses_cols() static VALUE curses_curs_set(VALUE obj, VALUE visibility) { +#ifdef HAVE_CURS_SET int n; return (n = curs_set(NUM2INT(visibility)) != ERR) ? INT2FIX(n) : Qnil; +#else + return Qnil; +#endif } static VALUE curses_scrl(VALUE obj, VALUE n) { /* may have to raise exception on ERR */ +#ifdef HAVE_SCRL return (scrl(NUM2INT(n)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE curses_setscrreg(VALUE obj, VALUE top, VALUE bottom) { /* may have to raise exception on ERR */ +#ifdef HAVE_SETSCRREG return (setscrreg(NUM2INT(top), NUM2INT(bottom)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE @@ -519,14 +531,20 @@ curses_attrset(VALUE obj, VALUE attrs) static VALUE curses_bkgdset(VALUE obj, VALUE ch) { +#ifdef HAVE_BKGDSET bkgdset(NUM2CHR(ch)); +#endif return Qnil; } static VALUE curses_bkgd(VALUE obj, VALUE ch) { - return CHR2FIX(bkgd(NUM2CHR(ch))); +#ifdef HAVE_BKGD + return (bkgd(NUM2CHR(ch)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE @@ -679,6 +697,37 @@ DEFINE_MOUSE_GET_MEMBER(curs_mouse_bstate, bstate) #undef define_curs_mouse_member #endif /* USE_MOUSE */ +static VALUE +curses_timeout(VALUE obj, VALUE delay) +{ +#ifdef HAVE_TIMEOUT + timeout(NUM2INT(delay)); + return Qnil; +#else + rb_notimplement(); +#endif +} + +static VALUE +curses_def_prog_mode(VALUE obj) +{ +#ifdef HAVE_DEF_PROG_MODE + return def_prog_mode() == OK ? Qtrue : Qfalse; +#else + rb_notimplement(); +#endif +} + +static VALUE +curses_reset_prog_mode(VALUE obj) +{ +#ifdef HAVE_RESET_PROG_MODE + return reset_prog_mode() == OK ? Qtrue : Qfalse; +#else + rb_notimplement(); +#endif +} + /*-------------------------- class Window --------------------------*/ /* def self.allocate */ @@ -1125,6 +1174,7 @@ window_idlok(VALUE obj, VALUE bf) static VALUE window_setscrreg(VALUE obj, VALUE top, VALUE bottom) { +#ifdef HAVE_WSETSCRREG struct windata *winp; int res; @@ -1132,6 +1182,9 @@ window_setscrreg(VALUE obj, VALUE top, VALUE bottom) res = wsetscrreg(winp->window, NUM2INT(top), NUM2INT(bottom)); /* may have to raise exception on ERR */ return (res == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE @@ -1147,25 +1200,34 @@ window_scroll(VALUE obj) static VALUE window_scrl(VALUE obj, VALUE n) { +#ifdef HAVE_WSCRL struct windata *winp; GetWINDOW(obj, winp); /* may have to raise exception on ERR */ return (wscrl(winp->window,NUM2INT(n)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE window_attroff(VALUE obj, VALUE attrs) { +#ifdef HAVE_WATTROFF struct windata *winp; GetWINDOW(obj,winp); return INT2FIX(wattroff(winp->window,NUM2INT(attrs))); +#else + return Qtrue; +#endif } static VALUE window_attron(VALUE obj, VALUE attrs) { +#ifdef HAVE_WATTRON struct windata *winp; VALUE val; @@ -1179,43 +1241,61 @@ window_attron(VALUE obj, VALUE attrs) else{ return val; } +#else + return Qtrue; +#endif } static VALUE window_attrset(VALUE obj, VALUE attrs) { +#ifdef HAVE_WATTRSET struct windata *winp; GetWINDOW(obj,winp); return INT2FIX(wattrset(winp->window,NUM2INT(attrs))); +#else + return Qtrue; +#endif } static VALUE window_bkgdset(VALUE obj, VALUE ch) { +#ifdef HAVE_WBKGDSET struct windata *winp; GetWINDOW(obj,winp); wbkgdset(winp->window, NUM2CHR(ch)); +#endif return Qnil; } static VALUE window_bkgd(VALUE obj, VALUE ch) { +#ifdef HAVE_WBKGD struct windata *winp; GetWINDOW(obj,winp); - return CHR2FIX(wbkgd(winp->window, NUM2CHR(ch))); + return (wbkgd(winp->window, NUM2CHR(ch)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE window_getbkgd(VALUE obj) { +#ifdef HAVE_WGETBKGD + char c; struct windata *winp; GetWINDOW(obj,winp); - return CHR2FIX(getbkgd(winp->window)); + return (c = getbkgd(winp->window) != ERR) ? CHR2FIX(c) : Qnil; +#else + return Qnil; +#endif } static VALUE @@ -1232,10 +1312,10 @@ window_resize(VALUE obj, VALUE lin, VALUE col) } -#ifdef HAVE_KEYPAD static VALUE window_keypad(VALUE obj, VALUE val) { +#ifdef HAVE_KEYPAD struct windata *winp; GetWINDOW(obj,winp); @@ -1248,8 +1328,37 @@ window_keypad(VALUE obj, VALUE val) return (keypad(winp->window,RTEST(val) ? TRUE : FALSE)) == OK ? Qtrue : Qfalse; #endif -} +#else + rb_notimplement(); #endif /* HAVE_KEYPAD */ +} + +static VALUE +window_nodelay(VALUE obj, VALUE val) +{ +#ifdef HAVE_NODELAY + struct windata *winp; + GetWINDOW(obj,winp); + + return nodelay(winp->window,RTEST(val) ? TRUE : FALSE) == OK ? Qtrue : Qfalse; +#else + rb_notimplement(); +#endif +} + +static VALUE +window_timeout(VALUE obj, VALUE delay) +{ +#ifdef HAVE_WTIMEOUT + struct windata *winp; + GetWINDOW(obj,winp); + + wtimeout(winp->window,NUM2INT(delay)); + return Qnil; +#else + rb_notimplement(); +#endif +} /*------------------------- Initialization -------------------------*/ void @@ -1333,6 +1442,10 @@ Init_curses() rb_define_module_function(mCurses, "mousemask", curses_mousemask, 1); #endif /* USE_MOUSE */ + rb_define_module_function(mCurses, "timeout=", curses_timeout, 1); + rb_define_module_function(mCurses, "def_prog_mode", curses_def_prog_mode, 0); + rb_define_module_function(mCurses, "reset_prog_mode", curses_reset_prog_mode, 0); + cWindow = rb_define_class_under(mCurses, "Window", rb_cData); rb_define_alloc_func(cWindow, window_s_allocate); rb_define_method(cWindow, "initialize", window_initialize, 4); @@ -1367,10 +1480,9 @@ Init_curses() rb_define_method(cWindow, "setscrreg", window_setscrreg, 2); rb_define_method(cWindow, "scrl", window_scrl, 1); rb_define_method(cWindow, "resize", window_resize, 2); -#ifdef HAVE_KEYPAD rb_define_method(cWindow, "keypad", window_keypad, 1); rb_define_method(cWindow, "keypad=", window_keypad, 1); -#endif + #ifdef USE_COLOR rb_define_method(cWindow, "attroff", window_attroff, 1); rb_define_method(cWindow, "attron", window_attron, 1); @@ -1380,6 +1492,8 @@ Init_curses() rb_define_method(cWindow, "getbkgd", window_getbkgd, 0); #endif /* USE_COLOR */ + rb_define_method(cWindow, "nodelay=", window_nodelay, 1); + rb_define_method(cWindow, "timeout=", window_timeout, 1); #define rb_curses_define_const(c) rb_define_const(mCurses,#c,UINT2NUM(c)) diff --git a/ext/curses/extconf.rb b/ext/curses/extconf.rb index a79cebf600..d0eed198d3 100644 --- a/ext/curses/extconf.rb +++ b/ext/curses/extconf.rb @@ -19,7 +19,7 @@ elsif have_header(*curses=%w"curses.h") and have_library("curses", "initscr") end if make - for f in %w(isendwin ungetch beep getnstr wgetnstr doupdate flash deleteln wdeleteln keypad keyname init_color wresize resizeterm) + for f in %w(beep bkgd bkgdset color curs deleteln doupdate flash getbkgd getnstr init isendwin keyname keypad resizeterm scrl set setscrreg ungetch wattroff wattron wattrset wbkgd wbkgdset wdeleteln wgetnstr wresize wscrl wsetscrreg def_prog_mode reset_prog_mode timeout wtimeout nodelay) have_func(f) end flag = "-D_XOPEN_SOURCE_EXTENDED" diff --git a/ext/etc/etc.c b/ext/etc/etc.c index f64b30604a..807a98c6b7 100644 --- a/ext/etc/etc.c +++ b/ext/etc/etc.c @@ -49,6 +49,16 @@ etc_getlogin(obj) return Qnil; } +#if defined(HAVE_GETPWENT) || defined(HAVE_GETGRENT) +static VALUE +safe_setup_str(str) + const char *str; +{ + if (str == 0) str = ""; + return rb_tainted_str_new2(str); +} +#endif + #ifdef HAVE_GETPWENT static VALUE setup_passwd(pwd) @@ -56,15 +66,15 @@ setup_passwd(pwd) { if (pwd == 0) rb_sys_fail("/etc/passwd"); return rb_struct_new(sPasswd, - rb_tainted_str_new2(pwd->pw_name), - rb_tainted_str_new2(pwd->pw_passwd), + safe_setup_str(pwd->pw_name), + safe_setup_str(pwd->pw_passwd), INT2FIX(pwd->pw_uid), INT2FIX(pwd->pw_gid), #ifdef HAVE_ST_PW_GECOS - rb_tainted_str_new2(pwd->pw_gecos), + safe_setup_str(pwd->pw_gecos), #endif - rb_tainted_str_new2(pwd->pw_dir), - rb_tainted_str_new2(pwd->pw_shell), + safe_setup_str(pwd->pw_dir), + safe_setup_str(pwd->pw_shell), #ifdef HAVE_ST_PW_CHANGE INT2FIX(pwd->pw_change), #endif @@ -75,10 +85,10 @@ setup_passwd(pwd) INT2FIX(pwd->pw_age), #endif #ifdef HAVE_ST_PW_CLASS - rb_tainted_str_new2(pwd->pw_class), + safe_setup_str(pwd->pw_class), #endif #ifdef HAVE_ST_PW_COMMENT - rb_tainted_str_new2(pwd->pw_comment), + safe_setup_str(pwd->pw_comment), #endif #ifdef HAVE_ST_PW_EXPIRE INT2FIX(pwd->pw_expire), @@ -220,12 +230,12 @@ setup_group(grp) mem = rb_ary_new(); tbl = grp->gr_mem; while (*tbl) { - rb_ary_push(mem, rb_tainted_str_new2(*tbl)); + rb_ary_push(mem, safe_setup_str(*tbl)); tbl++; } return rb_struct_new(sGroup, - rb_tainted_str_new2(grp->gr_name), - rb_tainted_str_new2(grp->gr_passwd), + safe_setup_str(grp->gr_name), + safe_setup_str(grp->gr_passwd), INT2FIX(grp->gr_gid), mem); } diff --git a/ext/pty/pty.c b/ext/pty/pty.c index cea0de50a2..01382e881a 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -24,6 +24,7 @@ #include "ruby.h" #include "rubyio.h" +#include "util.h" #include #ifdef HAVE_SYS_STROPTS_H diff --git a/ext/socket/getaddrinfo.c b/ext/socket/getaddrinfo.c index 4f58a23d2d..c05fbd57ba 100644 --- a/ext/socket/getaddrinfo.c +++ b/ext/socket/getaddrinfo.c @@ -397,7 +397,7 @@ getaddrinfo(hostname, servname, hints, res) fprintf(stderr, "panic!\n"); break; } - if ((sp = getservbyname(servname, proto)) == NULL) + if ((sp = getservbyname((char*)servname, proto)) == NULL) ERR(EAI_SERVICE); port = sp->s_port; if (pai->ai_socktype == ANY) @@ -554,7 +554,7 @@ get_name(addr, afd, res, numaddr, pai, port0) #ifdef INET6 hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error); #else - hp = gethostbyaddr(addr, afd->a_addrlen, AF_INET); + hp = gethostbyaddr((char*)addr, afd->a_addrlen, AF_INET); #endif if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { GET_AI(cur, afd, hp->h_addr_list[0], port); @@ -606,7 +606,7 @@ get_addr(hostname, af, res, pai, port0) } else hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error); #else - hp = gethostbyname(hostname); + hp = gethostbyname((char*)hostname); h_error = h_errno; #endif if (hp == NULL) { diff --git a/ext/socket/socket.c b/ext/socket/socket.c index e30d25404d..5cebe593bc 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -13,6 +13,7 @@ #include "ruby.h" #include "rubyio.h" #include "rubysig.h" +#include "util.h" #include #include @@ -31,6 +32,9 @@ # include #endif #include +#ifdef HAVE_NETINET_IN_SYSTM_H +# include +#endif #ifdef HAVE_NETINET_TCP_H # include #endif @@ -2016,7 +2020,7 @@ sock_s_gethostbyaddr(argc, argv) t = AF_INET6; } #endif - h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len, t); + h = gethostbyaddr((char*)RSTRING(addr)->ptr, RSTRING(addr)->len, t); if (h == NULL) { #ifdef HAVE_HSTRERROR extern int h_errno; @@ -2061,7 +2065,7 @@ sock_s_getservbyaname(argc, argv) else proto = StringValuePtr(protocol); StringValue(service); - sp = getservbyname(RSTRING(service)->ptr, proto); + sp = getservbyname((char*)RSTRING(service)->ptr, proto); if (sp) { port = ntohs(sp->s_port); } diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c index 5ee2c6b89a..ce386eda30 100644 --- a/ext/syslog/syslog.c +++ b/ext/syslog/syslog.c @@ -8,6 +8,7 @@ */ #include "ruby.h" +#include "util.h" #include /* Syslog class */ diff --git a/file.c b/file.c index 4935dc1690..84eb47f500 100644 --- a/file.c +++ b/file.c @@ -1419,14 +1419,12 @@ has_drive_letter(buf) } } -static void -getcwdofdrv(drv, buf, len) +static char* +getcwdofdrv(drv) int drv; - char *buf; - int len; { char drive[4]; - char oldcwd[MAXPATHLEN+1]; + char *drvcwd, *oldcwd; drive[0] = drv; drive[1] = ':'; @@ -1436,15 +1434,17 @@ getcwdofdrv(drv, buf, len) of a particular drive is to change chdir() to that drive, so save the old cwd before chdir() */ - getcwd(oldcwd, MAXPATHLEN); + oldcwd = my_getcwd(); if (chdir(drive) == 0) { - getcwd(buf, len); + drvcwd = my_getcwd(); chdir(oldcwd); + free(oldcwd); } else { /* perhaps the drive is not exist. we return only drive letter */ - strncpy(buf, drive, len); + drvcwd = strdup(drive); } + return drvcwd; } #endif @@ -1630,9 +1630,13 @@ file_expand_path(fname, dname, result) } } if (!same) { - BUFCHECK(buflen < MAXPATHLEN); - getcwdofdrv(*s, buf, MAXPATHLEN); + char *dir = getcwdofdrv(*s); + tainted = 1; + dirlen = strlen(dir); + BUFCHECK(dirlen > buflen); + strcpy(buf, dir); + free(dir); } p = chompdirsep(skiproot(buf)); s += 2; diff --git a/gc.c b/gc.c index 0fa9fd33b8..238c551057 100644 --- a/gc.c +++ b/gc.c @@ -1358,6 +1358,9 @@ Init_stack(addr) if (STACK_LEVEL_MAX > IA64_MAGIC_STACK_LIMIT) STACK_LEVEL_MAX = IA64_MAGIC_STACK_LIMIT; #endif +#ifdef _THREAD_SAFE + STACK_LEVEL_MAX /= 4; +#endif #endif } diff --git a/lib/cgi.rb b/lib/cgi.rb index 29351c24bf..103452a762 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -1036,7 +1036,7 @@ class CGI eval <<-END def body.local_path - #{body.path.dump} + #{(body.class == StringIO)? "" : body.path.dump} end END diff --git a/lib/fileutils.rb b/lib/fileutils.rb index ee62f5838b..dbab74aae0 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -751,7 +751,7 @@ module FileUtils end def have_st_ino? - /mswin|mingw|bccwin|wince|emx/ !~ RUBY_PLATFORM + /djgpp|mswin|mingw|bccwin|wince|emx/ !~ RUBY_PLATFORM end def fu_stream_blksize( *streams ) diff --git a/lib/mkmf.rb b/lib/mkmf.rb index 4628cb51c0..15a74aec16 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -215,6 +215,7 @@ def link_command(ldflags, opt="", libpath=$LIBPATH) 'INCFLAGS' => $INCFLAGS, 'CPPFLAGS' => $CPPFLAGS, 'CFLAGS' => "#$CFLAGS", + 'XCFLAGS' => "#$XCFLAGS", 'LDFLAGS' => "#$LDFLAGS #{ldflags}", 'LIBPATH' => libpathflag(libpath), 'LOCAL_LIBS' => "#$LOCAL_LIBS #$libs", @@ -223,7 +224,7 @@ end def cc_command(opt="") "$(CC) -c #$INCFLAGS -I#{$hdrdir} " \ - "#$CPPFLAGS #$CFLAGS #{opt} #{CONFTEST_C}" + "#$CPPFLAGS #$CFLAGS #$XCFLAGS #{opt} #{CONFTEST_C}" end def cpp_command(outfile, opt="") @@ -720,7 +721,7 @@ LIBRUBY_A = #{CONFIG['LIBRUBY_A']} LIBRUBYARG_SHARED = #$LIBRUBYARG_SHARED LIBRUBYARG_STATIC = #$LIBRUBYARG_STATIC -CFLAGS = #{CONFIG['CCDLFLAGS'] unless $static} #$CFLAGS +CFLAGS = #{CONFIG['CCDLFLAGS'] unless $static} #{CONFIG['XCFLAGS']} #$CFLAGS CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) #{$defs.join(" ")} #{$CPPFLAGS} CXXFLAGS = $(CFLAGS) #{CONFIG['CXXFLAGS']} DLDFLAGS = #$LDFLAGS #{CONFIG['DLDFLAGS']} #$DLDFLAGS @@ -943,6 +944,7 @@ def init_mkmf(config = CONFIG) $enable_shared = config['ENABLE_SHARED'] == 'yes' $defs = [] $CFLAGS = with_config("cflags", arg_config("CFLAGS", config["CFLAGS"])).dup + $XCFLAGS = config['XCFLAGS'].dup $CPPFLAGS = with_config("cppflags", arg_config("CPPFLAGS", config["CPPFLAGS"])).dup $LDFLAGS = (with_config("ldflags") || "").dup $INCFLAGS = "-I#{$topdir}" diff --git a/lib/xsd/charset.rb b/lib/xsd/charset.rb index 88d4f99043..3daace7bf3 100644 --- a/lib/xsd/charset.rb +++ b/lib/xsd/charset.rb @@ -41,7 +41,7 @@ public EncodingConvertMap[['UTF8', 'EUC' ]] = Proc.new { |str| IconvCharset.safe_iconv("euc-jp", "utf-8", str) } EncodingConvertMap[['EUC' , 'UTF8']] = Proc.new { |str| IconvCharset.safe_iconv("utf-8", "euc-jp", str) } EncodingConvertMap[['EUC' , 'SJIS']] = Proc.new { |str| IconvCharset.safe_iconv("shift-jis", "euc-jp", str) } - if /(mswin|bccwin|mingw|cygwin)/ =~ RUBY_PLATFORM + if /(mswin|bccwin|mingw|cygwin|emx)/ =~ RUBY_PLATFORM EncodingConvertMap[['UTF8', 'SJIS']] = Proc.new { |str| IconvCharset.safe_iconv("cp932", "utf-8", str) } EncodingConvertMap[['SJIS', 'UTF8']] = Proc.new { |str| IconvCharset.safe_iconv("utf-8", "cp932", str) } EncodingConvertMap[['SJIS', 'EUC' ]] = Proc.new { |str| IconvCharset.safe_iconv("euc-jp", "cp932", str) } diff --git a/main.c b/main.c index 02d8d1458e..aa264e8507 100644 --- a/main.c +++ b/main.c @@ -29,7 +29,7 @@ int _CRT_glob = 0; #endif /* to link startup code with ObjC support */ -#if defined(__APPLE__) && defined(__MACH__) +#if (defined(__APPLE__) || defined(__NeXT__)) && defined(__MACH__) static void objcdummyfunction( void ) { objc_msgSend(); } #endif diff --git a/marshal.c b/marshal.c index 48d71babae..d998293da8 100644 --- a/marshal.c +++ b/marshal.c @@ -345,14 +345,15 @@ hash_each(key, value, arg) } static void -w_extended(klass, arg) +w_extended(klass, arg, check) VALUE klass; struct dump_arg *arg; + int check; { char *path; if (FL_TEST(klass, FL_SINGLETON)) { - if (RCLASS(klass)->m_tbl->num_entries || + if (check && RCLASS(klass)->m_tbl->num_entries || (RCLASS(klass)->iv_tbl && RCLASS(klass)->iv_tbl->num_entries > 1)) { rb_raise(rb_eTypeError, "singleton can't be dumped"); } @@ -367,15 +368,16 @@ w_extended(klass, arg) } static void -w_class(type, obj, arg) +w_class(type, obj, arg, check) int type; VALUE obj; struct dump_arg *arg; + int check; { char *path; VALUE klass = CLASS_OF(obj); - w_extended(klass, arg); + w_extended(klass, arg, check); w_byte(type, arg); path = rb_class2name(klass); w_unique(path, arg); @@ -388,7 +390,7 @@ w_uclass(obj, base_klass, arg) { VALUE klass = CLASS_OF(obj); - w_extended(klass, arg); + w_extended(klass, arg, Qtrue); klass = rb_class_real(klass); if (klass != base_klass) { w_byte(TYPE_UCLASS, arg); @@ -429,6 +431,7 @@ w_object(obj, arg, limit) { struct dump_call_arg c_arg; st_table *ivtbl = 0; + st_data_t num; if (limit == 0) { rb_raise(rb_eArgError, "exceed depth limit"); @@ -438,6 +441,12 @@ w_object(obj, arg, limit) c_arg.limit = limit; c_arg.arg = arg; + if (st_lookup(arg->data, obj, &num)) { + w_byte(TYPE_LINK, arg); + w_long((long)num, arg); + return; + } + if (ivtbl = rb_generic_ivar_table(obj)) { w_byte(TYPE_IVAR, arg); } @@ -468,14 +477,6 @@ w_object(obj, arg, limit) w_symbol(SYM2ID(obj), arg); } else { - st_data_t num; - - if (st_lookup(arg->data, obj, &num)) { - w_byte(TYPE_LINK, arg); - w_long((long)num, arg); - return; - } - if (OBJ_TAINTED(obj)) arg->taint = Qtrue; st_add_direct(arg->data, obj, arg->data->num_entries); @@ -483,7 +484,7 @@ w_object(obj, arg, limit) VALUE v; v = rb_funcall(obj, s_mdump, 0, 0); - w_class(TYPE_USRMARSHAL, obj, arg); + w_class(TYPE_USRMARSHAL, obj, arg, Qfalse); w_object(v, arg, limit); if (ivtbl) w_ivar(0, &c_arg); return; @@ -498,7 +499,7 @@ w_object(obj, arg, limit) if (!ivtbl && (ivtbl = rb_generic_ivar_table(v))) { w_byte(TYPE_IVAR, arg); } - w_class(TYPE_USERDEF, obj, arg); + w_class(TYPE_USERDEF, obj, arg, Qfalse); w_bytes(RSTRING(v)->ptr, RSTRING(v)->len, arg); if (ivtbl) { w_ivar(ivtbl, &c_arg); @@ -614,7 +615,7 @@ w_object(obj, arg, limit) break; case T_STRUCT: - w_class(TYPE_STRUCT, obj, arg); + w_class(TYPE_STRUCT, obj, arg, Qtrue); { long len = RSTRUCT(obj)->len; VALUE mem; @@ -633,7 +634,7 @@ w_object(obj, arg, limit) break; case T_OBJECT: - w_class(TYPE_OBJECT, obj, arg); + w_class(TYPE_OBJECT, obj, arg, Qtrue); w_ivar(ROBJECT(obj)->iv_tbl, &c_arg); break; @@ -641,10 +642,10 @@ w_object(obj, arg, limit) { VALUE v; - w_class(TYPE_DATA, obj, arg); + w_class(TYPE_DATA, obj, arg, Qtrue); if (!rb_respond_to(obj, s_dump_data)) { rb_raise(rb_eTypeError, - "class %s needs to have instance method `_dump_data'", + "no marshal_dump is defined for class %s", rb_obj_classname(obj)); } v = rb_funcall(obj, s_dump_data, 0); diff --git a/test/csv/test_csv.rb b/test/csv/test_csv.rb index 96712209d1..782f5af8d4 100644 --- a/test/csv/test_csv.rb +++ b/test/csv/test_csv.rb @@ -1,5 +1,4 @@ -require 'test/unit/testsuite' -require 'test/unit/testcase' +require 'test/unit' require 'tempfile' require 'fileutils' diff --git a/test/ruby/test_file.rb b/test/ruby/test_file.rb index d0ba276d33..0d0ea389a4 100644 --- a/test/ruby/test_file.rb +++ b/test/ruby/test_file.rb @@ -13,7 +13,7 @@ class TestFile < Test::Unit::TestCase w.close r = File.open(filename, "r") begin - if /(mswin|bccwin|mingw)/ =~ RUBY_PLATFORM + if /(mswin|bccwin|mingw|emx)/ =~ RUBY_PLATFORM begin File.unlink(filename) assert(false) diff --git a/test/yaml/test_yaml.rb b/test/yaml/test_yaml.rb index 8baad11e5f..cfb6407c29 100644 --- a/test/yaml/test_yaml.rb +++ b/test/yaml/test_yaml.rb @@ -1,8 +1,7 @@ # vim:sw=4:ts=4 # $Id$ # -require 'test/unit/testsuite' -require 'test/unit/testcase' +require 'test/unit' require 'yaml' class YAML_Unit_Tests < Test::Unit::TestCase diff --git a/util.c b/util.c index 456704492a..cb0b4912f4 100644 --- a/util.c +++ b/util.c @@ -636,14 +636,25 @@ ruby_strdup(str) char * ruby_getcwd() { +#ifdef HAVE_GETCWD int size = 200; char *buf = xmalloc(size); while (!getcwd(buf, size)) { - if (errno != ERANGE) rb_sys_fail(0); + if (errno != ERANGE) rb_sys_fail("getcwd"); size *= 2; buf = xrealloc(buf, size); } +#else +# ifndef PATH_MAX +# define PATH_MAX 8192 +# endif + char *buf = xmalloc(PATH_MAX+1); + + if (!getwd(buf)) { + rb_sys_fail("getwd"); + } +#endif return buf; } diff --git a/variable.c b/variable.c index 1e0aea4093..ceb40f9433 100644 --- a/variable.c +++ b/variable.c @@ -1493,7 +1493,14 @@ mod_av_set(klass, id, val, isconst) if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest); - if (OBJ_FROZEN(klass)) rb_error_frozen("class/module"); + if (OBJ_FROZEN(klass)) { + if (BUILTIN_TYPE(klass) == T_MODULE) { + rb_error_frozen("module"); + } + else { + rb_error_frozen("class"); + } + } if (!RCLASS(klass)->iv_tbl) { RCLASS(klass)->iv_tbl = st_init_numtable(); } -- cgit v1.2.3