diff --git a/src/userfunc.c b/src/userfunc.c
index 6fa5854..020098d 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -30,7 +30,7 @@
  */
 static hashtab_T	func_hashtab;
 
-/* Used by get_func_tv() */
+// Used by get_func_tv()
 static garray_T funcargs = GA_EMPTY;
 
 // pointer to funccal for currently active function
@@ -128,7 +128,7 @@
 		    goto err_ret;
 		}
 
-		/* Check for duplicate argument name. */
+		// Check for duplicate argument name.
 		for (i = 0; i < newargs->ga_len; ++i)
 		    if (STRCMP(((char_u **)(newargs->ga_data))[i], arg) == 0)
 		    {
@@ -193,7 +193,7 @@
     }
     if (*p != endchar)
 	goto err_ret;
-    ++p;	/* skip "endchar" */
+    ++p;	// skip "endchar"
 
     *argp = p;
     return OK;
@@ -213,7 +213,7 @@
 register_closure(ufunc_T *fp)
 {
     if (fp->uf_scoped == current_funccal)
-	/* no change */
+	// no change
 	return OK;
     funccal_unref(fp->uf_scoped, fp, FALSE);
     fp->uf_scoped = current_funccal;
@@ -249,12 +249,12 @@
     ga_init(&newargs);
     ga_init(&newlines);
 
-    /* First, check if this is a lambda expression. "->" must exist. */
+    // First, check if this is a lambda expression. "->" must exist.
     ret = get_function_args(&start, '-', NULL, NULL, NULL, TRUE);
     if (ret == FAIL || *start != '>')
 	return NOTDONE;
 
-    /* Parse the arguments again. */
+    // Parse the arguments again.
     if (evaluate)
 	pnewargs = &newargs;
     else
@@ -264,11 +264,11 @@
     if (ret == FAIL || **arg != '>')
 	goto errret;
 
-    /* Set up a flag for checking local variables and arguments. */
+    // Set up a flag for checking local variables and arguments.
     if (evaluate)
 	eval_lavars_used = &eval_lavars;
 
-    /* Get the start and the end of the expression. */
+    // Get the start and the end of the expression.
     *arg = skipwhite(*arg + 1);
     s = *arg;
     ret = skip_expr(arg);
@@ -299,7 +299,7 @@
 	if (ga_grow(&newlines, 1) == FAIL)
 	    goto errret;
 
-	/* Add "return " before the expression. */
+	// Add "return " before the expression.
 	len = 7 + e - s + 1;
 	p = alloc(len);
 	if (p == NULL)
@@ -378,7 +378,7 @@
 	if (v->di_tv.vval.v_string == NULL)
 	{
 	    *lenp = 0;
-	    return (char_u *)"";	/* just in case */
+	    return (char_u *)"";	// just in case
 	}
 	s = v->di_tv.vval.v_string;
 	*lenp = (int)STRLEN(s);
@@ -392,7 +392,7 @@
 	if (pt == NULL)
 	{
 	    *lenp = 0;
-	    return (char_u *)"";	/* just in case */
+	    return (char_u *)"";	// just in case
 	}
 	if (partialp != NULL)
 	    *partialp = pt;
@@ -436,8 +436,8 @@
 {
     char_u	*argp;
     int		ret = OK;
-    typval_T	argvars[MAX_FUNC_ARGS + 1];	/* vars for arguments */
-    int		argcount = 0;		/* number of arguments found */
+    typval_T	argvars[MAX_FUNC_ARGS + 1];	// vars for arguments
+    int		argcount = 0;		// number of arguments found
 
     /*
      * Get the arguments.
@@ -446,7 +446,7 @@
     while (argcount < MAX_FUNC_ARGS - (funcexe->partial == NULL ? 0
 						  : funcexe->partial->pt_argc))
     {
-	argp = skipwhite(argp + 1);	    /* skip the '(' or ',' */
+	argp = skipwhite(argp + 1);	    // skip the '(' or ','
 	if (*argp == ')' || *argp == ',' || *argp == NUL)
 	    break;
 	if (eval1(&argp, &argvars[argcount], funcexe->evaluate) == FAIL)
@@ -469,8 +469,8 @@
 
 	if (get_vim_var_nr(VV_TESTING))
 	{
-	    /* Prepare for calling test_garbagecollect_now(), need to know
-	     * what variables are used on the call stack. */
+	    // Prepare for calling test_garbagecollect_now(), need to know
+	    // what variables are used on the call stack.
 	    if (funcargs.ga_itemsize == 0)
 		ga_init2(&funcargs, (int)sizeof(typval_T *), 50);
 	    for (i = 0; i < argcount; ++i)
@@ -530,7 +530,7 @@
 	fname_buf[1] = KS_EXTRA;
 	fname_buf[2] = (int)KE_SNR;
 	i = 3;
-	if (eval_fname_sid(name))	/* "<SID>" or "s:" */
+	if (eval_fname_sid(name))	// "<SID>" or "s:"
 	{
 	    if (current_sctx.sc_sid <= 0)
 		*error = ERROR_SCRIPT;
@@ -751,13 +751,13 @@
  */
     static void
 call_user_func(
-    ufunc_T	*fp,		/* pointer to function */
-    int		argcount,	/* nr of args */
-    typval_T	*argvars,	/* arguments */
-    typval_T	*rettv,		/* return value */
-    linenr_T	firstline,	/* first line of range */
-    linenr_T	lastline,	/* last line of range */
-    dict_T	*selfdict)	/* Dictionary for "self" */
+    ufunc_T	*fp,		// pointer to function
+    int		argcount,	// nr of args
+    typval_T	*argvars,	// arguments
+    typval_T	*rettv,		// return value
+    linenr_T	firstline,	// first line of range
+    linenr_T	lastline,	// last line of range
+    dict_T	*selfdict)	// Dictionary for "self"
 {
     char_u	*save_sourcing_name;
     linenr_T	save_sourcing_lnum;
@@ -768,7 +768,7 @@
     int		default_arg_err = FALSE;
     static int	depth = 0;
     dictitem_T	*v;
-    int		fixvar_idx = 0;	/* index in fixvar[] */
+    int		fixvar_idx = 0;	// index in fixvar[]
     int		i;
     int		ai;
     int		islambda = FALSE;
@@ -781,7 +781,7 @@
     int		started_profiling = FALSE;
 #endif
 
-    /* If depth of calling is getting too high, don't execute the function */
+    // If depth of calling is getting too high, don't execute the function
     if (depth >= p_mfd)
     {
 	emsg(_("E132: Function call depth is higher than 'maxfuncdepth'"));
@@ -791,7 +791,7 @@
     }
     ++depth;
 
-    line_breakcheck();		/* check for CTRL-C hit */
+    line_breakcheck();		// check for CTRL-C hit
 
     fc = ALLOC_CLEAR_ONE(funccall_T);
     if (fc == NULL)
@@ -804,10 +804,10 @@
     fc->linenr = 0;
     fc->returned = FALSE;
     fc->level = ex_nesting_level;
-    /* Check if this function has a breakpoint. */
+    // Check if this function has a breakpoint.
     fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
     fc->dbg_tick = debug_tick;
-    /* Set up fields for closure. */
+    // Set up fields for closure.
     fc->fc_refcount = 0;
     fc->fc_copyID = 0;
     ga_init2(&fc->fc_funcs, sizeof(ufunc_T *), 1);
@@ -827,8 +827,8 @@
     init_var_dict(&fc->l_vars, &fc->l_vars_var, VAR_DEF_SCOPE);
     if (selfdict != NULL)
     {
-	/* Set l:self to "selfdict".  Use "name" to avoid a warning from
-	 * some compiler that checks the destination size. */
+	// Set l:self to "selfdict".  Use "name" to avoid a warning from
+	// some compiler that checks the destination size.
 	v = &fc->fixvar[fixvar_idx++].var;
 	name = v->di_key;
 	STRCPY(name, "self");
@@ -850,8 +850,8 @@
 				(varnumber_T)(argcount >= fp->uf_args.ga_len
 				    ? argcount - fp->uf_args.ga_len : 0));
     fc->l_avars.dv_lock = VAR_FIXED;
-    /* Use "name" to avoid a warning from some compiler that checks the
-     * destination size. */
+    // Use "name" to avoid a warning from some compiler that checks the
+    // destination size.
     v = &fc->fixvar[fixvar_idx++].var;
     name = v->di_key;
     STRCPY(name, "000");
@@ -882,7 +882,7 @@
 	ai = i - fp->uf_args.ga_len;
 	if (ai < 0)
 	{
-	    /* named argument a:name */
+	    // named argument a:name
 	    name = FUNCARG(fp, i);
 	    if (islambda)
 		addlocal = TRUE;
@@ -908,7 +908,7 @@
 	}
 	else
 	{
-	    /* "..." argument a:1, a:2, etc. */
+	    // "..." argument a:1, a:2, etc.
 	    sprintf((char *)numbuf, "%d", ai + 1);
 	    name = numbuf;
 	}
@@ -933,8 +933,8 @@
 
 	if (addlocal)
 	{
-	    /* Named arguments should be accessed without the "a:" prefix in
-	     * lambda expressions.  Add to the l: dict. */
+	    // Named arguments should be accessed without the "a:" prefix in
+	    // lambda expressions.  Add to the l: dict.
 	    copy_tv(&v->di_tv, &v->di_tv);
 	    hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v));
 	}
@@ -951,7 +951,7 @@
 	}
     }
 
