diff libinterp/corefcn/defun-int.h @ 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 0af6dbede266
children be7b884ac589
line wrap: on
line diff
--- a/libinterp/corefcn/defun-int.h	Fri May 19 15:53:32 2017 -0400
+++ b/libinterp/corefcn/defun-int.h	Fri May 19 16:01:18 2017 -0400
@@ -32,6 +32,11 @@
 #include "symtab.h"
 #include "version.h"
 
+namespace octave
+{
+  class interpreter;
+}
+
 class octave_value;
 
 extern OCTINTERP_API void print_usage (void);
@@ -46,11 +51,21 @@
                           bool can_hide_function = true);
 
 extern OCTINTERP_API void
+install_builtin_function (octave_builtin::meth m, const std::string& name,
+                          const std::string& file, const std::string& doc,
+                          bool can_hide_function = true);
+
+extern OCTINTERP_API void
 install_dld_function (octave_dld_function::fcn f, const std::string& name,
                       const octave::dynamic_library& shl, const std::string& doc,
                       bool relative = false);
 
 extern OCTINTERP_API void
+install_dld_function (octave_dld_function::meth m, const std::string& name,
+                      const octave::dynamic_library& shl, const std::string& doc,
+                      bool relative = false);
+
+extern OCTINTERP_API void
 install_mex_function (void *fptr, bool fmex, const std::string& name,
                       const octave::dynamic_library& shl, bool relative = false);
 
@@ -101,22 +116,45 @@
   extern OCTAVE_EXPORT octave_value_list        \
   name (const octave_value_list&, int)
 
+#define FORWARD_DECLARE_METHODX(name)                           \
+  extern OCTAVE_EXPORT octave_value_list                        \
+  name (octave::interpreter&, const octave_value_list&, int)
+
 #define FORWARD_DECLARE_FUN(name)               \
   FORWARD_DECLARE_FUNX (F ## name)
 
+#define FORWARD_DECLARE_METHOD(name)            \
+  FORWARD_DECLARE_METHODX (F ## name)
+
 #define DECLARE_FUNX(name, args_name, nargout_name)             \
   OCTAVE_EXPORT octave_value_list                               \
   name (const octave_value_list& args_name, int nargout_name)
 
+#define DECLARE_METHODX(name, interp_name, args_name, nargout_name)     \
+  OCTAVE_EXPORT octave_value_list                                       \
+  name (octave::interpreter& interp_name,                               \
+        const octave_value_list& args_name, int nargout_name)
+
 #define DECLARE_FUN(name, args_name, nargout_name)      \
   DECLARE_FUNX (F ## name, args_name, nargout_name)
 
+#define DECLARE_METHOD(name, interp_name, args_name, nargout_name)      \
+  DECLARE_METHODX (F ## name, interp_name, args_name, nargout_name)
+
 #define DECLARE_STATIC_FUNX(name, args_name, nargout_name)      \
   static octave_value_list                                      \
   name (const octave_value_list& args_name, int nargout_name)
 
+#define DECLARE_STATIC_METHODX(name, interp_name, args_name, nargout_name) \
+  static octave_value_list                                              \
+  name (octave::interpreter& interp_name,                               \
+        const octave_value_list& args_name, int nargout_name)
+
 #define DECLARE_STATIC_FUN(name, args_name, nargout_name)       \
-  DECLARE_FUNX (F ## name, args_name, nargout_name)
+  DECLARE_STATIC_FUNX (F ## name, args_name, nargout_name)
+
+#define DECLARE_STATIC_METHOD(name, interp_name, args_name, nargout_name) \
+  DECLARE_STATIC_METHODX (F ## name, interp_name, args_name, nargout_name)
 
 // Define the code that will be used to insert the new function into
 // the symbol table.  We look for this name instead of the actual