PageRenderTime 17ms CodeModel.GetById 1ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 0ms

/Python/asdl.c

http://unladen-swallow.googlecode.com/
C | 64 lines | 50 code | 10 blank | 4 comment | 14 complexity | f5e7505036f003d26774d85d37316acd MD5 | raw file
 1#include "Python.h"
 2#include "asdl.h"
 3
 4asdl_seq *
 5asdl_seq_new(int size, PyArena *arena)
 6{
 7	asdl_seq *seq = NULL;
 8	size_t n = (size ? (sizeof(void *) * (size - 1)) : 0);
 9
10	/* check size is sane */
11	if (size < 0 || size == INT_MIN || 
12		(size && ((size - 1) > (PY_SIZE_MAX / sizeof(void *))))) {
13		PyErr_NoMemory();
14		return NULL;
15	}
16
17	/* check if size can be added safely */
18	if (n > PY_SIZE_MAX - sizeof(asdl_seq)) {
19		PyErr_NoMemory();
20		return NULL;
21	}
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 *
36asdl_int_seq_new(int size, PyArena *arena)
37{
38	asdl_int_seq *seq = NULL;
39	size_t n = (size ? (sizeof(void *) * (size - 1)) : 0);
40
41	/* check size is sane */
42	if (size < 0 || size == INT_MIN || 
43		(size && ((size - 1) > (PY_SIZE_MAX / sizeof(void *))))) {
44			PyErr_NoMemory();
45			return NULL;
46	}
47
48	/* check if size can be added safely */
49	if (n > PY_SIZE_MAX - sizeof(asdl_seq)) {
50		PyErr_NoMemory();
51		return NULL;
52	}
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}