-    /* Don't redraw while executing the function. */
+    // Don't redraw while executing the function.
     ++RedrawingDisabled;
     save_sourcing_name = sourcing_name;
     save_sourcing_lnum = sourcing_lnum;
@@ -963,7 +963,7 @@
 	++sandbox;
     }
 
-    /* need space for function name + ("function " + 3) or "[number]" */
+    // need space for function name + ("function " + 3) or "[number]"
     len = (save_sourcing_name == NULL ? 0 : STRLEN(save_sourcing_name))
 						   + STRLEN(fp->uf_name) + 20;
     sourcing_name = alloc(len);
@@ -999,7 +999,7 @@
 			msg_outnum((long)argvars[i].vval.v_number);
 		    else
 		    {
-			/* Do not want errors such as E724 here. */
+			// Do not want errors such as E724 here.
 			++emsg_off;
 			s = tv2string(&argvars[i], &tofree, numbuf2, 0);
 			--emsg_off;
@@ -1017,7 +1017,7 @@
 		}
 		msg_puts(")");
 	    }
-	    msg_puts("\n");   /* don't overwrite this either */
+	    msg_puts("\n");   // don't overwrite this either
 
 	    verbose_leave_scroll();
 	    --no_wait_return;
@@ -1056,7 +1056,7 @@
 
     --RedrawingDisabled;
 
-    /* when the function was aborted because of an error, return -1 */
+    // when the function was aborted because of an error, return -1
     if ((did_emsg && (fp->uf_flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN)
     {
 	clear_tv(rettv);
@@ -1083,7 +1083,7 @@
     }
 #endif
 
-    /* when being verbose, mention the return value */
+    // when being verbose, mention the return value
     if (p_verbose >= 12)
     {
 	++no_wait_return;
@@ -1101,9 +1101,9 @@
 	    char_u	*tofree;
 	    char_u	*s;
 
-	    /* The value may be very long.  Skip the middle part, so that we
-	     * have some idea how it starts and ends. smsg() would always
-	     * truncate it at the end. Don't want errors such as E724 here. */
+	    // The value may be very long.  Skip the middle part, so that we
+	    // have some idea how it starts and ends. smsg() would always
+	    // truncate it at the end. Don't want errors such as E724 here.
 	    ++emsg_off;
 	    s = tv2string(fc->rettv, &tofree, numbuf2, 0);
 	    --emsg_off;
@@ -1118,7 +1118,7 @@
 		vim_free(tofree);
 	    }
 	}
-	msg_puts("\n");   /* don't overwrite this either */
+	msg_puts("\n");   // don't overwrite this either
 
 	verbose_leave_scroll();
 	--no_wait_return;
@@ -1141,7 +1141,7 @@
 	verbose_enter_scroll();
 
 	smsg(_("continuing in %s"), sourcing_name);
-	msg_puts("\n");   /* don't overwrite this either */
+	msg_puts("\n");   // don't overwrite this either
 
 	verbose_leave_scroll();
 	--no_wait_return;
@@ -1231,7 +1231,7 @@
 	return;
     fp->uf_cleared = TRUE;
 
-    /* clear this function */
+    // clear this function
     func_clear_items(fp);
     funccal_unref(fp->uf_scoped, fp, force);
 }
