updated for version 7.0-120
diff --git a/src/ops.c b/src/ops.c
index 9e7927d..be7091f 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -770,6 +770,7 @@
 {
     char_u	*expr_copy;
     char_u	*rv;
+    static int	nested = 0;
 
     if (expr_line == NULL)
 	return NULL;
@@ -780,7 +781,14 @@
     if (expr_copy == NULL)
 	return NULL;
 
+    /* When we are invoked recursively limit the evaluation to 10 levels.
+     * Then return the string as-is. */
+    if (nested >= 10)
+	return expr_copy;
+
+    ++nested;
     rv = eval_to_string(expr_copy, NULL, TRUE);
+    --nested;
     vim_free(expr_copy);
     return rv;
 }
diff --git a/src/version.c b/src/version.c
index 31df517..e3b6b73 100644
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    120,
+/**/
     119,
 /**/
     118,