[gnumeric] Eval: eliminate GNM_EXPR_EVAL_ARRAY_CONTEXT



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]