1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| PyObject * PyTuple_New(register Py_ssize_t size) { register PyTupleObject *op; Py_ssize_t i;
// 大小为负数, return if (size < 0) { PyErr_BadInternalCall(); return NULL; }
// 如果大小=0, 空元组, 直接取free_list第一个返回 #if PyTuple_MAXSAVESIZE > 0 if (size == 0 && free_list[0]) { op = free_list[0]; Py_INCREF(op);
#ifdef COUNT_ALLOCS tuple_zero_allocs++; #endif
return (PyObject *) op; }
// 如果free_list可分配, 从free_list取一个 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) { // 上面 op = free_list[size] 取得单链表头 // free_list指向单链表下一个元素, 对应位置阈值-- free_list[size] = (PyTupleObject *) op->ob_item[0]; numfree[size]--;
#ifdef COUNT_ALLOCS fast_tuple_allocs++; #endif
// 初始化 ob_size和ob_type /* Inline PyObject_InitVar */ #ifdef Py_TRACE_REFS Py_SIZE(op) = size; Py_TYPE(op) = &PyTuple_Type; #endif _Py_NewReference((PyObject *)op); } else #endif // free_list不可用 { // 计算空间 Py_ssize_t nbytes = size * sizeof(PyObject *); /* Check for overflow */ if (nbytes / sizeof(PyObject *) != (size_t)size || (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *))) { return PyErr_NoMemory(); }
// 分配内存 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size); if (op == NULL) return NULL; }
// 初始化ob_item每个元素 for (i=0; i < size; i++) op->ob_item[i] = NULL;
// 第一次分配空数组, 将其放入free_list第一个位置 #if PyTuple_MAXSAVESIZE > 0 if (size == 0) { free_list[0] = op; ++numfree[0]; Py_INCREF(op); /* extra INCREF so that this is never freed */ } #endif
#ifdef SHOW_TRACK_COUNT count_tracked++; #endif
_PyObject_GC_TRACK(op);
// 返回 return (PyObject *) op; }
|