changeset 29729:d0ce7260978d

also accept validation syntax for classdef properties * parse.h, oct-parse.yy (arg_name): New non-terminal. (arg_validation): Don't accept identifier here. (args_validation_list): Use arg_name here. (class_property): Use arg_validation instead of '=' expression alone. (base_parser::make_arg_validation): Eliminate arg_name argument. * pt-args-block.h (tree_arg_validation::tree_arg_validation): Elimnate arg_name argument. (tree_arg_validation::arg_name, tree_arg_validation::validation_fcns, tree_arg_validation::identifier_expression, tree_arg_validation::size_spec, tree_arg_validation::class_name, tree_arg_validation::initializer_expression): New functions. * pt-classdef.h, pt-classdef.cc (tree_classdef_property::m_av): New data member to replace separate m_id and m_expr data members. (tree_classdef_property::tree_classdef_property): Accept tree_arg_validation argument instead of tree_identifier and tree_expression separately. (tree_classdef_property::~tree_classdef_property, tree_classdef_property::ident, tree_classdef_property::expression): Update. * pt-eval.cc (tree_evaluator::visit_arguments_block): Emphasize that incorrect results are possible for ignored argument validation blocks.
author John W. Eaton <jwe@octave.org>
date Fri, 04 Jun 2021 13:58:59 -0400
parents 287fde79ffa2
children 6d5ed3650447
files libinterp/parse-tree/oct-parse.yy libinterp/parse-tree/parse.h libinterp/parse-tree/pt-args-block.h libinterp/parse-tree/pt-classdef.cc libinterp/parse-tree/pt-classdef.h libinterp/parse-tree/pt-eval.cc
diffstat 6 files changed, 84 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.yy	Fri Jun 04 08:25:35 2021 -0400
+++ b/libinterp/parse-tree/oct-parse.yy	Fri Jun 04 13:58:59 2021 -0400
@@ -259,6 +259,7 @@
 %type <tree_expression_type> matrix cell
 %type <tree_expression_type> primary_expr oper_expr power_expr
 %type <tree_expression_type> simple_expr colon_expr assign_expr expression
+%type <tree_expression_type> arg_name
 %type <tree_identifier_type> identifier fcn_name magic_tilde
 %type <tree_superclass_ref_type> superclass_identifier
 %type <tree_metaclass_query_type> meta_identifier
@@ -1858,22 +1859,31 @@
                 ;
 
 args_validation_list
-                  : arg_validation
-                    { $$ = parser.make_args_validation_list ($1); }
-                  | args_validation_list sep arg_validation
+                  : arg_name arg_validation
+                    {
+                      $2->arg_name ($1);
+                      $$ = parser.make_args_validation_list ($2);
+                    }
+                  | args_validation_list sep arg_name arg_validation
                     {
                       OCTAVE_YYUSE ($2);
 
-                      $$ = parser.append_args_validation_list ($1, $3);
+                      $4->arg_name ($3);
+                      $$ = parser.append_args_validation_list ($1, $4);
                     }
                   ;
 
