Index: Makefile.in =================================================================== --- Makefile.in (revision 6439) +++ Makefile.in (working copy) @@ -34,7 +34,7 @@ empty = OUTFLAG = @OUTFLAG@$(empty) -CFLAGS = @CFLAGS@ @XCFLAGS@ @ARCH_FLAG@ +CFLAGS = @CFLAGS@ @XCFLAGS@ @ARCH_FLAG@ @VALGRIND_CFLAGS@ CPPFLAGS = -I. -I$(srcdir) @CPPFLAGS@ LDFLAGS = @STATIC@ $(CFLAGS) @LDFLAGS@ EXTLDFLAGS = Index: configure.in =================================================================== --- configure.in (revision 6439) +++ configure.in (working copy) @@ -895,6 +895,22 @@ fi fi +AC_ARG_ENABLE(valgrind, + [ --enable-valgrind use valgrind support], + [want_valgrind=$enableval], [want_valgrind=auto]) + +if test x"$want_valgrind" != xno; then + AC_CHECK_HEADERS(valgrind/memcheck.h, have_valgrind=yes, have_valgrind=no) + if test x"$have_valgrind" = xyes; then + AC_DEFINE(HAVE_VALGRIND) + VALGRIND_CFLAGS=""; + elif test x"$want_valgrind" = xyes -a x"$have_valgrind" = xno; then + AC_MSG_ERROR(valgrind support requested but valgrind not found) + else + VALGRIND_CFLAGS=""; + fi +fi + dnl default value for $KANJI DEFAULT_KCODE="KCODE_NONE" @@ -1504,6 +1520,7 @@ esac AC_SUBST(XCFLAGS)dnl +AC_SUBST(VALGRIND_CFLAGS)dnl AC_SUBST(XLDFLAGS)dnl AC_SUBST(LIBRUBY_LDSHARED) AC_SUBST(LIBRUBY_DLDFLAGS) Index: eval.c =================================================================== --- eval.c (revision 6439) +++ eval.c (working copy) @@ -28,6 +28,12 @@ #define EXIT_FAILURE 1 #endif +#ifdef HAVE_VALGRIND +#include +#else +#define VALGRIND_MAKE_MEM_DEFINED(p, n) /* empty */ +#endif + #include #include "st.h" @@ -5225,6 +5231,9 @@ int pcall; { ruby_current_node = lhs; + + VALGRIND_MAKE_MEM_DEFINED(&val, sizeof(val)); + if (val == Qundef) { rb_warning("assigning void value"); val = Qnil; Index: gc.c =================================================================== --- gc.c (revision 6439) +++ gc.c (working copy) @@ -30,6 +30,12 @@ #include #endif +#ifdef HAVE_VALGRIND +#include +#else +#define VALGRIND_MAKE_MEM_DEFINED(p, n) /* empty */ +#endif + #if defined _WIN32 || defined __CYGWIN__ #include #endif @@ -93,6 +99,9 @@ { void *mem; + VALGRIND_MAKE_MEM_DEFINED(&malloc_increase, sizeof(malloc_increase)); + VALGRIND_MAKE_MEM_DEFINED(&malloc_limit, sizeof(malloc_limit)); + if (size < 0) { rb_raise(rb_eNoMemError, "negative allocation size (or too big)"); } @@ -623,6 +632,9 @@ register long n; { VALUE v; + + VALGRIND_MAKE_MEM_DEFINED(x, sizeof(*x) * n); + while (n--) { v = *x; if (is_pointer_to_heap((void *)v)) { @@ -713,7 +725,10 @@ { register RVALUE *obj; + VALGRIND_MAKE_MEM_DEFINED(&ptr, sizeof(ptr)); obj = RANY(ptr); + VALGRIND_MAKE_MEM_DEFINED(obj, sizeof(*obj)); + if (rb_special_const_p(ptr)) return; /* special const not marked */ if (obj->as.basic.flags == 0) return; /* free cell */ if (obj->as.basic.flags & FL_MARK) return; /* already marked */