@@ -1243,8 +1243,8 @@
     static void
 func_free(ufunc_T *fp)
 {
-    /* only remove it when not done already, otherwise we would remove a newer
-     * version of the function */
+    // only remove it when not done already, otherwise we would remove a newer
+    // version of the function
     if ((fp->uf_flags & (FC_DELETED | FC_REMOVED)) == 0)
 	func_remove(fp);
 
@@ -1319,7 +1319,7 @@
     long_u	todo = 1;
     long_u	used;
 
-    /* Clean up the current_funccal chain and the funccal stack. */
+    // Clean up the current_funccal chain and the funccal stack.
     while (current_funccal != NULL)
     {
 	clear_tv(current_funccal->rettv);
@@ -1328,17 +1328,17 @@
 	    restore_funccal();
     }
 
-    /* First clear what the functions contain.  Since this may lower the
-     * reference count of a function, it may also free a function and change
-     * the hash table. Restart if that happens. */
+    // First clear what the functions contain.  Since this may lower the
+    // reference count of a function, it may also free a function and change
+    // the hash table. Restart if that happens.
     while (todo > 0)
     {
 	todo = func_hashtab.ht_used;
 	for (hi = func_hashtab.ht_array; todo > 0; ++hi)
 	    if (!HASHITEM_EMPTY(hi))
 	    {
-		/* Only free functions that are not refcounted, those are
-		 * supposed to be freed when no longer referenced. */
+		// Only free functions that are not refcounted, those are
+		// supposed to be freed when no longer referenced.
 		fp = HI2UF(hi);
 		if (func_name_refcount(fp->uf_name))
 		    ++skipped;
@@ -1356,8 +1356,8 @@
 	    }
     }
 
-    /* Now actually free the functions.  Need to start all over every time,
-     * because func_free() may change the hash table. */
+    // Now actually free the functions.  Need to start all over every time,
+    // because func_free() may change the hash table.
     skipped = 0;
     while (func_hashtab.ht_used > skipped)
     {
@@ -1366,8 +1366,8 @@
 	    if (!HASHITEM_EMPTY(hi))
 	    {
 		--todo;
-		/* Only free functions that are not refcounted, those are
-		 * supposed to be freed when no longer referenced. */
+		// Only free functions that are not refcounted, those are
+		// supposed to be freed when no longer referenced.
 		fp = HI2UF(hi);
 		if (func_name_refcount(fp->uf_name))
 		    ++skipped;
@@ -1421,9 +1421,8 @@
 	    emsg(_("E699: Too many arguments"));
 	    break;
 	}
-	/* Make a copy of each argument.  This is needed to be able to set
-	 * v_lock to VAR_FIXED in the copy without changing the original list.
-	 */
+	// Make a copy of each argument.  This is needed to be able to set
+	// v_lock to VAR_FIXED in the copy without changing the original list.
 	copy_tv(&item->li_tv, &argv[argc++]);
     }
 
@@ -1440,7 +1439,7 @@
 	r = call_func(name, -1, rettv, argc, argv, &funcexe);
     }
 
-    /* Free the arguments. */
+    // Free the arguments.
     while (argc > 0)
 	clear_tv(&argv[--argc]);
 
@@ -1529,9 +1528,9 @@
 
     if (partial != NULL)
     {
-	/* When the function has a partial with a dict and there is a dict
-	 * argument, use the dict argument.  That is backwards compatible.
-	 * When the dict was bound explicitly use the one from the partial. */
+	// When the function has a partial with a dict and there is a dict
+	// argument, use the dict argument.  That is backwards compatible.
+	// When the dict was bound explicitly use the one from the partial.
 	if (partial->pt_dict != NULL && (selfdict == NULL || !partial->pt_auto))
 	    selfdict = partial->pt_dict;
 	if (error == ERROR_NONE && partial->pt_argc > 0)
@@ -1556,11 +1555,11 @@
     {
 	char_u *rfname = fname;
 
-	/* Ignore "g:" before a function name. */
+	// Ignore "g:" before a function name.
 	if (fname[0] == 'g' && fname[1] == ':')
 	    rfname = fname + 2;
 
-	rettv->v_type = VAR_NUMBER;	/* default rettv is number zero */
+	rettv->v_type = VAR_NUMBER;	// default rettv is number zero
 	rettv->vval.v_number = 0;
 	error = ERROR_UNKNOWN;
 
@@ -1574,19 +1573,19 @@
 	    else
 		fp = find_func(rfname);
 
-	    /* Trigger FuncUndefined event, may load the function. */
+	    // Trigger FuncUndefined event, may load the function.
 	    if (fp == NULL
 		    && apply_autocmds(EVENT_FUNCUNDEFINED,
 						     rfname, rfname, TRUE, NULL)
 		    && !aborting())
 	    {
-		/* executed an autocommand, search for the function again */
+		// executed an autocommand, search for the function again
 		fp = find_func(rfname);
 	    }
-	    /* Try loading a package. */
+	    // Try loading a package.
 	    if (fp == NULL && script_autoload(rfname, TRUE) && !aborting())
 	    {
-		/* loaded a package, search for the function again */
+		// loaded a package, search for the function again
 		fp = find_func(rfname);
 	    }
 
@@ -1638,8 +1637,8 @@
 					 funcexe->firstline, funcexe->lastline,
 				  (fp->uf_flags & FC_DICT) ? selfdict : NULL);
 		    if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0)
-			/* Function was unreferenced while being used, free it
-			 * now. */
+			// Function was unreferenced while being used, free it
+			// now.
 			func_clear_free(fp, FALSE);
 		    if (did_save_redo)
 			restoreRedobuff(&save_redo);
