changeset 500:5f91088cb98e

[project @ 1994-07-08 02:16:02 by jwe]
author jwe
date Fri, 08 Jul 1994 02:24:43 +0000
parents 966db71124dc
children cc8a1d369540
files src/g-builtins.h src/pt-const.cc src/pt-const.h src/pt-exp-base.cc src/pt-exp-base.h src/tc-inlines.h src/tc-rep.cc src/tc-rep.h
diffstat 8 files changed, 459 insertions(+), 478 deletions(-) [+]
line wrap: on
line diff
--- a/src/g-builtins.h	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/g-builtins.h	Fri Jul 08 02:24:43 1994 +0000
@@ -35,103 +35,101 @@
   char *help_string;
 };
 
-extern tree_constant *builtin_all (const tree_constant *, int, int);
-extern tree_constant *builtin_any (const tree_constant *, int, int);
-extern tree_constant *builtin_balance (const tree_constant *, int, int);
-extern tree_constant *builtin_chol (const tree_constant *, int, int);
-extern tree_constant *builtin_clc (const tree_constant *, int, int);
-extern tree_constant *builtin_clock (const tree_constant *, int, int);
-extern tree_constant *builtin_closeplot (const tree_constant *, int, int);
-extern tree_constant *builtin_colloc (const tree_constant *, int, int);
-extern tree_constant *builtin_cumprod (const tree_constant *, int, int);
-extern tree_constant *builtin_cumsum (const tree_constant *, int, int);
-extern tree_constant *builtin_dassl (const tree_constant *, int, int);
-extern tree_constant *builtin_dassl_options (const tree_constant *, int, int);
-extern tree_constant *builtin_date (const tree_constant *, int, int);
-extern tree_constant *builtin_det (const tree_constant *, int, int);
-extern tree_constant *builtin_diag (const tree_constant *, int, int);
-extern tree_constant *builtin_disp (tree_constant *, int, int);
-extern tree_constant *builtin_eig (const tree_constant *, int, int);
-extern tree_constant *builtin_error (tree_constant *, int, int);
-extern tree_constant *builtin_eval (const tree_constant *, int, int);
-extern tree_constant *builtin_exist (const tree_constant *, int, int);
-extern tree_constant *builtin_expm (const tree_constant *, int, int);
-extern tree_constant *builtin_eye (const tree_constant *, int, int);
-extern tree_constant *builtin_fclose (const tree_constant *, int, int);
-extern tree_constant *builtin_feof (const tree_constant *, int, int);
-extern tree_constant *builtin_ferror (const tree_constant *, int, int);
-extern tree_constant *builtin_feval (const tree_constant *, int, int);
-extern tree_constant *builtin_fflush (const tree_constant *, int, int);
-extern tree_constant *builtin_fft (const tree_constant *, int, int);
-extern tree_constant *builtin_fgets (const tree_constant *, int, int);
-extern tree_constant *builtin_find (const tree_constant *, int, int);
-extern tree_constant *builtin_flops (const tree_constant *, int, int);
-extern tree_constant *builtin_fopen (const tree_constant *, int, int);
-extern tree_constant *builtin_fprintf (const tree_constant *, int, int);
-extern tree_constant *builtin_fread (const tree_constant *, int, int);
-extern tree_constant *builtin_frewind (const tree_constant *, int, int);
-extern tree_constant *builtin_freport (const tree_constant *, int, int);
-extern tree_constant *builtin_fscanf (const tree_constant *, int, int);
-extern tree_constant *builtin_fseek (const tree_constant *, int, int);
-extern tree_constant *builtin_fsolve (const tree_constant *, int, int);
-extern tree_constant *builtin_fsolve_options (const tree_constant *, int, int);
-extern tree_constant *builtin_fsqp (const tree_constant *, int, int);
-extern tree_constant *builtin_fsqp_options (const tree_constant *, int, int);
-extern tree_constant *builtin_ftell (const tree_constant *, int, int);
-extern tree_constant *builtin_fwrite (const tree_constant *, int, int);
-extern tree_constant *builtin_getenv (const tree_constant *, int, int);
-extern tree_constant *builtin_givens (const tree_constant *, int, int);
-extern tree_constant *builtin_hess (const tree_constant *, int, int);
-extern tree_constant *builtin_input (const tree_constant *, int, int);
-extern tree_constant *builtin_ifft (const tree_constant *, int, int);
-extern tree_constant *builtin_inv (const tree_constant *, int, int);
-extern tree_constant *builtin_is_global (const tree_constant *, int, int);
-extern tree_constant *builtin_isstr (const tree_constant *, int, int);
-extern tree_constant *builtin_kbhit (const tree_constant *, int, int);
-extern tree_constant *builtin_keyboard (const tree_constant *, int, int);
-extern tree_constant *builtin_logm (const tree_constant *, int, int);
-extern tree_constant *builtin_lpsolve (const tree_constant *, int, int);
-extern tree_constant *builtin_lpsolve_options (const tree_constant *,
-					       int, int);
-extern tree_constant *builtin_lsode (const tree_constant *, int, int);
-extern tree_constant *builtin_lsode_options (const tree_constant *, int, int);
-extern tree_constant *builtin_lu (const tree_constant *, int, int);
-extern tree_constant *builtin_max (const tree_constant *, int, int);
-extern tree_constant *builtin_min (const tree_constant *, int, int);
-extern tree_constant *builtin_npsol (const tree_constant *, int, int);
-extern tree_constant *builtin_npsol_options (const tree_constant *, int, int);
-extern tree_constant *builtin_ones (const tree_constant *, int, int);
-extern tree_constant *builtin_pause (const tree_constant *, int, int);
-extern tree_constant *builtin_purge_tmp_files (const tree_constant *,
-					       int, int);
-extern tree_constant *builtin_printf (const tree_constant *, int, int);
-extern tree_constant *builtin_prod (const tree_constant *, int, int);
-extern tree_constant *builtin_pwd (const tree_constant *, int, int);
-extern tree_constant *builtin_qpsol (const tree_constant *, int, int);
-extern tree_constant *builtin_qpsol_options (const tree_constant *, int, int);
-extern tree_constant *builtin_qr (const tree_constant *, int, int);
-extern tree_constant *builtin_quad (const tree_constant *, int, int);
-extern tree_constant *builtin_quad_options (const tree_constant *, int, int);
-extern tree_constant *builtin_quit (const tree_constant *, int, int);
-extern tree_constant *builtin_qzval (const tree_constant *, int, int);
-extern tree_constant *builtin_rand (const tree_constant *, int, int);
-extern tree_constant *builtin_setstr (tree_constant *, int, int);
-extern tree_constant *builtin_scanf (const tree_constant *, int, int);
-extern tree_constant *builtin_schur (const tree_constant *, int, int);
-extern tree_constant *builtin_shell_command (const tree_constant *, int, int);
-extern tree_constant *builtin_size (const tree_constant *, int, int);
-extern tree_constant *builtin_sort (const tree_constant *, int, int);
-extern tree_constant *builtin_sprintf (const tree_constant *, int, int);
-extern tree_constant *builtin_sqrtm (const tree_constant *, int, int);
-extern tree_constant *builtin_sscanf (const tree_constant *, int, int);
-extern tree_constant *builtin_sum (const tree_constant *, int, int);
-extern tree_constant *builtin_sumsq (const tree_constant *, int, int);
-extern tree_constant *builtin_svd (const tree_constant *, int, int);
-extern tree_constant *builtin_syl (const tree_constant *, int, int);
-extern tree_constant *builtin_va_arg (const tree_constant *, int, int);
-extern tree_constant *builtin_va_start (const tree_constant *, int, int);
-extern tree_constant *builtin_warranty (const tree_constant *, int, int);
-extern tree_constant *builtin_zeros (const tree_constant *, int, int);
+extern Octave_object builtin_all (const Octave_object&, int, int);
+extern Octave_object builtin_any (const Octave_object&, int, int);
+extern Octave_object builtin_balance (const Octave_object&, int, int);
+extern Octave_object builtin_chol (const Octave_object&, int, int);
+extern Octave_object builtin_clc (const Octave_object&, int, int);
+extern Octave_object builtin_clock (const Octave_object&, int, int);
+extern Octave_object builtin_closeplot (const Octave_object&, int, int);
+extern Octave_object builtin_colloc (const Octave_object&, int, int);
+extern Octave_object builtin_cumprod (const Octave_object&, int, int);
+extern Octave_object builtin_cumsum (const Octave_object&, int, int);
+extern Octave_object builtin_dassl (const Octave_object&, int, int);
+extern Octave_object builtin_dassl_options (const Octave_object&, int, int);
+extern Octave_object builtin_date (const Octave_object&, int, int);
+extern Octave_object builtin_det (const Octave_object&, int, int);
+extern Octave_object builtin_diag (const Octave_object&, int, int);
+extern Octave_object builtin_disp (const Octave_object&, int, int);
+extern Octave_object builtin_eig (const Octave_object&, int, int);
+extern Octave_object builtin_error (const Octave_object&, int, int);
+extern Octave_object builtin_eval (const Octave_object&, int, int);
+extern Octave_object builtin_exist (const Octave_object&, int, int);
+extern Octave_object builtin_expm (const Octave_object&, int, int);
+extern Octave_object builtin_eye (const Octave_object&, int, int);
+extern Octave_object builtin_fclose (const Octave_object&, int, int);
+extern Octave_object builtin_feof (const Octave_object&, int, int);
+extern Octave_object builtin_ferror (const Octave_object&, int, int);
+extern Octave_object builtin_feval (const Octave_object&, int, int);
+extern Octave_object builtin_fflush (const Octave_object&, int, int);
+extern Octave_object builtin_fft (const Octave_object&, int, int);
+extern Octave_object builtin_fgets (const Octave_object&, int, int);
+extern Octave_object builtin_find (const Octave_object&, int, int);
+extern Octave_object builtin_flops (const Octave_object&, int, int);
+extern Octave_object builtin_fopen (const Octave_object&, int, int);
+extern Octave_object builtin_fprintf (const Octave_object&, int, int);
+extern Octave_object builtin_fread (const Octave_object&, int, int);
+extern Octave_object builtin_frewind (const Octave_object&, int, int);
+extern Octave_object builtin_freport (const Octave_object&, int, int);
+extern Octave_object builtin_fscanf (const Octave_object&, int, int);
+extern Octave_object builtin_fseek (const Octave_object&, int, int);
+extern Octave_object builtin_fsolve (const Octave_object&, int, int);
+extern Octave_object builtin_fsolve_options (const Octave_object&, int, int);
+extern Octave_object builtin_fsqp (const Octave_object&, int, int);
+extern Octave_object builtin_fsqp_options (const Octave_object&, int, int);
+extern Octave_object builtin_ftell (const Octave_object&, int, int);
+extern Octave_object builtin_fwrite (const Octave_object&, int, int);
+extern Octave_object builtin_getenv (const Octave_object&, int, int);
+extern Octave_object builtin_givens (const Octave_object&, int, int);
+extern Octave_object builtin_hess (const Octave_object&, int, int);
+extern Octave_object builtin_input (const Octave_object&, int, int);
+extern Octave_object builtin_ifft (const Octave_object&, int, int);
+extern Octave_object builtin_inv (const Octave_object&, int, int);
+extern Octave_object builtin_is_global (const Octave_object&, int, int);
+extern Octave_object builtin_isstr (const Octave_object&, int, int);
+extern Octave_object builtin_kbhit (const Octave_object&, int, int);
+extern Octave_object builtin_keyboard (const Octave_object&, int, int);
+extern Octave_object builtin_logm (const Octave_object&, int, int);
+extern Octave_object builtin_lpsolve (const Octave_object&, int, int);
+extern Octave_object builtin_lpsolve_options (const Octave_object&, int, int);
+extern Octave_object builtin_lsode (const Octave_object&, int, int);
+extern Octave_object builtin_lsode_options (const Octave_object&, int, int);
+extern Octave_object builtin_lu (const Octave_object&, int, int);
+extern Octave_object builtin_max (const Octave_object&, int, int);
+extern Octave_object builtin_min (const Octave_object&, int, int);
+extern Octave_object builtin_npsol (const Octave_object&, int, int);
+extern Octave_object builtin_npsol_options (const Octave_object&, int, int);
+extern Octave_object builtin_ones (const Octave_object&, int, int);
+extern Octave_object builtin_pause (const Octave_object&, int, int);
+extern Octave_object builtin_purge_tmp_files (const Octave_object&, int, int);
+extern Octave_object builtin_printf (const Octave_object&, int, int);
+extern Octave_object builtin_prod (const Octave_object&, int, int);
+extern Octave_object builtin_pwd (const Octave_object&, int, int);
+extern Octave_object builtin_qpsol (const Octave_object&, int, int);
+extern Octave_object builtin_qpsol_options (const Octave_object&, int, int);
+extern Octave_object builtin_qr (const Octave_object&, int, int);
+extern Octave_object builtin_quad (const Octave_object&, int, int);
+extern Octave_object builtin_quad_options (const Octave_object&, int, int);
+extern Octave_object builtin_quit (const Octave_object&, int, int);
+extern Octave_object builtin_qzval (const Octave_object&, int, int);
+extern Octave_object builtin_rand (const Octave_object&, int, int);
+extern Octave_object builtin_setstr (const Octave_object&, int, int);
+extern Octave_object builtin_scanf (const Octave_object&, int, int);
+extern Octave_object builtin_schur (const Octave_object&, int, int);
+extern Octave_object builtin_shell_command (const Octave_object&, int, int);
+extern Octave_object builtin_size (const Octave_object&, int, int);
+extern Octave_object builtin_sort (const Octave_object&, int, int);
+extern Octave_object builtin_sprintf (const Octave_object&, int, int);
+extern Octave_object builtin_sqrtm (const Octave_object&, int, int);
+extern Octave_object builtin_sscanf (const Octave_object&, int, int);
+extern Octave_object builtin_sum (const Octave_object&, int, int);
+extern Octave_object builtin_sumsq (const Octave_object&, int, int);
+extern Octave_object builtin_svd (const Octave_object&, int, int);
+extern Octave_object builtin_syl (const Octave_object&, int, int);
+extern Octave_object builtin_va_arg (const Octave_object&, int, int);
+extern Octave_object builtin_va_start (const Octave_object&, int, int);
+extern Octave_object builtin_warranty (const Octave_object&, int, int);
+extern Octave_object builtin_zeros (const Octave_object&, int, int);
 
 #endif
 
