diff src/ov-builtin.cc @ 10887:f10d0bc8f9cc

make isargout available to DEFUNs
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 13 Aug 2010 10:14:52 +0200
parents 57a59eae83cc
children fd0a3ac60b0e
line wrap: on
line diff
--- a/src/ov-builtin.cc
+++ b/src/ov-builtin.cc
@@ -44,6 +44,14 @@
                          const std::list<octave_value_list>& idx,
                          int nargout)
 {
+  return octave_builtin::subsref (type, idx, nargout, 0);
+}
+
+octave_value_list
+octave_builtin::subsref (const std::string& type,
+                         const std::list<octave_value_list>& idx,
+                         int nargout, const std::list<octave_lvalue>* lvalue_list)
+{
   octave_value_list retval;
 
   switch (type[0])
@@ -52,7 +60,8 @@
       {
         int tmp_nargout = (type.length () > 1 && nargout == 0) ? 1 : nargout;
 
-        retval = do_multi_index_op (tmp_nargout, idx.front ());
+        retval = do_multi_index_op (tmp_nargout, idx.front (),
+                                    idx.size () == 1 ? lvalue_list : 0);
       }
       break;
 
@@ -87,6 +96,13 @@
 octave_value_list
 octave_builtin::do_multi_index_op (int nargout, const octave_value_list& args)
 {
+  return octave_builtin::do_multi_index_op (nargout, args, 0);
+}
+
+octave_value_list
+octave_builtin::do_multi_index_op (int nargout, const octave_value_list& args,
+                                   const std::list<octave_lvalue> *lvalue_list)
+{
   octave_value_list retval;
 
   if (error_state)
@@ -102,6 +118,12 @@
 
       frame.add_fcn (octave_call_stack::pop);
 
+      if (lvalue_list || curr_lvalue_list)
+        {
+          frame.protect_var (curr_lvalue_list);
+          curr_lvalue_list = lvalue_list;
+        }
+
       try
         {
           retval = (*f) (args, nargout);
@@ -125,3 +147,6 @@
 
   return retval;
 }
+
+
+const std::list<octave_lvalue> *octave_builtin::curr_lvalue_list = 0;