static int eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
static int eval6(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int want_string);
static int eval7(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int want_string);
-static int eval7_leader(typval_T *rettv, char_u *start_leader, char_u **end_leaderp);
+static int eval7_leader(typval_T *rettv, int numeric_only, char_u *start_leader, char_u **end_leaderp);
static int free_unref_items(int copyID);
static char_u *make_expanded_name(char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end);
case '8':
case '9':
case '.': ret = get_number_tv(arg, rettv, evaluate, want_string);
+
+ // Apply prefixed "-" and "+" now. Matters especially when
+ // "->" follows.
+ if (ret == OK && evaluate && end_leader > start_leader)
+ ret = eval7_leader(rettv, TRUE, start_leader, &end_leader);
break;
/*
// Handle following '[', '(' and '.' for expr[expr], expr.name,
// expr(expr), expr->name(expr)
if (ret == OK)
- ret = handle_subscript(arg, rettv, flags, TRUE,
- start_leader, &end_leader);
+ ret = handle_subscript(arg, rettv, flags, TRUE);
/*
* Apply logical NOT and unary '-', from right to left, ignore '+'.
*/
if (ret == OK && evaluate && end_leader > start_leader)
- ret = eval7_leader(rettv, start_leader, &end_leader);
+ ret = eval7_leader(rettv, FALSE, start_leader, &end_leader);
return ret;
}
/*
* Apply the leading "!" and "-" before an eval7 expression to "rettv".
+ * When "numeric_only" is TRUE only handle "+" and "-".
* Adjusts "end_leaderp" until it is at "start_leader".
*/
static int
-eval7_leader(typval_T *rettv, char_u *start_leader, char_u **end_leaderp)
+eval7_leader(
+ typval_T *rettv,
+ int numeric_only,
+ char_u *start_leader,
+ char_u **end_leaderp)
{
char_u *end_leader = *end_leaderp;
int ret = OK;
--end_leader;
if (*end_leader == '!')
{
+ if (numeric_only)
+ {
+ ++end_leader;
+ break;
+ }
#ifdef FEAT_FLOAT
if (rettv->v_type == VAR_FLOAT)
f = !f;
char_u **arg,
typval_T *rettv,
int flags, // do more than finding the end
- int verbose, // give error messages
- char_u *start_leader, // start of '!' and '-' prefixes
- char_u **end_leaderp) // end of '!' and '-' prefixes
+ int verbose) // give error messages
{
int evaluate = flags & EVAL_EVALUATE;
int ret = OK;
}
else if (**arg == '-')
{
- // Expression "-1.0->method()" applies the leader "-" before
- // applying ->.
- if (evaluate && *end_leaderp > start_leader)
- ret = eval7_leader(rettv, start_leader, end_leaderp);
if (ret == OK)
{
if ((*arg)[2] == '{')
{
// handle d.key, l[idx], f(expr)
arg_subsc = arg;
- if (handle_subscript(&arg, &tv, EVAL_EVALUATE, TRUE,
- name, &name) == FAIL)
+ if (handle_subscript(&arg, &tv, EVAL_EVALUATE, TRUE)
+ == FAIL)
error = TRUE;
else
{
if (n)
{
// handle d.key, l[idx], f(expr)
- n = (handle_subscript(&var, &tv, EVAL_EVALUATE,
- FALSE, name, &name) == OK);
+ n = (handle_subscript(&var, &tv, EVAL_EVALUATE, FALSE) == OK);
if (n)
clear_tv(&tv);
}
char_u *find_name_end(char_u *arg, char_u **expr_start, char_u **expr_end, int flags);
int eval_isnamec(int c);
int eval_isnamec1(int c);
-int handle_subscript(char_u **arg, typval_T *rettv, int flags, int verbose, char_u *start_leader, char_u **end_leaderp);
+int handle_subscript(char_u **arg, typval_T *rettv, int flags, int verbose);
int item_copy(typval_T *from, typval_T *to, int deep, int copyID);
void echo_one(typval_T *rettv, int with_space, int *atstart, int *needclr);
void ex_echo(exarg_T *eap);