You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.4 KiB

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