1#include "Python.h"
2#include "asdl.h"
3
4asdl_seq *
5_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena)
6{
7    asdl_seq *seq = NULL;
8    size_t n;
9
10    /* check size is sane */
11    if (size < 0 ||
12        (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) {
13        PyErr_NoMemory();
14        return NULL;
15    }
16    n = (size ? (sizeof(void *) * (size - 1)) : 0);
17
18    /* check if size can be added safely */
19    if (n > SIZE_MAX - sizeof(asdl_seq)) {
20        PyErr_NoMemory();
21        return NULL;
22    }
23    n += sizeof(asdl_seq);
24
25    seq = (asdl_seq *)PyArena_Malloc(arena, n);
26    if (!seq) {
27        PyErr_NoMemory();
28        return NULL;
29    }
30    memset(seq, 0, n);
31    seq->size = size;
32    return seq;
33}
34
35asdl_int_seq *
36_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena)
37{
38    asdl_int_seq *seq = NULL;
39    size_t n;
40
41    /* check size is sane */
42    if (size < 0 ||
43        (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) {
44            PyErr_NoMemory();
45            return NULL;
46    }
47    n = (size ? (sizeof(void *) * (size - 1)) : 0);
48
49    /* check if size can be added safely */
50    if (n > SIZE_MAX - sizeof(asdl_seq)) {
51        PyErr_NoMemory();
52        return NULL;
53    }
54    n += sizeof(asdl_seq);
55
56    seq = (asdl_int_seq *)PyArena_Malloc(arena, n);
57    if (!seq) {
58        PyErr_NoMemory();
59        return NULL;
60    }
61    memset(seq, 0, n);
62    seq->size = size;
63    return seq;
64}
65