diff --git a/src/auto/configure b/src/auto/configure
index 1a0a5a7..f22fee3 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -4629,7 +4629,7 @@
   if test "X$vi_cv_path_ruby" != "X"; then
     echo "$as_me:$LINENO: checking Ruby version" >&5
 echo $ECHO_N "checking Ruby version... $ECHO_C" >&6
-    if $vi_cv_path_ruby -e 'VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
+    if $vi_cv_path_ruby -e 'RUBY_VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
       echo "$as_me:$LINENO: result: OK" >&5
 echo "${ECHO_T}OK" >&6
       echo "$as_me:$LINENO: checking Ruby header files" >&5
diff --git a/src/configure.in b/src/configure.in
index cc8d00e..fb8e330 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -807,7 +807,7 @@
   AC_PATH_PROG(vi_cv_path_ruby, ruby)
   if test "X$vi_cv_path_ruby" != "X"; then
     AC_MSG_CHECKING(Ruby version)
-    if $vi_cv_path_ruby -e 'VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
+    if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
       AC_MSG_RESULT(OK)
       AC_MSG_CHECKING(Ruby header files)
       rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
diff --git a/src/gui_mac.c b/src/gui_mac.c
index bbf329d..03dc326 100644
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -3879,6 +3879,12 @@
     TextSize(font >> 16);
     TextFont(font & 0xFFFF);
 
+    GetFontInfo(&font_info);
+
+    gui.char_ascent = font_info.ascent;
+    gui.char_width  = CharWidth('_');
+    gui.char_height = font_info.ascent + font_info.descent + p_linespace;
+
 #ifdef USE_ATSUI_DRAWING
     ATSUFontID			fontID;
     Fixed			fontSize;
@@ -3927,12 +3933,6 @@
     }
 #endif
 
-    GetFontInfo(&font_info);
-
-    gui.char_ascent = font_info.ascent;
-    gui.char_width  = CharWidth('_');
-    gui.char_height = font_info.ascent + font_info.descent + p_linespace;
-
     return OK;
 
 }
