diff -r a989e7e47094 libinterp/corefcn/mex.cc
--- a/libinterp/corefcn/mex.cc	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/corefcn/mex.cc	Sun Feb 26 11:44:59 2023 -0500
@@ -4581,7 +4581,7 @@ mexCallMATLAB (int nargout, mxArray *arg
       octave::tree_evaluator& tw = interp.get_evaluator ();
 
       octave::unwind_action act
-      ([&tw] (const std::list<octave::octave_lvalue> *lvl)
+      ([&tw] (const octave::tiny_vector<octave::octave_lvalue> *lvl)
       {
         tw.set_lvalue_list (lvl);
       }, tw.lvalue_list ());
diff -r a989e7e47094 libinterp/octave-value/ov-classdef.cc
--- a/libinterp/octave-value/ov-classdef.cc	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/octave-value/ov-classdef.cc	Sun Feb 26 11:44:59 2023 -0500
@@ -48,6 +48,7 @@
 #include "pt-eval.h"
 #include "pt-misc.h"
 #include "oct-lvalue.h"
+#include "tiny_vector.h"
 
 static bool
 in_class_method (const octave::cdef_class& cls)
@@ -279,7 +280,8 @@ octave_classdef::xnumel (const octave_va
           octave::interpreter& interp = octave::__get_interpreter__ ();
           octave::tree_evaluator& tw = interp.get_evaluator();
 
-          octave::unwind_action act ([&tw] (const std::list<octave::octave_lvalue> *lvl)
+        octave::unwind_action act (
+          [&tw] (const octave::tiny_vector<octave::octave_lvalue> *lvl)
           {
             tw.set_lvalue_list (lvl);
           }, tw.lvalue_list ());
diff -r a989e7e47094 libinterp/parse-tree/oct-lvalue.h
--- a/libinterp/parse-tree/oct-lvalue.h	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/parse-tree/oct-lvalue.h	Sun Feb 26 11:44:59 2023 -0500
@@ -295,6 +295,13 @@ public:
     olv.m_rep = nullptr;
   }
 
+  octave_lvalue& operator = (const octave_lvalue &rh)
+  {
+    delete m_rep;
+    m_rep = rh.m_rep->clone ();
+    return *this;
+  }
+
   ~octave_lvalue ()
   {
     delete m_rep;
diff -r a989e7e47094 libinterp/parse-tree/pt-assign.cc
--- a/libinterp/parse-tree/pt-assign.cc	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/parse-tree/pt-assign.cc	Sun Feb 26 11:44:59 2023 -0500
@@ -36,6 +36,8 @@
 #include "pt-arg-list.h"
 #include "pt-assign.h"
 
+#include "tiny_vector.h"
+
 OCTAVE_BEGIN_NAMESPACE(octave)
 
 // Simple assignment expressions.
@@ -86,14 +88,14 @@ tree_simple_assignment::evaluate (tree_e
         {
           octave_lvalue ult = m_lhs->lvalue (tw);
 
-          std::list<octave_lvalue> lvalue_list;
-          lvalue_list.push_back (ult);
+          tiny_vector<octave_lvalue> lvalue_vec;
+          lvalue_vec.push_back (ult);
 
-          unwind_action act ([&tw] (const std::list<octave_lvalue> *lvl)
+          unwind_action act ([&tw] (const tiny_vector<octave_lvalue> *lvl)
           {
             tw.set_lvalue_list (lvl);
           }, tw.lvalue_list ());
-          tw.set_lvalue_list (&lvalue_list);
+          tw.set_lvalue_list (&lvalue_vec);
 
           if (ult.numel () != 1)
             err_invalid_structure_assignment ();
@@ -187,9 +189,9 @@ tree_multi_assignment::evaluate_n (tree_
 
   if (m_rhs)
     {
-      std::list<octave_lvalue> lvalue_list = tw.make_lvalue_list (m_lhs);
+      tiny_vector<octave_lvalue> lvalue_list = tw.make_lvalue_list (m_lhs);
 
-      unwind_action act ([&tw] (const std::list<octave_lvalue> *lvl)
+      unwind_action act ([&tw] (const tiny_vector<octave_lvalue> *lvl)
       {
         tw.set_lvalue_list (lvl);
       }, tw.lvalue_list ());
diff -r a989e7e47094 libinterp/parse-tree/pt-cell.cc
--- a/libinterp/parse-tree/pt-cell.cc	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/parse-tree/pt-cell.cc	Sun Feb 26 11:44:59 2023 -0500
@@ -51,7 +51,7 @@ tree_cell::dup (symbol_scope& scope) con
 octave_value
 tree_cell::evaluate (tree_evaluator& tw, int)
 {
-  unwind_action act ([&tw] (const std::list<octave_lvalue> *lvl)
+  unwind_action act ([&tw] (const tiny_vector<octave_lvalue> *lvl)
   {
     tw.set_lvalue_list (lvl);
   }, tw.lvalue_list ());
diff -r a989e7e47094 libinterp/parse-tree/pt-eval.cc
--- a/libinterp/parse-tree/pt-eval.cc	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/parse-tree/pt-eval.cc	Sun Feb 26 11:44:59 2023 -0500
@@ -1441,7 +1441,7 @@ tree_evaluator::ignored_fcn_outputs () c
 {
   Matrix retval;
 
-  const std::list<octave_lvalue> *lvalues = m_lvalue_list;
+  const tiny_vector<octave_lvalue> *lvalues = m_lvalue_vec;
 
   if (! lvalues)
     return retval;
@@ -3832,8 +3832,8 @@ tree_evaluator::visit_statement (tree_st
         {
           if (cmd)
             {
-              unwind_protect_var<const std::list<octave_lvalue> *>
-                upv (m_lvalue_list, nullptr);
+              unwind_protect_var<const tiny_vector<octave_lvalue> *>
+                upv (m_lvalue_vec, nullptr);
 
               cmd->accept (*this);
             }
@@ -4652,8 +4652,8 @@ tree_evaluator::make_value_list (tree_ar
 
   if (args)
     {
-      unwind_protect_var<const std::list<octave_lvalue> *>
-        upv (m_lvalue_list, nullptr);
+      unwind_protect_var<const tiny_vector<octave_lvalue> *>
+        upv (m_lvalue_vec, nullptr);
 
       int len = args->length ();
 
@@ -4699,10 +4699,10 @@ tree_evaluator::make_value_list (tree_ar
   return retval;
 }
 
-std::list<octave_lvalue>
+tiny_vector<octave_lvalue>
 tree_evaluator::make_lvalue_list (tree_argument_list *lhs)
 {
-  std::list<octave_lvalue> retval;
+  tiny_vector<octave_lvalue> retval;
 
   for (tree_expression *elt : *lhs)
     retval.push_back (elt->lvalue (*this));
diff -r a989e7e47094 libinterp/parse-tree/pt-eval.h
--- a/libinterp/parse-tree/pt-eval.h	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/parse-tree/pt-eval.h	Sun Feb 26 11:44:59 2023 -0500
@@ -43,6 +43,7 @@
 #include "profiler.h"
 #include "pt-walk.h"
 #include "stack-frame.h"
+#include "tiny_vector.h"
 
 class octave_builtin;
 class octave_mex_function;
@@ -127,7 +128,7 @@ public:
 
   tree_evaluator (interpreter& interp)
     : m_interpreter (interp), m_parser (), m_statement_context (SC_OTHER),
-      m_lvalue_list (nullptr), m_autoload_map (), m_bp_table (*this),
+      m_lvalue_vec (nullptr), m_autoload_map (), m_bp_table (*this),
       m_call_stack (*this), m_profiler (), m_debug_frame (0),
       m_debug_mode (false), m_quiet_breakpoint_flag (false),
       m_debugger_stack (), m_exit_status (0), m_max_recursion_depth (256),
@@ -749,14 +750,14 @@ public:
 
   octave_value_list evaluate_end_expression (const octave_value_list& args);
 
-  const std::list<octave_lvalue> * lvalue_list () const
+  const tiny_vector<octave_lvalue> * lvalue_list () const
   {
-    return m_lvalue_list;
+    return m_lvalue_vec;
   }
 
-  void set_lvalue_list (const std::list<octave_lvalue> *lst)
+  void set_lvalue_list (const tiny_vector<octave_lvalue> *v)
   {
-    m_lvalue_list = lst;
+    m_lvalue_vec = v;
   }
 
   int breaking () const { return m_breaking; }
@@ -836,7 +837,7 @@ public:
   octave_value_list
   make_value_list (tree_argument_list *args, const string_vector& arg_nm);
 
-  std::list<octave_lvalue> make_lvalue_list (tree_argument_list *);
+  tiny_vector<octave_lvalue> make_lvalue_list (tree_argument_list *);
 
   void push_echo_state (int type, const std::string& file_name, int pos = 1);
 
@@ -885,7 +886,7 @@ private:
   // The context for the current evaluation.
   stmt_list_type m_statement_context;
 
-  const std::list<octave_lvalue> *m_lvalue_list;
+  const tiny_vector<octave_lvalue> *m_lvalue_vec;
 
   // List of autoloads (function -> file mapping).
   std::map<std::string, std::string> m_autoload_map;
diff -r a989e7e47094 libinterp/parse-tree/pt-idx.cc
--- a/libinterp/parse-tree/pt-idx.cc	Sun Feb 26 11:06:55 2023 -0500
+++ b/libinterp/parse-tree/pt-idx.cc	Sun Feb 26 11:44:59 2023 -0500
@@ -395,7 +395,7 @@ tree_index_expression::evaluate_n (tree_
 
           if (al && al->length () > 0)
             {
-              unwind_action act ([&tw] (const std::list<octave_lvalue> *lvl)
+              unwind_action act ([&tw] (const tiny_vector<octave_lvalue> *lvl)
               {
                 tw.set_lvalue_list (lvl);
               }, tw.lvalue_list ());
diff -r a989e7e47094 liboctave/util/module.mk
--- a/liboctave/util/module.mk	Sun Feb 26 11:06:55 2023 -0500
+++ b/liboctave/util/module.mk	Sun Feb 26 11:44:59 2023 -0500
@@ -37,6 +37,7 @@ UTIL_INC = \
   %reldir%/singleton-cleanup.h \
   %reldir%/sparse-util.h \
   %reldir%/str-vec.h \
+  %reldir%/tiny_vector.h \
   %reldir%/unwind-prot.h \
   %reldir%/url-transfer.h
 