@@ -1796,10 +1795,10 @@
     char_u *
 trans_function_name(
     char_u	**pp,
-    int		skip,		/* only find the end, don't evaluate */
+    int		skip,		// only find the end, don't evaluate
     int		flags,
-    funcdict_T	*fdp,		/* return: info about dictionary used */
-    partial_T	**partial)	/* return: partial of a FuncRef */
+    funcdict_T	*fdp,		// return: info about dictionary used
+    partial_T	**partial)	// return: partial of a FuncRef
 {
     char_u	*name = NULL;
     char_u	*start;
@@ -1813,8 +1812,8 @@
 	vim_memset(fdp, 0, sizeof(funcdict_T));
     start = *pp;
 
-    /* Check for hard coded <SNR>: already translated function ID (from a user
-     * command). */
+    // Check for hard coded <SNR>: already translated function ID (from a user
+    // command).
     if ((*pp)[0] == K_SPECIAL && (*pp)[1] == KS_EXTRA
 						   && (*pp)[2] == (int)KE_SNR)
     {
@@ -1823,13 +1822,13 @@
 	return vim_strnsave(start, len);
     }
 
-    /* A name starting with "<SID>" or "<SNR>" is local to a script.  But
-     * don't skip over "s:", get_lval() needs it for "s:dict.func". */
+    // A name starting with "<SID>" or "<SNR>" is local to a script.  But
+    // don't skip over "s:", get_lval() needs it for "s:dict.func".
     lead = eval_fname_script(start);
     if (lead > 2)
 	start += lead;
 
-    /* Note that TFN_ flags use the same values as GLV_ flags. */
+    // Note that TFN_ flags use the same values as GLV_ flags.
     end = get_lval(start, NULL, &lv, FALSE, skip, flags | GLV_READ_ONLY,
 					      lead > 2 ? 0 : FNE_CHECK_START);
     if (end == start)
@@ -1891,12 +1890,12 @@
 
     if (lv.ll_name == NULL)
     {
-	/* Error found, but continue after the function name. */
+	// Error found, but continue after the function name.
 	*pp = end;
 	goto theend;
     }
 
-    /* Check if the name is a Funcref.  If so, use the value. */
+    // Check if the name is a Funcref.  If so, use the value.
     if (lv.ll_exp_name != NULL)
     {
 	len = (int)STRLEN(lv.ll_exp_name);
@@ -1918,7 +1917,7 @@
 	*pp = end;
 	if (STRNCMP(name, "<SNR>", 5) == 0)
 	{
-	    /* Change "<SNR>" to the byte sequence. */
+	    // Change "<SNR>" to the byte sequence.
 	    name[0] = K_SPECIAL;
 	    name[1] = KS_EXTRA;
 	    name[2] = (int)KE_SNR;
@@ -1933,8 +1932,8 @@
 	if (lead <= 2 && lv.ll_name == lv.ll_exp_name
 					 && STRNCMP(lv.ll_name, "s:", 2) == 0)
 	{
-	    /* When there was "s:" already or the name expanded to get a
-	     * leading "s:" then remove it. */
+	    // When there was "s:" already or the name expanded to get a
+	    // leading "s:" then remove it.
 	    lv.ll_name += 2;
 	    len -= 2;
 	    lead = 2;
@@ -1942,7 +1941,7 @@
     }
     else
     {
-	/* skip over "s:" and "g:" */
+	// skip over "s:" and "g:"
 	if (lead == 2 || (lv.ll_name[0] == 'g' && lv.ll_name[1] == ':'))
 	    lv.ll_name += 2;
 	len = (int)(end - lv.ll_name);
@@ -1954,14 +1953,14 @@
      * Accept <SNR>123_name() outside a script.
      */
     if (skip)
-	lead = 0;	/* do nothing */
+	lead = 0;	// do nothing
     else if (lead > 0)
     {
 	lead = 3;
 	if ((lv.ll_exp_name != NULL && eval_fname_sid(lv.ll_exp_name))
 						       || eval_fname_sid(*pp))
 	{
-	    /* It's "s:" or "<SID>" */
+	    // It's "s:" or "<SID>"
 	    if (current_sctx.sc_sid <= 0)
 	    {
 		emsg(_(e_usingsid));
@@ -1996,7 +1995,7 @@
 	    name[0] = K_SPECIAL;
 	    name[1] = KS_EXTRA;
 	    name[2] = (int)KE_SNR;
-	    if (lead > 3)	/* If it's "<SID>" */
+	    if (lead > 3)	// If it's "<SID>"
 		STRCPY(name + 3, sid_buf);
 	}
 	mch_memmove(name + lead, lv.ll_name, (size_t)len);
@@ -2036,7 +2035,7 @@
     int		nesting;
     dictitem_T	*v;
     funcdict_T	fudi;
-    static int	func_nr = 0;	    /* number for nameless function */
+    static int	func_nr = 0;	    // number for nameless function
     int		paren;
     hashtab_T	*ht;
     int		todo;
@@ -2149,8 +2148,8 @@
 	    eap->skip = TRUE;
     }
 
-    /* An error in a function call during evaluation of an expression in magic
-     * braces should not cause the function not to be defined. */
+    // An error in a function call during evaluation of an expression in magic
+    // braces should not cause the function not to be defined.
     saved_did_emsg = did_emsg;
     did_emsg = FALSE;
 
@@ -2184,7 +2183,7 @@
 		    if (j < 99)
 			msg_putchar(' ');
 		    msg_prt_line(FUNCLINE(fp, j), FALSE);
-		    out_flush();	/* show a line at a time */
+		    out_flush();	// show a line at a time
 		    ui_breakcheck();
 		}
 		if (!got_int)
@@ -2210,7 +2209,7 @@
 	    semsg(_("E124: Missing '(': %s"), eap->arg);
 	    goto ret_free;
 	}
-	/* attempt to continue by skipping some text */
+	// attempt to continue by skipping some text
 	if (vim_strchr(p, '(') != NULL)
 	    p = vim_strchr(p, '(');
     }
@@ -2220,8 +2219,8 @@
 
     if (!eap->skip)
     {
-	/* Check the name of the function.  Unless it's a dictionary function
-	 * (that we are overwriting). */
+	// Check the name of the function.  Unless it's a dictionary function
+	// (that we are overwriting).
 	if (name != NULL)
 	    arg = name;
 	else
@@ -2240,7 +2239,7 @@
 	    if (arg[j] != NUL)
 		emsg_funcname((char *)e_invarg2, arg);
 	}
-	/* Disallow using the g: dict. */
+	// Disallow using the g: dict.
 	if (fudi.fd_dict != NULL && fudi.fd_dict->dv_scope == VAR_DEF_SCOPE)
 	    emsg(_("E862: Cannot use g: here"));
     }
@@ -2249,7 +2248,7 @@
 					    &default_args, eap->skip) == FAIL)
 	goto errret_2;
 
-    /* find extra arguments "range", "dict", "abort" and "closure" */
+    // find extra arguments "range", "dict", "abort" and "closure"
     for (;;)
     {
 	p = skipwhite(p);
@@ -2283,8 +2282,8 @@
 	    break;
     }
 