--- a/src/pt-const.cc	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/pt-const.cc	Fri Jul 08 02:24:43 1994 +0000
@@ -94,10 +94,10 @@
  * Construct return vector of empty matrices.  Return empty matrices
  * and/or gripe when appropriate.
  */
-tree_constant *
+Octave_object
 vector_of_empties (int nargout, const char *fcn_name)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
 // Got an empty argument, check if should gripe/return empty values.
 
@@ -108,9 +108,9 @@
 	gripe_empty_arg (fcn_name, 0);
 
       Matrix m;
-      retval = new tree_constant [nargout+1];
+      retval.resize (nargout ? nargout : 1);
       for (int i = 0; i < nargout; i++)
-	retval[i] = tree_constant (m);
+	retval(i) = tree_constant (m);
     }
   else
     gripe_empty_arg (fcn_name, 1);
@@ -482,10 +482,10 @@
 // XXX FIXME XXX -- the next two functions (and expm) should really be just
 // one...
 
-tree_constant *
+Octave_object
 matrix_log (const tree_constant& a)
 {
-  tree_constant *retval = new tree_constant [2];
+  Octave_object retval (1);
 
   tree_constant tmp = a.make_numeric ();;
     
@@ -497,8 +497,7 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("logm", 0);
 	  Matrix m;
-	  retval = new tree_constant [2];
-	  retval[0] = tree_constant (m);
+	  retval(0) = tree_constant (m);
 	  return retval;
 	}
       else
@@ -534,7 +533,7 @@
 	    ComplexDiagMatrix D (lambda);
 	    ComplexMatrix result = Q * D * Q.inverse ();
 
-	    retval[0] = tree_constant (result);
+	    retval(0) = tree_constant (result);
 	  }
       }
       break;
@@ -565,7 +564,7 @@
 	    ComplexDiagMatrix D (lambda);
 	    ComplexMatrix result = Q * D * Q.inverse ();
 
-	    retval[0] = tree_constant (result);
+	    retval(0) = tree_constant (result);
 	  }
       }
       break;
@@ -573,18 +572,18 @@
       {
 	double d = tmp.double_value ();
 	if (d > 0.0)
-	  retval[0] = tree_constant (log (d));
+	  retval(0) = tree_constant (log (d));
 	else
 	  {
 	    Complex dtmp (d);
-	    retval[0] = tree_constant (log (dtmp));
+	    retval(0) = tree_constant (log (dtmp));
 	  }
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
 	Complex c = tmp.complex_value ();
-	retval[0] = tree_constant (log (c));
+	retval(0) = tree_constant (log (c));
       }
       break;
     default:
@@ -593,10 +592,10 @@
   return retval;
 }
 
-tree_constant *
+Octave_object
 matrix_sqrt (const tree_constant& a)
 {
-  tree_constant *retval = new tree_constant [2];
+  Octave_object retval (1);
 
   tree_constant tmp = a.make_numeric ();;
     
@@ -608,8 +607,7 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("sqrtm", 0);
 	  Matrix m;
-	  retval = new tree_constant [2];
-	  retval[0] = tree_constant (m);
+	  retval(0) = tree_constant (m);
 	  return retval;
 	}
       else
