# define EMACS_NOEXCEPT
#endif
+#if defined __has_attribute && __has_attribute(__nonnull__)
+# define EMACS_ATTRIBUTE_NONNULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
+#else
+# define EMACS_ATTRIBUTE_NONNULL(...)
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
struct emacs_runtime_private *private_members;
/* Return an environment pointer. */
- emacs_env *(*get_environment) (struct emacs_runtime *ert);
+ emacs_env *(*get_environment) (struct emacs_runtime *ert)
+ EMACS_ATTRIBUTE_NONNULL(1);
};
/* Memory management. */
emacs_value (*make_global_ref) (emacs_env *env,
- emacs_value any_reference);
+ emacs_value any_reference)
+ EMACS_ATTRIBUTE_NONNULL(1);
void (*free_global_ref) (emacs_env *env,
- emacs_value global_reference);
+ emacs_value global_reference)
+ EMACS_ATTRIBUTE_NONNULL(1);
/* Non-local exit handling. */
- enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env);
+ enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env)
+ EMACS_ATTRIBUTE_NONNULL(1);
- void (*non_local_exit_clear) (emacs_env *env);
+ void (*non_local_exit_clear) (emacs_env *env)
+ EMACS_ATTRIBUTE_NONNULL(1);
enum emacs_funcall_exit (*non_local_exit_get)
(emacs_env *env,
emacs_value *non_local_exit_symbol_out,
- emacs_value *non_local_exit_data_out);
+ emacs_value *non_local_exit_data_out)
+ EMACS_ATTRIBUTE_NONNULL(1, 2, 3);
void (*non_local_exit_signal) (emacs_env *env,
emacs_value non_local_exit_symbol,
- emacs_value non_local_exit_data);
+ emacs_value non_local_exit_data)
+ EMACS_ATTRIBUTE_NONNULL(1);
void (*non_local_exit_throw) (emacs_env *env,
emacs_value tag,
- emacs_value value);
+ emacs_value value)
+ EMACS_ATTRIBUTE_NONNULL(1);
/* Function registration. */
ptrdiff_t nargs,
emacs_value args[],
void *)
- EMACS_NOEXCEPT,
+ EMACS_NOEXCEPT
+ EMACS_ATTRIBUTE_NONNULL(1),
const char *documentation,
- void *data);
+ void *data)
+ EMACS_ATTRIBUTE_NONNULL(1, 4);
emacs_value (*funcall) (emacs_env *env,
emacs_value function,
ptrdiff_t nargs,
- emacs_value args[]);
+ emacs_value args[])
+ EMACS_ATTRIBUTE_NONNULL(1);
emacs_value (*intern) (emacs_env *env,
- const char *symbol_name);
+ const char *symbol_name)
+ EMACS_ATTRIBUTE_NONNULL(1, 2);
/* Type conversion. */
emacs_value (*type_of) (emacs_env *env,
- emacs_value value);
+ emacs_value value)
+ EMACS_ATTRIBUTE_NONNULL(1);
- bool (*is_not_nil) (emacs_env *env, emacs_value value);
+ bool (*is_not_nil) (emacs_env *env, emacs_value value)
+ EMACS_ATTRIBUTE_NONNULL(1);
- bool (*eq) (emacs_env *env, emacs_value a, emacs_value b);
+ bool (*eq) (emacs_env *env, emacs_value a, emacs_value b)
+ EMACS_ATTRIBUTE_NONNULL(1);
- intmax_t (*extract_integer) (emacs_env *env, emacs_value value);
+ intmax_t (*extract_integer) (emacs_env *env, emacs_value value)
+ EMACS_ATTRIBUTE_NONNULL(1);
- emacs_value (*make_integer) (emacs_env *env, intmax_t value);
+ emacs_value (*make_integer) (emacs_env *env, intmax_t value)
+ EMACS_ATTRIBUTE_NONNULL(1);
- double (*extract_float) (emacs_env *env, emacs_value value);
+ double (*extract_float) (emacs_env *env, emacs_value value)
+ EMACS_ATTRIBUTE_NONNULL(1);
- emacs_value (*make_float) (emacs_env *env, double value);
+ emacs_value (*make_float) (emacs_env *env, double value)
+ EMACS_ATTRIBUTE_NONNULL(1);
/* Copy the content of the Lisp string VALUE to BUFFER as an utf8
null-terminated string.
bool (*copy_string_contents) (emacs_env *env,
emacs_value value,
char *buffer,
- ptrdiff_t *size_inout);
+ ptrdiff_t *size_inout)
+ EMACS_ATTRIBUTE_NONNULL(1, 4);
/* Create a Lisp string from a utf8 encoded string. */
emacs_value (*make_string) (emacs_env *env,
- const char *contents, ptrdiff_t length);
+ const char *contents, ptrdiff_t length)
+ EMACS_ATTRIBUTE_NONNULL(1, 2);
/* Embedded pointer type. */
emacs_value (*make_user_ptr) (emacs_env *env,
void (*fin) (void *) EMACS_NOEXCEPT,
- void *ptr);
+ void *ptr)
+ EMACS_ATTRIBUTE_NONNULL(1);
- 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_ptr) (emacs_env *env, emacs_value uptr)
+ EMACS_ATTRIBUTE_NONNULL(1);
+ void (*set_user_ptr) (emacs_env *env, emacs_value uptr, void *ptr)
+ EMACS_ATTRIBUTE_NONNULL(1);
void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
- (void *) EMACS_NOEXCEPT;
+ (void *) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1);
void (*set_user_finalizer) (emacs_env *env,
emacs_value uptr,
- void (*fin) (void *) EMACS_NOEXCEPT);
+ void (*fin) (void *) EMACS_NOEXCEPT)
+ EMACS_ATTRIBUTE_NONNULL(1);
/* Vector functions. */
- emacs_value (*vec_get) (emacs_env *env, emacs_value vec, ptrdiff_t i);
+ emacs_value (*vec_get) (emacs_env *env, emacs_value vec, ptrdiff_t i)
+ EMACS_ATTRIBUTE_NONNULL(1);
void (*vec_set) (emacs_env *env, emacs_value vec, ptrdiff_t i,
- emacs_value val);
+ emacs_value val)
+ EMACS_ATTRIBUTE_NONNULL(1);
- ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vec);
+ ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vec)
+ EMACS_ATTRIBUTE_NONNULL(1);
/* Returns whether a quit is pending. */
- bool (*should_quit) (emacs_env *env);
+ bool (*should_quit) (emacs_env *env)
+ EMACS_ATTRIBUTE_NONNULL(1);
};
/* Every module should define a function as follows. */
-extern int emacs_module_init (struct emacs_runtime *ert);
+extern int emacs_module_init (struct emacs_runtime *ert)
+ EMACS_ATTRIBUTE_NONNULL(1);
#ifdef __cplusplus
}