diff src/pt-arg-list.cc @ 4234:90e44267e8cf

[project @ 2002-12-21 17:15:25 by jwe]
author jwe
date Sat, 21 Dec 2002 17:15:25 +0000
parents 23d06c9e1edd
children f7d11c1a49e3
line wrap: on
line diff
--- a/src/pt-arg-list.cc	Fri Dec 20 22:43:55 2002 +0000
+++ b/src/pt-arg-list.cc	Sat Dec 21 17:15:25 2002 +0000
@@ -33,6 +33,7 @@
 
 #include "str-vec.h"
 
+#include "defun.h"
 #include "error.h"
 #include "oct-obj.h"
 #include "ov.h"
@@ -42,6 +43,7 @@
 #include "pt-pr-code.h"
 #include "pt-walk.h"
 #include "toplev.h"
+#include "unwind-prot.h"
 
 // Argument lists.
 
@@ -88,9 +90,51 @@
   return true;
 }
 
+static const octave_value *indexed_object = 0;
+static int index_position = 0;
+
+DEFCONSTFUN (__end__, , ,
+  "internal function")
+{
+  octave_value retval;
+
+  if (indexed_object)
+    {
+      switch (index_position)
+	{
+	case -1:
+	  // XXX FIXME XXX -- we really want "numel" here.
+	  retval = indexed_object->rows () * indexed_object->columns ();
+	  break;
+
+	case 0:
+	  retval = indexed_object->rows ();
+	  break;
+
+	case 1:
+	  retval = indexed_object->columns ();
+	  break;
+
+	default:
+	  ::error ("__end__: internal error");
+	  break;
+	}
+    }
+  else
+    ::error ("__end__: internal error");
+
+  return retval;
+}
+
 octave_value_list
-tree_argument_list::convert_to_const_vector (void)
+tree_argument_list::convert_to_const_vector (const octave_value *object)
 {
+  unwind_protect::begin_frame ("convert_to_const_vector");
+
+  unwind_protect_ptr (indexed_object);
+
+  indexed_object = object;
+
   int len = length ();
 
   // XXX FIXME XXX -- would be nice to know in advance how largs args
@@ -105,6 +149,8 @@
   int j = 0;
   for (int k = 0; k < len; k++)
     {
+      index_position = (len == 1) ? -1 : k;
+
       tree_expression *elt = *p++;
 
       if (elt)
@@ -160,6 +206,8 @@
 
   args.resize (j);
 
+  unwind_protect::run_frame ("convert_to_const_vector");
+
   return args;
 }