-    /* When there is a line break use what follows for the function body.
-     * Makes 'exe "func Test()\n...\nendfunc"' work. */
+    // When there is a line break use what follows for the function body.
+    // Makes 'exe "func Test()\n...\nendfunc"' work.
     if (*p == '\n')
 	line_arg = p + 1;
     else if (*p != NUL && *p != '"' && !eap->skip && !did_emsg)
@@ -2295,9 +2294,9 @@
      */
     if (KeyTyped)
     {
-	/* Check if the function already exists, don't let the user type the
-	 * whole function before telling him it doesn't work!  For a script we
-	 * need to skip the body to be able to find what follows. */
+	// Check if the function already exists, don't let the user type the
+	// whole function before telling him it doesn't work!  For a script we
+	// need to skip the body to be able to find what follows.
 	if (!eap->skip && !eap->forceit)
 	{
 	    if (fudi.fd_dict != NULL && fudi.fd_newkey == NULL)
@@ -2309,7 +2308,7 @@
 	if (!eap->skip && did_emsg)
 	    goto erret;
 
-	msg_putchar('\n');	    /* don't overwrite the function name */
+	msg_putchar('\n');	    // don't overwrite the function name
 	cmdline_row = msg_row;
     }
 
@@ -2329,7 +2328,7 @@
 
 	if (line_arg != NULL)
 	{
-	    /* Use eap->arg, split up in parts by line breaks. */
+	    // Use eap->arg, split up in parts by line breaks.
 	    theline = line_arg;
 	    p = vim_strchr(theline, '\n');
 	    if (p == NULL)
@@ -2357,7 +2356,7 @@
 	    goto erret;
 	}
 
-	/* Detect line continuation: sourcing_lnum increased more than one. */
+	// Detect line continuation: sourcing_lnum increased more than one.
 	sourcing_lnum_off = get_sourced_lnum(eap->getline, eap->cookie);
 	if (sourcing_lnum < sourcing_lnum_off)
 	    sourcing_lnum_off -= sourcing_lnum;
@@ -2393,11 +2392,11 @@
 	}
 	else
 	{
-	    /* skip ':' and blanks*/
+	    // skip ':' and blanks
 	    for (p = theline; VIM_ISWHITE(*p) || *p == ':'; ++p)
 		;
 
-	    /* Check for "endfunction". */
+	    // Check for "endfunction".
 	    if (checkforcmd(&p, "endfunction", 4) && nesting-- == 0)
 	    {
 		char_u *nextcmd = NULL;
@@ -2412,9 +2411,9 @@
 			 p, TRUE);
 		if (nextcmd != NULL)
 		{
-		    /* Another command follows. If the line came from "eap" we
-		     * can simply point into it, otherwise we need to change
-		     * "eap->cmdlinep". */
+		    // Another command follows. If the line came from "eap" we
+		    // can simply point into it, otherwise we need to change
+		    // "eap->cmdlinep".
 		    eap->nextcmd = nextcmd;
 		    if (line_to_free != NULL)
 		    {
@@ -2426,8 +2425,8 @@
 		break;
 	    }
 
-	    /* Increase indent inside "if", "while", "for" and "try", decrease
-	     * at "end". */
+	    // Increase indent inside "if", "while", "for" and "try", decrease
+	    // at "end".
 	    if (indent > 2 && STRNCMP(p, "end", 3) == 0)
 		indent -= 2;
 	    else if (STRNCMP(p, "if", 2) == 0
@@ -2436,7 +2435,7 @@
 		    || STRNCMP(p, "try", 3) == 0)
 		indent += 2;
 
-	    /* Check for defining a function inside this function. */
+	    // Check for defining a function inside this function.
 	    if (checkforcmd(&p, "function", 2))
 	    {
 		if (*p == '!')
@@ -2450,7 +2449,7 @@
 		}
 	    }
 
-	    /* Check for ":append", ":change", ":insert". */
+	    // Check for ":append", ":change", ":insert".
 	    p = skip_range(p, NULL);
 	    if ((p[0] == 'a' && (!ASCII_ISALPHA(p[1]) || p[1] == 'p'))
 		    || (p[0] == 'c'
@@ -2463,7 +2462,7 @@
 				&& (!ASCII_ISALPHA(p[2]) || (p[2] == 's'))))))
 		skip_until = vim_strsave((char_u *)".");
 
-	    /* Check for ":python <<EOF", ":tcl <<EOF", etc. */
+	    // Check for ":python <<EOF", ":tcl <<EOF", etc.
 	    arg = skipwhite(skiptowhite(p));
 	    if (arg[0] == '<' && arg[1] =='<'
 		    && ((p[0] == 'p' && p[1] == 'y'
@@ -2482,7 +2481,7 @@
 				    && (!ASCII_ISALPHA(p[2]) || p[2] == 's'))
 			))
 	    {
-		/* ":python <<" continues until a dot, like ":append" */
+		// ":python <<" continues until a dot, like ":append"
 		p = skipwhite(arg + 2);
 		if (*p == NUL)
 		    skip_until = vim_strsave((char_u *)".");
@@ -2519,30 +2518,30 @@
 	    }
 	}
 
-	/* Add the line to the function. */
+	// Add the line to the function.
 	if (ga_grow(&newlines, 1 + sourcing_lnum_off) == FAIL)
 	    goto erret;
 
-	/* Copy the line to newly allocated memory.  get_one_sourceline()
-	 * allocates 250 bytes per line, this saves 80% on average.  The cost
-	 * is an extra alloc/free. */
+	// Copy the line to newly allocated memory.  get_one_sourceline()
+	// allocates 250 bytes per line, this saves 80% on average.  The cost
+	// is an extra alloc/free.
 	p = vim_strsave(theline);
 	if (p == NULL)
 	    goto erret;
 	((char_u **)(newlines.ga_data))[newlines.ga_len++] = p;
 
-	/* Add NULL lines for continuation lines, so that the line count is
-	 * equal to the index in the growarray.   */
+	// Add NULL lines for continuation lines, so that the line count is
+	// equal to the index in the growarray.
 	while (sourcing_lnum_off-- > 0)
 	    ((char_u **)(newlines.ga_data))[newlines.ga_len++] = NULL;
 