-arg_validation    : identifier size_spec class_name validation_fcns default_value
+// FIXME: Change grammar to allow IDENTIFIER to be be either
+// "NAME" or "NAME '.' NAME", possibly not entered in the symbol
+// table for the current scope.  Also stash comments before identifier.
+
+arg_name          : identifier
+                    { $$ = $1; }
+                  ;
+
+arg_validation    : size_spec class_name validation_fcns default_value
                   {
-                    // FIXME: Change grammar to allow IDENTIFIER to be
-                    // be either "NAME" or "NAME '.' NAME".
-
-                    if (! ($$ = parser.make_arg_validation ($1, $2, $3, $4, $5)))
+                    if (! ($$ = parser.make_arg_validation ($1, $2, $3, $4)))
                       {
                         // make_arg_validation deleted ...
                         YYABORT;
@@ -2156,15 +2166,20 @@
                   }
                 ;
 
-class_property  : stash_comment identifier
+class_property  : stash_comment identifier arg_validation
                   {
-                    $$ = new octave::tree_classdef_property ($2, $1);
-                  }
-                | stash_comment identifier '=' expression
-                  {
-                    OCTAVE_YYUSE ($3);
-
-                    $$ = new octave::tree_classdef_property ($2, $4, $1);
+                    // FIXME: Maybe this should be in a separate
+                    // base_parser::make_classdef_property function?
+
+                    octave::tree_arg_validation *av = $3;
+
+                    av->arg_name ($2);
+
+                    if (av->size_spec () || av->class_name ()
+                        || av->validation_fcns ())
+                      warning ("size, class, and validation function specifications are not yet supported for classdef properties; INCORRECT RESULTS ARE POSSIBLE!");
+
+                    $$ = new octave::tree_classdef_property (av, $1);
                   }
                 ;
 
@@ -4096,8 +4111,7 @@
   }
 
   tree_arg_validation *
