changeset 497:88614b380d6e

[project @ 1994-07-08 02:00:57 by jwe]
author jwe
date Fri, 08 Jul 1994 02:08:37 +0000
parents e7c5b23b34d3
children 2e1353465468
files src/balance.cc src/chol.cc src/colloc.cc src/dassl.cc src/det.cc src/dynamic-ld.h src/eig.cc src/expm.cc src/fft.cc src/file-io.cc src/file-io.h src/fsolve.cc src/fsqp.cc src/givens.cc src/hess.cc src/ifft.cc src/inv.cc src/lpsolve.cc src/lsode.cc src/lu.cc src/npsol.cc src/qpsol.cc src/qr.cc src/quad.cc src/qzval.cc src/rand.cc src/schur.cc src/svd.cc src/syl.cc src/symtab.h src/variables.h
diffstat 31 files changed, 686 insertions(+), 765 deletions(-) [+]
line wrap: on
line diff
--- a/src/balance.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/balance.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -42,24 +42,24 @@
 #include "f-balance.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_balance_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_balance_2 (const Octave_object& args, int nargin, int nargout)
 {
   return balance (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-balance (const tree_constant *args, int nargin, int nargout)
+Octave_object
+balance (const Octave_object& args, int nargin, int nargout)
 {
   char *bal_job;
   int my_nargin;		// # args w/o optional string arg
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   // determine if balancing option is listed
   // set my_nargin to the number of matrix inputs
-  if (args[nargin-1].const_type () == tree_constant_rep::string_constant ){
-    bal_job = args[nargin-1].string_value ();
+  if (args(nargin-1).const_type () == tree_constant_rep::string_constant ){
+    bal_job = args(nargin-1).string_value ();
     my_nargin = nargin-2;
   }
   else
@@ -68,7 +68,7 @@
     my_nargin = nargin-1;
   }
 
-  tree_constant arg = args[1].make_numeric ();
+  tree_constant arg = args(1).make_numeric ();
   int a_nr = arg.rows ();
   int a_nc = arg.columns ();
 
@@ -81,9 +81,9 @@
 	{
 	  if (flag < 0) warning ("balance: argument is empty matrix");
 	  Matrix m;
-	  retval = new tree_constant [3];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
+	  retval.resize (2);
+	  retval(0) = tree_constant (m);
+	  retval(1) = tree_constant (m);
 	}
       else
 	error ("balance: empty matrix is invalid as argument");
@@ -131,29 +131,29 @@
 
 // Algebraic eigenvalue problem.
 
-      retval = new tree_constant[nargout+1];
+      retval.resize (nargout ? nargout : 1);
       if (arg.is_complex_type ())
 	{
 	  ComplexAEPBALANCE result (caa, bal_job);
 
-	  if (nargout == 1)
-	    retval[0] = tree_constant(result.balanced_matrix ());
+	  if (nargout == 0 || nargout == 1)
+	    retval(0) = tree_constant(result.balanced_matrix ());
 	  else
 	    {
-	      retval[0] = tree_constant (result.balancing_matrix ());
-	      retval[1] = tree_constant (result.balanced_matrix ());
+	      retval(0) = tree_constant (result.balancing_matrix ());
+	      retval(1) = tree_constant (result.balanced_matrix ());
 	    }
 	}
       else
 	{
 	  AEPBALANCE result (aa, bal_job);
 
-	  if (nargout == 1)
-	    retval[0] = tree_constant (result.balanced_matrix ());
+	  if (nargout == 0 || nargout == 1)
+	    retval(0) = tree_constant (result.balanced_matrix ());
 	  else
 	    {
-	      retval[0] = tree_constant (result.balancing_matrix ());
-	      retval[1] = tree_constant (result.balanced_matrix ());
+	      retval(0) = tree_constant (result.balancing_matrix ());
+	      retval(1) = tree_constant (result.balanced_matrix ());
 	    }
 	}
       break;
@@ -162,11 +162,11 @@
 // Generalized eigenvalue problem.
 
       {
-	retval = new tree_constant[nargout+1];
+	retval.resize (nargout ? nargout : 1);
       
 // 1st we have to check argument 2 dimensions and type...
 
-	tree_constant brg = args[2].make_numeric ();
+	tree_constant brg = args(2).make_numeric ();
 	int b_nr = brg.rows ();
 	int b_nc = brg.columns ();
       
@@ -238,17 +238,17 @@
 	      {
 	      case 1:
 		warning ("balance: should use two output arguments");
-		retval[0] = tree_constant (caa);
+		retval(0) = tree_constant (caa);
 		break;
 	      case 2:
-		retval[0] = tree_constant (caa);
-		retval[1] = tree_constant (cbb);
+		retval(0) = tree_constant (caa);
+		retval(1) = tree_constant (cbb);
 		break;
 	      case 4:
-		retval[0] = tree_constant (result.left_balancing_matrix ());
-		retval[1] = tree_constant (result.right_balancing_matrix ());
-		retval[2] = tree_constant (caa);
-		retval[3] = tree_constant (cbb);
+		retval(0) = tree_constant (result.left_balancing_matrix ());
+		retval(1) = tree_constant (result.right_balancing_matrix ());
+		retval(2) = tree_constant (caa);
+		retval(3) = tree_constant (cbb);
 		break;
 	      default:
 		error ("balance: illegal number of output arguments");
@@ -260,14 +260,14 @@
 	    switch (nargout)
 	      {
 	      case 2:
-		retval[0] = tree_constant (result.balanced_a_matrix ());
-		retval[1] = tree_constant (result.balanced_b_matrix ());
+		retval(0) = tree_constant (result.balanced_a_matrix ());
+		retval(1) = tree_constant (result.balanced_b_matrix ());
 		break;
 	      case 4:
-		retval[0] = tree_constant (result.left_balancing_matrix ());
-		retval[1] = tree_constant (result.right_balancing_matrix ());
-		retval[2] = tree_constant (result.balanced_a_matrix ());
-		retval[3] = tree_constant (result.balanced_b_matrix ());
+		retval(0) = tree_constant (result.left_balancing_matrix ());
+		retval(1) = tree_constant (result.right_balancing_matrix ());
+		retval(2) = tree_constant (result.balanced_a_matrix ());
+		retval(3) = tree_constant (result.balanced_b_matrix ());
 		break;
 	      default:
 		error ("balance: illegal number of output arguments");
--- a/src/chol.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/chol.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,19 +35,21 @@
 #include "f-chol.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_chol_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object*
+builtin_chol_2 (const Octave_object& args, int nargin, int nargout)
 {
-  return chol (args, nargin, nargout);
+  Octave_object retval (1);
+  retval(0) = chol (args(1));
+  return retval;
 }
 #endif
 
-tree_constant *
-chol (const tree_constant *a, int nargin, int nargout)
+tree_constant
+chol (const tree_constant& a)
 {
-  tree_constant *retval = new tree_constant [2];
+  tree_constant retval;
 
-  tree_constant tmp = a[1].make_numeric ();;
+  tree_constant tmp = a.make_numeric ();;
     
   int nr = tmp.rows ();
   int nc = tmp.columns ();
@@ -60,9 +62,7 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("chol", 0);
 	  Matrix m;
-	  retval = new tree_constant [3];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
+	  retval = tree_constant (m);
 	}
       else
 	gripe_empty_arg ("chol", 1);
@@ -80,7 +80,7 @@
         if (info != 0)
           error ("chol: matrix not positive definite");
         else
-  	  retval[0] = tree_constant (fact.chol_matrix ());
+  	  retval = tree_constant (fact.chol_matrix ());
       }
       break;
     case tree_constant_rep::complex_matrix_constant:
@@ -91,19 +91,19 @@
         if (info != 0)
           error ("chol: matrix not positive definite");
         else
-	  retval[0] = tree_constant (fact.chol_matrix ());
+	  retval = tree_constant (fact.chol_matrix ());
       }
       break;
     case tree_constant_rep::scalar_constant:
       {
 	double d = tmp.double_value ();
-	retval[0] = tree_constant (d);
+	retval = tree_constant (d);
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
 	Complex c = tmp.complex_value ();
-	retval[0] = tree_constant (c);
+	retval = tree_constant (c);
       }
       break;
     default:
--- a/src/colloc.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/colloc.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -1,7 +1,7 @@
 // f-colloc.cc                                           -*- C++ -*-
 /*
 
-Copyright (C) 1993 John W. Eaton
+Copyright (C) 1993, 1994 John W. Eaton
 
 This file is part of Octave.
 
@@ -33,26 +33,26 @@
 #include "f-colloc.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_colloc_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_colloc_2 (const Octave_object& args, int nargin, int nargout)
 {
   return collocation_weights (args, nargin);
 }
 #endif
 
-tree_constant *
-collocation_weights (const tree_constant *args, int nargin)
+Octave_object
+collocation_weights (const Octave_object& args, int nargin)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  if (args[1].const_type () != tree_constant_rep::complex_scalar_constant
-      && args[1].const_type () != tree_constant_rep::scalar_constant)
+  if (args(1).const_type () != tree_constant_rep::complex_scalar_constant
+      && args(1).const_type () != tree_constant_rep::scalar_constant)
     {
       error ("colloc: first argument must be a scalar");
       return retval;
     }
 
-  int ncol = NINT (args[1].double_value ());
+  int ncol = NINT (args(1).double_value ());
   if (ncol < 0)
     {
       error ("colloc: first argument must be non-negative");
@@ -65,15 +65,15 @@
 
   for (int i = 2; i < nargin; i++)
     {
-      if (args[i].is_defined ())
+      if (args(i).is_defined ())
 	{
-	  if (! args[i].is_string_type ())
+	  if (! args(i).is_string_type ())
 	    {
 	      error ("colloc: expecting string argument");
 	      return retval;
 	    }
 
-	  char *s = args[i].string_value ();
+	  char *s = args(i).string_value ();
 	  if (s != (char *) NULL
 	      && (((*s == 'R' || *s == 'r') && strlen (s) == 1)
 		  || strcmp (s, "right") == 0))
@@ -113,13 +113,12 @@
   Matrix B = wts.second ();
   ColumnVector q = wts.quad_weights ();
 
-  retval = new tree_constant [5];
+  retval.resize (4);
 
-  retval[0] = tree_constant (r);
-  retval[1] = tree_constant (A);
-  retval[2] = tree_constant (B);
-  retval[3] = tree_constant (q);
-  retval[4] = tree_constant ();
+  retval(0) = tree_constant (r);
+  retval(1) = tree_constant (A);
+  retval(2) = tree_constant (B);
+  retval(3) = tree_constant (q);
 
   return retval;
 }
--- a/src/dassl.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/dassl.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -41,14 +41,14 @@
 static tree_fvc *dassl_fcn;
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_dassl_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_dassl_2 (const Octave_object& args, int nargin, int nargout)
 {
   return dassl (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_dassl_options_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_dassl_options_2 (const Octave_object& args, int nargin, int nargout)
 {
   return dassl_options (args, nargin, nargout);
 }
@@ -66,9 +66,9 @@
   assert (nstates == xdot.capacity ());
 
 //  tree_constant name (dassl_fcn->name ());
-  tree_constant *args = new tree_constant [4];
-//  args[0] = name;
-  args[3] = tree_constant (t);
+  Octave_object args (4);
+//  args(0) = name;
+  args(3) = tree_constant (t);
 
   if (nstates > 1)
     {
@@ -81,8 +81,8 @@
 	}
       tree_constant state (m1);
       tree_constant deriv (m2);
-      args[1] = state;
-      args[2] = deriv;
+      args(1) = state;
+      args(2) = deriv;
     }
   else
     {
@@ -90,15 +90,13 @@
       double d2 = xdot.elem (0);
       tree_constant state (d1);
       tree_constant deriv (d2);
-      args[1] = state;
-      args[2] = deriv;
+      args(1) = state;
+      args(2) = deriv;
     }
 
   if (dassl_fcn != (tree_fvc *) NULL)
     {
-      tree_constant *tmp = dassl_fcn->eval (0, 1, args, 4);
-
-      delete [] args;
+      Octave_object tmp = dassl_fcn->eval (0, 1, args, 4);
 
       if (error_state)
 	{
@@ -106,45 +104,40 @@
 	  return retval;
 	}
 
-      if (tmp != NULL_TREE_CONST && tmp[0].is_defined ())
+      if (tmp.length () > 0 && tmp(0).is_defined ())
 	{
-	  retval = tmp[0].to_vector ();
-
-	  delete [] tmp;
+	  retval = tmp(0).to_vector ();
 
 	  if (retval.length () == 0)
 	    gripe_user_supplied_eval ("dassl");
 	}
       else
-	{
-	  delete [] tmp;
-	  gripe_user_supplied_eval ("dassl");
-	}
+	gripe_user_supplied_eval ("dassl");
     }
 
   return retval;
 }
 
-tree_constant *
-dassl (const tree_constant *args, int nargin, int nargout)
+Octave_object
+dassl (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;
 
-  dassl_fcn = is_valid_function (args[1], "dassl", 1);
+  dassl_fcn = is_valid_function (args(1), "dassl", 1);
   if (dassl_fcn == (tree_fvc *) NULL
       || takes_correct_nargs (dassl_fcn, 4, "dassl", 1) != 1)
     return retval;
 
-  ColumnVector state = args[2].to_vector ();
-  ColumnVector deriv = args[3].to_vector ();
-  ColumnVector out_times = args[4].to_vector ();
+  ColumnVector state = args(2).to_vector ();
+  ColumnVector deriv = args(3).to_vector ();
+  ColumnVector out_times = args(4).to_vector ();
   ColumnVector crit_times;
   int crit_times_set = 0;
   if (nargin > 5)
     {
-      crit_times = args[5].to_vector ();
+      crit_times = args(5).to_vector ();
       crit_times_set = 1;
     }
 
@@ -168,9 +161,9 @@
   else
     output = dae.integrate (out_times, deriv_output);
 
-  retval = new tree_constant [3];
-  retval[0] = tree_constant (output);
-  retval[1] = tree_constant (deriv_output);
+  retval.resize (2);
+  retval(0) = tree_constant (output);
+  retval(1) = tree_constant (deriv_output);
   return retval;
 }
 
@@ -179,7 +172,7 @@
 
 #define MAX_TOKENS 3
 
-struct ODE_OPTIONS
+struct DAE_OPTIONS
 {
   char *keyword;
   char *kw_tok[MAX_TOKENS + 1];
@@ -189,7 +182,7 @@
   d_get_opt_mf d_get_fcn;
 };
 
-static ODE_OPTIONS dassl_option_table[] =
+static DAE_OPTIONS dassl_option_table [] =
 {
   { "absolute tolerance",
     { "absolute", "tolerance", NULL, NULL, },
@@ -233,7 +226,7 @@
 	     << "  keyword                                  value\n"
 	     << "  -------                                  -----\n\n";
 
-  ODE_OPTIONS *list = dassl_option_table;
+  DAE_OPTIONS *list = dassl_option_table;
 
   char *keyword;
   while ((keyword = list->keyword) != (char *) NULL)
@@ -257,7 +250,7 @@
 static void
 do_dassl_option (char *keyword, double val)
 {
-  ODE_OPTIONS *list = dassl_option_table;
+  DAE_OPTIONS *list = dassl_option_table;
 
   while (list->keyword != (char *) NULL)
     {
@@ -274,30 +267,26 @@
   warning ("dassl_options: no match for `%s'", keyword);
 }
 
-tree_constant *
-dassl_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+dassl_options (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (nargin == 1)
-    {
-      print_dassl_option_list ();
-    }
+    print_dassl_option_list ();
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ())
+      if (args(1).is_string_type ())
 	{
-	  char *keyword = args[1].string_value ();
-	  double val = args[2].double_value ();
+	  char *keyword = args(1).string_value ();
+	  double val = args(2).double_value ();
 	  do_dassl_option (keyword, val);
 	}
       else
 	print_usage ("dassl_options");
     }
   else
-    {
-      print_usage ("dassl_options");
-    }
+    print_usage ("dassl_options");
 
   return retval;
 }
--- a/src/det.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/det.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,11 +35,11 @@
 #include "f-det.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_det_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_det_2 (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = new tree_constant [2];
-  retval[0] = determinant (args[1]);
+  Octave_object retval (1);
+  retval(0) = determinant (args(1));
   return retval;
 }
 #endif
--- a/src/dynamic-ld.h	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/dynamic-ld.h	Fri Jul 08 02:08:37 1994 +0000
@@ -24,9 +24,9 @@
 #if !defined (octave_dynamic_ld_h)
 #define octave_dynamic_ld_h 1
 
-class tree_constant;
+#include "oct-obj.h"
 
-typedef tree_constant* (*builtin_fcn_ptr) (tree_constant*, int, int);
+typedef Octave_object (*builtin_fcn_ptr) (const Octave_object&, int, int);
 
 extern void octave_dld_tc2_unlink_by_symbol (const char *name, int hard = 1);
 
@@ -36,11 +36,11 @@
 				       const char *fcn,
 				       const char *object);
 
-extern tree_constant *octave_dld_tc2_and_go (tree_constant *args,
-					     int nargin, int nargout,
-					     const char *name,
-					     const char *fcn,
-					     const char *object);
+extern Octave_object octave_dld_tc2_and_go (const Octave_object&,
+					    int nargin, int nargout,
+					    const char *name,
+					    const char *fcn,
+					    const char *object);
 
 #endif
 
--- a/src/eig.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/eig.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -34,19 +34,19 @@
 #include "f-eig.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_eig_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_eig_2 (const Octave_object& args, int nargin, int nargout)
 {
   return eig (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-eig (const tree_constant *args, int nargin, int nargout)
+Octave_object
+eig (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arg = args[1].make_numeric ();
+  tree_constant arg = args(1).make_numeric ();
 
   int a_nr = arg.rows ();
   int a_nc = arg.columns ();
@@ -59,9 +59,9 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("eig", 0);
 	  Matrix m;
-	  retval = new tree_constant [3];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
+	  retval.resize (2);
+	  retval(0) = tree_constant (m);
+	  retval(1) = tree_constant (m);
 	}
       else
 	gripe_empty_arg ("eig", 1);
@@ -103,10 +103,10 @@
       break;
     }
 
-  if (nargout == 1)
+  if (nargout == 0 || nargout == 1)
     {
-      retval = new tree_constant [2];
-      retval[0] = tree_constant (result.eigenvalues (), 1);
+      retval.resize (1);
+      retval(0) = tree_constant (result.eigenvalues (), 1);
     }
   else
     {
@@ -114,9 +114,9 @@
 
       ComplexDiagMatrix d (result.eigenvalues ());
 
-      retval = new tree_constant [3];
-      retval[0] = tree_constant (result.eigenvectors ());
-      retval[1] = tree_constant (d);
+      retval.resize (2);
+      retval(0) = tree_constant (result.eigenvectors ());
+      retval(1) = tree_constant (d);
     }
 
   return retval;
--- a/src/expm.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/expm.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -43,11 +43,11 @@
 #include "f-expm.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_matrix_exp_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_matrix_exp_2 (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = new tree_constant [2];
-  retval[0] = matrix_exp (args[1]);
+  Octave_object retval (1);
+  retval(0) = matrix_exp (args(1));
   return retval;
 }
 #endif
@@ -69,7 +69,7 @@
 
 // Constants for matrix exponential calculation.
 
-  static double padec[] =
+  static double padec [] =
     {
       5.0000000000000000e-1,
       1.1666666666666667e-1,
--- a/src/fft.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/fft.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,11 +35,11 @@
 #include "f-fft.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_fft_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_fft_2 (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = new tree_constant [2];
-  retval[0] = fft (args[1]);
+  Octave_object retval (1);
+  retval(0) = fft (args(1));
   return retval;
 }
 #endif
--- a/src/file-io.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/file-io.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -275,12 +275,12 @@
   return p;
 }
 
-tree_constant *
-fclose_internal (const tree_constant *args)
+Octave_object
+fclose_internal (const Octave_object& args)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = return_valid_file (args[1]);
+  Pix p = return_valid_file (args(1));
 
   if (p == (Pix) NULL)
     return retval;
@@ -297,24 +297,24 @@
   file_list.del (p);
   file_count--;
 
-  retval = new tree_constant[2];
+  retval.resize (1);
   if (success == 0)
-    retval[0] = tree_constant (1.0); // succeeded
+    retval(0) = tree_constant (1.0); // succeeded
   else
     {
       error ("fclose: error on closing file");
-      retval[0] = tree_constant (0.0); // failed
+      retval(0) = tree_constant (0.0); // failed
     }
 
   return retval;
 }
 
-tree_constant *
-fflush_internal (const tree_constant *args)
+Octave_object
+fflush_internal (const Octave_object& args)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = return_valid_file (args[1]);
+  Pix p = return_valid_file (args(1));
 
   if (p == (Pix) NULL)
     return retval;
@@ -334,13 +334,13 @@
   else
     success = fflush (file.fptr ());
 
-  retval = new tree_constant[2];
+  retval.resize (1);
   if (success == 0)
-    retval[0] = tree_constant (1.0); // succeeded
+    retval(0) = tree_constant (1.0); // succeeded
   else
     {
       error ("fflush: write error");
-      retval[0] = tree_constant (0.0); // failed
+      retval(0) = tree_constant (0.0); // failed
     }
 
   return retval;
@@ -361,20 +361,20 @@
   return 0;
 }
 
-tree_constant *
-fgets_internal (const tree_constant *args, int nargout)
+Octave_object
+fgets_internal (const Octave_object& args, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = file_io_get_file (args[1], "r", "fgets");
+  Pix p = file_io_get_file (args(1), "r", "fgets");
   
   if (p == (Pix) NULL)
     return retval;
 
   int length = 0;
-  if (args[2].is_scalar_type ())
+  if (args(2).is_scalar_type ())
     {
-      length = (int) args[2].double_value ();
+      length = (int) args(2).double_value ();
       if ((double) NINT (length) != length)
 	{
 	  error ("fgets: length not an integer value");
@@ -389,56 +389,56 @@
 
   if (success == (char *) NULL)
     {
-      retval = new tree_constant[2];
-      retval[0] = tree_constant (-1.0);
+      retval.resize (1);
+      retval(0) = tree_constant (-1.0);
       return retval;
     }
 
   if (nargout == 2)
     {
-      retval = new tree_constant[3];
-      retval[1] = tree_constant ((double) strlen (string));
+      retval.resize (2);
+      retval(1) = tree_constant ((double) strlen (string));
     }
   else
-    retval = new tree_constant[2];
+    retval.resize (1);
 
-  retval[0] = tree_constant (string);
+  retval(0) = tree_constant (string);
 
   return retval;
 }
 
-tree_constant *
-fopen_internal (const tree_constant *args)
+Octave_object
+fopen_internal (const Octave_object& args)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
   Pix p;
 
-  if (! args[1].is_string_type ())
+  if (! args(1).is_string_type ())
     {
       error ("fopen: file name must be a string");
       return retval;
     }
 
-  p = return_valid_file (args[1]);
+  p = return_valid_file (args(1));
 
   if (p != (Pix) NULL)
     {
       file_info file = file_list (p);
 
-      retval = new tree_constant[2];
-      retval[0] = tree_constant ((double) file.number ());
+      retval.resize (1);
+      retval(0) = tree_constant ((double) file.number ());
 
       return retval;
     }
 
-  if (! args[2].is_string_type ())
+  if (! args(2).is_string_type ())
     {
       error ("fopen: file mode must be a string");
       return retval;
     }
 
-  char *name = args[1].string_value ();
-  char *mode = args[2].string_value ();
+  char *name = args(1).string_value ();
+  char *mode = args(2).string_value ();
 
   if (! valid_mode (mode))
     {
@@ -466,16 +466,16 @@
   file_info file (number, name, file_ptr, mode);
   file_list.append (file);
 
-  retval = new tree_constant[2];
-  retval[0] = tree_constant ((double) number);
+  retval.resize (1);
+  retval(0) = tree_constant ((double) number);
 
   return retval;
 }
 
-tree_constant *
+Octave_object
 freport_internal (void)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
   Pix p = file_list.first ();
 
   ostrstream output_buf;
@@ -495,12 +495,12 @@
   return retval;
 }
 
-tree_constant *
-frewind_internal (const tree_constant *args)
+Octave_object
+frewind_internal (const Octave_object& args)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = file_io_get_file (args[1], "a+", "frewind");
+  Pix p = file_io_get_file (args(1), "a+", "frewind");
 
   if (p != (Pix) NULL)
     {
@@ -511,21 +511,21 @@
   return retval;
 }
 
-tree_constant *
-fseek_internal (const tree_constant *args, int nargin)
+Octave_object
+fseek_internal (const Octave_object& args, int nargin)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = file_io_get_file (args[1], "a+", "fseek");
+  Pix p = file_io_get_file (args(1), "a+", "fseek");
 
   if (p == (Pix) NULL)
     return retval;
 
   long origin = SEEK_SET;
   long offset = 0;
-  if (args[2].is_scalar_type ())
+  if (args(2).is_scalar_type ())
     {
-      offset = (long) args[2].double_value ();
+      offset = (long) args(2).double_value ();
       if ((double) NINT (offset) != offset)
 	{
 	  error ("fseek: offset not an integer value");
@@ -533,9 +533,9 @@
 	}
     }
 
-  if (nargin == 4 && args[3].is_scalar_type ())
+  if (nargin == 4 && args(3).is_scalar_type ())
     {
-      origin = (long) args[3].double_value ();
+      origin = (long) args(3).double_value ();
       if (origin == -1)
 	origin = SEEK_CUR;
       else if (origin == -2)
@@ -552,32 +552,32 @@
 
   file_info file = file_list (p);
   int success = fseek (file.fptr (), offset, origin);
-  retval = new tree_constant[2];
+  retval.resize (1);
 
   if (success == 0)
-    retval[0] = tree_constant (1.0); // succeeded
+    retval(0) = tree_constant (1.0); // succeeded
   else
     {
       error ("fseek: file error");
-      retval[0] = tree_constant (0.0); // failed
+      retval(0) = tree_constant (0.0); // failed
     }
 
   return retval;
 }
 
-tree_constant *
-ftell_internal (const tree_constant *args)
+Octave_object
+ftell_internal (const Octave_object& args)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = file_io_get_file (args[1], "a+", "ftell");
+  Pix p = file_io_get_file (args(1), "a+", "ftell");
 
   if (p != (Pix) NULL)
     {
       file_info file = file_list (p);
       long offset = ftell (file.fptr ());
-      retval = new tree_constant[2];
-      retval[0] = tree_constant ((double) offset);
+      retval.resize (1);
+      retval(0) = tree_constant ((double) offset);
 
       if (offset == -1L)
 	error ("ftell: write error");
@@ -605,7 +605,7 @@
 }
 
 static int
-process_printf_format (const char *s, const tree_constant *args,
+process_printf_format (const char *s, const Octave_object& args,
 		       ostrstream& sb, const char *type, int nargin)
 {
   ostrstream fmt;
@@ -639,14 +639,14 @@
 	  return -1;
 	}
 
-      if (args[fmt_arg_count].const_type ()
+      if (args(fmt_arg_count).const_type ()
 	  != tree_constant_rep::scalar_constant)
 	{
 	  error ("%s: `*' must be replaced by an integer", type);
 	  return -1;
 	}
 
-      fmt << NINT (args[fmt_arg_count++].double_value ());
+      fmt << NINT (args(fmt_arg_count++).double_value ());
       s++;
       chars_from_fmt_str++;
     }
@@ -679,14 +679,14 @@
 	  return -1;
 	}
 
-      if (args[fmt_arg_count].const_type ()
+      if (args(fmt_arg_count).const_type ()
 	  != tree_constant_rep::scalar_constant)
 	{
 	  error ("%s: `*' must be replaced by an integer", type);
 	  return -1;
 	}
 
-      fmt << NINT (args[fmt_arg_count++].double_value ());
+      fmt << NINT (args(fmt_arg_count++).double_value ());
       s++;
       chars_from_fmt_str++;
     }
@@ -717,7 +717,7 @@
       return -1;
     }
 
-  arg_type = args[fmt_arg_count].const_type ();
+  arg_type = args(fmt_arg_count).const_type ();
 
   switch (*s)
     {
@@ -729,7 +729,7 @@
 	{
 	  chars_from_fmt_str++;
 	  fmt << *s << ends;
-	  double d = args[fmt_arg_count++].double_value ();
+	  double d = args(fmt_arg_count++).double_value ();
 	  if ((int) d != d)
 	    goto invalid_conversion;
 	  else
@@ -750,7 +750,7 @@
 	  chars_from_fmt_str++;
 	  fmt << *s << ends;
 	  char *s = fmt.str ();
-	  sb.form (s, args[fmt_arg_count++].double_value ());
+	  sb.form (s, args(fmt_arg_count++).double_value ());
 	  delete [] s;
 	  return chars_from_fmt_str;
 	}
@@ -764,7 +764,7 @@
 	  chars_from_fmt_str++;
 	  fmt << *s << ends;
 	  char *s = fmt.str ();
-	  sb.form (s, args[fmt_arg_count++].string_value ());
+	  sb.form (s, args(fmt_arg_count++).string_value ());
 	  delete [] s;
 	  return chars_from_fmt_str;
 	}
@@ -777,7 +777,7 @@
 	{
 	  chars_from_fmt_str++;
 	  fmt << *s << ends;
-	  char *str = args[fmt_arg_count++].string_value ();
+	  char *str = args(fmt_arg_count++).string_value ();
 	  if (strlen (str) != 1)
 	    goto invalid_conversion;
 	  else
@@ -803,20 +803,20 @@
 }
 
 
-tree_constant *
-do_printf (const char *type, const tree_constant *args, int nargin,
+Octave_object
+do_printf (const char *type, const Octave_object& args, int nargin,
 	   int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
   fmt_arg_count = 1;
   char *fmt;
   file_info file;
 
   if (strcmp (type, "fprintf") == 0)
     {
-      if (args[2].is_string_type ())
+      if (args(2).is_string_type ())
 	{
-	  fmt = args[2].string_value ();
+	  fmt = args(2).string_value ();
 	  fmt_arg_count++;
 	}
       else
@@ -825,7 +825,7 @@
 	  return retval;
 	}
 
-      Pix p = file_io_get_file (args[1], "a+", type);
+      Pix p = file_io_get_file (args(1), "a+", type);
 
       if (p == (Pix) NULL)
 	return retval;
@@ -838,13 +838,13 @@
 	  return retval;
 	}
 
-      fmt = args[2].string_value ();
+      fmt = args(2).string_value ();
 
       fmt_arg_count++;
     }
-  else if (args[1].is_string_type ())
+  else if (args(1).is_string_type ())
     {
-      fmt = args[1].string_value ();
+      fmt = args(1).string_value ();
       fmt_arg_count++;
     }
   else
@@ -903,9 +903,9 @@
     }
   else if (strcmp (type, "sprintf") == 0)
     {
-      retval = new tree_constant [2];
+      retval.resize (1);
       char *msg = output_buf.str ();
-      retval[0] = tree_constant (msg);
+      retval(0) = tree_constant (msg);
       delete [] msg;
     }
 
@@ -915,7 +915,7 @@
 static int
 process_scanf_format (const char *s, ostrstream& fmt,
 		      const char *type, int nargout, FILE* fptr,
-		      tree_constant *values)
+		      Octave_object& values)
 {
   fmt << "%";
 
@@ -961,7 +961,7 @@
 // Even if we don't have a place to store them, attempt to convert
 // everything specified by the format string.
 
-  if (fmt_arg_count >= nargout)
+  if (fmt_arg_count >= (nargout ? nargout : 1))
     store_value = 0;
 
   switch (*s)
@@ -975,7 +975,7 @@
 	success = fscanf (fptr, str, &temp);
 	delete [] str;
 	if (success > 0 && store_value)
-	  values[fmt_arg_count++] = tree_constant ((double) temp);
+	  values(fmt_arg_count++) = tree_constant ((double) temp);
       }
       break;
     case 'e': case 'E': case 'f': case 'g': case 'G':
@@ -987,7 +987,7 @@
 	success = fscanf (fptr, str, &temp);
 	delete [] str;
 	if (success > 0 && store_value)
-	  values[fmt_arg_count++] = tree_constant (temp);
+	  values(fmt_arg_count++) = tree_constant (temp);
       }
       break;
     case 's':
@@ -1023,7 +1023,7 @@
 	success = fscanf (fptr, str, temp);
 	delete [] str;
 	if (success && store_value)
-	  values[fmt_arg_count++] = tree_constant (temp);
+	  values(fmt_arg_count++) = tree_constant (temp);
       }
       break;
     case 'c':
@@ -1039,7 +1039,7 @@
 	delete [] str;
 	temp[string_width] = '\0';
 	if (success > 0 && store_value)
-	  values[fmt_arg_count++] = tree_constant (temp);
+	  values(fmt_arg_count++) = tree_constant (temp);
       }
       break;
     default:
@@ -1068,10 +1068,10 @@
   return -1;
 }
 
-tree_constant *
-do_scanf (const char *type, const tree_constant *args, int nargin, int nargout)
+Octave_object
+do_scanf (const char *type, const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
   char *scanf_fmt = (char *) NULL;
   char *tmp_file = (char *) NULL;
   int tmp_file_open = 0;
@@ -1082,8 +1082,8 @@
 
   if (strcmp (type, "scanf") != 0)
     {
-      if (args[2].is_string_type ())
-	scanf_fmt = args[2].string_value ();
+      if (args(2).is_string_type ())
+	scanf_fmt = args(2).string_value ();
       else
 	{
 	  error ("%s: format must be a string", type);
@@ -1095,7 +1095,7 @@
 
   if (doing_fscanf)
     {
-      Pix p = file_io_get_file (args[1], "r", type);
+      Pix p = file_io_get_file (args(1), "r", type);
 
       if (p == (Pix) NULL)
 	return retval;
@@ -1111,13 +1111,13 @@
       fptr = file.fptr ();
     }
 
-  if ((fptr == (FILE *) NULL && args[1].is_string_type ())
+  if ((fptr == (FILE *) NULL && args(1).is_string_type ())
       || (doing_fscanf && file.number () == 0))
     {
       char *string;
 
       if (strcmp (type, "scanf") == 0)
-	scanf_fmt = args[1].string_value ();
+	scanf_fmt = args(1).string_value ();
 
       if (strcmp (type, "scanf") == 0
 	  || (doing_fscanf && file.number () == 0))
@@ -1127,7 +1127,7 @@
 	    maybe_save_history (string);
 	}
       else
-	string = args[1].string_value ();
+	string = args(1).string_value ();
 
       tmp_file = tmpnam ((char *) NULL);
 
@@ -1162,7 +1162,7 @@
 
 // Scan scanf_fmt for % escapes and assign the arguments.
 
-  retval = new tree_constant[nargout+1];
+  retval.resize (nargout ? nargout : 1);
 
   char *ptr = scanf_fmt;
 
@@ -1191,10 +1191,7 @@
       if (status < 0)
 	{
 	  if (fmt_arg_count == 0)
-	    {
-	      delete [] retval;
-	      retval = NULL_TREE_CONST;
-	    }
+	    retval.resize (0);
 	  break;
 	}
 
@@ -1273,12 +1270,12 @@
  *     data	 : output data
  *     count	 : number of elements read
  */
-tree_constant *
-fread_internal (const tree_constant *args, int nargin, int nargout)
+Octave_object
+fread_internal (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = file_io_get_file (args[1], "r", "fread");
+  Pix p = file_io_get_file (args(1), "r", "fread");
 
   if (p == (Pix) NULL)
     return retval;
@@ -1287,8 +1284,8 @@
   char *prec = "uchar";
   if (nargin > 3)
     {
-      if (args[3].is_string_type ())
-	prec = args[3].string_value ();
+      if (args(3).is_string_type ())
+	prec = args(3).string_value ();
       else
 	{
 	  error ("fread: precision must be a specified as a string");
@@ -1312,15 +1309,15 @@
 
   if (nargin > 2)
     {
-      if (args[2].is_scalar_type ())
+      if (args(2).is_scalar_type ())
 	{
-	  tree_constant tmpa = args[2].make_numeric ();
+	  tree_constant tmpa = args(2).make_numeric ();
 	  dnr = tmpa.double_value ();
 	  dnc = 1.0;
 	}
-      else if (args[2].is_matrix_type ())
+      else if (args(2).is_matrix_type ())
 	{
-	  ColumnVector tmp = args[2].to_vector ();
+	  ColumnVector tmp = args(2).to_vector ();
 
 	  if (tmp.length () == 2)
 	    {
@@ -1380,13 +1377,13 @@
 
   if (nargout > 1)
     {
-      retval = new tree_constant[3];
-      retval[1] = tree_constant ((double) count);
+      retval.resize (2);
+      retval(1) = tree_constant ((double) count);
     }
   else
-    retval = new tree_constant[2];
+    retval.resize (1);
 
-  retval[0] = tree_constant (m);
+  retval(0) = tree_constant (m);
 
   return retval;
 }
@@ -1407,12 +1404,12 @@
  *
  *    count     : the number of elements written
  */
-tree_constant *
-fwrite_internal (const tree_constant *args, int nargin, int nargout)
+Octave_object
+fwrite_internal (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  Pix p = file_io_get_file (args[1], "a+", "fwrite");
+  Pix p = file_io_get_file (args(1), "a+", "fwrite");
 
   if (p == (Pix) NULL)
     return retval;
@@ -1421,8 +1418,8 @@
   char *prec = "uchar";
   if (nargin > 3)
     {
-      if (args[3].is_string_type ())
-	prec = args[3].string_value ();
+      if (args(3).is_string_type ())
+	prec = args(3).string_value ();
       else
 	{
 	  error ("fwrite: precision must be a specified as a string");
@@ -1432,12 +1429,12 @@
 
   file_info file = file_list (p);
 
-  Matrix m = args[2].to_matrix ();
+  Matrix m = args(2).to_matrix ();
 
   int count = m.write (file.fptr (), prec);
 
-  retval = new tree_constant[2];
-  retval[0] = tree_constant ((double) count);
+  retval.resize (1);
+  retval(0) = tree_constant ((double) count);
 
   return retval;
 }
@@ -1450,21 +1447,21 @@
  *     fid : file id from fopen
  *     eof : non zero for an end of file condition
  */
-tree_constant *
-feof_internal (const tree_constant *args, int nargin, int nargout)
+Octave_object
+feof_internal (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
 // Get file info.
-  Pix p = return_valid_file (args[1]);
+  Pix p = return_valid_file (args(1));
 
   if (p == (Pix) NULL)
     return retval;
 
   file_info file = file_list (p);
 
-  retval = new tree_constant[2];
-  retval[0] = tree_constant (feof (file.fptr ()));
+  retval.resize (1);
+  retval(0) = tree_constant (feof (file.fptr ()));
 
   return retval;
 }
@@ -1478,13 +1475,13 @@
  *     message : system error message
  *     errnum  : error number
  */
-tree_constant *
-ferror_internal (const tree_constant *args, int nargin, int nargout)
+Octave_object
+ferror_internal (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
 // Get file info.
-  Pix p = return_valid_file (args[1]);
+  Pix p = return_valid_file (args(1));
 
   if (p == (Pix) NULL)
     return retval;
@@ -1495,13 +1492,13 @@
 
   if (nargout > 1)
     {
-      retval = new tree_constant[3];
-      retval[1] = tree_constant ((double) ierr);
+      retval.resize (2);
+      retval(1) = tree_constant ((double) ierr);
     }
   else
-    retval = new tree_constant[2];
+    retval.resize (1);
 
-  retval[0] = tree_constant (strsave (strerror (ierr)));
+  retval(0) = tree_constant (strsave (strerror (ierr)));
 
   return retval;
 }
--- a/src/file-io.h	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/file-io.h	Fri Jul 08 02:08:37 1994 +0000
@@ -28,36 +28,36 @@
 
 #include <Pix.h>
 
-class tree_constant;
+#include "oct-obj.h"
 
 extern Pix return_valid_file (const tree_constant& arg);
 
-extern tree_constant *fclose_internal (const tree_constant *args);
-extern tree_constant *feof_internal (const tree_constant *args,
+extern Octave_object fclose_internal (const Octave_object& args);
+extern Octave_object feof_internal (const Octave_object& args,
+				    int nargin, int nargout);
+extern Octave_object ferror_internal (const Octave_object& args,
+				      int nargin, int nargout);
+extern Octave_object fflush_internal (const Octave_object& args);
+extern Octave_object fgets_internal (const Octave_object& args, int nargout);
+extern Octave_object fopen_internal (const Octave_object& args);
+extern Octave_object fread_internal (const Octave_object& args,
 				     int nargin, int nargout);
-extern tree_constant *ferror_internal (const tree_constant *args,
-                                       int nargin, int nargout);
-extern tree_constant *fflush_internal (const tree_constant *args);
-extern tree_constant *fgets_internal (const tree_constant *args, int nargout);
-extern tree_constant *fopen_internal (const tree_constant *args);
-extern tree_constant *fread_internal (const tree_constant *args,
+extern Octave_object freport_internal (void);
+extern Octave_object frewind_internal (const Octave_object& args);
+extern Octave_object fseek_internal (const Octave_object& args, int nargin);
+extern Octave_object ftell_internal (const Octave_object& args);
+extern Octave_object fwrite_internal (const Octave_object& args,
 				      int nargin, int nargout);
-extern tree_constant *freport_internal (void);
-extern tree_constant *frewind_internal (const tree_constant *args);
-extern tree_constant *fseek_internal (const tree_constant *args, int nargin);
-extern tree_constant *ftell_internal (const tree_constant *args);
-extern tree_constant *fwrite_internal (const tree_constant *args,
-				       int nargin, int nargout);
 
 extern void initialize_file_io (void);
 
 extern void close_files (void);
 
-extern tree_constant *do_printf (const char *type, const tree_constant *args,
-				 int nargin, int nargout);
+extern Octave_object do_printf (const char *type, const Octave_object& args,
+				int nargin, int nargout);
 
-extern tree_constant *do_scanf (const char *type, const tree_constant *args,
-				int nargin, int nargout);
+extern Octave_object do_scanf (const char *type, const Octave_object& args,
+			       int nargin, int nargout);
 
 #endif
 
--- a/src/fsolve.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/fsolve.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -41,14 +41,14 @@
 static tree_fvc *fsolve_fcn;
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_fsolve_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_fsolve_2 (const Octave_object& args, int nargin, int nargout)
 {
   return fsolve (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_fsolve_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_fsolve_options (const Octave_object& args, int nargin, int nargout)
 {
   return fsolve_options (args, nargin, nargout);
 }
@@ -92,8 +92,8 @@
   int n = x.capacity ();
 
 //  tree_constant name = tree_constant (fsolve_fcn->name ());
-  tree_constant *args = new tree_constant [2];
-//  args[0] = name;
+  Octave_object args (2);
+//  args(0) = name;
 
   if (n > 1)
     {
@@ -101,51 +101,45 @@
       for (int i = 0; i < n; i++)
 	m (i, 0) = x.elem (i);
       tree_constant vars (m);
-      args[1] = vars;
+      args(1) = vars;
     }
   else
     {
       double d = x.elem (0);
       tree_constant vars (d);
-      args[1] = vars;
+      args(1) = vars;
     }
 
   if (fsolve_fcn != (tree_fvc *) NULL)
     {
-      tree_constant *tmp = fsolve_fcn->eval (0, 1, args, 2);
-      delete [] args;
-      if (tmp != NULL_TREE_CONST && tmp[0].is_defined ())
+      Octave_object tmp = fsolve_fcn->eval (0, 1, args, 2);
+      if (tmp.length () > 0 && tmp(0).is_defined ())
 	{
-	  retval = tmp[0].to_vector ();
-
-	  delete [] tmp;
+	  retval = tmp(0).to_vector ();
 
 	  if (retval.length () <= 0)
 	    gripe_user_supplied_eval ("fsolve");
 	}
       else
-	{
-	  delete [] tmp;
-	  gripe_user_supplied_eval ("fsolve");
-	}
+	gripe_user_supplied_eval ("fsolve");
     }
 
   return retval;
 }
 
-tree_constant *
-fsolve (const tree_constant *args, int nargin, int nargout)
+Octave_object
+fsolve (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;
 
-  fsolve_fcn = is_valid_function (args[1], "fsolve", 1);
+  fsolve_fcn = is_valid_function (args(1), "fsolve", 1);
   if (fsolve_fcn == (tree_fvc *) NULL
       || takes_correct_nargs (fsolve_fcn, 2, "fsolve", 1) != 1)
     return retval;
 
-  ColumnVector x = args[2].to_vector ();
+  ColumnVector x = args(2).to_vector ();
 
   if (nargin > 3)
     warning ("fsolve: ignoring extra arguments");
@@ -162,14 +156,14 @@
 
   info = hybrd_info_to_fsolve_info (info);
 
-  retval = new tree_constant [nargout+1];
-  retval[0] = tree_constant (soln, 1);
+  retval.resize (nargout ? nargout : 1);
+  retval(0) = tree_constant (soln, 1);
 
   if (nargout > 1)
-    retval[1] = tree_constant ((double) info);
+    retval(1) = tree_constant ((double) info);
 
   if (nargout > 2)
-    retval[2] = tree_constant ();
+    retval(2) = tree_constant ();
 
   return retval;
 }
@@ -189,7 +183,7 @@
   d_get_opt_mf d_get_fcn;
 };
 
-static NLEQN_OPTIONS fsolve_option_table[] =
+static NLEQN_OPTIONS fsolve_option_table [] =
 {
   { "tolerance",
     { "tolerance", NULL, },
@@ -256,30 +250,26 @@
   warning ("fsolve_options: no match for `%s'", keyword);
 }
 
-tree_constant *
-fsolve_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+fsolve_options (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (nargin == 1)
-    {
-      print_fsolve_option_list ();
-    }
+    print_fsolve_option_list ();
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ())
+      if (args(1).is_string_type ())
 	{
-	  char *keyword = args[1].string_value ();
-	  double val = args[2].double_value ();
+	  char *keyword = args(1).string_value ();
+	  double val = args(2).double_value ();
 	  do_fsolve_option (keyword, val);
 	}
       else
 	print_usage ("fsolve_options");
     }
   else
-    {
-      print_usage ("fsolve_options");
-    }
+    print_usage ("fsolve_options");
 
   return retval;
 }
--- a/src/fsqp.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/fsqp.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -38,14 +38,14 @@
 // static tree *fsqp_constraints;
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_fsqp_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_fsqp_2 (const Octave_object& args, int nargin, int nargout)
 {
   return fsqp (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_fsqp_options_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_fsqp_options_2 (const Octave_object& args, int nargin, int nargout)
 {
   return fsqp_options (args, nargin, nargout);
 }
@@ -64,8 +64,8 @@
   return retval;
 }
 
-tree_constant *
-fsqp (const tree_constant *args, int nargin, int nargout)
+Octave_object
+fsqp (const Octave_object& args, int nargin, int nargout)
 {
 /*
 
@@ -84,17 +84,17 @@
 
 // Assumes that we have been given the correct number of arguments.
 
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
   error ("fsqp: not implemented yet");
   return retval;
 }
 
-tree_constant *
-fsqp_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+fsqp_options (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;
   error ("fsqp_options: not implemented yet");
   return retval;
 }
--- a/src/givens.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/givens.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -57,21 +57,21 @@
 #endif
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_givens_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_givens_2 (const Octave_object& args, int nargin, int nargout)
 {
   return givens (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-givens (const tree_constant *args, int nargin, int nargout)
+Octave_object
+givens (const Octave_object& args, int nargin, int nargout)
 {
 
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arga = args[1].make_numeric ();
-  tree_constant argb = args[2].make_numeric ();
+  tree_constant arga = args(1).make_numeric ();
+  tree_constant argb = args(2).make_numeric ();
 
   if (! arga.is_scalar_type () && argb.is_scalar_type ())
     {
@@ -79,8 +79,7 @@
     }
   else
     {
-
-      retval = new tree_constant [nargout+1];
+      retval.resize (nargout ? nargout : 1);
 
       Complex cx, cy;
       double x, y;
@@ -120,13 +119,13 @@
 		g.elem (0, 1) = cs;
 		g.elem (1, 0) = -conj (cs);
 
-		retval[0] = tree_constant (g);
+		retval(0) = tree_constant (g);
 	      }
 	      break;
    
 	    case 2:		// output scalar values
-	      retval[0] = tree_constant(cc);
-	      retval[1] = tree_constant(cs);
+	      retval(0) = tree_constant(cc);
+	      retval(1) = tree_constant(cs);
 	      break;
 
 	    default:  
@@ -150,13 +149,13 @@
 		g.elem (0, 1) = s;
 		g.elem (1, 0) = -s;
 
-		retval[0] = tree_constant (g);
+		retval(0) = tree_constant (g);
 	      }
 	      break;
    
 	    case 2:		// output scalar values
-	      retval[0] = tree_constant (cc);
-	      retval[1] = tree_constant (s);
+	      retval(0) = tree_constant (cc);
+	      retval(1) = tree_constant (s);
 	      break;
    
 	    default:
--- a/src/hess.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/hess.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,19 +35,19 @@
 #include "f-hess.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_hess_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_hess_2 (const Octave_object& args, int nargin, int nargout)
 {
   return hess (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-hess (const tree_constant *args, int nargin, int nargout)
+Octave_object
+hess (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arg = args[1].make_numeric ();
+  tree_constant arg = args(1).make_numeric ();
 
   int a_nr = arg.rows ();
   int a_nc = arg.columns ();
@@ -60,9 +60,9 @@
 	  if (flag < 0)
 	    warning ("hess: argument is empty matrix");
 	  Matrix m;
-	  retval = new tree_constant [3];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
+	  retval.resize (2);
+	  retval(0) = tree_constant (m);
+	  retval(1) = tree_constant (m);
         }
       else
 	error ("hess: empty matrix is invalid as argument");
@@ -87,16 +87,16 @@
 
 	HESS result (tmp);
 
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
 	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (result.hess_matrix ());
+	    retval.resize (1);
+	    retval(0) = tree_constant (result.hess_matrix ());
 	  }
         else
 	  {
-	    retval = new tree_constant [3];
-	    retval[0] = tree_constant (result.unitary_hess_matrix ());
-	    retval[1] = tree_constant (result.hess_matrix ());
+	    retval.resize (2);
+	    retval(0) = tree_constant (result.unitary_hess_matrix ());
+	    retval(1) = tree_constant (result.hess_matrix ());
           }
       }
       break;
@@ -106,48 +106,48 @@
 
 	ComplexHESS result (ctmp);
 
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
 	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (result.hess_matrix ());
+	    retval.resize (1);
+	    retval(0) = tree_constant (result.hess_matrix ());
 	  }
   	else
 	  {
-	    retval = new tree_constant [3];
-	    retval[0] = tree_constant (result.unitary_hess_matrix ());
-	    retval[1] = tree_constant (result.hess_matrix ());
+	    retval.resize (2);
+	    retval(0) = tree_constant (result.unitary_hess_matrix ());
+	    retval(1) = tree_constant (result.hess_matrix ());
 	  }
       }
       break;
     case tree_constant_rep::scalar_constant:
       {
 	double d = arg.double_value ();
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
 	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (d);
+	    retval.resize (1);
+	    retval(0) = tree_constant (d);
 	  }
 	else
 	  {
-	    retval = new tree_constant [3];
-	    retval[0] = tree_constant (1);
-	    retval[1] = tree_constant (d);
+	    retval.resize (2);
+	    retval(0) = tree_constant (1);
+	    retval(1) = tree_constant (d);
 	  }
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
 	Complex c = arg.complex_value ();
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
  	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (c);
+	    retval.resize (1);
+	    retval(0) = tree_constant (c);
 	  }
 	else
 	  {
-	    retval = new tree_constant [3];
-	    retval[0] = tree_constant (1);
-	    retval[1] = tree_constant (c);
+	    retval.resize (2);
+	    retval(0) = tree_constant (1);
+	    retval(1) = tree_constant (c);
 	  }
       }
       break;
--- a/src/ifft.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/ifft.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,11 +35,11 @@
 #include "f-ifft.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_ifft_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_ifft_2 (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = new tree_constant [2];
-  retval[0] = ifft (args[1]);
+  Octave_object retval (1);
+  retval(0) = ifft (args(1));
   return retval;
 }
 #endif
--- a/src/inv.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/inv.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,11 +35,11 @@
 #include "f-inv.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_inv_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_inv_2 (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = new tree_constant [2];
-  retval[0] = inverse (args[1]);
+  Octave_object retval (1);
+  retval(0) = inverse (args(1));
   return retval;
 }
 #endif
--- a/src/lpsolve.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/lpsolve.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -1,7 +1,7 @@
 // f-lpsolve.cc                                          -*- C++ -*-
 /*
 
-Copyright (C) 1993 John W. Eaton
+Copyright (C) 1993, 1994 John W. Eaton
 
 This file is part of Octave.
 
@@ -32,35 +32,35 @@
 #include "f-lpsolve.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_lpsolve_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_lpsolve_2 (const Octave_object& args, int nargin, int nargout)
 {
   return lpsolve (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_lpsolve_options_2 (const tree_constant *args, int nargin, int nargout) 
+Octave_object
+builtin_lpsolve_options_2 (const Octave_object& args, int nargin, int nargout) 
 {
   return lpsolve_options (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-lpsolve (const tree_constant *args, int nargin, int nargout)
+Octave_object
+lpsolve (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;
   error ("lpsolve: not implemented yet");
   return retval;
 }
 
-tree_constant *
-lpsolve_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+lpsolve_options (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;
   error ("lpsolve_options: not implemented yet");
   return retval;
 }
--- a/src/lsode.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/lsode.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -41,14 +41,14 @@
 static tree_fvc *lsode_fcn;
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_lsode_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_lsode_2 (const Octave_object& args, int nargin, int nargout)
 {
   return lsode (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_lsode_options_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_lsode_options_2 (const Octave_object& args, int nargin, int nargout)
 {
   return lsode_options (args, nargin, nargout);
 }
@@ -64,9 +64,9 @@
   int nstates = x.capacity ();
 
 //  tree_constant name (lsode_fcn->name ());
-  tree_constant *args = new tree_constant [3];
-//  args[0] = name;
-  args[2] = tree_constant (t);
+  Octave_object args (3);
+//  args(0) = name;
+  args(2) = tree_constant (t);
 
   if (nstates > 1)
     {
@@ -74,20 +74,18 @@
       for (int i = 0; i < nstates; i++)
 	m (i, 0) = x.elem (i);
       tree_constant state (m);
-      args[1] = state;
+      args(1) = state;
     }
   else
     {
       double d = x.elem (0);
       tree_constant state (d);
-      args[1] = state;
+      args(1) = state;
     }
 
   if (lsode_fcn != (tree_fvc *) NULL)
     {
-      tree_constant *tmp = lsode_fcn->eval (0, 1, args, 3);
-
-      delete [] args;
+      Octave_object tmp = lsode_fcn->eval (0, 1, args, 3);
 
       if (error_state)
 	{
@@ -95,44 +93,39 @@
 	  return retval;
 	}
 
-      if (tmp != NULL_TREE_CONST && tmp[0].is_defined ())
+      if (tmp.length () > 0 && tmp(0).is_defined ())
 	{
-	  retval = tmp[0].to_vector ();
-
-	  delete [] tmp;
+	  retval = tmp(0).to_vector ();
 
 	  if (retval.length () == 0)
 	    gripe_user_supplied_eval ("lsode");
 	}
       else
-	{
-	  delete [] tmp;
-	  gripe_user_supplied_eval ("lsode");
-	}
+	gripe_user_supplied_eval ("lsode");
     }
 
   return retval;
 }
 
-tree_constant *
-lsode (const tree_constant *args, int nargin, int nargout)
+Octave_object
+lsode (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;
 
-  lsode_fcn = is_valid_function (args[1], "lsode", 1);
+  lsode_fcn = is_valid_function (args(1), "lsode", 1);
   if (lsode_fcn == (tree_fvc *) NULL
       || takes_correct_nargs (lsode_fcn, 3, "lsode", 1) != 1)
     return retval;
 
-  ColumnVector state = args[2].to_vector ();
-  ColumnVector out_times = args[3].to_vector ();
+  ColumnVector state = args(2).to_vector ();
+  ColumnVector out_times = args(3).to_vector ();
   ColumnVector crit_times;
   int crit_times_set = 0;
   if (nargin > 4)
     {
-      crit_times = args[4].to_vector ();
+      crit_times = args(4).to_vector ();
       crit_times_set = 1;
     }
 
@@ -151,8 +144,8 @@
   else
     output = ode.integrate (out_times);
 
-  retval = new tree_constant [2];
-  retval[0] = tree_constant (output);
+  retval.resize (1);
+  retval(0) = tree_constant (output);
   return retval;
 }
 
@@ -171,7 +164,7 @@
   d_get_opt_mf d_get_fcn;
 };
 
-static ODE_OPTIONS lsode_option_table[] =
+static ODE_OPTIONS lsode_option_table [] =
 {
   { "absolute tolerance",
     { "absolute", "tolerance", NULL, NULL, },
@@ -262,30 +255,26 @@
   warning ("lsode_options: no match for `%s'", keyword);
 }
 
-tree_constant *
-lsode_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+lsode_options (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (nargin == 1)
-    {
-      print_lsode_option_list ();
-    }
+    print_lsode_option_list ();
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ())
+      if (args(1).is_string_type ())
 	{
-	  char *keyword = args[1].string_value ();
-	  double val = args[2].double_value ();
+	  char *keyword = args(1).string_value ();
+	  double val = args(2).double_value ();
 	  do_lsode_option (keyword, val);
 	}
       else
 	print_usage ("lsode_options");
     }
   else
-    {
-      print_usage ("lsode_options");
-    }
+    print_usage ("lsode_options");
 
   return retval;
 }
--- a/src/lu.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/lu.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -34,17 +34,17 @@
 #include "f-lu.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_lu_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_lu_2 (const Octave_object& args, int nargin, int nargout)
 {
-  return lu (args[1], nargout);
+  return lu (args(1), nargout);
 }
 #endif
 
-tree_constant *
+Octave_object
 lu (const tree_constant& a, int nargout)
 {
-  tree_constant *retval = new tree_constant [4];
+  Octave_object retval (3);
 
   tree_constant tmp = a.make_numeric ();;
     
@@ -56,10 +56,9 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("lu", 0);
 	  Matrix m;
-	  retval = new tree_constant [4];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
-	  retval[2] = tree_constant (m);
+	  retval(0) = tree_constant (m);
+	  retval(1) = tree_constant (m);
+	  retval(2) = tree_constant (m);
 	  return retval;
 	}
       else
@@ -81,15 +80,15 @@
 		{
 		  Matrix P = fact.P ();
 		  Matrix L = P.transpose () * fact.L ();
-		  retval[0] = tree_constant (L);
-		  retval[1] = tree_constant (fact.U ());
+		  retval(0) = tree_constant (L);
+		  retval(1) = tree_constant (fact.U ());
 		}
 		break;
 	      case 3:
 	      default:
-		retval[0] = tree_constant (fact.L ());
-		retval[1] = tree_constant (fact.U ());
-		retval[2] = tree_constant (fact.P ());
+		retval(0) = tree_constant (fact.L ());
+		retval(1) = tree_constant (fact.U ());
+		retval(2) = tree_constant (fact.P ());
 		break;
 	      }
 	  }
@@ -110,15 +109,15 @@
 		{
 		  ComplexMatrix P = fact.P ();
 		  ComplexMatrix L = P.transpose () * fact.L ();
-		  retval[0] = tree_constant (L);
-		  retval[1] = tree_constant (fact.U ());
+		  retval(0) = tree_constant (L);
+		  retval(1) = tree_constant (fact.U ());
 		}
 		break;
 	      case 3:
 	      default:
-		retval[0] = tree_constant (fact.L ());
-		retval[1] = tree_constant (fact.U ());
-		retval[2] = tree_constant (fact.P ());
+		retval(0) = tree_constant (fact.L ());
+		retval(1) = tree_constant (fact.U ());
+		retval(2) = tree_constant (fact.P ());
 		break;
 	      }
 	  }
@@ -129,17 +128,17 @@
     case tree_constant_rep::scalar_constant:
       {
 	double d = tmp.double_value ();
-	retval[0] = tree_constant (1.0);
-	retval[1] = tree_constant (d);
-	retval[2] = tree_constant (1.0);
+	retval(0) = tree_constant (1.0);
+	retval(1) = tree_constant (d);
+	retval(2) = tree_constant (1.0);
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
 	Complex c = tmp.complex_value ();
-	retval[0] = tree_constant (1.0);
-	retval[1] = tree_constant (c);
-	retval[2] = tree_constant (1.0);
+	retval(0) = tree_constant (1.0);
+	retval(1) = tree_constant (c);
+	retval(2) = tree_constant (1.0);
       }
       break;
     default:
--- a/src/npsol.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/npsol.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -45,14 +45,14 @@
 static tree_fvc *npsol_constraints;
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_npsol_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_npsol_2 (const Octave_object& args, int nargin, int nargout)
 {
   return npsol (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_npsol_options_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_npsol_options_2 (const Octave_object& args, int nargin, int nargout)
 {
   return npsol_options (args, nargin, nargout);
 }
@@ -80,9 +80,9 @@
     }
 
 //  tree_constant name = tree_constant (npsol_objective->name ());
-  tree_constant *args = new tree_constant [2];
-//  args[0] = name;
-  args[1] = decision_vars;
+  Octave_object args (2);
+//  args(0) = name;
+  args(1) = decision_vars;
 
   static double retval;
   retval = 0.0;
@@ -90,26 +90,19 @@
   tree_constant objective_value;
   if (npsol_objective != (tree_fvc *) NULL)
     {
-      tree_constant *tmp = npsol_objective->eval (0, 1, args, 2);
-
-      delete [] args;
+      Octave_object tmp = npsol_objective->eval (0, 1, args, 2);
 
       if (error_state)
 	{
 	  error ("npsol: error evaluating objective function");
 	  npsol_objective_error = 1; // XXX FIXME XXX
-	  delete [] tmp;
 	  return retval;
 	}
 
-      if (tmp != NULL_TREE_CONST && tmp[0].is_defined ())
-	{
-	  objective_value = tmp[0];
-	  delete [] tmp;
-	}
+      if (tmp.length () > 0 && tmp(0).is_defined ())
+	objective_value = tmp(0);
       else
 	{
-	  delete [] tmp;
 	  error ("npsol: error evaluating objective function");
 	  npsol_objective_error = 1; // XXX FIXME XXX
 	  return retval;
@@ -164,37 +157,29 @@
     }
 
 //  tree_constant name = tree_constant (npsol_constraints->name ());
-  tree_constant *args = new tree_constant [2];
-//  args[0] = name;
-  args[1] = decision_vars;
+  Octave_object args (2);
+//  args(0) = name;
+  args(1) = decision_vars;
 
   if (npsol_constraints != (tree_fvc *)NULL)
     {
-      tree_constant *tmp = npsol_constraints->eval (0, 1, args, 2);
-
-      delete [] args;
+      Octave_object tmp = npsol_constraints->eval (0, 1, args, 2);
 
       if (error_state)
 	{
-	  delete [] tmp;
 	  error ("npsol: error evaluating constraints");
 	  return retval;
 	}
 
-      if (tmp != NULL_TREE_CONST && tmp[0].is_defined ())
+      if (tmp.length () > 0 && tmp(0).is_defined ())
 	{
-	  retval = tmp[0].to_vector ();
-
-	  delete [] tmp;
+	  retval = tmp(0).to_vector ();
 
 	  if (retval.length () <= 0)
 	    error ("npsol: error evaluating constraints");
 	}
       else
-	{
-	  delete [] tmp;
-	  error ("npsol: error evaluating constraints");
-	}
+	error ("npsol: error evaluating constraints");
     }
 
   return retval;
@@ -260,8 +245,8 @@
   return ok;
 }
 
-tree_constant *
-npsol (const tree_constant *args, int nargin, int nargout)
+Octave_object
+npsol (const Octave_object& args, int nargin, int nargout)
 {
 /*
 
@@ -280,9 +265,9 @@
 
 // Assumes that we have been given the correct number of arguments.
 
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  ColumnVector x = args[1].to_vector ();
+  ColumnVector x = args(1).to_vector ();
 
   if (x.capacity () == 0)
     {
@@ -290,7 +275,7 @@
       return retval;
     }
 
-  npsol_objective = is_valid_function (args[2], "npsol", 1);
+  npsol_objective = is_valid_function (args(2), "npsol", 1);
   if (npsol_objective == (tree_fvc *) NULL
       || takes_correct_nargs (npsol_objective, 2, "npsol", 1) != 1)
     return retval;
@@ -302,8 +287,8 @@
   Bounds bounds;
   if (nargin == 5 || nargin == 8 || nargin == 11)
     {
-      ColumnVector lb = args[3].to_vector ();
-      ColumnVector ub = args[4].to_vector ();
+      ColumnVector lb = args(3).to_vector ();
+      ColumnVector ub = args(4).to_vector ();
 
       int lb_len = lb.capacity ();
       int ub_len = ub.capacity ();
@@ -347,15 +332,15 @@
 
   npsol_constraints = (tree_fvc *) NULL;
   if (nargin == 6 || nargin == 8 || nargin == 9 || nargin == 11)
-    npsol_constraints = is_valid_function (args[nargin-2], "npsol", 0);
+    npsol_constraints = is_valid_function (args(nargin-2), "npsol", 0);
 
   if (nargin == 8 || nargin == 6)
     {
       if (npsol_constraints == (tree_fvc *) NULL)
 	{
-	  ColumnVector lub = args[nargin-1].to_vector ();
-	  Matrix c = args[nargin-2].to_matrix ();
-	  ColumnVector llb = args[nargin-3].to_vector ();
+	  ColumnVector lub = args(nargin-1).to_vector ();
+	  Matrix c = args(nargin-2).to_matrix ();
+	  ColumnVector llb = args(nargin-3).to_vector ();
 
 	  if (llb.capacity () == 0 || lub.capacity () == 0)
 	    {
@@ -390,8 +375,8 @@
 	{
 	  if (takes_correct_nargs (npsol_constraints, 2, "npsol", 1))
 	    {
-	      ColumnVector nlub = args[nargin-1].to_vector ();
-	      ColumnVector nllb = args[nargin-3].to_vector ();
+	      ColumnVector nlub = args(nargin-1).to_vector ();
+	      ColumnVector nllb = args(nargin-3).to_vector ();
 
 	      NLFunc const_func (npsol_constraint_function);
 
@@ -427,14 +412,14 @@
       if (npsol_constraints == (tree_fvc *) NULL)
 	{
 	  // Produce error message.
-	  is_valid_function (args[nargin-2], "npsol", 1);
+	  is_valid_function (args(nargin-2), "npsol", 1);
 	}
       else
 	{
 	  if (takes_correct_nargs (npsol_constraints, 2, "npsol", 1))
 	    {
-	      ColumnVector nlub = args[nargin-1].to_vector ();
-	      ColumnVector nllb = args[nargin-3].to_vector ();
+	      ColumnVector nlub = args(nargin-1).to_vector ();
+	      ColumnVector nllb = args(nargin-3).to_vector ();
 
 	      NLFunc const_func (npsol_constraint_function);
 
@@ -444,9 +429,9 @@
 
 	      NLConst nonlinear_constraints (nllb, const_func, nlub);
 
-	      ColumnVector lub = args[nargin-4].to_vector ();
-	      Matrix c = args[nargin-5].to_matrix ();
-	      ColumnVector llb = args[nargin-6].to_vector ();
+	      ColumnVector lub = args(nargin-4).to_vector ();
+	      Matrix c = args(nargin-5).to_matrix ();
+	      ColumnVector llb = args(nargin-6).to_vector ();
 
 	      if (llb.capacity () == 0 || lub.capacity () == 0)
 		{
@@ -486,14 +471,14 @@
 
  solved:
 
-  retval = new tree_constant [nargout+1];
-  retval[0] = tree_constant (soln, 1);
+  retval.resize (nargout ? nargout : 1);
+  retval(0) = tree_constant (soln, 1);
   if (nargout > 1)
-    retval[1] = tree_constant (objf);
+    retval(1) = tree_constant (objf);
   if (nargout > 2)
-    retval[2] = tree_constant ((double) inform);
+    retval(2) = tree_constant ((double) inform);
   if (nargout > 3)
-    retval[3] = tree_constant (lambda);
+    retval(3) = tree_constant (lambda);
 
   return retval;
 }
@@ -517,7 +502,7 @@
   i_get_opt_mf i_get_fcn;
 };
 
-static NPSOL_OPTIONS npsol_option_table[] =
+static NPSOL_OPTIONS npsol_option_table [] =
 {
   { "central difference interval",
     { "central", "difference", "interval", NULL, NULL, NULL, },
@@ -710,10 +695,10 @@
   warning ("npsol_options: no match for `%s'", keyword);
 }
 
-tree_constant *
-npsol_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+npsol_options (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (nargin == 1)
     {
@@ -721,10 +706,10 @@
     }
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ())
+      if (args(1).is_string_type ())
 	{
-	  char *keyword = args[1].string_value ();
-	  double val = args[2].double_value ();
+	  char *keyword = args(1).string_value ();
+	  double val = args(2).double_value ();
 	  do_npsol_option (keyword, val);
 	}
       else
--- a/src/qpsol.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/qpsol.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -47,14 +47,14 @@
 				  int warn);
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_qpsol_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_qpsol_2 (const Octave_object& args, int nargin, int nargout)
 {
   return qpsol (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_qpsol_options_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_qpsol_options_2 (const Octave_object& args, int nargin, int nargout)
 {
   return qpsol_options (args, nargin, nargout);
 }
@@ -62,8 +62,8 @@
 
 static QPSOL_options qpsol_opts;
 
-tree_constant *
-qpsol (const tree_constant *args, int nargin, int nargout)
+Octave_object
+qpsol (const Octave_object& args, int nargin, int nargout)
 {
 /*
 
@@ -78,23 +78,23 @@
 
 // Assumes that we have been given the correct number of arguments.
 
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  ColumnVector x = args[1].to_vector ();
+  ColumnVector x = args(1).to_vector ();
   if (x.capacity () == 0)
     {
       error ("qpsol: expecting vector as first argument");
       return retval;
     }
 
-  Matrix H = args[2].to_matrix ();
+  Matrix H = args(2).to_matrix ();
   if (H.rows () != H.columns () || H.rows () != x.capacity ())
     {
       error ("qpsol: H must be a square matrix consistent with the size of x");
       return retval;
     }
 
-  ColumnVector c = args[3].to_vector ();
+  ColumnVector c = args(3).to_vector ();
   if (c.capacity () != x.capacity ())
     {
       error ("qpsol: c must be a vector the same size as x");
@@ -104,8 +104,8 @@
   Bounds bounds;
   if (nargin == 6 || nargin == 9)
     {
-      ColumnVector lb = args[4].to_vector ();
-      ColumnVector ub = args[5].to_vector ();
+      ColumnVector lb = args(4).to_vector ();
+      ColumnVector ub = args(5).to_vector ();
 
       int lb_len = lb.capacity ();
       int ub_len = ub.capacity ();
@@ -150,9 +150,9 @@
 
   if (nargin == 7 || nargin == 9)
     {
-      ColumnVector lub = args[nargin-1].to_vector ();
-      Matrix A = args[nargin-2].to_matrix ();
-      ColumnVector llb = args[nargin-3].to_vector ();
+      ColumnVector lub = args(nargin-1).to_vector ();
+      Matrix A = args(nargin-2).to_matrix ();
+      ColumnVector llb = args(nargin-3).to_vector ();
 
       if (llb.capacity () == 0 || lub.capacity () == 0)
 	{
@@ -188,14 +188,14 @@
 
  solved:
 
-  retval = new tree_constant [nargout+1];
-  retval[0] = tree_constant (soln, 1);
+  retval.resize (nargout ? nargout : 1);
+  retval(0) = tree_constant (soln, 1);
   if (nargout > 1)
-    retval[1] = tree_constant (objf);
+    retval(1) = tree_constant (objf);
   if (nargout > 2)
-    retval[2] = tree_constant ((double) inform);
+    retval(2) = tree_constant ((double) inform);
   if (nargout > 3)
-    retval[3] = tree_constant (lambda);
+    retval(3) = tree_constant (lambda);
 
   return retval;
 }
@@ -219,7 +219,7 @@
   i_get_opt_mf i_get_fcn;
 };
 
-static QPSOL_OPTIONS qpsol_option_table[] =
+static QPSOL_OPTIONS qpsol_option_table [] =
 {
   { "feasibility tolerance",
     { "feasibility", "tolerance", NULL, },
@@ -316,10 +316,10 @@
   warning ("qpsol_options: no match for `%s'", keyword);
 }
 
-tree_constant *
-qpsol_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+qpsol_options (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (nargin == 1)
     {
@@ -327,10 +327,10 @@
     }
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ())
+      if (args(1).is_string_type ())
 	{
-	  char *keyword = args[1].string_value ();
-	  double val = args[2].double_value ();
+	  char *keyword = args(1).string_value ();
+	  double val = args(2).double_value ();
 	  do_qpsol_option (keyword, val);
 	}
       else
--- a/src/qr.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/qr.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -34,17 +34,17 @@
 #include "f-qr.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_qr_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_qr_2 (const Octave_object& args, int nargin, int nargout)
 {
-  return qr (args[1], nargout);
+  return qr (args(1), nargout);
 }
 #endif
 
-tree_constant *
+Octave_object
 qr (const tree_constant& a, int nargout)
 {
-  tree_constant *retval = new tree_constant [3];
+  Octave_object retval (2);
 
   tree_constant tmp = a.make_numeric ();;
     
@@ -59,9 +59,8 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("qr", 0);
 	  Matrix m;
-	  retval = new tree_constant [3];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
+	  retval(0) = tree_constant (m);
+	  retval(1) = tree_constant (m);
 	}
       else
 	gripe_empty_arg ("qr", 1);
@@ -75,30 +74,30 @@
       {
 	Matrix m = tmp.matrix_value ();
 	QR fact (m);
-	retval[0] = tree_constant (fact.Q ());
-	retval[1] = tree_constant (fact.R ());
+	retval(0) = tree_constant (fact.Q ());
+	retval(1) = tree_constant (fact.R ());
       }
       break;
     case tree_constant_rep::complex_matrix_constant:
       {
 	ComplexMatrix m = tmp.complex_matrix_value ();
 	ComplexQR fact (m);
-	retval[0] = tree_constant (fact.Q ());
-	retval[1] = tree_constant (fact.R ());
+	retval(0) = tree_constant (fact.Q ());
+	retval(1) = tree_constant (fact.R ());
       }
       break;
     case tree_constant_rep::scalar_constant:
       {
 	double d = tmp.double_value ();
-	retval[0] = tree_constant (1.0);
-	retval[1] = tree_constant (d);
+	retval(0) = tree_constant (1.0);
+	retval(1) = tree_constant (d);
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
 	Complex c = tmp.complex_value ();
-	retval[0] = tree_constant (1.0);
-	retval[1] = tree_constant (c);
+	retval(0) = tree_constant (1.0);
+	retval(1) = tree_constant (c);
       }
       break;
     default:
--- a/src/quad.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/quad.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -42,14 +42,14 @@
 static tree_fvc *quad_fcn;
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_quad_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_quad_2 (const Octave_object& args, int nargin, int nargout)
 {
   return do_quad (args, nargin, nargout);
 }
 
-tree_constant *
-builtin_quad_options_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_quad_options_2 (const Octave_object& args, int nargin, int nargout)
 {
   return quad_options (args, nargin, nargout);
 }
@@ -63,32 +63,25 @@
   double retval = 0.0;
 
 //  tree_constant name = tree_constant (quad_fcn->name ());
-  tree_constant *args = new tree_constant [2];
-//  args[0] = name;
-  args[1] = tree_constant (x);
+  Octave_object args (2);
+//  args(0) = name;
+  args(1) = tree_constant (x);
 
   if (quad_fcn != (tree_fvc *) NULL)
     {
-      tree_constant *tmp = quad_fcn->eval (0, 1, args, 2);
-
-      delete [] args;
+      Octave_object tmp = quad_fcn->eval (0, 1, args, 2);
 
       if (error_state)
 	{
-	  delete [] tmp;
 	  quad_integration_error = 1;  // XXX FIXME XXX
 	  gripe_user_supplied_eval ("quad");
 	  return retval;
 	}
 
-      if (tmp != NULL_TREE_CONST && tmp[0].is_defined ())
-	{
-	  retval = tmp[0].to_scalar ();
-	  delete [] tmp;
-	}
+      if (tmp.length () && tmp(0).is_defined ())
+	retval = tmp(0).to_scalar ();
       else
 	{
-	  delete [] tmp;
 	  quad_integration_error = 1;  // XXX FIXME XXX
 	  gripe_user_supplied_eval ("quad");
 	}
@@ -97,20 +90,20 @@
   return retval;
 }
 
-tree_constant *
-do_quad (const tree_constant *args, int nargin, int nargout)
+Octave_object
+do_quad (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;
 
-  quad_fcn = is_valid_function (args[1], "fsolve", 1);
+  quad_fcn = is_valid_function (args(1), "fsolve", 1);
   if (quad_fcn == (tree_fvc *) NULL
       || takes_correct_nargs (quad_fcn, 2, "fsolve", 1) != 1)
     return retval;
 
-  double a = args[2].to_scalar ();
-  double b = args[3].to_scalar ();
+  double a = args(2).to_scalar ();
+  double b = args(3).to_scalar ();
 
   int indefinite = 0;
   IndefQuad::IntegralType indef_type = IndefQuad::doubly_infinite;
@@ -151,9 +144,9 @@
 	  return retval;
 	}
       have_sing = 1;
-      sing = args[5].to_vector ();
+      sing = args(5).to_vector ();
     case 5:
-      tol = args[4].to_vector ();
+      tol = args(4).to_vector ();
       switch (tol.capacity ())
 	{
 	case 2:
@@ -193,12 +186,12 @@
       break;
     }
 
-  retval = new tree_constant [5];
+  retval.resize (4);
 
-  retval[0] = tree_constant (val);
-  retval[1] = tree_constant ((double) ier);
-  retval[2] = tree_constant ((double) nfun);
-  retval[3] = tree_constant (abserr);
+  retval(0) = tree_constant (val);
+  retval(1) = tree_constant ((double) ier);
+  retval(2) = tree_constant ((double) nfun);
+  retval(3) = tree_constant (abserr);
 
   return retval;
 }
@@ -218,7 +211,7 @@
   d_get_opt_mf d_get_fcn;
 };
 
-static QUAD_OPTIONS quad_option_table[] =
+static QUAD_OPTIONS quad_option_table [] =
 {
   { "absolute tolerance",
     { "absolute", "tolerance", NULL, },
@@ -291,30 +284,26 @@
   warning ("quad_options: no match for `%s'", keyword);
 }
 
-tree_constant *
-quad_options (const tree_constant *args, int nargin, int nargout)
+Octave_object
+quad_options (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
   if (nargin == 1)
-    {
-      print_quad_option_list ();
-    }
+    print_quad_option_list ();
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ())
+      if (args(1).is_string_type ())
 	{
-	  char *keyword = args[1].string_value ();
-	  double val = args[2].double_value ();
+	  char *keyword = args(1).string_value ();
+	  double val = args(2).double_value ();
 	  do_quad_option (keyword, val);
 	}
       else
 	print_usage ("quad_options");
     }
   else
-    {
-      print_usage ("quad_options");
-    }
+    print_usage ("quad_options");
 
   return retval;
 }
--- a/src/qzval.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/qzval.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -53,20 +53,20 @@
 }
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_qzvalue_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_qzvalue_2 (const Octave_object& args, int nargin, int nargout)
 {
   return qzvalue (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-qzvalue (const tree_constant *args, int nargin, int nargout)
+Octave_object
+qzvalue (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arga = args[1].make_numeric ();
-  tree_constant argb = args[2].make_numeric();
+  tree_constant arga = args(1).make_numeric ();
+  tree_constant argb = args(2).make_numeric();
 
   if (arga.is_empty () || argb.is_empty ())
     retval = vector_of_empties (nargout, "qzvalue");
@@ -93,7 +93,7 @@
   
 // Dimensions look o.k., let's solve the problem.
 
-      retval = new tree_constant[nargout+1];
+      retval.resize (nargout ? nargout : 1);
 
       if (arga.is_complex_type () || argb.is_complex_type ())
 	error ("qzvalue: cannot yet do complex matrix arguments\n");
@@ -155,7 +155,7 @@
 		  cx (cnt) = (alfr (i) + Im * alfi (i)) / beta (i);
 		}
 	    }
-	  retval[0] = tree_constant (cx);
+	  retval(0)                          = tree_constant (cx);
 	}
     }
   return retval;
--- a/src/rand.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/rand.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -1,7 +1,7 @@
 // f-rand.cc                                           -*- C++ -*-
 /*
 
-Copyright (C) 1993 John W. Eaton
+Copyright (C) 1993, 1994 John W. Eaton
 
 This file is part of Octave.
 
@@ -46,8 +46,8 @@
 }
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_rand_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_rand_2 (const Octave_object& args, int nargin, int nargout)
 {
   return rand_internal (args, nargin, nargout);
 }
@@ -102,12 +102,12 @@
     }
 }
 
-tree_constant *
-rand_internal (const tree_constant *args, int nargin, int nargout)
+Octave_object
+rand_internal (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;
 
   static int initialized = 0;
   if (! initialized)
@@ -144,49 +144,45 @@
     }
   else if (nargin == 2)
     {
-      switch (args[1].const_type ())
+      switch (args(1).const_type ())
 	{
 	case tree_constant_rep::string_constant:
-	  char *s_arg = args[1].string_value ();
+	  char *s_arg = args(1).string_value ();
 	  if (strcmp (s_arg, "dist") == 0)
 	    {
-	      retval = new tree_constant [2];
+	      retval.resize (1);
 	      char *s = curr_rand_dist ();
-	      retval[0] = tree_constant (s);
+	      retval(0) = tree_constant (s);
 	    }
 	  else if (strcmp (s_arg, "seed") == 0)
 	    {
-	      retval = new tree_constant [2];
+	      retval.resize (1);
 	      double d = curr_rand_seed ();
-	      retval[0] = tree_constant (d);
+	      retval(0) = tree_constant (d);
 	    }
 	  else if (strcmp (s_arg, "uniform") == 0)
 	    current_distribution = uniform;
 	  else if (strcmp (s_arg, "normal") == 0)
 	    current_distribution = normal;
 	  else
-	    {
-	      delete [] retval;
-	      retval = NULL_TREE_CONST;
-	      error ("rand: unrecognized string argument");
-	    }
+	    error ("rand: unrecognized string argument");
 	  break;
 	case tree_constant_rep::scalar_constant:
 	case tree_constant_rep::complex_scalar_constant:
-	  n = NINT (args[1].double_value ());
+	  n = NINT (args(1).double_value ());
 	  m = n;
 	  goto gen_matrix;
 	case tree_constant_rep::range_constant:
 	  {
-	    Range r = args[1].range_value ();
+	    Range r = args(1).range_value ();
 	    n = 1;
 	    m = NINT (r.nelem ());
 	  }
 	  goto gen_matrix;
 	case tree_constant_rep::matrix_constant:
 	case tree_constant_rep::complex_matrix_constant:
-	  n = NINT (args[1].rows ());
-	  m = NINT (args[1].columns ());
+	  n = NINT (args(1).rows ());
+	  m = NINT (args(1).columns ());
 	  goto gen_matrix;
 	default:
 	  panic_impossible ();
@@ -195,16 +191,16 @@
     }
   else if (nargin == 3)
     {
-      if (args[1].is_string_type ()
-	  && strcmp (args[1].string_value (), "seed") == 0)
+      if (args(1).is_string_type ()
+	  && strcmp (args(1).string_value (), "seed") == 0)
 	{
-	  double d = args[2].to_scalar ();
+	  double d = args(2).to_scalar ();
 	  set_rand_seed (d);
 	}
       else
 	{
-	  n = NINT (args[1].to_scalar ());
-	  m = NINT (args[2].to_scalar ());
+	  n = NINT (args(1).to_scalar ());
+	  m = NINT (args(2).to_scalar ());
 	  goto gen_matrix;
 	}
     }
@@ -215,13 +211,13 @@
 
   if (n == 0 || m == 0)
     {
-      retval = new tree_constant [2];
+      retval.resize (1);
       Matrix m (0, 0);
-      retval[0] = tree_constant (m);
+      retval(0) = tree_constant (m);
     }
   else if (n > 0 && m > 0)
     {
-      retval = new tree_constant [2];
+      retval.resize (1);
       Matrix rand_mat (n, m);
       for (int j = 0; j < m; j++)
 	for (int i = 0; i < n; i++)
@@ -245,7 +241,7 @@
 	      }
 	  }
 
-      retval[0] = tree_constant (rand_mat);
+      retval(0)   = tree_constant (rand_mat);
     }
   else
     error ("rand: invalid negative argument");
--- a/src/schur.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/schur.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,34 +35,34 @@
 #include "f-schur.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_schur_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_schur_2 (const Octave_object& args, int nargin, int nargout)
 {
   return schur (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-schur (const tree_constant *args, int nargin, int nargout)
+Octave_object
+schur (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arg = args[1].make_numeric ();
+  tree_constant arg = args(1).make_numeric ();
 
   char *ord;
   if (nargin != 3)
     ord = "U";
   else
-    ord = args[2].string_value ();
+    ord = args(2).string_value ();
 
   if (*ord != 'U' && *ord != 'A' && *ord != 'D'
       && *ord != 'u' && *ord != 'a' && *ord != 'd')
     {
       warning ("schur: incorrect ordered schur argument `%c'", *ord);
       Matrix m;
-      retval = new tree_constant [3];
-      retval[0] = tree_constant (m);
-      retval[1] = tree_constant (m);
+      retval.resize (2);
+      retval(0) = tree_constant (m);
+      retval(1) = tree_constant (m);
       return retval;
     }
   int a_nr = arg.rows ();
@@ -76,9 +76,9 @@
           if (flag < 0)
             warning ("schur: argument is empty matrix");
           Matrix m;
-          retval = new tree_constant [3];
-          retval[0] = tree_constant (m);
-          retval[1] = tree_constant (m);
+          retval.resize (2);
+          retval(0) = tree_constant (m);
+          retval(1) = tree_constant (m);
         }
       else
         error ("schur: empty matrix is invalid as argument");
@@ -102,16 +102,16 @@
 
 	SCHUR result (tmp,ord);
 
-        if (nargout == 1)
+        if (nargout == 0 || nargout == 1)
           {
-            retval = new tree_constant [2];
-            retval[0] = tree_constant (result.schur_matrix ());
+            retval.resize (1);
+            retval(0) = tree_constant (result.schur_matrix ());
           }
         else
           {
-            retval = new tree_constant [3];
-            retval[0] = tree_constant (result.unitary_matrix ());
-            retval[1] = tree_constant (result.schur_matrix ());
+            retval.resize (2);
+            retval(0) = tree_constant (result.unitary_matrix ());
+            retval(1) = tree_constant (result.schur_matrix ());
           }
       }
       break;
@@ -121,48 +121,48 @@
 
         ComplexSCHUR result (ctmp,ord);
  
-        if (nargout == 1)
+        if (nargout == 0 || nargout == 1)
           {
-            retval = new tree_constant [2];
-            retval[0] = tree_constant (result.schur_matrix ());
+            retval.resize (1);
+            retval(0) = tree_constant (result.schur_matrix ());
           }
         else
           {
-            retval = new tree_constant [3];
-            retval[0] = tree_constant (result.unitary_matrix ());
-            retval[1] = tree_constant (result.schur_matrix ());
+            retval.resize (2);
+            retval(0) = tree_constant (result.unitary_matrix ());
+            retval(1) = tree_constant (result.schur_matrix ());
           }
       }    
       break;
     case tree_constant_rep::scalar_constant:
       {
         double d = arg.double_value ();
-        if (nargout == 1)
+        if (nargout == 0 || nargout == 1)
   	  {
-	    retval = new tree_constant [2];
-            retval[0] = tree_constant (d);
+	    retval.resize (1);
+            retval(0) = tree_constant (d);
           }
         else
 	  {
-	    retval = new tree_constant [3];
-	    retval[0] = tree_constant (1);
-	    retval[1] = tree_constant (d);
+	    retval.resize (2);
+	    retval(0) = tree_constant (1);
+	    retval(1) = tree_constant (d);
   	  }
       }
       break;
     case tree_constant_rep::complex_scalar_constant:
       {
         Complex c = arg.complex_value ();
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
 	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (c);
+	    retval.resize (1);
+	    retval(0) = tree_constant (c);
 	  }
 	else
 	  {
-	    retval = new tree_constant [3];
-	    retval[0] = tree_constant (1);
-	    retval[1] = tree_constant (c);
+	    retval.resize (2);
+	    retval(0) = tree_constant (1);
+	    retval(1) = tree_constant (c);
 	  }
       }
       break;
--- a/src/svd.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/svd.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -35,19 +35,19 @@
 #include "f-svd.h"
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_svd_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_svd_2 (const Octave_object& args, int nargin, int nargout)
 {
   return svd (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-svd (const tree_constant *args, int nargin, int nargout)
+Octave_object
+svd (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arg = args[1].make_numeric ();
+  tree_constant arg = args(1).make_numeric ();
 
   if (arg.rows () == 0 || arg.columns () == 0)
     {
@@ -57,10 +57,10 @@
 	  if (flag < 0)
 	    gripe_empty_arg ("svd", 0);
 	  Matrix m;
-	  retval = new tree_constant [4];
-	  retval[0] = tree_constant (m);
-	  retval[1] = tree_constant (m);
-	  retval[2] = tree_constant (m);
+	  retval.resize (3);
+	  retval(0) = tree_constant (m);
+	  retval(1) = tree_constant (m);
+	  retval(2) = tree_constant (m);
 	}
       else
 	gripe_empty_arg ("svd", 1);
@@ -100,17 +100,17 @@
 
 	DiagMatrix sigma = result.singular_values ();
 
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
 	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (sigma.diag (), 1);
+	    retval.resize (1);
+	    retval(0) = tree_constant (sigma.diag (), 1);
 	  }
 	else
 	  {
-	    retval = new tree_constant [4];
-	    retval[0] = tree_constant (result.left_singular_matrix ());
-	    retval[1] = tree_constant (sigma);
-	    retval[2] = tree_constant (result.right_singular_matrix ());
+	    retval.resize (3);
+	    retval(0) = tree_constant (result.left_singular_matrix ());
+	    retval(1) = tree_constant (sigma);
+	    retval(2) = tree_constant (result.right_singular_matrix ());
 	  }
       }
       break;
@@ -121,17 +121,17 @@
 
 	DiagMatrix sigma = result.singular_values ();
 
-	if (nargout == 1)
+	if (nargout == 0 || nargout == 1)
 	  {
-	    retval = new tree_constant [2];
-	    retval[0] = tree_constant (sigma.diag (), 1);
+	    retval.resize (1);
+	    retval(0) = tree_constant (sigma.diag (), 1);
 	  }
 	else
 	  {
-	    retval = new tree_constant [4];
-	    retval[0] = tree_constant (result.left_singular_matrix ());
-	    retval[1] = tree_constant (sigma);
-	    retval[2] = tree_constant (result.right_singular_matrix ());
+	    retval.resize (3);
+	    retval(0) = tree_constant (result.left_singular_matrix ());
+	    retval(1) = tree_constant (sigma);
+	    retval(2) = tree_constant (result.right_singular_matrix ());
 	  }
       }
       break;
--- a/src/syl.cc	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/syl.cc	Fri Jul 08 02:08:37 1994 +0000
@@ -55,21 +55,21 @@
 }
 
 #ifdef WITH_DLD
-tree_constant *
-builtin_syl_2 (const tree_constant *args, int nargin, int nargout)
+Octave_object
+builtin_syl_2 (const Octave_object& args, int nargin, int nargout)
 {
   return syl (args, nargin, nargout);
 }
 #endif
 
-tree_constant *
-syl (const tree_constant *args, int nargin, int nargout)
+Octave_object
+syl (const Octave_object& args, int nargin, int nargout)
 {
-  tree_constant *retval = NULL_TREE_CONST;
+  Octave_object retval;
 
-  tree_constant arga = args[1].make_numeric ();
-  tree_constant argb = args[2].make_numeric ();
-  tree_constant argc = args[3].make_numeric ();
+  tree_constant arga = args(1).make_numeric ();
+  tree_constant argb = args(2).make_numeric ();
+  tree_constant argc = args(3).make_numeric ();
 
   if (arga.is_empty () || argb.is_empty () || argc.is_empty ())
     retval = vector_of_empties (nargout, "syl");
@@ -98,7 +98,7 @@
   
 // Dimensions look o.k., let's solve the problem.
 
-    retval = new tree_constant[nargout+1];
+    retval.resize (nargout ? nargout : 1);
 
     if (arga.is_complex_type () || argb.is_complex_type ()
 	|| argc.is_complex_type ())
@@ -138,7 +138,7 @@
 
 	cx = -ua * cx * ub.hermitian ();
   
-	retval[0] = tree_constant (cx);
+	retval(0) = tree_constant (cx);
       }
     else
       {
@@ -180,7 +180,7 @@
   
 	cx = -ua*cx*ub.transpose ();
   
-	retval[0] = tree_constant (cx);
+	retval(0) = tree_constant (cx);
       }
     }
   return retval;
--- a/src/symtab.h	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/symtab.h	Fri Jul 08 02:08:37 1994 +0000
@@ -35,12 +35,7 @@
 
 #include "SLStack.h"
 
-#ifndef SV_FUNCTION_TYPEDEFS
-#define SV_FUNCTION_TYPEDEFS 1
-
-typedef int (*sv_Function)(void);
-
-#endif
+#include "builtins.h"
 
 #define HASH_TABLE_SIZE 1024             /* Must be multiple of 2 */
 #define HASH_MASK (HASH_TABLE_SIZE - 1)
--- a/src/variables.h	Wed Jul 06 15:02:26 1994 +0000
+++ b/src/variables.h	Fri Jul 08 02:08:37 1994 +0000
@@ -36,12 +36,7 @@
 struct builtin_general_functions;
 struct builtin_string_variables;
 
-#ifndef SV_FUNCTION_TYPEDEFS
-#define SV_FUNCTION_TYPEDEFS 1
-
-typedef int (*sv_Function)(void);
-
-#endif
+#include "builtins.h"
 
 extern void initialize_symbol_tables (void);