-	/* Check for end of eap->arg. */
+	// Check for end of eap->arg.
 	if (line_arg != NULL && *line_arg == NUL)
 	    line_arg = NULL;
     }
 
-    /* Don't define the function when skipping commands or when an error was
-     * detected. */
+    // Don't define the function when skipping commands or when an error was
+    // detected.
     if (eap->skip || did_emsg)
 	goto erret;
 
@@ -2580,8 +2579,8 @@
 	    }
 	    if (fp->uf_refcount > 1)
 	    {
-		/* This function is referenced somewhere, don't redefine it but
-		 * create a new one. */
+		// This function is referenced somewhere, don't redefine it but
+		// create a new one.
 		--fp->uf_refcount;
 		fp->uf_flags |= FC_REMOVED;
 		fp = NULL;
@@ -2589,7 +2588,7 @@
 	    }
 	    else
 	    {
-		/* redefine existing function */
+		// redefine existing function
 		VIM_CLEAR(name);
 		func_clear_items(fp);
 #ifdef FEAT_PROFILE
@@ -2611,16 +2610,16 @@
 	}
 	if (fudi.fd_di == NULL)
 	{
-	    /* Can't add a function to a locked dictionary */
+	    // Can't add a function to a locked dictionary
 	    if (var_check_lock(fudi.fd_dict->dv_lock, eap->arg, FALSE))
 		goto erret;
 	}
-	    /* Can't change an existing function if it is locked */
+	    // Can't change an existing function if it is locked
 	else if (var_check_lock(fudi.fd_di->di_tv.v_lock, eap->arg, FALSE))
 	    goto erret;
 
-	/* Give the function a sequential number.  Can only be used with a
-	 * Funcref! */
+	// Give the function a sequential number.  Can only be used with a
+	// Funcref!
 	vim_free(name);
 	sprintf(numbuf, "%d", ++func_nr);
 	name = vim_strsave((char_u *)numbuf);
@@ -2635,7 +2634,7 @@
 	    int	    slen, plen;
 	    char_u  *scriptname;
 
