diff libinterp/octave-value/ov.cc @ 24565:dbec1e04f499

accept type_info obj as arg to binary_op, unary_op, and cat_op functions * ov.h, ov.cc (do_binary_op, do_unary_op, do_cat_op): New verloads that accept reference to type_info object as argument. (decompose_binary_op): New aregument, reference to type_info object. * pt-eval.cc (tree_evaluator::visit_binary_expression): Pass type_info object to do_binary_op. (tree_evaluator::visit_postfix_expression, tree_evaluator::visit_prefix_expression): Pass type_info object to do_unary_op. (tree_evaluator::visit_matrix): Pass type_info object to do_cat_op.
author John W. Eaton <jwe@octave.org>
date Mon, 08 Jan 2018 16:45:26 -0500
parents 46440078d73b
children d4dd741b2794
line wrap: on
line diff
--- a/libinterp/octave-value/ov.cc	Mon Jan 08 15:51:52 2018 -0500
+++ b/libinterp/octave-value/ov.cc	Mon Jan 08 16:45:26 2018 -0500
@@ -2155,7 +2155,7 @@
 }
 
 octave_value
-do_binary_op (octave_value::binary_op op,
+do_binary_op (octave::type_info& ti, octave_value::binary_op op,
               const octave_value& v1, const octave_value& v2)
 {
   octave_value retval;
@@ -2163,8 +2163,6 @@
   int t1 = v1.type_id ();
   int t2 = v2.type_id ();
 
-  octave::type_info& ti = octave::__get_type_info__ ("do_binary_op");
-
   if (t1 == octave_class::static_type_id ()
       || t2 == octave_class::static_type_id ()
       || t1 == octave_classdef::static_type_id ()
@@ -2292,8 +2290,18 @@
   return retval;
 }
 
+octave_value
+do_binary_op (octave_value::binary_op op,
+              const octave_value& v1, const octave_value& v2)
+{
+  octave::type_info& ti = octave::__get_type_info__ ("do_binary_op");
+
+  return do_binary_op (ti, op, v1, v2);
+}
+
 static octave_value
-decompose_binary_op (octave_value::compound_binary_op op,
+decompose_binary_op (octave::type_info& ti,
+                     octave_value::compound_binary_op op,
                      const octave_value& v1, const octave_value& v2)
 {
   switch (op)
@@ -2303,39 +2311,39 @@
                            do_unary_op (octave_value::op_transpose, v1), v2);
 
     case octave_value::op_mul_trans:
-      return do_binary_op (octave_value::op_mul,
+      return do_binary_op (ti, octave_value::op_mul,
                            v1, do_unary_op (octave_value::op_transpose, v2));
 
     case octave_value::op_herm_mul:
-      return do_binary_op (octave_value::op_mul,
+      return do_binary_op (ti, octave_value::op_mul,
                            do_unary_op (octave_value::op_hermitian, v1), v2);
 
     case octave_value::op_mul_herm:
-      return do_binary_op (octave_value::op_mul,
+      return do_binary_op (ti, octave_value::op_mul,
                            v1, do_unary_op (octave_value::op_hermitian, v2));
 
     case octave_value::op_trans_ldiv:
-      return do_binary_op (octave_value::op_ldiv,
+      return do_binary_op (ti, octave_value::op_ldiv,
                            do_unary_op (octave_value::op_transpose, v1), v2);
 
     case octave_value::op_herm_ldiv:
-      return do_binary_op (octave_value::op_ldiv,
+      return do_binary_op (ti, octave_value::op_ldiv,
                            do_unary_op (octave_value::op_hermitian, v1), v2);
 
     case octave_value::op_el_not_and:
-      return do_binary_op (octave_value::op_el_and,
+      return do_binary_op (ti, octave_value::op_el_and,
                            do_unary_op (octave_value::op_not, v1), v2);
 
     case octave_value::op_el_not_or:
-      return do_binary_op (octave_value::op_el_or,
+      return do_binary_op (ti, octave_value::op_el_or,
                            do_unary_op (octave_value::op_not, v1), v2);
 
     case octave_value::op_el_and_not:
-      return do_binary_op (octave_value::op_el_and,
+      return do_binary_op (ti, octave_value::op_el_and,
                            v1, do_unary_op (octave_value::op_not, v2));
 
     case octave_value::op_el_or_not:
-      return do_binary_op (octave_value::op_el_or,
+      return do_binary_op (ti, octave_value::op_el_or,
                            v1, do_unary_op (octave_value::op_not, v2));
 
     default:
@@ -2344,7 +2352,7 @@
 }
 
 octave_value
-do_binary_op (octave_value::compound_binary_op op,
+do_binary_op (octave::type_info& ti, octave_value::compound_binary_op op,
               const octave_value& v1, const octave_value& v2)
 {
   octave_value retval;
@@ -2352,8 +2360,6 @@
   int t1 = v1.type_id ();
   int t2 = v2.type_id ();
 
-  octave::type_info& ti = octave::__get_type_info__ ("do_binary_op");
-
   if (t1 == octave_class::static_type_id ()
       || t2 == octave_class::static_type_id ()
       || t1 == octave_classdef::static_type_id ()
@@ -2364,7 +2370,7 @@
       if (f)
         retval = f (v1, v2);
       else
-        retval = decompose_binary_op (op, v1, v2);
+        retval = decompose_binary_op (ti, op, v1, v2);
     }
   else
     {
@@ -2373,12 +2379,21 @@
       if (f)
         retval = f (*v1.rep, *v2.rep);
       else
-        retval = decompose_binary_op (op, v1, v2);
+        retval = decompose_binary_op (ti, op, v1, v2);
     }
 
   return retval;
 }
 
+octave_value
+do_binary_op (octave_value::compound_binary_op op,
+              const octave_value& v1, const octave_value& v2)
+{
+  octave::type_info& ti = octave::__get_type_info__ ("do_binary_op");
+
+  return do_binary_op (ti, op, v1, v2);
+}
+
 OCTAVE_NORETURN static void
 err_cat_op (const std::string& tn1, const std::string& tn2)
 {
@@ -2393,8 +2408,8 @@
 }
 
 octave_value
-do_cat_op (const octave_value& v1, const octave_value& v2,
-           const Array<octave_idx_type>& ra_idx)
+do_cat_op (octave::type_info& ti, const octave_value& v1,
+           const octave_value& v2, const Array<octave_idx_type>& ra_idx)
 {
   octave_value retval;
 
@@ -2404,8 +2419,6 @@
   int t1 = v1.type_id ();
   int t2 = v2.type_id ();
 
-  octave::type_info& ti = octave::__get_type_info__ ("do_cat_op");
-
   octave::type_info::cat_op_fcn f = ti.lookup_cat_op (t1, t2);
 
   if (f)
@@ -2453,13 +2466,22 @@
       if (! cf1 && ! cf2)
         err_cat_op (v1.type_name (), v2.type_name ());
 
-      retval = do_cat_op (tv1, tv2, ra_idx);
+      retval = do_cat_op (ti, tv1, tv2, ra_idx);
     }
 
   return retval;
 }
 
 octave_value
+do_cat_op (const octave_value& v1, const octave_value& v2,
+           const Array<octave_idx_type>& ra_idx)
+{
+  octave::type_info& ti = octave::__get_type_info__ ("do_cat_op");
+
+  return do_cat_op (ti, v1, v2, ra_idx);
+}
+
+octave_value
 do_colon_op (const octave_value& base, const octave_value& increment,
              const octave_value& limit, bool is_for_cmd_expr)
 {
@@ -2583,14 +2605,13 @@
 }
 
 octave_value
-do_unary_op (octave_value::unary_op op, const octave_value& v)
+do_unary_op (octave::type_info& ti, octave_value::unary_op op,
+             const octave_value& v)
 {
   octave_value retval;
 
   int t = v.type_id ();
 
-  octave::type_info& ti = octave::__get_type_info__ ("do_unary_op");
-
   if (t == octave_class::static_type_id ()
       || t == octave_classdef::static_type_id ())
     {
@@ -2633,6 +2654,14 @@
   return retval;
 }
 
+octave_value
+do_unary_op (octave_value::unary_op op, const octave_value& v)
+{
+  octave::type_info& ti = octave::__get_type_info__ ("do_unary_op");
+
+  return do_unary_op (ti, op, v);
+}
+
 OCTAVE_NORETURN static void
 err_unary_op_conversion_failed (const std::string& op,
                                 const std::string& tn)