updated for version 7.0230
diff --git a/src/gui_beval.c b/src/gui_beval.c
index b79884e..077991d 100644
--- a/src/gui_beval.c
+++ b/src/gui_beval.c
@@ -28,6 +28,8 @@
     char_u	*text;
     static char_u  *result = NULL;
     long	winnr = 0;
+    char_u	*bexpr;
+    buf_T	*save_curbuf;
 #ifdef FEAT_WINDOWS
     win_T	*cw;
 #endif
@@ -39,39 +41,51 @@
 	return;
 
 #ifdef FEAT_EVAL
-    if (*p_bexpr != NUL
-	    && get_beval_info(balloonEval, TRUE, &wp, &lnum, &text, &col) == OK)
+    if (get_beval_info(balloonEval, TRUE, &wp, &lnum, &text, &col) == OK)
     {
+	bexpr = (*wp->w_buffer->b_p_bexpr == NUL) ? p_bexpr
+						    : wp->w_buffer->b_p_bexpr;
+	if (*bexpr != NUL)
+	{
 # ifdef FEAT_WINDOWS
-	/* Convert window pointer to number. */
-	for (cw = firstwin; cw != wp; cw = cw->w_next)
-	    ++winnr;
+	    /* Convert window pointer to number. */
+	    for (cw = firstwin; cw != wp; cw = cw->w_next)
+		++winnr;
 # endif
 
-	set_vim_var_nr(VV_BEVAL_BUFNR, (long)wp->w_buffer->b_fnum);
-	set_vim_var_nr(VV_BEVAL_WINNR, winnr);
-	set_vim_var_nr(VV_BEVAL_LNUM, (long)lnum);
-	set_vim_var_nr(VV_BEVAL_COL, (long)(col + 1));
-	set_vim_var_string(VV_BEVAL_TEXT, text, -1);
-	vim_free(text);
+	    set_vim_var_nr(VV_BEVAL_BUFNR, (long)wp->w_buffer->b_fnum);
+	    set_vim_var_nr(VV_BEVAL_WINNR, winnr);
+	    set_vim_var_nr(VV_BEVAL_LNUM, (long)lnum);
+	    set_vim_var_nr(VV_BEVAL_COL, (long)(col + 1));
+	    set_vim_var_string(VV_BEVAL_TEXT, text, -1);
+	    vim_free(text);
 
-	use_sandbox = was_set_insecurely((char_u *)"balloonexpr", 0);
-	if (use_sandbox)
-	    ++sandbox;
-	++textlock;
+	    /*
+	     * Temporarily change the curbuf, so that we can determine whether
+	     * the buffer-local balloonexpr option was set insecurly.
+	     */
+	    save_curbuf = curbuf;
+	    curbuf = wp->w_buffer;
+	    use_sandbox = was_set_insecurely((char_u *)"balloonexpr",
+				 *curbuf->b_p_bexpr == NUL ? 0 : OPT_LOCAL);
+	    curbuf = save_curbuf;
+	    if (use_sandbox)
+		++sandbox;
+	    ++textlock;
 
-	vim_free(result);
-	result = eval_to_string(p_bexpr, NULL, TRUE);
+	    vim_free(result);
+	    result = eval_to_string(bexpr, NULL, TRUE);
 
-	if (use_sandbox)
-	    --sandbox;
-	--textlock;
+	    if (use_sandbox)
+		--sandbox;
+	    --textlock;
 
-	set_vim_var_string(VV_BEVAL_TEXT, NULL, -1);
-	if (result != NULL && result[0] != NUL)
-	{
-	    gui_mch_post_balloon(beval, result);
-	    return;
+	    set_vim_var_string(VV_BEVAL_TEXT, NULL, -1);
+	    if (result != NULL && result[0] != NUL)
+	    {
+		gui_mch_post_balloon(beval, result);
+		return;
+	    }
 	}
     }
 #endif