]> code.delx.au - gnu-emacs/blobdiff - src/emacs-module.h
Update copyright year to 2016
[gnu-emacs] / src / emacs-module.h
index 18344270b296088e634c7cb294322ab784f55de3..3efea349d71e2e9f1e0ec4e5aa18522205e9e1eb 100644 (file)
@@ -1,6 +1,6 @@
 /* emacs-module.h - GNU Emacs module API.
 
-Copyright (C) 2015 Free Software Foundation, Inc.
+Copyright (C) 2015-2016 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -26,8 +26,19 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #if defined __cplusplus && __cplusplus >= 201103L
 # define EMACS_NOEXCEPT noexcept
+
+/* Function prototype for module user-pointer finalizers.
+
+   NOTE: C++11 15.4: An exception-specification shall not appear in a
+                     typedef declaration or alias-declaration.
+
+*/
+void emacs_dummy_finalizer_function (void *) noexcept;
+typedef decltype(emacs_dummy_finalizer_function) *emacs_finalizer_function;
+
 #else
 # define EMACS_NOEXCEPT
+typedef void (*emacs_finalizer_function) (void *);
 #endif
 
 #ifdef __cplusplus
@@ -37,7 +48,8 @@ extern "C" {
 /* Current environment.  */
 typedef struct emacs_env_25 emacs_env;
 
-/* Opaque structure pointer representing an Emacs Lisp value.  */
+/* Opaque pointer representing an Emacs Lisp value.
+   BEWARE: Do not assume NULL is a valid value!  */
 typedef struct emacs_value_tag *emacs_value;
 
 enum emacs_arity { emacs_variadic_function = -2 };
@@ -60,11 +72,8 @@ struct emacs_runtime
 typedef int (*emacs_init_function) (struct emacs_runtime *ert);
 
 /* Function prototype for the module Lisp functions.  */
-typedef emacs_value (*emacs_subr) (emacs_env *env, int nargs, emacs_value args[],
-                                  void *data);
-
-/* Function prototype for module user-pointer finalizers.  */
-typedef void (*emacs_finalizer_function) (void *);
+typedef emacs_value (*emacs_subr) (emacs_env *env, ptrdiff_t nargs,
+                                  emacs_value args[], void *data);
 
 /* Possible Emacs function call outcomes.  */
 enum emacs_funcall_exit
@@ -117,17 +126,19 @@ struct emacs_env_25
   /* Function registration.  */
 
   emacs_value (*make_function) (emacs_env *env,
-                               int min_arity,
-                               int max_arity,
-                               emacs_value (*function) (emacs_env *, int,
-                                                        emacs_value *, void *)
+                               ptrdiff_t min_arity,
+                               ptrdiff_t max_arity,
+                               emacs_value (*function) (emacs_env *env,
+                                                        ptrdiff_t nargs,
+                                                        emacs_value args[],
+                                                        void *)
                                  EMACS_NOEXCEPT,
                                const char *documentation,
                                void *data);
 
   emacs_value (*funcall) (emacs_env *env,
                           emacs_value function,
-                          int nargs,
+                          ptrdiff_t nargs,
                           emacs_value args[]);
 
   emacs_value (*intern) (emacs_env *env,
@@ -173,17 +184,17 @@ struct emacs_env_25
 
   /* Embedded pointer type.  */
   emacs_value (*make_user_ptr) (emacs_env *env,
-                               void (*fin) (void *) EMACS_NOEXCEPT,
+                               emacs_finalizer_function fin,
                                void *ptr);
 
   void *(*get_user_ptr) (emacs_env *env, emacs_value uptr);
   void (*set_user_ptr) (emacs_env *env, emacs_value uptr, void *ptr);
 
-  void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
-    (void *) EMACS_NOEXCEPT;
+  emacs_finalizer_function (*get_user_finalizer) (emacs_env *env,
+                                                 emacs_value uptr);
   void (*set_user_finalizer) (emacs_env *env,
                              emacs_value uptr,
-                             void (*fin) (void *) EMACS_NOEXCEPT);
+                             emacs_finalizer_function fin);
 
   /* Vector functions.  */
   emacs_value (*vec_get) (emacs_env *env, emacs_value vec, ptrdiff_t i);
@@ -194,6 +205,9 @@ struct emacs_env_25
   ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vec);
 };
 
+/* Every module should define a function as follows.  */
+extern int emacs_module_init (struct emacs_runtime *ert);
+
 #ifdef __cplusplus
 }
 #endif