@@ -645,7 +643,7 @@
 	    ComplexDiagMatrix D (lambda);
 	    ComplexMatrix result = Q * D * Q.inverse ();
 
-	    retval[0] = tree_constant (result);
+	    retval(0) = tree_constant (result);
 	  }
       }
       break;
@@ -676,7 +674,7 @@
 	    ComplexDiagMatrix D (lambda);
 	    ComplexMatrix result = Q * D * Q.inverse ();
 
-	    retval[0] = tree_constant (result);
+	    retval(0) = tree_constant (result);
 	  }
       }
       break;
@@ -684,18 +682,18 @@
       {
 	double d = tmp.double_value ();
 	if (d > 0.0)
-	  retval[0] = tree_constant (sqrt (d));
+	  retval(0) = tree_constant (sqrt (d));
 	else
 	  {
 	    Complex dtmp (d);
-	    retval[0] = tree_constant (sqrt (dtmp));
+	    retval(0) = tree_constant (sqrt (dtmp));
 	  }
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
 	Complex c = tmp.complex_value ();
-	retval[0] = tree_constant (log (c));
+	retval(0) = tree_constant (log (c));
       }
       break;
     default:
@@ -704,10 +702,10 @@
   return retval;
 }
 
-tree_constant *
-column_max (const tree_constant *args, int nargin, int nargout)
+Octave_object
+column_max (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   tree_constant arg1;
   tree_constant arg2;
@@ -719,11 +717,11 @@
   switch (nargin)
     {
     case 3:
-      arg2 = args[2].make_numeric ();
+      arg2 = args(2).make_numeric ();
       arg2_type = arg2.const_type ();
 // Fall through...
     case 2:
-      arg1 = args[1].make_numeric ();
+      arg1 = args(1).make_numeric ();
       arg1_type = arg1.const_type ();
       break;
     default:
@@ -731,33 +729,33 @@
       break;
     }
 
-  if (nargin == 2 && nargout == 1)
+  if (nargin == 2 && (nargout == 1 || nargout == 0))
     {
-      retval = new tree_constant [2];
+      retval.resize (1);
       switch (arg1_type)
 	{
         case tree_constant_rep::scalar_constant:
-	  retval[0] = tree_constant (arg1.double_value ());
+	  retval(0) = tree_constant (arg1.double_value ());
           break;
         case tree_constant_rep::complex_scalar_constant:
-          retval[0] = tree_constant (arg1.complex_value ());
+          retval(0) = tree_constant (arg1.complex_value ());
           break;
         case tree_constant_rep::matrix_constant:
           {
   	    Matrix m = arg1.matrix_value ();
 	    if (m.rows () == 1)
-	      retval[0] = tree_constant (m.row_max ());
+	      retval(0) = tree_constant (m.row_max ());
 	    else
-	      retval[0] = tree_constant (m.column_max (), 0);
+	      retval(0) = tree_constant (m.column_max (), 0);
  	  }
           break;
         case tree_constant_rep::complex_matrix_constant:
           {
             ComplexMatrix m = arg1.complex_matrix_value ();
             if (m.rows () == 1)
-              retval[0] = tree_constant (m.row_max ());
+              retval(0) = tree_constant (m.row_max ());
             else
-              retval[0] = tree_constant (m.column_max (), 0);
+              retval(0) = tree_constant (m.column_max (), 0);
           }
 	  break;
 	default:
@@ -767,19 +765,19 @@
     }
   else if (nargin == 2 && nargout == 2)
     {
-      retval = new tree_constant [2];
+      retval.resize (2);
       switch (arg1_type)
         {
 	case tree_constant_rep::scalar_constant:
 	  {
-	    retval[0] = tree_constant (arg1.double_value ());
-	    retval[1] = tree_constant (1);
+	    retval(0) = tree_constant (arg1.double_value ());
+	    retval(1) = tree_constant (1);
 	  }
           break;
 	case tree_constant_rep::complex_scalar_constant:
 	  {
-	    retval[0] = tree_constant (arg1.complex_value ());
-	    retval[1] = tree_constant (1);
+	    retval(0) = tree_constant (arg1.complex_value ());
+	    retval(1) = tree_constant (1);
 	  }
           break;
 	case tree_constant_rep::matrix_constant:
@@ -787,13 +785,13 @@
 	    Matrix m = arg1.matrix_value ();
 	    if (m.rows () == 1)
 	      {
-		retval[0] = tree_constant (m.row_max ());
-		retval[1] = tree_constant (m.row_max_loc ());
+		retval(0) = tree_constant (m.row_max ());
+		retval(1) = tree_constant (m.row_max_loc ());
 	      }
 	    else
 	      {
-		retval[0] = tree_constant (m.column_max (), 0);
-		retval[1] = tree_constant (m.column_max_loc (), 0);
+		retval(0) = tree_constant (m.column_max (), 0);
+		retval(1) = tree_constant (m.column_max_loc (), 0);
 	      }
 	  }
           break;
@@ -802,13 +800,13 @@
 	    ComplexMatrix m = arg1.complex_matrix_value ();
 	    if (m.rows () == 1)
 	      {
-		retval[0] = tree_constant (m.row_max ());
-		retval[1] = tree_constant (m.row_max_loc ());
+		retval(0) = tree_constant (m.row_max ());
+		retval(1) = tree_constant (m.row_max_loc ());
 	      }
 	    else
 	      {
-		retval[0] = tree_constant (m.column_max (), 0);
-		retval[1] = tree_constant (m.column_max_loc (), 0);
+		retval(0) = tree_constant (m.column_max (), 0);
+		retval(1) = tree_constant (m.column_max_loc (), 0);
 	      }
 	  }
           break;
@@ -822,7 +820,7 @@
       if (arg1.rows () == arg2.rows ()
 	  && arg1.columns () == arg2.columns ())
 	{
-	  retval = new tree_constant [2];
+	  retval.resize (1);
           switch (arg1_type)
             {
 	    case tree_constant_rep::scalar_constant:
@@ -831,7 +829,7 @@
 		double a_elem = arg1.double_value ();
 		double b_elem = arg2.double_value ();
 		result = MAX (a_elem, b_elem);
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
               break;
 	    case tree_constant_rep::complex_scalar_constant:
@@ -843,14 +841,14 @@
 		  result = a_elem;
 		else
 		  result = b_elem;
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
               break;
 	    case tree_constant_rep::matrix_constant:
 	      {
 		Matrix result;
 		result = max (arg1.matrix_value (), arg2.matrix_value ());
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
               break;
 	    case tree_constant_rep::complex_matrix_constant:
@@ -858,7 +856,7 @@
 		ComplexMatrix result;
 		result = max (arg1.complex_matrix_value (),
 			      arg2.complex_matrix_value ());
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
 	      break;
 	    default:
@@ -875,10 +873,10 @@
   return retval;
 }
 
-tree_constant *
-column_min (const tree_constant *args, int nargin, int nargout)
+Octave_object
+column_min (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   tree_constant arg1;
   tree_constant arg2;
@@ -890,11 +888,11 @@
   switch (nargin)
     {
     case 3:
-      arg2 = args[2].make_numeric ();
+      arg2 = args(2).make_numeric ();
       arg2_type = arg2.const_type ();
 // Fall through...
     case 2:
-      arg1 = args[1].make_numeric ();
+      arg1 = args(1).make_numeric ();
       arg1_type = arg1.const_type ();
       break;
     default:
@@ -902,33 +900,33 @@
       break;
     }
 
-  if (nargin == 2 && nargout == 1)
+  if (nargin == 2 && (nargout == 1 || nargout == 0))
     {
-      retval = new tree_constant [2];
+      retval.resize (1);
       switch (arg1_type)
 	{
         case tree_constant_rep::scalar_constant:
-	  retval[0] = tree_constant (arg1.double_value ());
+	  retval(0) = tree_constant (arg1.double_value ());
           break;
         case tree_constant_rep::complex_scalar_constant:
-          retval[0] = tree_constant (arg1.complex_value ());
+          retval(0) = tree_constant (arg1.complex_value ());
           break;
         case tree_constant_rep::matrix_constant:
           {
   	    Matrix m = arg1.matrix_value ();
 	    if (m.rows () == 1)
-	      retval[0] = tree_constant (m.row_min ());
+	      retval(0) = tree_constant (m.row_min ());
 	    else
-	      retval[0] = tree_constant (m.column_min (), 0);
+	      retval(0) = tree_constant (m.column_min (), 0);
  	  }
           break;
         case tree_constant_rep::complex_matrix_constant:
           {
             ComplexMatrix m = arg1.complex_matrix_value ();
             if (m.rows () == 1)
-              retval[0] = tree_constant (m.row_min ());
+              retval(0) = tree_constant (m.row_min ());
             else
-              retval[0] = tree_constant (m.column_min (), 0);
+              retval(0) = tree_constant (m.column_min (), 0);
           }
 	  break;
 	default:
@@ -938,19 +936,19 @@
     }
   else if (nargin == 2 && nargout == 2)
     {
-      retval = new tree_constant [2];
+      retval.resize (2);
       switch (arg1_type)
         {
 	case tree_constant_rep::scalar_constant:
 	  {
-	    retval[0] = tree_constant (arg1.double_value ());
-	    retval[1] = tree_constant (1);
+	    retval(0) = tree_constant (arg1.double_value ());
+	    retval(1) = tree_constant (1);
 	  }
           break;
 	case tree_constant_rep::complex_scalar_constant:
 	  {
-	    retval[0] = tree_constant (arg1.complex_value ());
-	    retval[1] = tree_constant (1);
+	    retval(0) = tree_constant (arg1.complex_value ());
+	    retval(1) = tree_constant (1);
 	  }
           break;
 	case tree_constant_rep::matrix_constant:
@@ -958,13 +956,13 @@
 	    Matrix m = arg1.matrix_value ();
 	    if (m.rows () == 1)
 	      {
-		retval[0] = tree_constant (m.row_min ());
-		retval[1] = tree_constant (m.row_min_loc ());
+		retval(0) = tree_constant (m.row_min ());
+		retval(1) = tree_constant (m.row_min_loc ());
 	      }
 	    else
 	      {
-		retval[0] = tree_constant (m.column_min (), 0);
-		retval[1] = tree_constant (m.column_min_loc (), 0);
+		retval(0) = tree_constant (m.column_min (), 0);
+		retval(1) = tree_constant (m.column_min_loc (), 0);
 	      }
 	  }
           break;
@@ -973,13 +971,13 @@
 	    ComplexMatrix m = arg1.complex_matrix_value ();
 	    if (m.rows () == 1)
 	      {
-		retval[0] = tree_constant (m.row_min ());
-		retval[1] = tree_constant (m.row_min_loc ());
+		retval(0) = tree_constant (m.row_min ());
+		retval(1) = tree_constant (m.row_min_loc ());
 	      }
 	    else
 	      {
-		retval[0] = tree_constant (m.column_min (), 0);
-		retval[1] = tree_constant (m.column_min_loc (), 0);
+		retval(0) = tree_constant (m.column_min (), 0);
+		retval(1) = tree_constant (m.column_min_loc (), 0);
 	      }
 	  }
           break;
@@ -993,7 +991,7 @@
       if (arg1.rows () == arg2.rows ()
 	  && arg1.columns () == arg2.columns ())
 	{
-	  retval = new tree_constant [2];
+	  retval.resize (1);
           switch (arg1_type)
             {
 	    case tree_constant_rep::scalar_constant:
@@ -1002,7 +1000,7 @@
 		double a_elem = arg1.double_value ();
 		double b_elem = arg2.double_value ();
 		result = MIN (a_elem, b_elem);
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
               break;
 	    case tree_constant_rep::complex_scalar_constant:
@@ -1014,14 +1012,14 @@
 		  result = a_elem;
 		else
 		  result = b_elem;
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
               break;
 	    case tree_constant_rep::matrix_constant:
 	      {
 		Matrix result;
 		result = min (arg1.matrix_value (), arg2.matrix_value ());
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
               break;
 	    case tree_constant_rep::complex_matrix_constant:
@@ -1029,7 +1027,7 @@
 		ComplexMatrix result;
 		result = min (arg1.complex_matrix_value (),
 			      arg2.complex_matrix_value ());
-		retval[0] = tree_constant (result);
+		retval(0) = tree_constant (result);
 	      }
 	      break;
 	    default:
@@ -1180,40 +1178,40 @@
 	}
 }
 
-tree_constant *
-sort (const tree_constant *args, int nargin, int nargout)
+Octave_object
+sort (const Octave_object& args, int nargin, int nargout)
 {
 // Assumes that we have been given the correct number of arguments.
 
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   int return_idx = nargout > 1;
   if (return_idx)
-    retval = new tree_constant [3];
+    retval.resize (2);
   else
-    retval = new tree_constant [2];
+    retval.resize (1);
 
-  switch (args[1].const_type ())
+  switch (args(1).const_type ())
     {
     case tree_constant_rep::scalar_constant:
       {
-	retval [0] = tree_constant (args[1].double_value ());
+	retval(0) = tree_constant (args(1).double_value ());
 	if (return_idx)
-	  retval [1] = tree_constant (1.0);
+	  retval(1) = tree_constant (1.0);
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
-	retval [0] = tree_constant (args[1].complex_value ());
+	retval(0) = tree_constant (args(1).complex_value ());
 	if (return_idx)
-	  retval [1] = tree_constant (1.0);
+	  retval(1) = tree_constant (1.0);
       }
       break;
     case tree_constant_rep::string_constant:
     case tree_constant_rep::range_constant:
     case tree_constant_rep::matrix_constant:
       {
-	Matrix m = args[1].to_matrix ();
+	Matrix m = args(1).to_matrix ();
 	if (m.rows () == 1)
 	  {
 	    int nc = m.columns ();
@@ -1223,9 +1221,9 @@
 	    RowVector idx;
 	    mx_sort (v, idx, return_idx);
 
-	    retval [0] = tree_constant (v, 0);
+	    retval(0) = tree_constant (v, 0);
 	    if (return_idx)
-	      retval [1] = tree_constant (idx, 0);
+	      retval(1) = tree_constant (idx, 0);
 	  }
 	else
 	  {
@@ -1233,15 +1231,15 @@
 	    Matrix idx;
 	    mx_sort (m, idx, return_idx);
 
-	    retval [0] = tree_constant (m);
+	    retval(0) = tree_constant (m);
 	    if (return_idx)
-	      retval [1] = tree_constant (idx);
+	      retval(1) = tree_constant (idx);
 	  }
       }
       break;
     case tree_constant_rep::complex_matrix_constant:
       {
-	ComplexMatrix cm = args[1].complex_matrix_value ();
+	ComplexMatrix cm = args(1).complex_matrix_value ();
 	if (cm.rows () == 1)
 	  {
 	    int nc = cm.columns ();
@@ -1251,9 +1249,9 @@
 	    RowVector idx;
 	    mx_sort (cv, idx, return_idx);
 
-	    retval [0] = tree_constant (cv, 0);
+	    retval(0) = tree_constant (cv, 0);
 	    if (return_idx)
-	      retval [1] = tree_constant (idx, 0);
+	      retval(1) = tree_constant (idx, 0);
 	  }
 	else
 	  {
@@ -1261,9 +1259,9 @@
 	    Matrix idx;
 	    mx_sort (cm, idx, return_idx);
 
-	    retval [0] = tree_constant (cm);
+	    retval(0) = tree_constant (cm);
 	    if (return_idx)
-	      retval [1] = tree_constant (idx);
+	      retval(1) = tree_constant (idx);
 	  }
       }
       break;
@@ -1275,19 +1273,20 @@
   return retval;
 }
 
-tree_constant *
-feval (const tree_constant *args, int nargin, int nargout)
+Octave_object
+feval (const Octave_object& args, int nargin, int nargout)
 {
 // Assumes that we have been given the correct number of arguments.
 
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_fvc *fcn = is_valid_function (args[1], "feval", 1);
+  tree_fvc *fcn = is_valid_function (args(1), "feval", 1);
   if (fcn != (tree_fvc *) NULL)
     {
-      args++;
-      nargin--;
-      retval = fcn->eval (0, nargout, args, nargin);
+      Octave_object tmp_args (--nargin);
+      for (int i = 0; i < nargin; i++)
+	tmp_args(i) = args(i+1);
+      retval = fcn->eval (0, nargout, tmp_args, nargin);
     }
 
   return retval;
@@ -1372,7 +1371,7 @@
 }
 
 tree_constant
-get_user_input (const tree_constant *args, int nargin, int nargout,
+get_user_input (const Octave_object& args, int nargin, int nargout,
 		int debug = 0)
 {
   tree_constant retval;
@@ -1380,8 +1379,8 @@
   int read_as_string = 0;
   if (nargin == 3)
     {
-      if (args[2].is_string_type ()
-	  && strcmp ("s", args[2].string_value ()) == 0)
+      if (args(2).is_string_type ()
+	  && strcmp ("s", args(2).string_value ()) == 0)
 	read_as_string++;
       else
 	{
@@ -1393,8 +1392,8 @@
   char *prompt = "debug> ";
   if (nargin > 1)
    {
-      if (args[1].is_string_type ())
-	prompt = args[1].string_value ();
+      if (args(1).is_string_type ())
+	prompt = args(1).string_value ();
       else
 	{
 	  error ("input: unrecognized argument");
--- a/src/pt-const.h	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/pt-const.h	Fri Jul 08 02:24:43 1994 +0000
@@ -30,13 +30,15 @@
 
 #include <stdlib.h>
 
+#include "Array.h"
+#include "mx-base.h"
+#include "Range.h"
+
 #include "builtins.h"
 #include "tree-base.h"
 #include "tree-expr.h"
 #include "tc-rep.h"
-
-#include "mx-base.h"
-#include "Range.h"
+#include "oct-obj.h"
 
 class idx_vector;
 
@@ -171,7 +173,8 @@
 	return rep->make_numeric ();
     }
 
-  tree_constant assign (tree_constant& rhs, tree_constant *args, int nargs)
+  tree_constant assign (tree_constant& rhs, const Octave_object& args,
+			int nargs)
     {
       if (rep->count > 1)
 	{
@@ -265,19 +268,18 @@
       return *this;
     }
 
-  tree_constant *eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0)
+  Octave_object eval (int print, int nargout, const Octave_object& args,
+		      int nargin)
     {
-      tree_constant *retval = new tree_constant [2];
+      Octave_object retval (1);
 
-      if (args != NULL_TREE_CONST && nargin > 0)
-	retval[0] = rep->do_index (args, nargin);
+      if (args.length () > 0 && nargin > 0)
+	retval(0) = rep->do_index (args, nargin);
       else
-	retval[0] = *this;
+	retval(0) = *this;
 
-      if (retval[0].is_defined ())
-	retval[0].eval (print);
+      if (retval(0).is_defined ())
+	retval(0).eval (print);
       return retval;
     }
 
@@ -290,7 +292,7 @@
  * class but that don't need to be class members or friends.
  */
 
-extern tree_constant *vector_of_empties (int nargout, const char *fcn_name);
+extern Octave_object vector_of_empties (int nargout, const char *fcn_name);
 
 extern tree_constant fill_matrix (const tree_constant& a,
 				  double d, const char *warn_for);
@@ -304,25 +306,25 @@
 
 extern tree_constant find_nonzero_elem_idx (const tree_constant& a);
 
-extern tree_constant *matrix_log (const tree_constant& a);
-extern tree_constant *matrix_sqrt (const tree_constant& a);
+extern Octave_object matrix_log (const tree_constant& a);
+extern Octave_object matrix_sqrt (const tree_constant& a);
 
-extern tree_constant *column_max (const tree_constant *args, int nargin,
-				  int nargout);
+extern Octave_object column_max (const Octave_object& args, int nargin,
+				 int nargout);
 
-extern tree_constant *column_min (const tree_constant *args, int nargin,
-				  int nargout);
+extern Octave_object column_min (const Octave_object& args, int nargin,
+				 int nargout);
   
-extern tree_constant *sort (const tree_constant *args, int nargin,
-			    int nargout);
+extern Octave_object sort (const Octave_object& args, int nargin,
+			   int nargout);
  
-extern tree_constant *feval (const tree_constant *args, int nargin,
-			     int nargout);
+extern Octave_object feval (const Octave_object& args, int nargin,
+			    int nargout);
 
 extern tree_constant eval_string (const tree_constant& arg, int&
 				  parse_status);
 
-extern tree_constant get_user_input (const tree_constant *args,
+extern tree_constant get_user_input (const Octave_object& args,
 				     int nargin, int nargout,
 				     int debug = 0);
 
--- a/src/pt-exp-base.cc	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/pt-exp-base.cc	Fri Jul 08 02:24:43 1994 +0000
@@ -108,11 +108,11 @@
  * Make sure that all arguments have values.
  */
 static int
-all_args_defined (tree_constant *args, int nargs)
+all_args_defined (const Octave_object& args, int nargs)
 {
   while (--nargs > 0)
     {
-      if (args[nargs].is_undefined ())
+      if (args(nargs).is_undefined ())
 	return 0;
     }
   return 1;
@@ -122,11 +122,11 @@
  * Are any of the arguments `:'?
  */
 static int
-any_arg_is_magic_colon (const tree_constant *args, int nargs)
+any_arg_is_magic_colon (const Octave_object& args, int nargs)
 {
   while (--nargs > 0)
     {
-      if (args[nargs].const_type () == tree_constant_rep::magic_colon)
+      if (args(nargs).const_type () == tree_constant_rep::magic_colon)
 	return 1;
     }
   return 0;
@@ -573,7 +573,7 @@
 }
 
 tree_constant
-tree_fvc::assign (tree_constant& t, tree_constant *args, int nargs)
+tree_fvc::assign (tree_constant& t, const Octave_object& args, int nargs)
 {
   panic_impossible ();
   return tree_constant ();
@@ -650,21 +650,18 @@
     {
       char **argv = new char * [1];
       argv[0] = strsave (my_name);
-      tree_constant *tmp = (*text_fcn) (1, argv, 1);
-      if (tmp != NULL_TREE)
-	retval = tmp[0];
-      delete [] tmp;
+      Octave_object tmp = (*text_fcn) (1, argv, 1);
+      if (tmp.length () > 0)
+	retval = tmp(0);
       delete [] argv;
     }
   else if (general_fcn != (General_fcn) NULL)
     {
-      tree_constant *args = new tree_constant [1];
-      args[0] = tree_constant (my_name);
-      tree_constant *tmp = (*general_fcn) (args, 1, 1);
-      delete [] args;
-      if (tmp != NULL_TREE_CONST)
-	retval = tmp[0];
-      delete [] tmp;
+      Octave_object args (1);
+      args(0) = tree_constant (my_name);
+      Octave_object tmp = (*general_fcn) (args, 1, 1);
+      if (tmp.length () > 0)
+	retval = tmp(0);
     }
   else // Assume mapper function
     ::error ("%s: argument expected", my_name);
@@ -672,12 +669,11 @@
   return retval;
 }
 
-tree_constant *
-tree_builtin::eval (int print, int nargout,
-		    const tree_constant *args = NULL_TREE_CONST,
-		    int nargin = 0)
+Octave_object
+tree_builtin::eval (int print, int nargout, const Octave_object& args,
+		    int nargin)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (error_state)
     return retval;
@@ -690,7 +686,7 @@
       char **argv = new char * [argc + 1];
       argv[0] = strsave (my_name);
       for (int i = 1; i < argc; i++)
-	argv[i] = strsave (args[i].string_value ());
+	argv[i] = strsave (args(i).string_value ());
       argv[argc] = (char *) NULL;
 
       retval = (*text_fcn) (argc, argv, nargout);
@@ -710,12 +706,11 @@
     {
       if (nargin > nargin_max)
 	::error ("%s: too many arguments", my_name);
-      else if (nargin > 0 && args != NULL_TREE_CONST && args[1].is_defined ())
+      else if (nargin > 0 && args.length () > 0 && args(1).is_defined ())
 	{
-	  tree_constant tmp = args[1].mapper (mapper_fcn, 0);
-	  retval = new tree_constant [2];
-	  retval[0] = tmp;
-	  retval[1] = tree_constant ();
+	  tree_constant tmp = args(1).mapper (mapper_fcn, 0);
+	  retval.resize (1);
+	  retval(0) = tmp;
 	}	
     }
 
@@ -841,7 +836,8 @@
 }
 
 tree_constant
-tree_identifier::assign (tree_constant& rhs, tree_constant *args, int nargs)
+tree_identifier::assign (tree_constant& rhs, const Octave_object& args,
+			 int nargs)
 {
   tree_constant retval;
 
@@ -886,6 +882,12 @@
   return retval;
 }
 
+int
+tree_identifier::is_defined (void)
+{
+  return (sym != (symbol_record *) NULL && sym->is_defined ());
+}
+
 void
 tree_identifier::bump_value (tree::expression_type etype)
 {
@@ -1149,12 +1151,11 @@
 	{
 	  int nargout = maybe_do_ans_assign ? 0 : 1;
 
-	  tree_constant *tmp = ans->eval (0, nargout);
-
-	  if (tmp != NULL_TREE_CONST)
-	    retval = tmp[0];
-
-	  delete [] tmp;
+	  Octave_object tmp_args;
+	  Octave_object tmp = ans->eval (0, nargout, tmp_args, 0);
+
+	  if (tmp.length () > 0)
+	    retval = tmp(0);
 	}
     }
 
@@ -1214,12 +1215,11 @@
   return retval;
 }
 
-tree_constant *
-tree_identifier::eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0)
+Octave_object
+tree_identifier::eval (int print, int nargout, const Octave_object& args,
+		       int nargin)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (error_state)
     return retval;
@@ -1243,7 +1243,7 @@
 
 	      retval = ans->eval (0, nargout, args, nargin);
 
-	      if (retval != NULL_TREE_CONST && retval[0].is_defined ())
+	      if (retval.length () > 0 && retval(0).is_defined ())
 		{
 		  symbol_record *sr = global_sym_tab->lookup ("ans", 1, 0);
 
@@ -1251,7 +1251,7 @@
       
 		  tree_identifier *ans_id = new tree_identifier (sr);
 
-		  tree_constant *tmp = new tree_constant (retval[0]);
+		  tree_constant *tmp = new tree_constant (retval(0));
 
 		  tree_simple_assignment_expression tmp_ass (ans_id, tmp);
 
@@ -1284,7 +1284,6 @@
   system_fcn_file = 0;
   varargs_ok = 0;
   num_named_args = 0;
-  args_passed = NULL_TREE_CONST;
   num_args_passed = 0;
   curr_arg_number = 0;
 }
@@ -1302,7 +1301,6 @@
   system_fcn_file = 0;
   varargs_ok = 0;
   num_named_args = 0;
-  args_passed = NULL_TREE_CONST;
   num_args_passed = 0;
   curr_arg_number = 0;
 }
@@ -1414,7 +1412,7 @@
 
   if (curr_arg_number < num_args_passed)
     {
-      retval = args_passed[curr_arg_number];
+      retval = args_passed(curr_arg_number);
       curr_arg_number++;
     }
   else
@@ -1445,11 +1443,11 @@
   if (error_state || cmd_list == NULL_TREE)
     return retval;
 
-  tree_constant *tmp = eval (print, 1);
-
-  if (! error_state && tmp != NULL_TREE_CONST)
-    retval = tmp[0];
-  delete [] tmp;
+  Octave_object tmp_args;
+  Octave_object tmp = eval (print, 1, tmp_args, 0);
+
+  if (! error_state && tmp.length () > 0)
+    retval = tmp(0);
 
   return retval;
 }
@@ -1470,12 +1468,11 @@
   tmp->clear ();
 }
 
-tree_constant *
-tree_function::eval (int print, int nargout,
-		     const tree_constant *args = NULL_TREE_CONST,
-		     int nargin = 0)
+Octave_object
+tree_function::eval (int print, int nargout, const Octave_object& args,
+		     int nargin)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (error_state)
     return retval;
@@ -1506,7 +1503,7 @@
   unwind_protect_ptr (curr_function);
   curr_function = this;
 
-  unwind_protect_ptr (args_passed);
+//  unwind_protect_ptr (args_passed);
   args_passed = args;
 
   unwind_protect_int (num_args_passed);
@@ -1553,9 +1550,8 @@
       }
     else if (user_pref.return_last_computed_value)
       {
-	retval = new tree_constant [2];
-	retval[0] = last_computed_value;
-	retval[1] = tree_constant ();
+	retval.resize (1);
+	retval(0) = last_computed_value;
       }
   }
 
@@ -1620,6 +1616,14 @@
   return tree_constant ();
 }
 
+Octave_object
+tree_expression::eval (int print, int nargout, const Octave_object& args,
+		       int nargin)
+{
+  panic_impossible ();
+  return Octave_object ();
+}
+
 /*
  * Prefix expressions.
  */
@@ -2123,7 +2127,7 @@
 	{
 // Extract the arguments into a simple vector.
 	  int nargs = 0;
-	  tree_constant *args = index->convert_to_const_vector (nargs);
+	  Octave_object args = index->convert_to_const_vector (nargs);
 
 	  if (error_state)
 	    eval_error ();
@@ -2133,8 +2137,6 @@
 	      if (error_state)
 		eval_error ();
 	    }
-
-	  delete [] args;
 	}
     }
 
@@ -2223,30 +2225,28 @@
   if (error_state)
     return retval;
 
-  tree_constant *result = eval (print, 1);
-
-  if (result != NULL_TREE_CONST)
-    {
-      retval = result[0];
-      delete [] result;
-    }
+  Octave_object tmp_args;
+  Octave_object result = eval (print, 1, tmp_args, 0);
+
+  if (result.length () > 0)
+    retval = result(0);
 
   return retval;
 }
 
-tree_constant *
+Octave_object
 tree_multi_assignment_expression::eval (int print, int nargout,
-					const tree_constant *args =
-					NULL_TREE_CONST,
-					int nargin = 0)
+					const Octave_object& args,
+					int nargin)
 {
   assert (etype == tree::multi_assignment);
 
   if (error_state || rhs == (tree_expression *) NULL)
-    return NULL_TREE_CONST;
+    return Octave_object ();
 
   nargout = lhs->length ();
-  tree_constant *results = rhs->eval (0, nargout);
+  Octave_object tmp_args;
+  Octave_object results = rhs->eval (0, nargout, tmp_args, 0);
 
   if (error_state)
     eval_error ();
@@ -2254,7 +2254,7 @@
   int ma_line = line ();
   int ma_column = column ();
 
-  if (results != NULL_TREE_CONST)
+  if (results.length () > 0)
     {
       tree_return_list *elem;
       int i = 0;
@@ -2266,63 +2266,57 @@
 	  tree_index_expression *lhs_expr = elem->idx_expr ();
 	  if (i < nargout)
 	    {
-	      if (results[i].is_undefined ())
+// XXX FIXME? XXX -- this is apparently the way Matlab works, but
+// maybe we should have the option of skipping the assignment instead.
+
+	      tree_constant *tmp = NULL_TREE_CONST;
+	      if (results(i).is_undefined ())
 		{
-		  tree_simple_assignment_expression tmp_expr
-		    (lhs_expr, NULL_TREE_CONST, ma_line, ma_column);
-
-		  results[i] = tmp_expr.eval (0); // Should stay undefined!
-
-		  if (error_state)
-		    break;
-
-		  if (last_was_scalar_type && i == 1)
-		    pad_after = 0;
-
-		  break;
+		  Matrix m;
+		  tmp = new tree_constant (m);
 		}
 	      else
+		tmp = new tree_constant (results(i));
+
+	      tree_simple_assignment_expression tmp_expr
+		(lhs_expr, tmp, ma_line, ma_column);
+
+	      results(i) = tmp_expr.eval (0); // May change
+
+	      if (error_state)
+		break;
+
+	      if (print && pad_after)
 		{
-		  tree_constant *tmp = new tree_constant (results[i]);
-
-		  tree_simple_assignment_expression tmp_expr
-		    (lhs_expr, tmp, ma_line, ma_column);
-
-		  results[i] = tmp_expr.eval (0); // May change
-
-		  if (error_state)
-		    break;
-
-		  if (print && pad_after)
+		  ostrstream output_buf;
+		  output_buf << "\n" << '\0';
+		  maybe_page_output (output_buf);
+		}
+
+	      if (print && user_pref.print_answer_id_name)
+		{
+		  tree_identifier *tmp_id = lhs_expr->ident ();
+		  char *tmp_nm = tmp_id->name ();
+		  
+		  if (print_as_scalar (results(i)))
 		    {
 		      ostrstream output_buf;
-		      output_buf << "\n" << '\0';
+		      output_buf << tmp_nm << " = " << '\0';
 		      maybe_page_output (output_buf);
+		      last_was_scalar_type = 1;
 		    }
-
-		  if (print && user_pref.print_answer_id_name)
+		  else
 		    {
-		      tree_identifier *tmp_id = lhs_expr->ident ();
-		      char *tmp_nm = tmp_id->name ();
-
-		      if (print_as_scalar (results[i]))
-			{
-			  ostrstream output_buf;
-			  output_buf << tmp_nm << " = " << '\0';
-			  maybe_page_output (output_buf);
-			  last_was_scalar_type = 1;
-			}
-		      else
-			{
-			  ostrstream output_buf;
-			  output_buf << tmp_nm << " =\n\n" << '\0';
-			  maybe_page_output (output_buf);
-			  last_was_scalar_type = 0;
-			}
+		      ostrstream output_buf;
+		      output_buf << tmp_nm << " =\n\n" << '\0';
+		      maybe_page_output (output_buf);
+		      last_was_scalar_type = 0;
 		    }
-		  results[i].eval (print);
-		  pad_after++;
 		}
+
+	      results(i).eval (print);
+
+	      pad_after++;
 	      i++;
 	    }
 	  else
@@ -2572,40 +2566,37 @@
     {
 // Extract the arguments into a simple vector.
       int nargin = 0;
-      tree_constant *args = list->convert_to_const_vector (nargin);
+      Octave_object args = list->convert_to_const_vector (nargin);
 // Don't pass null arguments.
       if (error_state)
 	eval_error ();
       else if (nargin > 1 && all_args_defined (args, nargin))
 	{
-	  tree_constant *tmp = id->eval (print, 1, args, nargin);
+	  Octave_object tmp = id->eval (print, 1, args, nargin);
 
 	  if (error_state)
 	    eval_error ();
 
-	  if (tmp != NULL_TREE_CONST)
-	    retval = tmp[0];
-
-	  delete [] tmp;
+	  if (tmp.length () > 0)
+	    retval = tmp(0);
 	}
-      delete [] args;
     }
   return retval;
 }
 
-tree_constant *
+Octave_object
 tree_index_expression::eval (int print, int nargout,
-			     const tree_constant *args = NULL_TREE_CONST,
-			     int nargin = 0)
+			     const Octave_object& args, int nargin)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (error_state)
     return retval;
 
   if (list == (tree_argument_list *) NULL)
     {
-      retval = id->eval (print, nargout);
+      Octave_object tmp_args;
+      retval = id->eval (print, nargout, tmp_args, 0);
       if (error_state)
 	eval_error ();
     }
@@ -2613,7 +2604,7 @@
     {
 // Extract the arguments into a simple vector.
       int nargin = 0;
-      tree_constant *args = list->convert_to_const_vector (nargin);
+      Octave_object args = list->convert_to_const_vector (nargin);
 // Don't pass null arguments.
       if (error_state)
 	eval_error ();
@@ -2623,8 +2614,6 @@
 	  if (error_state)
 	    eval_error ();
 	}
-
-      delete [] args;
     }
   return retval;
 }
@@ -2725,12 +2714,12 @@
  * Convert a linked list of trees to a vector of pointers to trees,
  * evaluating them along the way.
  */
-tree_constant *
+Octave_object
 tree_argument_list::convert_to_const_vector (int& len)
 {
   len = length () + 1;
 
-  tree_constant *args = new tree_constant [len];
+  Octave_object args (len);
 
 // args[0] may eventually hold something useful, like the function
 // name.
@@ -2739,7 +2728,7 @@
     {
       if (tmp_list != (tree_argument_list *) NULL)
 	{
-	  args[k] = tmp_list->eval (0);
+	  args(k) = tmp_list->eval (0);
 	  if (error_state)
 	    {
 	      ::error ("evaluating argument list element number %d", k);
@@ -2749,7 +2738,7 @@
 	}
       else
 	{
-	  args[k] = tree_constant ();
+	  args(k) = tree_constant ();
 	  break;
 	}
     }
@@ -2859,10 +2848,10 @@
 }
 
 void
-tree_parameter_list::define_from_arg_vector (const tree_constant *args,
+tree_parameter_list::define_from_arg_vector (const Octave_object& args,
 					     int nargin)
 {
-  if (args == NULL_TREE_CONST)
+  if (args.length () <= 0)
     return;
 
   int expected_nargin = length () + 1;
@@ -2875,13 +2864,13 @@
 
       if (i < nargin)
 	{
-	  if (args[i].is_defined ()
-	      && (args[i].const_type () == tree_constant_rep::magic_colon))
+	  if (args(i).is_defined ()
+	      && (args(i).const_type () == tree_constant_rep::magic_colon))
 	    {
 	      ::error ("invalid use of colon in function argument list");
 	      return;
 	    }
-	  tmp = new tree_constant (args[i]);
+	  tmp = new tree_constant (args(i));
 	}
 
       ptr->define (tmp);
@@ -2889,28 +2878,33 @@
     }
 }
 
-// XXX FIXME XXX -- need a way to prevent this from setting
-// error_state and printing an error message if the elements are not
-// defined.
-tree_constant *
+Octave_object
 tree_parameter_list::convert_to_const_vector (void)
 {
   int nout = length ();
 
-  tree_constant *retval = new tree_constant [nout+1];
+  Octave_object retval (nout);
 
   int i = 0;
 
   tree_parameter_list *elem = this;
 
-  for ( ; elem != (tree_parameter_list *) NULL;	elem = elem->next) 
-    retval[i++] = elem->eval (0);
-
-  retval [nout] = tree_constant ();
+  for ( ; elem != (tree_parameter_list *) NULL;	elem = elem->next)
+    {
+      if (elem->is_defined ())
+	retval(i) = elem->eval (0);
+      i++;
+    }
 
   return retval;
 }
 
+int
+tree_parameter_list::is_defined (void)
+{
+  return (param != (tree_identifier *) NULL && param->is_defined ());
+}
+
 tree_parameter_list *
 tree_parameter_list::next_elem (void)
 {
--- a/src/pt-exp-base.h	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/pt-exp-base.h	Fri Jul 08 02:24:43 1994 +0000
@@ -30,28 +30,18 @@
 
 #include <stdio.h>
 
+#include "Array.h"
+
 #include "builtins.h"
 #include "error.h"
+#include "oct-obj.h"
 
 class tree_constant;
 class symbol_record;
 class symbol_table;
 
-#ifndef TREE_FCN_TYPEDEFS
-#define TREE_FCN_TYPEDEFS 1
-
-typedef tree_constant* (*Text_fcn)(int, char **, int);
-typedef tree_constant* (*General_fcn)(const tree_constant *, int, int);
-
-#endif
-
-#ifndef NULL_TREE
-#define NULL_TREE (tree *) NULL
-#endif
-
-#ifndef NULL_TREE_CONST
-#define NULL_TREE_CONST (tree_constant *) NULL
-#endif
+typedef Octave_object (*Text_fcn)(int, char **, int);
+typedef Octave_object (*General_fcn)(const Octave_object&, int, int);
 
 class tree_matrix;
 class tree_builtin;
@@ -99,10 +89,8 @@
   virtual void mark_for_possible_ans_assign (void)
     { panic_impossible (); }
 
-  virtual tree_constant *eval (int print, int nargout,
-			       const tree_constant *args = NULL_TREE_CONST,
-			       int nargin = 0)
-    { panic_impossible (); return NULL_TREE_CONST; }
+  virtual Octave_object eval (int print, int nargout,
+			      const Octave_object& args, int nargin);
 
 protected:
   expression_type etype;
@@ -282,9 +270,8 @@
 
   tree_constant eval (int print);
 
-  tree_constant *eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0);
+  Octave_object eval (int print, int nargout, const Octave_object& args,
+		      int nargin);
 
   void eval_error (void);
 
@@ -342,9 +329,8 @@
 
   tree_constant eval (int print);
 
-  tree_constant *eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0);
+  Octave_object eval (int print, int nargout, const Octave_object& args,
+		      int nargin);
 
   void eval_error (void);
 
@@ -366,7 +352,7 @@
 //  virtual int is_builtin (void) const
 //    { return 0; }
 
-  virtual tree_constant assign (tree_constant& t, tree_constant *args,
+  virtual tree_constant assign (tree_constant& t, const Octave_object& args,
 				int nargs);
 
   virtual char *name (void) const
@@ -416,9 +402,8 @@
 
   tree_constant eval (int print);
 
-  tree_constant *eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0);
+  Octave_object eval (int print, int nargout, const Octave_object& args,
+		      int nargin);
 
   char *name (void) const;
 
@@ -458,7 +443,10 @@
   void document (char *s);
 
   tree_constant assign (tree_constant& t);
-  tree_constant assign (tree_constant& t, tree_constant *args, int nargs);
+  tree_constant assign (tree_constant& t, const Octave_object& args,
+			int nargs);
+
+  int is_defined (void);
 
   void bump_value (tree::expression_type);
 
@@ -474,9 +462,8 @@
 
   tree_constant eval (int print);
 
-  tree_constant *eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0);
+  Octave_object eval (int print, int nargout, const Octave_object& args,
+		      int nargin);
 
   void eval_undefined_error (void);
 
@@ -519,9 +506,8 @@
 
   tree_constant eval (int print);
 
-  tree_constant *eval (int print, int nargout,
-		       const tree_constant *args = NULL_TREE_CONST,
-		       int nargin = 0);
+  Octave_object eval (int print, int nargout, const Octave_object& args,
+		      int nargin);
 
   int max_expected_args (void);
 
@@ -539,7 +525,7 @@
   int system_fcn_file;
   int varargs_ok;
   int num_named_args;
-  const tree_constant *args_passed;
+  Octave_object args_passed;
   int num_args_passed;
   int curr_arg_number;
 };
@@ -562,7 +548,7 @@
 
   tree_argument_list *next_elem (void);
 
-  tree_constant *convert_to_const_vector (int& nargs);
+  Octave_object convert_to_const_vector (int& nargs);
 
   tree_constant eval (int print);
 
@@ -598,9 +584,11 @@
 
   tree_identifier *define (tree_constant *t);
 
-  void define_from_arg_vector (const tree_constant *args, int nargin);
+  void define_from_arg_vector (const Octave_object& args, int nargin);
 
-  tree_constant *convert_to_const_vector (void);
+  int is_defined (void);
+
+  Octave_object convert_to_const_vector (void);
 
   tree_parameter_list *next_elem (void);
 
--- a/src/tc-inlines.h	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/tc-inlines.h	Fri Jul 08 02:24:43 1994 +0000
@@ -1,7 +1,7 @@
 // tc-inlines.cc                                          -*- C++ -*-
 /*
 
-Copyright (C) 1992, 1993 John W. Eaton
+Copyright (C) 1992, 1993, 1994 John W. Eaton
 
 This file is part of Octave.
 
@@ -140,12 +140,12 @@
 }
 
 static inline int
-valid_scalar_indices (const tree_constant *args, int nargs)
+valid_scalar_indices (const Octave_object& args, int nargs)
 {
-  int valid = args != NULL_TREE_CONST
-    && ((nargs == 3 && args[2].valid_as_scalar_index ()
-	 && args[1].valid_as_scalar_index ())
-	|| (nargs == 2 && args[1].valid_as_scalar_index ()));
+  int valid = (args.length () > 0)
+    && ((nargs == 3 && args(2).valid_as_scalar_index ()
+	 && args(1).valid_as_scalar_index ())
+	|| (nargs == 2 && args(1).valid_as_scalar_index ()));
 
   return valid;
 }
--- a/src/tc-rep.cc	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/tc-rep.cc	Fri Jul 08 02:24:43 1994 +0000
@@ -1315,7 +1315,7 @@
 }
 
 tree_constant
-tree_constant_rep::do_index (const tree_constant *args, int nargin)
+tree_constant_rep::do_index (const Octave_object& args, int nargin)
 {
   tree_constant retval;
 
@@ -2655,7 +2655,8 @@
  * hand off to other functions to do the real work.
  */
 void
-tree_constant_rep::assign (tree_constant& rhs, tree_constant *args, int nargs)
+tree_constant_rep::assign (tree_constant& rhs,
+			   const Octave_object& args, int nargs)
 {
   tree_constant rhs_tmp = rhs.make_numeric ();
 
@@ -2695,7 +2696,7 @@
  */
 void
 tree_constant_rep::do_scalar_assignment (tree_constant& rhs,
-					 tree_constant *args, int nargs)
+					 const Octave_object& args, int nargs)
 {
   assert (type_tag == unknown_constant
 	  || type_tag == scalar_constant
@@ -2800,7 +2801,7 @@
  */
 void
 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
-					 tree_constant *args, int nargs)
+					 const Octave_object& args, int nargs)
 {
   assert (type_tag == unknown_constant
 	  || type_tag == matrix_constant
@@ -2832,21 +2833,21 @@
   switch (nargs)
     {
     case 2:
-      if (! args)
+      if (args.length () <= 0)
 	::error ("matrix index is null");
-      else if (args[1].is_undefined ())
+      else if (args(1).is_undefined ())
 	::error ("matrix index is undefined");
       else
-	do_matrix_assignment (rhs, args[1]);
+	do_matrix_assignment (rhs, args(1));
       break;
     case 3:
-      if (! args)
+      if (args.length () <= 0)
 	::error ("matrix indices are null");
-      else if (args[1].is_undefined ())
+      else if (args(1).is_undefined ())
 	::error ("first matrix index is undefined");
-      else if (args[2].is_undefined ())
+      else if (args(2).is_undefined ())
 	::error ("second matrix index is undefined");
-      else if (args[1].is_empty () || args[2].is_empty ())
+      else if (args(1).is_empty () || args(2).is_empty ())
 	{
 	  if (! rhs.is_empty ())
 	    {
@@ -2858,7 +2859,7 @@
 // work than it's worth right now...
 	}
       else
-	do_matrix_assignment (rhs, args[1], args[2]);
+	do_matrix_assignment (rhs, args(1), args(2));
       break;
     default:
       ::error ("too many indices for matrix expression");
@@ -4999,7 +5000,7 @@
 }
 
 tree_constant
-tree_constant_rep::do_scalar_index (const tree_constant *args,
+tree_constant_rep::do_scalar_index (const Octave_object& args,
 				    int nargs) const
 {
   if (valid_scalar_indices (args, nargs))
@@ -5020,9 +5021,9 @@
 	{
 	case 3:
 	  {
-	    if (args[2].is_matrix_type ())
+	    if (args(2).is_matrix_type ())
 	      {
-		Matrix mj = args[2].matrix_value ();
+		Matrix mj = args(2).matrix_value ();
 
 		idx_vector j (mj, user_pref.do_fortran_indexing, "");
 		if (! j)
@@ -5032,9 +5033,9 @@
 		if (len == j.ones_count ())
 		  cols = len;
 	      }
-	    else if (args[2].const_type () == magic_colon
-		     || (args[2].is_scalar_type ()
-			 && NINT (args[2].double_value ()) == 1))
+	    else if (args(2).const_type () == magic_colon
+		     || (args(2).is_scalar_type ()
+			 && NINT (args(2).double_value ()) == 1))
 	      {
 		cols = 1;
 	      }
@@ -5044,9 +5045,9 @@
 // Fall through...
 	case 2:
 	  {
-	    if (args[1].is_matrix_type ())
+	    if (args(1).is_matrix_type ())
 	      {
-		Matrix mi = args[1].matrix_value ();
+		Matrix mi = args(1).matrix_value ();
 
 		idx_vector i (mi, user_pref.do_fortran_indexing, "");
 		if (! i)
@@ -5056,14 +5057,14 @@
 		if (len == i.ones_count ())
 		  rows = len;
 	      }
-	    else if (args[1].const_type () == magic_colon
-		     || (args[1].is_scalar_type ()
-			 && NINT (args[1].double_value ()) == 1))
+	    else if (args(1).const_type () == magic_colon
+		     || (args(1).is_scalar_type ()
+			 && NINT (args(1).double_value ()) == 1))
 	      {
 		rows = 1;
 	      }
-	    else if (args[1].is_scalar_type ()
-		     && NINT (args[1].double_value ()) == 0)
+	    else if (args(1).is_scalar_type ()
+		     && NINT (args(1).double_value ()) == 0)
 	      {
 		Matrix m (0, 0);
 		return tree_constant (m);
@@ -5108,7 +5109,7 @@
 }
 
 tree_constant
-tree_constant_rep::do_matrix_index (const tree_constant *args,
+tree_constant_rep::do_matrix_index (const Octave_object& args,
 				    int nargin) const
 {
   tree_constant retval;
@@ -5116,22 +5117,22 @@
   switch (nargin)
     {
     case 2:
-      if (! args)
+      if (args.length () <= 0)
 	::error ("matrix index is null");
-      else if (args[1].is_undefined ())
+      else if (args(1).is_undefined ())
 	::error ("matrix index is a null expression");
       else
-	retval = do_matrix_index (args[1]);
+	retval = do_matrix_index (args(1));
       break;
     case 3:
-      if (! args)
+      if (args.length () <= 0)
 	::error ("matrix indices are null");
-      else if (args[1].is_undefined ())
+      else if (args(1).is_undefined ())
 	::error ("first matrix index is a null expression");
-      else if (args[2].is_undefined ())
+      else if (args(2).is_undefined ())
 	::error ("second matrix index is a null expression");
       else
-	retval = do_matrix_index (args[1], args[2]);
+	retval = do_matrix_index (args(1), args(2));
       break;
     default:
       ::error ("too many indices for matrix expression");
--- a/src/tc-rep.h	Fri Jul 08 02:11:50 1994 +0000
+++ b/src/tc-rep.h	Fri Jul 08 02:24:43 1994 +0000
@@ -156,13 +156,13 @@
   tree_constant_rep::constant_type force_numeric (int force_str_conv = 0);
   tree_constant make_numeric (int force_str_conv = 0) const;
 
-  void assign (tree_constant& rhs, tree_constant *args, int nargs);
+  void assign (tree_constant& rhs, const Octave_object& args, int nargs);
 
   void do_scalar_assignment
-    (tree_constant& rhs, tree_constant *args, int nargin);
+    (tree_constant& rhs, const Octave_object& args, int nargin);
 
   void do_matrix_assignment
-    (tree_constant& rhs, tree_constant *args, int nargin);
+    (tree_constant& rhs, const Octave_object& args, int nargin);
 
   void do_matrix_assignment
     (tree_constant& rhs, tree_constant& i_arg);
@@ -232,12 +232,11 @@
   void maybe_mutate (void);
   void print (void);
 
-  tree_constant do_index (const tree_constant *args, int nargin);
+  tree_constant do_index (const Octave_object& args, int nargin);
 
-  tree_constant do_scalar_index (const tree_constant *args,
-				 int nargin) const;
+  tree_constant do_scalar_index (const Octave_object& args, int nargin) const;
 
-  tree_constant do_matrix_index (const tree_constant *args, int nargin) const;
+  tree_constant do_matrix_index (const Octave_object& args, int nargin) const;
 
   tree_constant do_matrix_index (const tree_constant& i_arg) const;