[gnumeric] Eval: eliminate GNM_EXPR_EVAL_ARRAY_CONTEXT
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Eval: eliminate GNM_EXPR_EVAL_ARRAY_CONTEXT
- Date: Mon, 29 Jun 2020 00:33:00 +0000 (UTC)
commit 61cedef1a8376a4568a4446805dad7299f88eaf7
Author: Morten Welinder <terra gnome org>
Date: Sun Jun 28 20:32:08 2020 -0400
Eval: eliminate GNM_EXPR_EVAL_ARRAY_CONTEXT
Provide function gnm_expr_top_eval_fake_array instead.
src/expr.c | 29 ++++++++++++++++++++---------
src/expr.h | 4 ++++
src/func.c | 3 +--
src/gnumeric.h | 3 +--
src/graph.c | 6 ++++--
src/widgets/gnm-validation-combo-view.c | 7 +++----
6 files changed, 33 insertions(+), 19 deletions(-)
---
diff --git a/src/expr.c b/src/expr.c
index 633da7b37..1331533d3 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3367,23 +3367,34 @@ gnm_expr_top_eval (GnmExprTop const *texpr,
res = gnm_expr_top_eval_array_corner (texpr, pos, flags);
else if (gnm_expr_top_is_array_elem (texpr, NULL, NULL))
res = gnm_expr_top_eval_array_elem (texpr, pos, flags);
- else if ((flags & GNM_EXPR_EVAL_ARRAY_CONTEXT) && !eval_pos_is_array_context (pos)) {
- // Array context out of the blue. Fake it.
- GnmEvalPos pos2;
+ else
+ res = gnm_expr_eval (texpr->expr, pos, flags);
+ gnm_app_recalc_finish ();
+
+ return res;
+}
+
+GnmValue *
+gnm_expr_top_eval_fake_array (GnmExprTop const *texpr,
+ GnmEvalPos const *pos,
+ GnmExprEvalFlags flags)
+{
+ if (eval_pos_is_array_context (pos))
+ return gnm_expr_top_eval (texpr, pos, flags);
+ else {
+ GnmEvalPos pos2 = *pos;
GnmExprTop const *fake = gnm_expr_top_new_array_corner (1, 1, NULL);
+ GnmValue *res;
((GnmExpr *)(fake->expr))->array_corner.expr = texpr->expr; // Patch in our expr
- pos2 = *pos;
pos2.array_texpr = fake;
res = gnm_expr_eval (texpr->expr, &pos2, flags);
((GnmExpr *)(fake->expr))->array_corner.expr = NULL;
gnm_expr_top_unref (fake);
- } else
- res = gnm_expr_eval (texpr->expr, pos, flags);
- gnm_app_recalc_finish ();
-
- return res;
+ return res;
+ }
}
+
static GSList *
gnm_insert_unique (GSList *list, gpointer data)
{
diff --git a/src/expr.h b/src/expr.h
index fbad3f09a..cedb98d5f 100644
--- a/src/expr.h
+++ b/src/expr.h
@@ -219,6 +219,10 @@ char *gnm_expr_top_multiple_as_string (GnmExprTop const *texpr,
GnmParsePos const *pp,
GnmConventions const *convs);
+GnmValue *gnm_expr_top_eval_fake_array (GnmExprTop const *texpr,
+ GnmEvalPos const *pos,
+ GnmExprEvalFlags flags);
+
/*****************************************************************************/
GType gnm_expr_sharer_get_type (void);
diff --git a/src/func.c b/src/func.c
index e9d096193..169aabc4d 100644
--- a/src/func.c
+++ b/src/func.c
@@ -1283,8 +1283,7 @@ function_call_with_exprs (GnmFuncEvalInfo *ei)
if (ei->func_call->func == fn_if && iter_count == -1)
return gnumeric_if2 (ei, argc, argv, flags);
- pass_flags = (flags &
- (GNM_EXPR_EVAL_ARRAY_CONTEXT));
+ pass_flags = (flags & 0); // Nothing right now.
for (i = 0; i < argc; i++) {
char arg_type = fn_def->arg_types[i];
diff --git a/src/gnumeric.h b/src/gnumeric.h
index b9a5fceb8..0c57adf46 100644
--- a/src/gnumeric.h
+++ b/src/gnumeric.h
@@ -83,8 +83,7 @@ typedef enum {
GNM_EXPR_EVAL_SCALAR_NON_EMPTY = 0,
GNM_EXPR_EVAL_PERMIT_NON_SCALAR = 0x1,
GNM_EXPR_EVAL_PERMIT_EMPTY = 0x2,
- GNM_EXPR_EVAL_WANT_REF = 0x4,
- GNM_EXPR_EVAL_ARRAY_CONTEXT = 0x8
+ GNM_EXPR_EVAL_WANT_REF = 0x4
} GnmExprEvalFlags;
G_END_DECLS
diff --git a/src/graph.c b/src/graph.c
index e6c7143d6..bb0f3c2ca 100644
--- a/src/graph.c
+++ b/src/graph.c
@@ -565,8 +565,10 @@ gnm_go_data_vector_load_len (GODataVector *dat)
for (cur = l; cur != NULL; cur = cur->next)
value_release (cur->data);
}
- vec->val = gnm_expr_top_eval (vec->dep.texpr, &ep,
- GNM_EXPR_EVAL_PERMIT_NON_SCALAR | GNM_EXPR_EVAL_PERMIT_EMPTY |
GNM_EXPR_EVAL_ARRAY_CONTEXT);
+ vec->val = gnm_expr_top_eval_fake_array
+ (vec->dep.texpr, &ep,
+ GNM_EXPR_EVAL_PERMIT_NON_SCALAR |
+ GNM_EXPR_EVAL_PERMIT_EMPTY);
}
g_slist_free (l);
}
diff --git a/src/widgets/gnm-validation-combo-view.c b/src/widgets/gnm-validation-combo-view.c
index c02265b3f..485acc0d9 100644
--- a/src/widgets/gnm-validation-combo-view.c
+++ b/src/widgets/gnm-validation-combo-view.c
@@ -108,10 +108,9 @@ vcombo_create_list (SheetObject *so,
g_return_val_if_fail (sv != NULL, NULL);
eval_pos_init_editpos (&ep, sv);
- v = gnm_expr_top_eval (val->deps[0].texpr, &ep,
- GNM_EXPR_EVAL_PERMIT_NON_SCALAR |
- GNM_EXPR_EVAL_PERMIT_EMPTY |
- GNM_EXPR_EVAL_ARRAY_CONTEXT);
+ v = gnm_expr_top_eval_fake_array (val->deps[0].texpr, &ep,
+ GNM_EXPR_EVAL_PERMIT_NON_SCALAR |
+ GNM_EXPR_EVAL_PERMIT_EMPTY);
if (NULL == v)
return NULL;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]