-	    /* Check that the autoload name matches the script name. */
+	    // Check that the autoload name matches the script name.
 	    j = FAIL;
 	    if (sourcing_name != NULL)
 	    {
@@ -2666,7 +2665,7 @@
 	{
 	    if (fudi.fd_di == NULL)
 	    {
-		/* add new dict entry */
+		// add new dict entry
 		fudi.fd_di = dictitem_alloc(fudi.fd_newkey);
 		if (fudi.fd_di == NULL)
 		{
@@ -2681,16 +2680,16 @@
 		}
 	    }
 	    else
-		/* overwrite existing dict entry */
+		// overwrite existing dict entry
 		clear_tv(&fudi.fd_di->di_tv);
 	    fudi.fd_di->di_tv.v_type = VAR_FUNC;
 	    fudi.fd_di->di_tv.vval.v_string = vim_strsave(name);
 
-	    /* behave like "dict" was used */
+	    // behave like "dict" was used
 	    flags |= FC_DICT;
 	}
 
-	/* insert the new function in the function list */
+	// insert the new function in the function list
 	STRCPY(fp->uf_name, name);
 	if (overwrite)
 	{
@@ -2750,8 +2749,8 @@
     int
 eval_fname_script(char_u *p)
 {
-    /* Use MB_STRICMP() because in Turkish comparing the "I" may not work with
-     * the standard library function. */
+    // Use MB_STRICMP() because in Turkish comparing the "I" may not work with
+    // the standard library function.
     if (p[0] == '<' && (MB_STRNICMP(p + 1, "SID>", 4) == 0
 				       || MB_STRNICMP(p + 1, "SNR>", 4) == 0))
 	return 5;
@@ -2786,8 +2785,8 @@
     p = trans_function_name(&nm, FALSE, flag, NULL, NULL);
     nm = skipwhite(nm);
 
-    /* Only accept "funcname", "funcname ", "funcname (..." and
-     * "funcname(...", not "funcname!...". */
+    // Only accept "funcname", "funcname ", "funcname (..." and
+    // "funcname(...", not "funcname!...".
     if (p != NULL && (*nm == NUL || *nm == '('))
 	n = translated_function_exists(p);
     vim_free(p);
@@ -2838,10 +2837,10 @@
 
 	if ((fp->uf_flags & FC_DICT)
 				|| STRNCMP(fp->uf_name, "<lambda>", 8) == 0)
-	    return (char_u *)""; /* don't show dict and lambda functions */
+	    return (char_u *)""; // don't show dict and lambda functions
 
 	if (STRLEN(fp->uf_name) + 4 >= IOSIZE)
-	    return fp->uf_name;	/* prevents overflow */
+	    return fp->uf_name;	// prevents overflow
 
 	cat_func_name(IObuff, fp);
 	if (xp->xp_context != EXPAND_USER_FUNC)
@@ -2905,21 +2904,21 @@
 
 	if (fudi.fd_dict != NULL)
 	{
-	    /* Delete the dict item that refers to the function, it will
-	     * invoke func_unref() and possibly delete the function. */
+	    // Delete the dict item that refers to the function, it will
+	    // invoke func_unref() and possibly delete the function.
 	    dictitem_remove(fudi.fd_dict, fudi.fd_di);
 	}
 	else
 	{
-	    /* A normal function (not a numbered function or lambda) has a
-	     * refcount of 1 for the entry in the hashtable.  When deleting
-	     * it and the refcount is more than one, it should be kept.
-	     * A numbered function and lambda should be kept if the refcount is
-	     * one or more. */
+	    // A normal function (not a numbered function or lambda) has a
+	    // refcount of 1 for the entry in the hashtable.  When deleting
+	    // it and the refcount is more than one, it should be kept.
+	    // A numbered function and lambda should be kept if the refcount is
+	    // one or more.
 	    if (fp->uf_refcount > (func_name_refcount(fp->uf_name) ? 0 : 1))
 	    {
-		/* Function is still referenced somewhere.  Don't free it but
-		 * do remove it from the hashtable. */
+		// Function is still referenced somewhere.  Don't free it but
+		// do remove it from the hashtable.
 		if (func_remove(fp))
 		    fp->uf_refcount--;
 		fp->uf_flags |= FC_DELETED;
@@ -2951,8 +2950,8 @@
     }
     if (fp != NULL && --fp->uf_refcount <= 0)
     {
-	/* Only delete it when it's not being used.  Otherwise it's done
-	 * when "uf_calls" becomes zero. */
+	// Only delete it when it's not being used.  Otherwise it's done
+	// when "uf_calls" becomes zero.
 	if (fp->uf_calls == 0)
 	    func_clear_free(fp, FALSE);
     }
@@ -2967,8 +2966,8 @@
 {
     if (fp != NULL && --fp->uf_refcount <= 0)
     {
-	/* Only delete it when it's not being used.  Otherwise it's done
-	 * when "uf_calls" becomes zero. */
+	// Only delete it when it's not being used.  Otherwise it's done
+	// when "uf_calls" becomes zero.
 	if (fp->uf_calls == 0)
 	    func_clear_free(fp, FALSE);
     }
@@ -2988,8 +2987,8 @@
     if (fp != NULL)
 	++fp->uf_refcount;
     else if (isdigit(*name))
-	/* Only give an error for a numbered function.
-	 * Fail silently, when named or lambda function isn't found. */
+	// Only give an error for a numbered function.
+	// Fail silently, when named or lambda function isn't found.
 	internal_error("func_ref()");
 }
 
@@ -3044,10 +3043,10 @@
 	else
 	    clear_tv(&rettv);
     }
-    /* It's safer to return also on error. */
+    // It's safer to return also on error.
     else if (!eap->skip)
     {
-	/* In return statement, cause_abort should be force_abort. */
+	// In return statement, cause_abort should be force_abort.
 	update_force_abort();
 
 	/*
@@ -3058,12 +3057,12 @@
 	    returning = do_return(eap, FALSE, TRUE, NULL);
     }
 
-    /* When skipping or the return gets pending, advance to the next command
-     * in this line (!returning).  Otherwise, ignore the rest of the line.
-     * Following lines will be ignored by get_func_line(). */
+    // When skipping or the return gets pending, advance to the next command
+    // in this line (!returning).  Otherwise, ignore the rest of the line.
+    // Following lines will be ignored by get_func_line().
     if (returning)
 	eap->nextcmd = NULL;
-    else if (eap->nextcmd == NULL)	    /* no argument */
+    else if (eap->nextcmd == NULL)	    // no argument
 	eap->nextcmd = check_nextcmd(arg);
 
     if (eap->skip)
@@ -3090,9 +3089,9 @@
 
     if (eap->skip)
     {
-	/* trans_function_name() doesn't work well when skipping, use eval0()
-	 * instead to skip to any following command, e.g. for:
-	 *   :if 0 | call dict.foo().bar() | endif  */
+	// trans_function_name() doesn't work well when skipping, use eval0()
+	// instead to skip to any following command, e.g. for:
+	//   :if 0 | call dict.foo().bar() | endif
 	++emsg_skip;
 	if (eval0(eap->arg, &rettv, &eap->nextcmd, FALSE) != FAIL)
 	    clear_tv(&rettv);
@@ -3103,29 +3102,29 @@
     tofree = trans_function_name(&arg, eap->skip, TFN_INT, &fudi, &partial);
     if (fudi.fd_newkey != NULL)
     {
-	/* Still need to give an error message for missing key. */
+	// Still need to give an error message for missing key.
 	semsg(_(e_dictkey), fudi.fd_newkey);
 	vim_free(fudi.fd_newkey);
     }
     if (tofree == NULL)
 	return;
 
-    /* Increase refcount on dictionary, it could get deleted when evaluating
-     * the arguments. */
+    // Increase refcount on dictionary, it could get deleted when evaluating
+    // the arguments.
     if (fudi.fd_dict != NULL)
 	++fudi.fd_dict->dv_refcount;
 
-    /* If it is the name of a variable of type VAR_FUNC or VAR_PARTIAL use its
-     * contents.  For VAR_PARTIAL get its partial, unless we already have one
-     * from trans_function_name(). */
+    // If it is the name of a variable of type VAR_FUNC or VAR_PARTIAL use its
+    // contents.  For VAR_PARTIAL get its partial, unless we already have one
+    // from trans_function_name().
     len = (int)STRLEN(tofree);
     name = deref_func_name(tofree, &len,
 				    partial != NULL ? NULL : &partial, FALSE);
 
-    /* Skip white space to allow ":call func ()".  Not good, but required for
-     * backward compatibility. */
+    // Skip white space to allow ":call func ()".  Not good, but required for
+    // backward compatibility.
     startarg = skipwhite(arg);
-    rettv.v_type = VAR_UNKNOWN;	/* clear_tv() uses this */
+    rettv.v_type = VAR_UNKNOWN;	// clear_tv() uses this
 
     if (*startarg != '(')
     {
@@ -3142,7 +3141,7 @@
     if (eap->skip)
     {
 	++emsg_skip;
-	lnum = eap->line2;	/* do it once, also with an invalid range */
+	lnum = eap->line2;	// do it once, also with an invalid range
     }
     else
 	lnum = eap->line1;
@@ -3192,10 +3191,10 @@
 	if (doesrange || eap->skip)
 	    break;
 
-	/* Stop when immediately aborting on error, or when an interrupt
-	 * occurred or an exception was thrown but not caught.
-	 * get_func_tv() returned OK, so that the check for trailing
-	 * characters below is executed. */
+	// Stop when immediately aborting on error, or when an interrupt
+	// occurred or an exception was thrown but not caught.
+	// get_func_tv() returned OK, so that the check for trailing
+	// characters below is executed.
 	if (aborting())
 	    break;
     }
@@ -3204,7 +3203,7 @@
 
     if (!failed)
     {
-	/* Check for trailing illegal characters and a following command. */
+	// Check for trailing illegal characters and a following command.
 	if (!ends_excmd(*arg))
 	{
 	    emsg_severe = TRUE;
@@ -3238,7 +3237,7 @@
     struct condstack *cstack = eap->cstack;
 
     if (reanimate)
-	/* Undo the return. */
+	// Undo the return.
 	current_funccal->returned = FALSE;
 
     /*
@@ -3253,20 +3252,20 @@
 	cstack->cs_pending[idx] = CSTP_RETURN;
 
 	if (!is_cmd && !reanimate)
-	    /* A pending return again gets pending.  "rettv" points to an
-	     * allocated variable with the rettv of the original ":return"'s
-	     * argument if present or is NULL else. */
+	    // A pending return again gets pending.  "rettv" points to an
+	    // allocated variable with the rettv of the original ":return"'s
+	    // argument if present or is NULL else.
 	    cstack->cs_rettv[idx] = rettv;
 	else
 	{
-	    /* When undoing a return in order to make it pending, get the stored
-	     * return rettv. */
+	    // When undoing a return in order to make it pending, get the stored
+	    // return rettv.
 	    if (reanimate)
 		rettv = current_funccal->rettv;
 
 	    if (rettv != NULL)
 	    {
-		/* Store the value of the pending return. */
+		// Store the value of the pending return.
 		if ((cstack->cs_rettv[idx] = alloc_tv()) != NULL)
 		    *(typval_T *)cstack->cs_rettv[idx] = *(typval_T *)rettv;
 		else
@@ -3277,9 +3276,9 @@
 
 	    if (reanimate)
 	    {
-		/* The pending return value could be overwritten by a ":return"
-		 * without argument in a finally clause; reset the default
-		 * return value. */
+		// The pending return value could be overwritten by a ":return"
+		// without argument in a finally clause; reset the default
+		// return value.
 		current_funccal->rettv->v_type = VAR_NUMBER;
 		current_funccal->rettv->vval.v_number = 0;
 	    }
@@ -3290,9 +3289,9 @@
     {
 	current_funccal->returned = TRUE;
 
-	/* If the return is carried out now, store the return value.  For
-	 * a return immediately after reanimation, the value is already
-	 * there. */
+	// If the return is carried out now, store the return value.  For
+	// a return immediately after reanimation, the value is already
+	// there.
 	if (!reanimate && rettv != NULL)
 	{
 	    clear_tv(current_funccal->rettv);
@@ -3353,9 +3352,9 @@
     funccall_T	*fcp = (funccall_T *)cookie;
     ufunc_T	*fp = fcp->func;
     char_u	*retval;
-    garray_T	*gap;  /* growarray with function lines */
+    garray_T	*gap;  // growarray with function lines
 
-    /* If breakpoints have been added/deleted need to check for it. */
+    // If breakpoints have been added/deleted need to check for it.
     if (fcp->dbg_tick != debug_tick)
     {
 	fcp->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name,
@@ -3373,7 +3372,7 @@
 	retval = NULL;
     else
     {
-	/* Skip NULL lines (continuation lines). */
+	// Skip NULL lines (continuation lines).
 	while (fcp->linenr < gap->ga_len
 			  && ((char_u **)(gap->ga_data))[fcp->linenr] == NULL)
 	    ++fcp->linenr;
@@ -3390,11 +3389,11 @@
 	}
     }
 
-    /* Did we encounter a breakpoint? */
+    // Did we encounter a breakpoint?
     if (fcp->breakpoint != 0 && fcp->breakpoint <= sourcing_lnum)
     {
 	dbg_breakpoint(fp->uf_name, sourcing_lnum);
-	/* Find next breakpoint. */
+	// Find next breakpoint.
 	fcp->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name,
 							       sourcing_lnum);
 	fcp->dbg_tick = debug_tick;
@@ -3412,8 +3411,8 @@
 {
     funccall_T  *fcp = (funccall_T *)cookie;
 
-    /* Ignore the "abort" flag if the abortion behavior has been changed due to
-     * an error inside a try conditional. */
+    // Ignore the "abort" flag if the abortion behavior has been changed due to
+    // an error inside a try conditional.
     return (((fcp->func->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try())
 	    || fcp->returned);
 }
@@ -3452,7 +3451,7 @@
     {
 	fname = rettv->v_type == VAR_FUNC ? rettv->vval.v_string
 					      : rettv->vval.v_partial->pt_name;
-	/* Translate "s:func" to the stored function name. */
+	// Translate "s:func" to the stored function name.
 	fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
 	fp = find_func(fname);
 	vim_free(tofree);
@@ -3470,8 +3469,8 @@
 	    selfdict = NULL;
 	    if (rettv->v_type == VAR_FUNC)
 	    {
-		/* Just a function: Take over the function name and use
-		 * selfdict. */
+		// Just a function: Take over the function name and use
+		// selfdict.
 		pt->pt_name = rettv->vval.v_string;
 	    }
 	    else
@@ -3479,9 +3478,9 @@
 		partial_T	*ret_pt = rettv->vval.v_partial;
 		int		i;
 
-		/* Partial: copy the function name, use selfdict and copy
-		 * args.  Can't take over name or args, the partial might
-		 * be referenced elsewhere. */
+		// Partial: copy the function name, use selfdict and copy
+		// args.  Can't take over name or args, the partial might
+		// be referenced elsewhere.
 		if (ret_pt->pt_name != NULL)
 		{
 		    pt->pt_name = vim_strsave(ret_pt->pt_name);
@@ -3496,7 +3495,7 @@
 		{
 		    pt->pt_argv = ALLOC_MULT(typval_T, ret_pt->pt_argc);
 		    if (pt->pt_argv == NULL)
-			/* out of memory: drop the arguments */
+			// out of memory: drop the arguments
 			pt->pt_argc = 0;
 		    else
 		    {
@@ -3580,8 +3579,8 @@
 	    pfc = &(*pfc)->caller;
     }
     if (did_free_funccal)
-	/* When a funccal was freed some more items might be garbage
-	 * collected, so run again. */
+	// When a funccal was freed some more items might be garbage
+	// collected, so run again.
 	(void)garbage_collect(testing);
 
     return did_free;
@@ -3606,7 +3605,7 @@
 	    if (temp_funccal)
 		funccal = temp_funccal;
 	    else
-		/* backtrace level overflow. reset to max */
+		// backtrace level overflow. reset to max
 		debug_backtrace_level = i;
 	}
     }
@@ -3700,7 +3699,7 @@
     if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL)
       return NULL;
 
-    /* Search in parent scope which is possible to reference from lambda */
+    // Search in parent scope which is possible to reference from lambda
     current_funccal = current_funccal->func->uf_scoped;
     while (current_funccal != NULL)
     {
@@ -3737,7 +3736,7 @@
     if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL)
 	return NULL;
 
-    /* Search in parent scope which is possible to reference from lambda */
+    // Search in parent scope which is possible to reference from lambda
     current_funccal = current_funccal->func->uf_scoped;
     while (current_funccal)
     {
@@ -3887,4 +3886,4 @@
     return abort;
 }
 
-#endif /* FEAT_EVAL */
+#endif // FEAT_EVAL
