From octave-maintainers-request at bevo dot che dot wisc dot edu Tue Dec 31 15:47:16 2002 Subject: Re: f(end) feature? From: "John W. Eaton" To: Paul Kienzle Cc: "John W. Eaton" , octave-maintainers@bevo.che.wisc.edu Date: Tue, 31 Dec 2002 15:47:02 -0600 On 31-Dec-2002, Paul Kienzle wrote: | So I guess the following is out of the question: | | function y = head(x) | y = x(1:min(3,end)); | end Sorry, that's not what I intended, and it's not actually prevented by the previous patch, but min(3,end) would return -1, so you would not get the result you expect. The following patch should help (I think). With it and the previous patch: octave:1> function y = head (x) y = x(1:min(3,end)); end octave:2> x = [1,2,3,4] x = 1 2 3 4 octave:3> head (x) ans = 1 2 3 and octave:1> min (1,end) error: __end__: internal error error: evaluating argument list element number 2 Is that better? The error message could be improved, I suppose. jwe 2002-12-31 John W. Eaton * pt-arg-list.cc (F__end__): Fail if rows or columns is negative. (tree_argument_list::convert_to_const_vector): Only protect and save pointer to the indexed object if it is a constant. Index: pt-arg-list.cc =================================================================== RCS file: /usr/local/cvsroot/octave/src/pt-arg-list.cc,v retrieving revision 1.13 diff -u -r1.13 pt-arg-list.cc --- pt-arg-list.cc 31 Dec 2002 20:16:38 -0000 1.13 +++ pt-arg-list.cc 31 Dec 2002 21:43:14 -0000 at @ -137,11 +151,19 @@ octave_value_list tree_argument_list::convert_to_const_vector (const octave_value *object) { - unwind_protect::begin_frame ("convert_to_const_vector"); + // END doesn't make sense for functions. Maybe we need a different + // way of asking an octave_value object this question? + + bool stash_object = (object && object->is_constant ()); - unwind_protect_ptr (indexed_object); + if (stash_object) + { + unwind_protect::begin_frame ("convert_to_const_vector"); + + unwind_protect_ptr (indexed_object); - indexed_object = object; + indexed_object = object; + } int len = length (); at @ -214,7 +236,8 @@ args.resize (j); - unwind_protect::run_frame ("convert_to_const_vector"); + if (stash_object) + unwind_protect::run_frame ("convert_to_const_vector"); return args; }