-  base_parser::make_arg_validation (tree_expression *arg_name,
-                                    tree_arg_size_spec *size_spec,
+  base_parser::make_arg_validation (tree_arg_size_spec *size_spec,
                                     tree_identifier *class_name,
                                     tree_arg_validation_fcns *validation_fcns,
                                     tree_expression *default_value)
@@ -4105,7 +4119,7 @@
     // FIXME: Validate arguments and convert to more specific types
     // (std::string for arg_name and class_name, etc).
 
-    return new tree_arg_validation (arg_name, size_spec, class_name,
+    return new tree_arg_validation (size_spec, class_name,
                                     validation_fcns, default_value);
   }
 
--- a/libinterp/parse-tree/parse.h	Fri Jun 04 08:25:35 2021 -0400
+++ b/libinterp/parse-tree/parse.h	Fri Jun 04 13:58:59 2021 -0400
@@ -395,8 +395,7 @@
 
     // Make an argument validation.
     OCTINTERP_API tree_arg_validation *
-    make_arg_validation (tree_expression *arg_name,
-                         tree_arg_size_spec *size_spec,
+    make_arg_validation (tree_arg_size_spec *size_spec,
                          tree_identifier *class_name,
                          tree_arg_validation_fcns *validation_fcns,
                          tree_expression *default_value);
--- a/libinterp/parse-tree/pt-args-block.h	Fri Jun 04 08:25:35 2021 -0400
+++ b/libinterp/parse-tree/pt-args-block.h	Fri Jun 04 13:58:59 2021 -0400
@@ -36,6 +36,9 @@
 
 #include "base-list.h"
 
+// FIXME: We could maybe re-think the naming of some of these objects
+// before releasing a version that contains these new classes...
+
 namespace octave
 {
   class tree_arg_size_spec
@@ -100,12 +103,11 @@
   {
   public:
 
-    tree_arg_validation (tree_expression *arg_name,
-                         tree_arg_size_spec *size_spec,
+    tree_arg_validation (tree_arg_size_spec *size_spec,
                          tree_identifier *class_name,
                          tree_arg_validation_fcns *validation_fcns,
                          tree_expression *default_value)
-      : m_arg_name (arg_name), m_size_spec (size_spec),
+      : m_arg_name (nullptr), m_size_spec (size_spec),
         m_class_name (class_name), m_validation_fcns (validation_fcns),
         m_default_value (default_value)
     { }
@@ -125,6 +127,23 @@
       delete m_default_value;
     }
 
+    void arg_name (tree_expression *name)
+    {
+      m_arg_name = name;
+    }
+
+    tree_expression * identifier_expression (void) { return m_arg_name; }
+
+    tree_arg_size_spec * size_spec (void) { return m_size_spec; }
+
+    tree_identifier * class_name (void) { return m_class_name; }
+
+    tree_arg_validation_fcns *
+    validation_fcns (void) { return m_validation_fcns; }
+
+    tree_expression *
+    initializer_expression (void) { return m_default_value; }
+
     void accept (tree_walker& tw)
     {
       tw.visit_arg_validation (*this);
--- a/libinterp/parse-tree/pt-classdef.cc	Fri Jun 04 08:25:35 2021 -0400
+++ b/libinterp/parse-tree/pt-classdef.cc	Fri Jun 04 13:58:59 2021 -0400
@@ -31,6 +31,7 @@
 
 #include "ov.h"
 #include "ov-classdef.h"
+#include "pt-args-block.h"
 #include "pt-classdef.h"
 #include "pt-eval.h"
 
@@ -137,18 +138,28 @@
     return "";
   }
 
-  tree_classdef_property::tree_classdef_property (tree_identifier *i,
+  tree_classdef_property::tree_classdef_property (tree_arg_validation *av,
                                                   comment_list *comments)
-    : m_id (i), m_expr (nullptr), m_comments (comments),
+    : m_av (av), m_comments (comments),
       m_doc_string (check_for_doc_string (m_comments))
   { }
 
-  tree_classdef_property::tree_classdef_property (tree_identifier *i,
-                                                  tree_expression *e,
-                                                  comment_list *comments)
-    : m_id (i), m_expr (e), m_comments (comments),
-      m_doc_string (check_for_doc_string (m_comments))
-  { }
+  tree_classdef_property::~tree_classdef_property (void)
+  {
+    delete m_av;
+  }
+
+  tree_identifier * tree_classdef_property::ident (void)
+  {
+    tree_expression *id_expr = m_av->identifier_expression ();
+
+    return dynamic_cast<tree_identifier *> (id_expr);
+  }
+
+  tree_expression * tree_classdef_property::expression (void)
+  {
+    return m_av->initializer_expression ();
+  }
 
   // Classdef property_list
 
--- a/libinterp/parse-tree/pt-classdef.h	Fri Jun 04 08:25:35 2021 -0400
+++ b/libinterp/parse-tree/pt-classdef.h	Fri Jun 04 13:58:59 2021 -0400
@@ -44,6 +44,8 @@
 {
   class interpreter;
 
+  class tree_arg_validation;
+
   class tree_superclass_ref : public tree_expression
   {
   public:
@@ -317,10 +319,7 @@
   {
   public:
 
-    tree_classdef_property (tree_identifier *i,
-                            comment_list *comments = nullptr);
-
-    tree_classdef_property (tree_identifier *i, tree_expression *e,
+    tree_classdef_property (tree_arg_validation *av,
                             comment_list *comments = nullptr);
 
     // No copying!
@@ -329,15 +328,11 @@
 
     tree_classdef_property& operator = (const tree_classdef_property&) = delete;
 
-    ~tree_classdef_property (void)
-    {
-      delete m_id;
-      delete m_expr;
-    }
+    ~tree_classdef_property (void);
 
-    tree_identifier * ident (void) { return m_id; }
+    tree_identifier * ident (void);
 
-    tree_expression * expression (void) { return m_expr; }
+    tree_expression * expression (void);
 
     comment_list * comments (void) const { return m_comments; }
 
@@ -354,8 +349,7 @@
 
   private:
 
-    tree_identifier *m_id;
-    tree_expression *m_expr;
+    tree_arg_validation *m_av;
     comment_list *m_comments;
     std::string m_doc_string;
   };
--- a/libinterp/parse-tree/pt-eval.cc	Fri Jun 04 08:25:35 2021 -0400
+++ b/libinterp/parse-tree/pt-eval.cc	Fri Jun 04 13:58:59 2021 -0400
@@ -1247,7 +1247,7 @@
   void
   tree_evaluator::visit_arguments_block (tree_arguments_block&)
   {
-    warning ("function arguments validation blocks are not supported");
+    warning ("function arguments validation blocks are not supported; INCORRECT RESULTS ARE POSSIBLE");
   }
 
   void