blob: 8b61e16c329ea90b8cda2020432f2e1f59eb033b [file] [log] [blame]
Zackery Spytz421a72a2019-09-12 03:27:14 -06001#ifndef Py_LIMITED_API
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002#ifndef Py_ASDL_H
3#define Py_ASDL_H
4
5typedef PyObject * identifier;
6typedef PyObject * string;
7typedef PyObject * object;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008typedef PyObject * constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00009
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010/* It would be nice if the code generated by asdl_c.py was completely
11 independent of Python, but it is a goal the requires too much work
12 at this stage. So, for example, I'll represent identifiers as
13 interned Python strings.
14*/
15
Pablo Galindoa5634c42020-09-16 19:42:00 +010016#define _ASDL_SEQ_HEAD \
17 Py_ssize_t size; \
18 void **elements;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000019
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000020typedef struct {
Pablo Galindoa5634c42020-09-16 19:42:00 +010021 _ASDL_SEQ_HEAD
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022} asdl_seq;
23
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000024typedef struct {
Pablo Galindoa5634c42020-09-16 19:42:00 +010025 _ASDL_SEQ_HEAD
26 void *typed_elements[1];
27} asdl_generic_seq;
28
29typedef struct {
30 _ASDL_SEQ_HEAD
31 PyObject *typed_elements[1];
32} asdl_identifier_seq;
33
34typedef struct {
35 _ASDL_SEQ_HEAD
36 int typed_elements[1];
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000037} asdl_int_seq;
38
Pablo Galindoa5634c42020-09-16 19:42:00 +010039asdl_generic_seq *_Py_asdl_generic_seq_new(Py_ssize_t size, PyArena *arena);
40asdl_identifier_seq *_Py_asdl_identifier_seq_new(Py_ssize_t size, PyArena *arena);
Antoine Pitroud01d396e2013-10-12 22:52:43 +020041asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042
Pablo Galindoa5634c42020-09-16 19:42:00 +010043
44#define GENERATE_ASDL_SEQ_CONSTRUCTOR(NAME, TYPE) \
45asdl_ ## NAME ## _seq *_Py_asdl_ ## NAME ## _seq_new(Py_ssize_t size, PyArena *arena) \
46{ \
47 asdl_ ## NAME ## _seq *seq = NULL; \
48 size_t n; \
49 /* check size is sane */ \
50 if (size < 0 || \
51 (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) { \
52 PyErr_NoMemory(); \
53 return NULL; \
54 } \
55 n = (size ? (sizeof(TYPE *) * (size - 1)) : 0); \
56 /* check if size can be added safely */ \
57 if (n > SIZE_MAX - sizeof(asdl_ ## NAME ## _seq)) { \
58 PyErr_NoMemory(); \
59 return NULL; \
60 } \
61 n += sizeof(asdl_ ## NAME ## _seq); \
62 seq = (asdl_ ## NAME ## _seq *)PyArena_Malloc(arena, n); \
63 if (!seq) { \
64 PyErr_NoMemory(); \
65 return NULL; \
66 } \
67 memset(seq, 0, n); \
68 seq->size = size; \
69 seq->elements = (void**)seq->typed_elements; \
70 return seq; \
71}
72
73#define asdl_seq_GET_UNTYPED(S, I) (S)->elements[(I)]
74#define asdl_seq_GET(S, I) (S)->typed_elements[(I)]
Jeremy Hyltona8293132006-02-28 17:58:27 +000075#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
76#ifdef Py_DEBUG
Victor Stinner042cb462013-11-16 00:16:58 +010077#define asdl_seq_SET(S, I, V) \
78 do { \
79 Py_ssize_t _asdl_i = (I); \
80 assert((S) != NULL); \
Victor Stinner4d73ae72018-11-22 14:45:16 +010081 assert(0 <= _asdl_i && _asdl_i < (S)->size); \
Pablo Galindoa5634c42020-09-16 19:42:00 +010082 (S)->typed_elements[_asdl_i] = (V); \
83 } while (0)
84#else
85#define asdl_seq_SET(S, I, V) (S)->typed_elements[I] = (V)
86#endif
87
88#ifdef Py_DEBUG
89#define asdl_seq_SET_UNTYPED(S, I, V) \
90 do { \
91 Py_ssize_t _asdl_i = (I); \
92 assert((S) != NULL); \
93 assert(0 <= _asdl_i && _asdl_i < (S)->size); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000094 (S)->elements[_asdl_i] = (V); \
Victor Stinner042cb462013-11-16 00:16:58 +010095 } while (0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096#else
Pablo Galindoa5634c42020-09-16 19:42:00 +010097#define asdl_seq_SET_UNTYPED(S, I, V) (S)->elements[I] = (V)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000099
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000100#endif /* !Py_ASDL_H */
Zackery Spytz421a72a2019-09-12 03:27:14 -0600101#endif /* Py_LIMITED_API */