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