g_save greenlet存在heap上的數據區間由stack_copy
到 stack_copy + stack_saved
指定 這裏在把greenlet的數據存到heap上時 判斷以前的那段區間是否足夠存放 若是不夠的話 從新申請內存code
static int g_save(PyGreenlet* g, char* stop) { /* Save more of g's stack into the heap -- at least up to 'stop' */
intptr_t sz1 = g->stack_saved; intptr_t sz2 = stop - g->stack_start; assert(g->stack_start != NULL); if (sz2 > sz1) { char* c = (char*)PyMem_Realloc(g->stack_copy, sz2); if (!c) { PyErr_NoMemory(); return -1; } memcpy(c+sz1, g->stack_start+sz1, sz2-sz1); g->stack_copy = c; g->stack_saved = sz2; } return 0; }