diff build-aux/mk-builtins.pl @ 23518:8744d4ed8fb4

provide DEFMETHOD macros Allow a reference to the interpreter object to be passed to built-in interpreter functions. * find-defun-files.sh: Adjust regexp pattern for finding built-in functions. * mk-builtins.pl: Handle DEFMETHOD variants of built-in function macros. * defun-int.h, defun.cc (install_builtin_function): New overloads for methods. * defun-int.h (FORWARD_DECLARE_METHODX, FORWARD_DECLARE_METHOD, DECLARE_METHODX, DECLARE_METHOD, DECLARE_STATIC_METHODX, DECLARE_STATIC_METHOD): New macros. * defun.h (DEFMETHOD, DEFMETHODX, DEFCONSTMETHOD): New macros. * libinterp/gendoc.pl: Likewise. * ov-builtin.h, ov-builtin.cc (octave_builtin::meth): New typedef. (octave_builtin::m): New data member. (octave_builtin::method): New function. (octave_builtin::octave_builtin, octave_builtin::call): Handle methods. * ov-dld-fcn.h, ov-dld-fcn.cc (octave_dld_function::create, octave_dld_function::octave_dld_function): Handle methods.
author John W. Eaton <jwe@octave.org>
date Fri, 19 May 2017 16:01:18 -0400
parents 75a4b9a34999
children
line wrap: on
line diff
--- a/build-aux/mk-builtins.pl	Fri May 19 15:53:32 2017 -0400
+++ b/build-aux/mk-builtins.pl	Fri May 19 16:01:18 2017 -0400
@@ -71,6 +71,11 @@
 
 #include \"ovl.h\"
 
+namespace octave
+{
+  class interpreter;
+}
+
 ";
 
   while ($file = shift (@ARGV))
@@ -88,33 +93,47 @@
 
     while (<$fh>)
     {
-      if (/^[ \t]*DEF(CONSTFUN|UN)[ \t]*\( *([^ ,]*).*$/)
+      if (/^[ \t]*DEF(CONSTFUN|CONSTMETHOD|METHOD|UN)[ \t]*\( *([^ ,]*).*$/)
       {
         $name = "F$2";
+        $is_method = ($1 eq "METHOD" || $1 eq "CONSTMETHOD");
       }
-      elsif (/^[ \t]*DEFUNX[ \t]*\( *"[^"]*" *, *([^ ,]*).*$/)
+      elsif (/^[ \t]*DEF(METHOD|UN)X[ \t]*\( *"[^"]*" *, *([^ ,]*).*$/)
       {
-        $name = $1;
+        $name = $2;
+        $is_method = ($1 eq "METHOD");
       }
       elsif ($defun_dld_are_built_in)
       {
-        if (/^[ \t]*DEFUN_DLD[ \t]*\( *([^ ,]*).*$/)
+        if (/^[ \t]*DEF(METHOD|UN)_DLD[ \t]*\( *([^ ,]*).*$/)
         {
-          $name = "F$1";
+          $name = "F$2";
+          $is_method = ($1 eq "METHOD");
         }
-        elsif (/^[ \t]*DEFUNX_DLD[ \t]*\( *"[^"]*" *, *([^ ,]*).*$/)
+        elsif (/^[ \t]*DEF(METHOD|UN)X_DLD[ \t]*\( *"[^"]*" *, *([^ ,]*).*$/)
         {
-          $name = "$1";
+          $name = "$2";
+          $is_method = ($1 eq "METHOD");
         }
       }
 
       if ($name)
       {
-        print "extern OCTINTERP_API octave_value_list
+        if ($is_method)
+        {
+          print "extern OCTINTERP_API octave_value_list
+$name (octave::interpreter&, const octave_value_list& = octave_value_list (), int = 0);
+";
+        }
+        else
+        {
+          print "extern OCTINTERP_API octave_value_list
 $name (const octave_value_list& = octave_value_list (), int = 0);
+";
+        }
 
-";
         $name = "";
+        $is_method = 0;
       }
     }
   }
@@ -182,23 +201,23 @@
 
     while ($line = <$fh>)
     {
-      if ($line =~ /^ *DEFUN *\( *([^ ,]*) *,.*$/)
+      if ($line =~ /^ *DEF(METHOD|UN) *\( *([^ ,]*) *,.*$/)
       {
         $type = "fun";
-        $fname = "F$1";
-        $name = "$1";
+        $fname = "F$2";
+        $name = "$2";
       }
-      elsif ($line =~ /^ *DEFUNX *\( *"([^"]*)" *, *([^ ,]*) *,.*$/)
+      elsif ($line =~ /^ *DEF(METHOD|UN)X *\( *"([^"]*)" *, *([^ ,]*) *,.*$/)
       {
         $type = "fun";
-        $fname = "$2";
-        $name = "$1";
+        $fname = "$3";
+        $name = "$2";
       }
-      elsif ($line =~ /^ *DEFCONSTFUN *\( *([^ ,]*) *,.*$/)
+      elsif ($line =~ /^ *DEFCONST(FUN|METHOD) *\( *([^ ,]*) *,.*$/)
       {
         $type = "fun";
-        $fname = "F$1";
-        $name = "$1";
+        $fname = "F$2";
+        $name = "$2";
         $const = 1;
       }
       elsif ($line =~ /^ *DEFALIAS *\( *([^ ,]*) *, *([^ )]*) *\).*$/)
@@ -209,17 +228,17 @@
       }
       elsif ($defun_dld_are_built_in)
       {
-        if ($line =~ /^ *DEFUN_DLD *\( *([^ ,]*) *,.*$/)
+        if ($line =~ /^ *DEF(METHOD|UN)_DLD *\( *([^ ,]*) *,.*$/)
         {
           $type = "fun";
-          $fname = "F$1";
-          $name = "$1";
+          $fname = "F$2";
+          $name = "$2";
         }
-        elsif ($line =~ /^ *DEFUNX_DLD *\( *"([^"]*)" *, *([^ ,]*) *,.*$/)
+        elsif ($line =~ /^ *DEF(METHOD|UN)X_DLD *\( *"([^"]*)" *, *([^ ,]*) *,.*$/)
         {
           $type = "fun";
-          $fname = "$2";
-          $name = "$1";
+          $fname = "$3";
+          $name = "$2";
         }
       }