aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Stephani2017-06-12 10:57:39 +0200
committerPhilipp Stephani2017-06-12 10:57:39 +0200
commitb49dd3b047bf07994d9577e08daba55f143a8bb1 (patch)
tree8d02bdc9f532e9005b0f56ca57fd3e1f2ec1f019
parent9dc6e93b77ce0d920771060756e65779751fd5f7 (diff)
downloademacs-b49dd3b047bf07994d9577e08daba55f143a8bb1.tar.gz
emacs-b49dd3b047bf07994d9577e08daba55f143a8bb1.zip
emacs-module: Use __attribute__((nonnull))
Annotate all parameters with __attribute__((nonnull)) that may not be NULL.
-rw-r--r--src/emacs-module.h98
1 files changed, 67 insertions, 31 deletions
diff --git a/src/emacs-module.h b/src/emacs-module.h
index 26b519a39cf..88cc38191b1 100644
--- a/src/emacs-module.h
+++ b/src/emacs-module.h
@@ -35,6 +35,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
35# define EMACS_NOEXCEPT 35# define EMACS_NOEXCEPT
36#endif 36#endif
37 37
38#if defined __has_attribute && __has_attribute(__nonnull__)
39# define EMACS_ATTRIBUTE_NONNULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
40#else
41# define EMACS_ATTRIBUTE_NONNULL(...)
42#endif
43
38#ifdef __cplusplus 44#ifdef __cplusplus
39extern "C" { 45extern "C" {
40#endif 46#endif
@@ -58,7 +64,8 @@ struct emacs_runtime
58 struct emacs_runtime_private *private_members; 64 struct emacs_runtime_private *private_members;
59 65
60 /* Return an environment pointer. */ 66 /* Return an environment pointer. */
61 emacs_env *(*get_environment) (struct emacs_runtime *ert); 67 emacs_env *(*get_environment) (struct emacs_runtime *ert)
68 EMACS_ATTRIBUTE_NONNULL(1);
62}; 69};
63 70
64 71
@@ -86,29 +93,36 @@ struct emacs_env_25
86 /* Memory management. */ 93 /* Memory management. */
87 94
88 emacs_value (*make_global_ref) (emacs_env *env, 95 emacs_value (*make_global_ref) (emacs_env *env,
89 emacs_value any_reference); 96 emacs_value any_reference)
97 EMACS_ATTRIBUTE_NONNULL(1);
90 98
91 void (*free_global_ref) (emacs_env *env, 99 void (*free_global_ref) (emacs_env *env,
92 emacs_value global_reference); 100 emacs_value global_reference)
101 EMACS_ATTRIBUTE_NONNULL(1);
93 102
94 /* Non-local exit handling. */ 103 /* Non-local exit handling. */
95 104
96 enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env); 105 enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env)
106 EMACS_ATTRIBUTE_NONNULL(1);
97 107
98 void (*non_local_exit_clear) (emacs_env *env); 108 void (*non_local_exit_clear) (emacs_env *env)
109 EMACS_ATTRIBUTE_NONNULL(1);
99 110
100 enum emacs_funcall_exit (*non_local_exit_get) 111 enum emacs_funcall_exit (*non_local_exit_get)
101 (emacs_env *env, 112 (emacs_env *env,
102 emacs_value *non_local_exit_symbol_out, 113 emacs_value *non_local_exit_symbol_out,
103 emacs_value *non_local_exit_data_out); 114 emacs_value *non_local_exit_data_out)
115 EMACS_ATTRIBUTE_NONNULL(1, 2, 3);
104 116
105 void (*non_local_exit_signal) (emacs_env *env, 117 void (*non_local_exit_signal) (emacs_env *env,
106 emacs_value non_local_exit_symbol, 118 emacs_value non_local_exit_symbol,
107 emacs_value non_local_exit_data); 119 emacs_value non_local_exit_data)
120 EMACS_ATTRIBUTE_NONNULL(1);
108 121
109 void (*non_local_exit_throw) (emacs_env *env, 122 void (*non_local_exit_throw) (emacs_env *env,
110 emacs_value tag, 123 emacs_value tag,
111 emacs_value value); 124 emacs_value value)
125 EMACS_ATTRIBUTE_NONNULL(1);
112 126
113 /* Function registration. */ 127 /* Function registration. */
114 128
@@ -119,34 +133,45 @@ struct emacs_env_25
119 ptrdiff_t nargs, 133 ptrdiff_t nargs,
120 emacs_value args[], 134 emacs_value args[],
121 void *) 135 void *)
122 EMACS_NOEXCEPT, 136 EMACS_NOEXCEPT
137 EMACS_ATTRIBUTE_NONNULL(1),
123 const char *documentation, 138 const char *documentation,
124 void *data); 139 void *data)
140 EMACS_ATTRIBUTE_NONNULL(1, 4);
125 141
126 emacs_value (*funcall) (emacs_env *env, 142 emacs_value (*funcall) (emacs_env *env,
127 emacs_value function, 143 emacs_value function,
128 ptrdiff_t nargs, 144 ptrdiff_t nargs,
129 emacs_value args[]); 145 emacs_value args[])
146 EMACS_ATTRIBUTE_NONNULL(1);
130 147
131 emacs_value (*intern) (emacs_env *env, 148 emacs_value (*intern) (emacs_env *env,
132 const char *symbol_name); 149 const char *symbol_name)
150 EMACS_ATTRIBUTE_NONNULL(1, 2);
133 151
134 /* Type conversion. */ 152 /* Type conversion. */
135 153
136 emacs_value (*type_of) (emacs_env *env, 154 emacs_value (*type_of) (emacs_env *env,
137 emacs_value value); 155 emacs_value value)
156 EMACS_ATTRIBUTE_NONNULL(1);
138 157
139 bool (*is_not_nil) (emacs_env *env, emacs_value value); 158 bool (*is_not_nil) (emacs_env *env, emacs_value value)
159 EMACS_ATTRIBUTE_NONNULL(1);
140 160
141 bool (*eq) (emacs_env *env, emacs_value a, emacs_value b); 161 bool (*eq) (emacs_env *env, emacs_value a, emacs_value b)
162 EMACS_ATTRIBUTE_NONNULL(1);
142 163
143 intmax_t (*extract_integer) (emacs_env *env, emacs_value value); 164 intmax_t (*extract_integer) (emacs_env *env, emacs_value value)
165 EMACS_ATTRIBUTE_NONNULL(1);
144 166
145 emacs_value (*make_integer) (emacs_env *env, intmax_t value); 167 emacs_value (*make_integer) (emacs_env *env, intmax_t value)
168 EMACS_ATTRIBUTE_NONNULL(1);
146 169
147 double (*extract_float) (emacs_env *env, emacs_value value); 170 double (*extract_float) (emacs_env *env, emacs_value value)
171 EMACS_ATTRIBUTE_NONNULL(1);
148 172
149 emacs_value (*make_float) (emacs_env *env, double value); 173 emacs_value (*make_float) (emacs_env *env, double value)
174 EMACS_ATTRIBUTE_NONNULL(1);
150 175
151 /* Copy the content of the Lisp string VALUE to BUFFER as an utf8 176 /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
152 null-terminated string. 177 null-terminated string.
@@ -163,40 +188,51 @@ struct emacs_env_25
163 bool (*copy_string_contents) (emacs_env *env, 188 bool (*copy_string_contents) (emacs_env *env,
164 emacs_value value, 189 emacs_value value,
165 char *buffer, 190 char *buffer,
166 ptrdiff_t *size_inout); 191 ptrdiff_t *size_inout)
192 EMACS_ATTRIBUTE_NONNULL(1, 4);
167 193
168 /* Create a Lisp string from a utf8 encoded string. */ 194 /* Create a Lisp string from a utf8 encoded string. */
169 emacs_value (*make_string) (emacs_env *env, 195 emacs_value (*make_string) (emacs_env *env,
170 const char *contents, ptrdiff_t length); 196 const char *contents, ptrdiff_t length)
197 EMACS_ATTRIBUTE_NONNULL(1, 2);
171 198
172 /* Embedded pointer type. */ 199 /* Embedded pointer type. */
173 emacs_value (*make_user_ptr) (emacs_env *env, 200 emacs_value (*make_user_ptr) (emacs_env *env,
174 void (*fin) (void *) EMACS_NOEXCEPT, 201 void (*fin) (void *) EMACS_NOEXCEPT,
175 void *ptr); 202 void *ptr)
203 EMACS_ATTRIBUTE_NONNULL(1);
176 204
177 void *(*get_user_ptr) (emacs_env *env, emacs_value uptr); 205 void *(*get_user_ptr) (emacs_env *env, emacs_value uptr)
178 void (*set_user_ptr) (emacs_env *env, emacs_value uptr, void *ptr); 206 EMACS_ATTRIBUTE_NONNULL(1);
207 void (*set_user_ptr) (emacs_env *env, emacs_value uptr, void *ptr)
208 EMACS_ATTRIBUTE_NONNULL(1);
179 209
180 void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr)) 210 void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
181 (void *) EMACS_NOEXCEPT; 211 (void *) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1);
182 void (*set_user_finalizer) (emacs_env *env, 212 void (*set_user_finalizer) (emacs_env *env,
183 emacs_value uptr, 213 emacs_value uptr,
184 void (*fin) (void *) EMACS_NOEXCEPT); 214 void (*fin) (void *) EMACS_NOEXCEPT)
215 EMACS_ATTRIBUTE_NONNULL(1);
185 216
186 /* Vector functions. */ 217 /* Vector functions. */
187 emacs_value (*vec_get) (emacs_env *env, emacs_value vec, ptrdiff_t i); 218 emacs_value (*vec_get) (emacs_env *env, emacs_value vec, ptrdiff_t i)
219 EMACS_ATTRIBUTE_NONNULL(1);
188 220
189 void (*vec_set) (emacs_env *env, emacs_value vec, ptrdiff_t i, 221 void (*vec_set) (emacs_env *env, emacs_value vec, ptrdiff_t i,
190 emacs_value val); 222 emacs_value val)
223 EMACS_ATTRIBUTE_NONNULL(1);
191 224
192 ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vec); 225 ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vec)
226 EMACS_ATTRIBUTE_NONNULL(1);
193 227
194 /* Returns whether a quit is pending. */ 228 /* Returns whether a quit is pending. */
195 bool (*should_quit) (emacs_env *env); 229 bool (*should_quit) (emacs_env *env)
230 EMACS_ATTRIBUTE_NONNULL(1);
196}; 231};
197 232
198/* Every module should define a function as follows. */ 233/* Every module should define a function as follows. */
199extern int emacs_module_init (struct emacs_runtime *ert); 234extern int emacs_module_init (struct emacs_runtime *ert)
235 EMACS_ATTRIBUTE_NONNULL(1);
200 236
201#ifdef __cplusplus 237#ifdef __cplusplus
202} 238}