@@ -4313,11 +4313,6 @@
     int		len;
     int		flags;
 {
-#if defined(FEAT_GUI) && defined(MACOS_X)
-#ifndef USE_ATSUI_DRAWING
-    SInt32	sys_version;
-#endif
-#endif
 #ifdef FEAT_MBYTE
 #ifdef USE_ATSUI_DRAWING
     /* ATSUI requires utf-16 strings */
@@ -4342,10 +4337,7 @@
     /*
      * On OS X, try using Quartz-style text antialiasing.
      */
-    sys_version = 0;
-
-    Gestalt(gestaltSystemVersion, &sys_version);
-    if (sys_version >= 0x1020)
+    if (gMacSystemVersion >= 0x1020)
     {
 	/* Quartz antialiasing is available only in OS 10.2 and later. */
 	UInt32 qd_flags = (p_antialias ?
@@ -4366,7 +4358,7 @@
 #ifdef USE_ATSUI_DRAWING
     if ((flags & DRAW_TRANSP) == 0)
 #else
-    if (((sys_version >= 0x1020 && p_antialias) || p_linespace != 0)
+    if (((gMacSystemVersion >= 0x1020 && p_antialias) || p_linespace != 0)
 	    && !(flags & DRAW_TRANSP))
 #endif
     {
@@ -4394,7 +4386,7 @@
     }
 
 #ifndef USE_ATSUI_DRAWING
-    if (sys_version >= 0x1020 && p_antialias)
+    if (gMacSystemVersion >= 0x1020 && p_antialias)
     {
 	StyleParameter face;
 
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 2308362..8bcec1d 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -3947,7 +3947,7 @@
 /* BALLOON-EVAL IMPLEMENTATION FOR WINDOWS.
  *  Added by Sergey Khorev <sergey.khorev@gmail.com>
  *
- * The only reused thing is gui_beval.h and gui_mch_get_beval_info()
+ * The only reused thing is gui_beval.h and get_beval_info()
  * from gui_beval.c (note it uses x and y of the BalloonEval struct
  * to get current mouse position).
  *
diff --git a/src/proto/gui_gtk.pro b/src/proto/gui_gtk.pro
index 882587e..afe38dc 100644
--- a/src/proto/gui_gtk.pro
+++ b/src/proto/gui_gtk.pro
@@ -14,7 +14,6 @@
 char_u *gui_mch_browse __ARGS((int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter));
 char_u *gui_mch_browsedir __ARGS((char_u *title, char_u *initdir));
 int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
-int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
 void gui_mch_show_popupmenu __ARGS((vimmenu_T *menu));
 void gui_make_popup __ARGS((char_u *path_name));
 void gui_mch_find_dialog __ARGS((exarg_T *eap));
diff --git a/src/proto/netbeans.pro b/src/proto/netbeans.pro
index 31b7ef3..f6b7d7d 100644
--- a/src/proto/netbeans.pro
+++ b/src/proto/netbeans.pro
@@ -1,9 +1,11 @@
 /* netbeans.c */
+void netbeans_w32_connect __ARGS((void));
 void messageFromNetbeansW32 __ARGS((void));
 int isNetbeansBuffer __ARGS((buf_T *bufp));
 int isNetbeansModified __ARGS((buf_T *bufp));
 void netbeans_end __ARGS((void));
 void ex_nbkey __ARGS((exarg_T *eap));
+void netbeans_beval_cb __ARGS((BalloonEval *beval, int state));
 void netbeans_startup_done __ARGS((void));
 void netbeans_send_disconnect __ARGS((void));
 void netbeans_frame_moved __ARGS((int new_x, int new_y));
diff --git a/src/proto/workshop.pro b/src/proto/workshop.pro
index 13a1050..426fded 100644
--- a/src/proto/workshop.pro
+++ b/src/proto/workshop.pro
@@ -44,5 +44,6 @@
 char *workshop_test_getcursorrowtext __ARGS((void));
 char *workshop_test_getselectedtext __ARGS((void));
 void workshop_save_sensitivity __ARGS((char *filename));
+void workshop_beval_cb __ARGS((BalloonEval *beval, int state));
 void findYourself __ARGS((char *argv0));
 /* vim: set ft=c : */
diff --git a/src/quickfix.c b/src/quickfix.c
index d9ce186..c34f47f 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2418,27 +2418,6 @@
 	else
 	{
 	    found_match = FALSE;
-#if 0
-#ifdef HAVE_SETJMP_H
-	    /*
-	     * Matching with a regexp may cause a very deep recursive call of
-	     * regmatch().  Vim will crash when running out of stack space.
-	     * Catch this here if the system supports it.
-	     * It's a bit slow, thus do it outside of the loop.
-	     */
-	    mch_startjmp();
-	    if (SETJMP(lc_jump_env) != 0)
-	    {
-		mch_didjmp();
-# ifdef SIGHASARG
-		if (lc_signal != SIGINT)
-# endif
-		    EMSG(_(e_complex));
-		got_int = TRUE;
-		goto jumpend;
-	    }
-#endif
-#endif
 	    /* Try for a match in all lines of the buffer. */
 	    for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
 	    {
@@ -2477,12 +2456,6 @@
 		if (got_int)
 		    break;
 	    }
-#if 0
-#ifdef HAVE_SETJMP_H
-jumpend:
-	    mch_endjmp();
-#endif
-#endif
 
 	    if (using_dummy)
 	    {
diff --git a/src/regexp.c b/src/regexp.c
index 79d3e2a..9ad719c 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -3184,49 +3184,21 @@
     return r;
 }
 
-#if 0	/* disabled, no longer needed now that regmatch() is not recursive */
-# ifdef HAVE_SETJMP_H
-#  define USE_SETJMP
-# endif
-# ifdef HAVE_TRY_EXCEPT
-#  define USE_TRY_EXCEPT
-# endif
-#endif
-
 /*
  * Match a regexp against a string ("line" points to the string) or multiple
  * lines ("line" is NULL, use reg_getline()).
  */
-#ifdef USE_SETJMP
-    static long
-vim_regexec_both(line_arg, col_arg)
-    char_u	*line_arg;
-    colnr_T	col_arg;	/* column to start looking for match */
-#else
     static long
 vim_regexec_both(line, col)
     char_u	*line;
     colnr_T	col;		/* column to start looking for match */
-#endif
 {
     regprog_T	*prog;
     char_u	*s;
-    long	retval;
-#ifdef USE_SETJMP
-    char_u	*line;
-    colnr_T	col;
-    int		did_mch_startjmp = FALSE;
-#endif
+    long	retval = 0L;
 
     reg_tofree = NULL;
 
-#ifdef USE_SETJMP
-    /* Trick to avoid "might be clobbered by `longjmp'" warning from gcc. */
-    line = line_arg;
-    col = col_arg;
-#endif
-    retval = 0L;
-
     if (REG_MULTI)
     {
 	prog = reg_mmatch->regprog;
@@ -3312,36 +3284,6 @@
 	    goto theend;
     }
 
-#ifdef USE_TRY_EXCEPT
-    __try
-    {
-#endif
-
-#ifdef USE_SETJMP
-    /*
-     * Matching with a regexp may cause a very deep recursive call of
-     * regmatch().  Vim will crash when running out of stack space.  Catch
-     * this here if the system supports it.
-     * It's a bit slow, do it after the check for "regmust".
-     * Don't do it if the caller already set it up.
-     */
-    if (!lc_active)
-    {
-	did_mch_startjmp = TRUE;
-	mch_startjmp();
-	if (SETJMP(lc_jump_env) != 0)
-	{
-	    mch_didjmp();
-# ifdef SIGHASARG
-	    if (lc_signal != SIGINT)
-# endif
-		EMSG(_(e_complex));
-	    retval = 0L;
-	    goto inner_end;
-	}
-    }
-#endif
-
     regline = line;
     reglnum = 0;
 
@@ -3414,26 +3356,6 @@
 	}
     }
 
-#ifdef USE_SETJMP
-inner_end:
-    if (did_mch_startjmp)
-	mch_endjmp();
-#endif
-#ifdef USE_TRY_EXCEPT
-    }
-    __except(EXCEPTION_EXECUTE_HANDLER)
-    {
-	if (GetExceptionCode() == EXCEPTION_STACK_OVERFLOW)
-	{
-	    RESETSTKOFLW();
-	    EMSG(_(e_outofstack));
-	}
-	else
-	    EMSG(_(e_complex));
-	retval = 0L;
-    }
-#endif
-
 theend:
     /* Didn't find a match. */
     vim_free(reg_tofree);
@@ -3505,68 +3427,67 @@
 	need_clear_zsubexpr = TRUE;
 #endif
 
-    if (regmatch(prog->program + 1))
+    if (regmatch(prog->program + 1) == 0)
+	return 0;
+
+    cleanup_subexpr();
+    if (REG_MULTI)
     {
-	cleanup_subexpr();
-	if (REG_MULTI)
+	if (reg_startpos[0].lnum < 0)
 	{
-	    if (reg_startpos[0].lnum < 0)
-	    {
-		reg_startpos[0].lnum = 0;
-		reg_startpos[0].col = col;
-	    }
-	    if (reg_endpos[0].lnum < 0)
-	    {
-		reg_endpos[0].lnum = reglnum;
-		reg_endpos[0].col = (int)(reginput - regline);
-	    }
-	    else
-		/* Use line number of "\ze". */
-		reglnum = reg_endpos[0].lnum;
+	    reg_startpos[0].lnum = 0;
+	    reg_startpos[0].col = col;
+	}
+	if (reg_endpos[0].lnum < 0)
+	{
+	    reg_endpos[0].lnum = reglnum;
+	    reg_endpos[0].col = (int)(reginput - regline);
 	}
 	else
-	{
-	    if (reg_startp[0] == NULL)
-		reg_startp[0] = regline + col;
-	    if (reg_endp[0] == NULL)
-		reg_endp[0] = reginput;
-	}
+	    /* Use line number of "\ze". */
+	    reglnum = reg_endpos[0].lnum;
+    }
+    else
+    {
+	if (reg_startp[0] == NULL)
+	    reg_startp[0] = regline + col;
+	if (reg_endp[0] == NULL)
+	    reg_endp[0] = reginput;
+    }
 #ifdef FEAT_SYN_HL
-	/* Package any found \z(...\) matches for export. Default is none. */
-	unref_extmatch(re_extmatch_out);
-	re_extmatch_out = NULL;
+    /* Package any found \z(...\) matches for export. Default is none. */
+    unref_extmatch(re_extmatch_out);
+    re_extmatch_out = NULL;
 
-	if (prog->reghasz == REX_SET)
+    if (prog->reghasz == REX_SET)
+    {
+	int		i;
+
+	cleanup_zsubexpr();
+	re_extmatch_out = make_extmatch();
+	for (i = 0; i < NSUBEXP; i++)
 	{
-	    int		i;
-
-	    cleanup_zsubexpr();
-	    re_extmatch_out = make_extmatch();
-	    for (i = 0; i < NSUBEXP; i++)
+	    if (REG_MULTI)
 	    {
-		if (REG_MULTI)
-		{
-		    /* Only accept single line matches. */
-		    if (reg_startzpos[i].lnum >= 0
-			    && reg_endzpos[i].lnum == reg_startzpos[i].lnum)
-			re_extmatch_out->matches[i] =
-			    vim_strnsave(reg_getline(reg_startzpos[i].lnum)
+		/* Only accept single line matches. */
+		if (reg_startzpos[i].lnum >= 0
+			&& reg_endzpos[i].lnum == reg_startzpos[i].lnum)
+		    re_extmatch_out->matches[i] =
+			vim_strnsave(reg_getline(reg_startzpos[i].lnum)
 						       + reg_startzpos[i].col,
-				    reg_endzpos[i].col - reg_startzpos[i].col);
-		}
-		else
-		{
-		    if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
-			re_extmatch_out->matches[i] =
+				   reg_endzpos[i].col - reg_startzpos[i].col);
+	    }
+	    else
+	    {
+		if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
+		    re_extmatch_out->matches[i] =
 			    vim_strnsave(reg_startzp[i],
-				    (int)(reg_endzp[i] - reg_startzp[i]));
-		}
+					(int)(reg_endzp[i] - reg_startzp[i]));
 	    }
 	}
-#endif
-	return 1 + reglnum;
     }
-    return 0;
+#endif
+    return 1 + reglnum;
 }
 
 #ifdef FEAT_MBYTE
@@ -4601,7 +4522,12 @@
 		    /* It could match.  Prepare for trying to match what
 		     * follows.  The code is below.  Parameters are stored in
 		     * a regstar_T on the regstack. */
-		    if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
+		    if (((unsigned)regstack.ga_len >> 10) >= p_mmp)
+		    {
+			EMSG(_(e_maxmempat));
+			status = RA_FAIL;
+		    }
+		    else if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
 			status = RA_FAIL;
 		    else
 		    {
@@ -4641,7 +4567,12 @@
 	  case BEHIND:
 	  case NOBEHIND:
 	    /* Need a bit of room to store extra positions. */
-	    if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
+	    if (((unsigned)regstack.ga_len >> 10) >= p_mmp)
+	    {
+		EMSG(_(e_maxmempat));
+		status = RA_FAIL;
+	    }
+	    else if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
 		status = RA_FAIL;
 	    else
 	    {
@@ -5029,7 +4960,7 @@
 	    break;
     }
 
-    /* May want to continue with the inner loop. */
+    /* May need to continue with the inner loop, starting at "scan". */
     if (status == RA_CONT)
 	continue;
 
@@ -5050,6 +4981,8 @@
 	    printf("Premature EOL\n");
 #endif
 	}
+	if (status == RA_FAIL)
+	    got_int = TRUE;
 	return (status == RA_MATCH);
     }
 
@@ -5071,6 +5004,11 @@
 {
     regitem_T	*rp;
 
+    if (((unsigned)regstack->ga_len >> 10) >= p_mmp)
+    {
+	EMSG(_(e_maxmempat));
+	return NULL;
+    }
     if (ga_grow(regstack, sizeof(regitem_T)) == FAIL)
 	return NULL;
 
diff --git a/src/workshop.c b/src/workshop.c
index a80575f..e17f0e6 100644
--- a/src/workshop.c
+++ b/src/workshop.c
@@ -58,7 +58,7 @@
 static void	 load_window(char *, int lnum);
 static void	 warp_to_pc(int);
 #ifdef FEAT_BEVAL
-static void	 bevalCB(BalloonEval *, int);
+void		workshop_beval_cb(BalloonEval *, int);
 #endif
 static char	*fixAccelText(char *);
 static void	 addMenu(char *, char *, char *);
@@ -74,7 +74,6 @@
 int		 usingSunWorkShop = 0;	/* set if -ws flag is used */
 char		 curMenuName[BUFSIZ];
 char		 curMenuPriority[BUFSIZ];
-BalloonEval	*balloonEval;
 
 static Boolean	 workshopInitDone = False;
 static Boolean	 workshopHotKeysEnabled = False;
@@ -220,21 +219,7 @@
 #endif
 
 #ifdef FEAT_BEVAL
-    if (balloonEval == NULL)
-    {
-	/*
-	 * Set up the Balloon Expression Evaluation area.
-	 * It's enabled by default.  Disable it when 'ballooneval' is off.
-	 */
-# ifdef FEAT_GUI_GTK
-	balloonEval = gui_mch_create_beval_area(gui.drawarea, NULL,
-							      &bevalCB, NULL);
-# else
-	balloonEval = gui_mch_create_beval_area(textArea, NULL, bevalCB, NULL);
-# endif
-	if (!p_beval)
-	    gui_mch_disable_beval_area(balloonEval);
-    }
+    bevalServers |= BEVAL_WORKSHOP;
 #endif
 
     load_window(filename, line);
@@ -1566,15 +1551,15 @@
 }
 
 #ifdef FEAT_BEVAL
-    static void
-bevalCB(
+    void
+workshop_beval_cb(
 	BalloonEval	*beval,
 	int		 state)
 {
-    char_u	*filename;
+    win_T	*wp;
     char_u	*text;
     int		 type;
-    int		 line;
+    linenr_T	 lnum;
     int		 col;
     int		 idx;
     char	 buf[MAXPATHLEN * 2];
@@ -1583,7 +1568,7 @@
     if (!p_beval)
 	return;
 
-    if (gui_mch_get_beval_info(beval, &filename, &line, &text, &col) == OK)
+    if (get_beval_info(beval, FALSE, &wp, &lnum, &text, &col) == OK)
     {
 	if (text && text[0])
 	{
@@ -1606,7 +1591,7 @@
 	    idx = computeIndex(col, text, beval->ts);
 	    if (idx > 0)
 	    {
-		line = 0;
+		lnum = 0;
 
 		/*
 		 * If successful, it will respond with a balloon cmd.
@@ -1623,9 +1608,10 @@
 
 		/* Send request to dbx */
 		sprintf(buf, "toolVerb debug.balloonEval "
-			"%s %d,0 %d,0 %d,%d %d %s\n", (char *) filename,
-			line, idx, type, serialNo++,
-			strlen((char *) text), (char *) text);
+			"%s %ld,0 %d,0 %d,%d %ld %s\n",
+			(char *)wp->w_buffer->b_ffname,
+			(long)lnum, idx, type, serialNo++,
+			(long)strlen((char *)text), (char *)text);
 		balloonEval = beval;
 		workshop_send_message(buf);
 	    }
