/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. asdl_seq *
  4. asdl_seq_new(int size, PyArena *arena)
  5. {
  6. asdl_seq *seq = NULL;
  7. size_t n = (size ? (sizeof(void *) * (size - 1)) : 0);
  8. /* check size is sane */
  9. if (size < 0 || size == INT_MIN ||
  10. (size && ((size - 1) > (PY_SIZE_MAX / sizeof(void *))))) {
  11. PyErr_NoMemory();
  12. return NULL;
  13. }
  14. /* check if size can be added safely */
  15. if (n > PY_SIZE_MAX - sizeof(asdl_seq)) {
  16. PyErr_NoMemory();
  17. return NULL;
  18. }
  19. n += sizeof(asdl_seq);
  20. seq = (asdl_seq *)PyArena_Malloc(arena, n);
  21. if (!seq) {
  22. PyErr_NoMemory();
  23. return NULL;
  24. }
  25. memset(seq, 0, n);
  26. seq->size = size;
  27. return seq;
  28. }
  29. asdl_int_seq *
  30. asdl_int_seq_new(int size, PyArena *arena)
  31. {
  32. asdl_int_seq *seq = NULL;
  33. size_t n = (size ? (sizeof(void *) * (size - 1)) : 0);
  34. /* check size is sane */
  35. if (size < 0 || size == INT_MIN ||
  36. (size && ((size - 1) > (PY_SIZE_MAX / sizeof(void *))))) {
  37. PyErr_NoMemory();
  38. return NULL;
  39. }
  40. /* check if size can be added safely */
  41. if (n > PY_SIZE_MAX - sizeof(asdl_seq)) {
  42. PyErr_NoMemory();
  43. return NULL;
  44. }
  45. n += sizeof(asdl_seq);
  46. seq = (asdl_int_seq *)PyArena_Malloc(arena, n);
  47. if (!seq) {
  48. PyErr_NoMemory();
  49. return NULL;
  50. }
  51. memset(seq, 0, n);
  52. seq->size = size;
  53. return seq;
  54. }