a68g-genie.h
1 //! @file a68g-genie.h
2 //! @author J. Marcel van der Veer
3
4 //! @section Copyright
5 //!
6 //! This file is part of Algol68G - an Algol 68 compiler-interpreter.
7 //! Copyright 2001-2025 J. Marcel van der Veer [algol68g@xs4all.nl].
8
9 //! @section License
10 //!
11 //! This program is free software; you can redistribute it and/or modify it
12 //! under the terms of the GNU General Public License as published by the
13 //! Free Software Foundation; either version 3 of the License, or
14 //! (at your option) any later version.
15 //!
16 //! This program is distributed in the hope that it will be useful, but
17 //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 //! more details. You should have received a copy of the GNU General Public
20 //! License along with this program. If not, see [http://www.gnu.org/licenses/].
21
22 //! @section Synopsis
23 //!
24 //! Interpreter related definitions.
25
26 #if !defined (__A68G_GENIE_H__)
27 #define __A68G_GENIE_H__
28
29 #include "a68g-frames.h"
30
31 //! @brief PROC VOID gc heap
32
33 // Prelude errors can also occur in the constant folder
34
35 #define CHECK_INT_SHORTEN(p, i)\
36 PRELUDE_ERROR (((i) > INT_MAX || (i) < -INT_MAX), p, ERROR_MATH, M_INT)
37
38 #define CHECK_INT_ADDITION(p, i, j)\
39 PRELUDE_ERROR (\
40 ((j) > 0 && (i) > (A68G_MAX_INT - (j))) || ((j) < 0 && (i) < (-A68G_MAX_INT - (j))),\
41 p, "M overflow", M_INT)
42
43 #define CHECK_INT_MULTIPLICATION(p, i, j)\
44 PRELUDE_ERROR (\
45 (j) != 0 && ABS (i) > A68G_MAX_INT / ABS (j),\
46 p, "M overflow", M_INT)
47
48 #define CHECK_BITS_ADDITION(p, i, j)\
49 if (!MODULAR_MATH (p)) {\
50 PRELUDE_ERROR (((i) > (A68G_MAX_BITS - (j))), p, ERROR_MATH, M_BITS);\
51 }
52
53 #define CHECK_BITS_SUBTRACTION(p, i, j)\
54 if (!MODULAR_MATH (p)) {\
55 PRELUDE_ERROR (((j) > (i)), p, ERROR_MATH, M_BITS);\
56 }
57
58 #define CHECK_BITS_MULTIPLICATION(p, i, j)\
59 if (!MODULAR_MATH (p)) {\
60 PRELUDE_ERROR ((j) != 0 && (i) > A68G_MAX_BITS / (j), p, ERROR_MATH, M_BITS);\
61 }
62
63 #define CHECK_INT_DIVISION(p, i, j)\
64 PRELUDE_ERROR ((j) == 0, p, ERROR_DIVISION_BY_ZERO, M_INT)
65
66 #define PRELUDE_ERROR(cond, p, txt, add)\
67 if (cond) {\
68 if (A68G (in_execution)) {\
69 diagnostic (A68G_RUNTIME_ERROR, p, txt, add);\
70 exit_genie (p, A68G_RUNTIME_ERROR);\
71 } else {\
72 diagnostic (A68G_MATH_ERROR, p, txt, add);\
73 }}
74
75 // Check on a NIL name
76
77 #define CHECK_REF(p, z, m)\
78 if (! INITIALISED (&z)) {\
79 diagnostic (A68G_RUNTIME_ERROR, (p), ERROR_EMPTY_VALUE_FROM, (m));\
80 exit_genie ((p), A68G_RUNTIME_ERROR);\
81 } else if (IS_NIL (z)) {\
82 diagnostic (A68G_RUNTIME_ERROR, (p), ERROR_ACCESSING_NIL, (m));\
83 exit_genie ((p), A68G_RUNTIME_ERROR);\
84 }
85
86 // Macros for row-handling
87
88 // An A68G row is a reference to a descriptor in the heap:
89 // A68G_REF row -> A68G_ARRAY ----+ ARRAY: Description of row, ref to elements.
90 // A68G_TUPLE 1 | TUPLE: Bounds, one for every dimension.
91 // ... |
92 // A68G_TUPLE dim |
93 // ... |
94 // ... |
95 // Element 1 <---+ Sequential row elements in the heap.
96 // ...
97 // Element n
98
99 #define DESCRIPTOR_SIZE(n) (SIZE_ALIGNED (A68G_ARRAY) + (n) * SIZE_ALIGNED (A68G_TUPLE))
100
101 #define NEW_ROW_1D(des, row, arr, tup, row_m, mod, upb)\
102 (des) = heap_generator (p, (row_m), DESCRIPTOR_SIZE (1));\
103 (row) = heap_generator (p, (row_m), (upb) * SIZE (mod));\
104 DIM (&(arr)) = 1;\
105 MOID (&(arr)) = (mod);\
106 ELEM_SIZE (&(arr)) = SIZE (mod);\
107 SLICE_OFFSET (&(arr)) = 0;\
108 FIELD_OFFSET (&(arr)) = 0;\
109 ARRAY (&(arr)) = (row);\
110 LWB (&(tup)) = 1;\
111 UPB (&(tup)) = (upb);\
112 SHIFT (&(tup)) = LWB (&(tup));\
113 SPAN (&(tup)) = 1;\
114 K (&(tup)) = 0;\
115 PUT_DESCRIPTOR ((arr), (tup), &(des));
116
117 #define GET_DESCRIPTOR(arr, tup, p)\
118 arr = (A68G_ARRAY *) ARRAY_ADDRESS (p);\
119 tup = (A68G_TUPLE *) & (((BYTE_T *) (arr)) [SIZE_ALIGNED (A68G_ARRAY)]);
120
121 #define GET_DESCRIPTOR2(arr, tup1, tup2, p)\
122 arr = (A68G_ARRAY *) ARRAY_ADDRESS (p);\
123 tup1 = (A68G_TUPLE *) & (((BYTE_T *) (arr)) [SIZE_ALIGNED (A68G_ARRAY)]);\
124 tup2 = (A68G_TUPLE *) & (((BYTE_T *) (arr)) [SIZE_ALIGNED (A68G_ARRAY) + sizeof (A68G_TUPLE)]);
125
126 #define PUT_DESCRIPTOR(arr, tup, p) {\
127 BYTE_T *a_p = ARRAY_ADDRESS (p);\
128 *(A68G_ARRAY *) a_p = (arr);\
129 *(A68G_TUPLE *) &(((BYTE_T *) (a_p)) [SIZE_ALIGNED (A68G_ARRAY)]) = (tup);\
130 }
131
132 #define PUT_DESCRIPTOR2(arr, tup1, tup2, p) {\
133 BYTE_T *a_p = ARRAY_ADDRESS (p);\
134 *(A68G_ARRAY *) a_p = (arr);\
135 *(A68G_TUPLE *) &(((BYTE_T *) (a_p)) [SIZE_ALIGNED (A68G_ARRAY)]) = (tup1);\
136 *(A68G_TUPLE *) &(((BYTE_T *) (a_p)) [SIZE_ALIGNED (A68G_ARRAY) + sizeof (A68G_TUPLE)]) = (tup2);\
137 }
138
139 #define ROW_SIZE(tup) ((LWB (tup) <= UPB (tup)) ? (UPB (tup) - LWB (tup) + 1) : 0)
140 #define ROW_ELEMENT(arr, k) (((ADDR_T) k + SLICE_OFFSET (arr)) * ELEM_SIZE (arr) + FIELD_OFFSET (arr))
141 #define INDEX_1_DIM(arr, tup, k) ROW_ELEMENT (arr, (SPAN (tup) * (int) (k) - SHIFT (tup)))
142
143 #define VECTOR_OFFSET(arr, tup)\
144 ((LWB (tup) * SPAN (tup) - SHIFT (tup) + SLICE_OFFSET (arr)) * ELEM_SIZE (arr) + FIELD_OFFSET (arr))
145
146 #define MATRIX_OFFSET(arr, tup1, tup2)\
147 ((LWB (tup1) * SPAN (tup1) - SHIFT (tup1) + LWB (tup2) * SPAN (tup2) - SHIFT (tup2) + SLICE_OFFSET (arr)) * ELEM_SIZE (arr) + FIELD_OFFSET (arr))
148
149 // Execution
150
151 #define STORE_GC(p, _sp_) {\
152 A68G_REF _loc_;\
153 STATUS (&_loc_) = (STATUS_MASK_T) (INIT_MASK | IN_FRAME_MASK);\
154 REF_HANDLE (&_loc_) = (A68G_HANDLE *) & nil_handle;\
155 OFFSET (&_loc_) = A68G_FP + FRAME_INFO_SIZE + OFFSET (TAX_GC (p));\
156 REF_SCOPE (&_loc_) = A68G_FP;\
157 COPY_ALIGNED ((BYTE_T *) ADDRESS (&_loc_), STACK_ADDRESS (_sp_), SIZE (MOID (p)));\
158 }
159
160 #define GENIE_UNIT(p) {\
161 PROP_T *_prop_ = &GPROP (p);\
162 if (TAX_GC (p) != NO_TAG) {\
163 ADDR_T _sp_ = A68G_SP;\
164 (void) (*(UNIT (_prop_))) (SOURCE (_prop_));\
165 STORE_GC (p, _sp_);\
166 } else {\
167 (void) (*(UNIT (_prop_))) (SOURCE (_prop_));\
168 }}
169
170 #define GENIE_UNIT_KEEP(p, dest) {\
171 PROP_T *_prop_ = &GPROP (p);\
172 if (TAX_GC (p) != NO_TAG) {\
173 ADDR_T _sp_ = A68G_SP;\
174 dest = (*(UNIT (_prop_))) (SOURCE (_prop_));\
175 STORE_GC (p, _sp_);\
176 } else {\
177 dest = (*(UNIT (_prop_))) (SOURCE (_prop_));\
178 }}
179
180 #define GENIE_UNIT_NO_GC(p) {\
181 A68G_GC (sema) ++;\
182 GENIE_UNIT ((p));\
183 A68G_GC (sema) --;}
184
185 #define GENIE_UNIT_KEEP_NO_GC(p, dest) {\
186 A68G_GC (sema) ++;\
187 GENIE_UNIT_KEEP ((p), (dest));\
188 A68G_GC (sema) --;}
189
190 #define GENIE_UNIT_TRACE(p) {\
191 if (STATUS_TEST (p, (BREAKPOINT_MASK | BREAKPOINT_TEMPORARY_MASK | \
192 BREAKPOINT_INTERRUPT_MASK | BREAKPOINT_WATCH_MASK | BREAKPOINT_TRACE_MASK))) {\
193 single_step ((p), STATUS (p));\
194 }\
195 GENIE_UNIT (p);}
196
197 // Stuff for the garbage collector
198
199 #define PREEMPTIVE_FRACTION 0.9
200
201 // Save a handle from the GC
202
203 #define BLOCK_GC_HANDLE(z) {\
204 if (IS_IN_HEAP (z)) {\
205 STATUS_SET (REF_HANDLE(z), BLOCK_GC_MASK);\
206 }}
207
208 #define UNBLOCK_GC_HANDLE(z) {\
209 if (IS_IN_HEAP (z)) {\
210 STATUS_CLEAR (REF_HANDLE (z), BLOCK_GC_MASK);\
211 }}
212
213 // Tests for objects of mode INT
214
215 #define CHECK_INDEX(p, k, t) {\
216 if (VALUE (k) < LWB (t) || VALUE (k) > UPB (t)) {\
217 diagnostic (A68G_RUNTIME_ERROR, p, ERROR_INDEX_OUT_OF_BOUNDS);\
218 exit_genie (p, A68G_RUNTIME_ERROR);\
219 }}
220
221 // Tests for objects of mode REAL
222
223 #if defined (HAVE_IEEE_754)
224 #define CHECK_REAL(p, u) PRELUDE_ERROR (!a68g_finite_real (u), p, ERROR_INFINITE, M_REAL)
225 #define CHECK_COMPLEX(p, u, v) PRELUDE_ERROR (!a68g_finite_real (u) || !a68g_finite_real (v), p, ERROR_INFINITE, M_COMPLEX)
226 #else
227 #define CHECK_REAL(p, u) {;}
228 #define CHECK_COMPLEX(p, u, v) {;}
229 #endif
230
231 #define MATH_RTE(p, z, m, t) PRELUDE_ERROR (z, (p), (t == NO_TEXT ? ERROR_MATH : t), (m))
232
233 // Macros.
234
235 #define C_FUNCTION(p, f)\
236 A68G_REAL *x;\
237 POP_OPERAND_ADDRESS (p, x, A68G_REAL);\
238 errno = 0;\
239 VALUE (x) = f (VALUE (x));\
240 MATH_RTE (p, errno != 0, M_REAL, NO_TEXT);
241
242 #define OWN_FUNCTION(p, f)\
243 A68G_REAL *x;\
244 POP_OPERAND_ADDRESS (p, x, A68G_REAL);\
245 errno = 0;\
246 VALUE (x) = f (p, VALUE (x));\
247 MATH_RTE (p, errno != 0, M_REAL, NO_TEXT);
248
249 // Macros for standard environ
250
251 #define A68G_ENV_INT(n, k) void n (NODE_T *p) {PUSH_PRIMAL (p, (k), INT);}
252 #define A68G_ENV_REAL(n, z) void n (NODE_T *p) {PUSH_PRIMAL (p, (z), REAL);}
253
254 // Macros for the evaluation stack
255
256 #define INCREMENT_STACK_POINTER(err, i)\
257 {A68G_SP += (ADDR_T) A68G_ALIGN (i); (void) (err);}
258
259 #define DECREMENT_STACK_POINTER(err, i)\
260 {A68G_SP -= A68G_ALIGN (i); (void) (err);}
261
262 #define PUSH(p, addr, size) {\
263 BYTE_T *_sp_ = STACK_TOP;\
264 INCREMENT_STACK_POINTER ((p), (int) (size));\
265 COPY (_sp_, (BYTE_T *) (addr), (int) (size));\
266 }
267
268 #define POP(p, addr, size) {\
269 DECREMENT_STACK_POINTER((p), (int) (size));\
270 COPY ((BYTE_T *) (addr), STACK_TOP, (int) (size));\
271 }
272
273 #define POP_ALIGNED(p, addr, size) {\
274 DECREMENT_STACK_POINTER((p), (int) (size));\
275 COPY_ALIGNED ((BYTE_T *) (addr), STACK_TOP, (int) (size));\
276 }
277
278 #define POP_ADDRESS(p, addr, type) {\
279 DECREMENT_STACK_POINTER((p), (int) SIZE_ALIGNED (type));\
280 (addr) = (type *) STACK_TOP;\
281 }
282
283 #define POP_OPERAND_ADDRESS(p, i, type) {\
284 (void) (p);\
285 (i) = (type *) (STACK_OFFSET (-SIZE_ALIGNED (type)));\
286 }
287
288 #define POP_OPERAND_ADDRESSES(p, i, j, type) {\
289 DECREMENT_STACK_POINTER ((p), (int) SIZE_ALIGNED (type));\
290 (j) = (type *) STACK_TOP;\
291 (i) = (type *) (STACK_OFFSET (-SIZE_ALIGNED (type)));\
292 }
293
294 #define POP_3_OPERAND_ADDRESSES(p, i, j, k, type) {\
295 DECREMENT_STACK_POINTER ((p), (int) (2 * SIZE_ALIGNED (type)));\
296 (k) = (type *) (STACK_OFFSET (SIZE_ALIGNED (type)));\
297 (j) = (type *) STACK_TOP;\
298 (i) = (type *) (STACK_OFFSET (-SIZE_ALIGNED (type)));\
299 }
300
301 #define PUSH_VALUE(p, z, mode) {\
302 mode *_x_ = (mode *) STACK_TOP;\
303 STATUS (_x_) = INIT_MASK;\
304 VALUE (_x_) = (z);\
305 INCREMENT_STACK_POINTER ((p), SIZE_ALIGNED (mode));\
306 }
307
308 #define PUSH_PRIMAL(p, z, m) {\
309 A68G_##m *_x_ = (A68G_##m *) STACK_TOP;\
310 int _size_ = SIZE_ALIGNED (A68G_##m);\
311 STATUS (_x_) = INIT_MASK;\
312 VALUE (_x_) = (z);\
313 INCREMENT_STACK_POINTER ((p), _size_);\
314 }
315
316 #define PUSH_OBJECT(p, z, mode) {\
317 *(mode *) STACK_TOP = (z);\
318 INCREMENT_STACK_POINTER (p, SIZE_ALIGNED (mode));\
319 }
320
321 #define POP_OBJECT(p, z, mode) {\
322 DECREMENT_STACK_POINTER((p), SIZE_ALIGNED (mode));\
323 (*(z)) = *((mode *) STACK_TOP);\
324 }
325
326 #define PUSH_COMPLEX(p, re, im) {\
327 PUSH_PRIMAL (p, re, REAL);\
328 PUSH_PRIMAL (p, im, REAL);\
329 }
330
331 #define POP_COMPLEX(p, re, im) {\
332 POP_OBJECT (p, im, A68G_REAL);\
333 POP_OBJECT (p, re, A68G_REAL);\
334 }
335
336 #define PUSH_BYTES(p, k) {\
337 A68G_BYTES *_z_ = (A68G_BYTES *) STACK_TOP;\
338 STATUS (_z_) = INIT_MASK;\
339 MOVE (VALUE (_z_), k, A68G_BYTES_WIDTH);\
340 INCREMENT_STACK_POINTER((p), SIZE_ALIGNED (A68G_BYTES));\
341 }
342
343 #define PUSH_LONG_BYTES(p, k) {\
344 A68G_LONG_BYTES *_z_ = (A68G_LONG_BYTES *) STACK_TOP;\
345 STATUS (_z_) = INIT_MASK;\
346 MOVE (VALUE (_z_), k, A68G_LONG_BYTES_WIDTH);\
347 INCREMENT_STACK_POINTER((p), SIZE_ALIGNED (A68G_LONG_BYTES));\
348 }
349
350 #define PUSH_REF(p, z) PUSH_OBJECT (p, z, A68G_REF)
351 #define PUSH_PROCEDURE(p, z) PUSH_OBJECT (p, z, A68G_PROCEDURE)
352 #define PUSH_FORMAT(p, z) PUSH_OBJECT (p, z, A68G_FORMAT)
353
354 #define PUSH_STRING(p, z) {\
355 char *_s_ = (z);\
356 PUSH_REF ((p), tmp_to_a68g_string ((p), _s_));\
357 }
358
359 #define POP_REF(p, z) POP_OBJECT (p, z, A68G_REF)
360 #define POP_PROCEDURE(p, z) POP_OBJECT (p, z, A68G_PROCEDURE)
361
362 #define PUSH_UNION(p, z) {\
363 A68G_UNION *_x_ = (A68G_UNION *) STACK_TOP;\
364 STATUS (_x_) = INIT_MASK;\
365 VALUE (_x_) = (z);\
366 INCREMENT_STACK_POINTER ((p), SIZE_ALIGNED (A68G_UNION));\
367 }
368
369 // Interpreter macros
370
371 #define INITIALISED(z) ((BOOL_T) (STATUS (z) & INIT_MASK))
372 #define MODULAR_MATH(z) ((BOOL_T) (STATUS (z) & MODULAR_MASK))
373 #define LHS_MODE(p) (MOID (PACK (MOID (p))))
374 #define RHS_MODE(p) (MOID (NEXT (PACK (MOID (p)))))
375
376 // Transput related macros
377
378 #define IS_NIL_FORMAT(f) ((BOOL_T) (BODY (f) == NO_NODE && ENVIRON (f) == 0))
379
380 // Macros for check on initialisation of values
381
382 #define CHECK_INIT(p, c, q)\
383 if (!(c)) {\
384 diagnostic (A68G_RUNTIME_ERROR, (p), ERROR_EMPTY_VALUE_FROM, (q));\
385 exit_genie ((p), A68G_RUNTIME_ERROR);\
386 }
387
388 #define CHECK_DNS2(p, scope, limit, mode)\
389 if (scope > limit) {\
390 BUFFER txt;\
391 ASSERT (a68g_bufprt (txt, SNPRINTF_SIZE, ERROR_SCOPE_DYNAMIC_1) >= 0);\
392 diagnostic (A68G_RUNTIME_ERROR, p, txt, mode);\
393 exit_genie (p, A68G_RUNTIME_ERROR);\
394 }
395
396 #define CHECK_DNS(p, m, w, limit)\
397 if (NEED_DNS (GINFO (p))) {\
398 ADDR_T _lim = ((limit) < A68G_GLOBALS ? A68G_GLOBALS : (limit));\
399 if (IS ((m), REF_SYMBOL)) {\
400 CHECK_DNS2 (p, (REF_SCOPE ((A68G_REF *) (w))), _lim, (m));\
401 } else if (IS ((m), PROC_SYMBOL)) {\
402 CHECK_DNS2 (p, ENVIRON ((A68G_PROCEDURE *) (w)), _lim, (m));\
403 } else if (IS ((m), FORMAT_SYMBOL)) {\
404 CHECK_DNS2 (p, ENVIRON ((A68G_FORMAT *) w), _lim, (m));\
405 }}
406
407 //
408 // The void * cast in next macro is to stop warnings about dropping a volatile
409 // qualifier to a pointer. This is safe here.
410
411 #define STACK_DNS(p, m, limit)\
412 if (p != NO_NODE && GINFO (p) != NO_GINFO) {\
413 CHECK_DNS ((NODE_T *)(void *)(p), (m),\
414 (STACK_OFFSET (-SIZE (m))), (limit));\
415 }
416
417 // Genie routines.
418
419 PROP_T genie_column_function (NODE_T *);
420 PROP_T genie_diagonal_function (NODE_T *);
421 PROP_T genie_row_function (NODE_T *);
422 PROP_T genie_transpose_function (NODE_T *);
423 PROP_T genie_and_function (NODE_T *);
424 PROP_T genie_assertion (NODE_T *);
425 PROP_T genie_assignation_constant (NODE_T *);
426 PROP_T genie_assignation (NODE_T *);
427 PROP_T genie_assignation_quick (NODE_T * p);
428 PROP_T genie_call (NODE_T *);
429 PROP_T genie_cast (NODE_T *);
430 PROP_T genie_closed (volatile NODE_T *);
431 PROP_T genie_coercion (NODE_T *);
432 PROP_T genie_collateral (NODE_T *);
433 PROP_T genie_conditional (volatile NODE_T *);
434 PROP_T genie_constant (NODE_T *);
435 PROP_T genie_denotation (NODE_T *);
436 PROP_T genie_deproceduring (NODE_T *);
437 PROP_T genie_dereference_frame_identifier (NODE_T *);
438 PROP_T genie_dereference_generic_identifier (NODE_T *);
439 PROP_T genie_dereference_selection_name_quick (NODE_T *);
440 PROP_T genie_dereference_slice_name_quick (NODE_T *);
441 PROP_T genie_dereferencing (NODE_T *);
442 PROP_T genie_dereferencing_quick (NODE_T *);
443 PROP_T genie_dyadic (NODE_T *);
444 PROP_T genie_dyadic_quick (NODE_T *);
445 PROP_T genie_enclosed (volatile NODE_T *);
446 PROP_T genie_field_selection (NODE_T *);
447 PROP_T genie_format_text (NODE_T *);
448 PROP_T genie_formula (NODE_T *);
449 PROP_T genie_frame_identifier (NODE_T *);
450 PROP_T genie_identifier (NODE_T *);
451 PROP_T genie_identifier_standenv (NODE_T *);
452 PROP_T genie_identifier_standenv_proc (NODE_T *);
453 PROP_T genie_identity_relation (NODE_T *);
454 PROP_T genie_int_case (volatile NODE_T *);
455 PROP_T genie_loop (volatile NODE_T *);
456 PROP_T genie_loop (volatile NODE_T *);
457 PROP_T genie_monadic (NODE_T *);
458 PROP_T genie_nihil (NODE_T *);
459 PROP_T genie_or_function (NODE_T *);
460 PROP_T genie_routine_text (NODE_T *);
461 PROP_T genie_rowing (NODE_T *);
462 PROP_T genie_rowing_ref_row_of_row (NODE_T *);
463 PROP_T genie_rowing_ref_row_row (NODE_T *);
464 PROP_T genie_rowing_row_of_row (NODE_T *);
465 PROP_T genie_rowing_row_row (NODE_T *);
466 PROP_T genie_selection_name_quick (NODE_T *);
467 PROP_T genie_selection (NODE_T *);
468 PROP_T genie_selection_value_quick (NODE_T *);
469 PROP_T genie_skip (NODE_T *);
470 PROP_T genie_slice_name_quick (NODE_T *);
471 PROP_T genie_slice (NODE_T *);
472 PROP_T genie_united_case (volatile NODE_T *);
473 PROP_T genie_uniting (NODE_T *);
474 PROP_T genie_unit (NODE_T *);
475 PROP_T genie_voiding_assignation_constant (NODE_T *);
476 PROP_T genie_voiding_assignation (NODE_T *);
477 PROP_T genie_voiding (NODE_T *);
478 PROP_T genie_widen_int_to_real (NODE_T *);
479 PROP_T genie_widen (NODE_T *);
480
481 A68G_REF genie_clone (NODE_T *, MOID_T *, A68G_REF *, A68G_REF *);
482 A68G_REF genie_make_ref_row_of_row (NODE_T *, MOID_T *, MOID_T *, ADDR_T);
483 A68G_REF genie_make_ref_row_row (NODE_T *, MOID_T *, MOID_T *, ADDR_T);
484 A68G_REF genie_make_rowrow (NODE_T *, MOID_T *, int, ADDR_T);
485
486 void genie (void *);
487 void genie_clone_stack (NODE_T *, MOID_T *, A68G_REF *, A68G_REF *);
488 void genie_serial_units_no_label (NODE_T *, ADDR_T, NODE_T **);
489 void genie_jump (NODE_T *);
490
491 #endif
© 2002-2025 J.M. van der Veer (jmvdveer@xs4all.nl)
|