SpringBoot+SpringCloud+vue+Element開發專案——業務功能實現
阿新 • • 發佈:2020-07-12
// 這裡需要問一下:upval和一般的物件有什麼區別?為什麼要單獨一個函式來處理? void luaC_linkupval (lua_State *L, UpVal *uv) { global_State *g = G(L); GCObject *o = obj2gco(uv); o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ g->rootgc = o; if (isgray(o)) { // 如果obj是灰色的,說明與它關聯的物件還沒mark過 if (g->gcstate == GCSpropagate) { // 如果當前在mark階段,就對它關聯的物件進行mark gray2black(o); /* closed upvalues need barrier */ luaC_barrier(L, uv, uv->v); } else { /* sweep phase: sweep it (turning it into white) */ // 否則就是已經過了mark階段,這裡的註釋說將會sweep這個節點,但是這樣是不對的 // 因為過了GCSpropagate階段的話,在atomic函式中已經切換了白色,也就是下一次GC時的白色. // 所以這個時候的切換,並不會讓它在本次GC中被sweep掉 makewhite(g, o); lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); } } }
// 對儲存string的hash桶進行resize
void luaS_resize (lua_State *L, int newsize) {
GCObject **newhash;
stringtable tb;
int i;
if (G(L)->gcstate == GCSsweepstring)
return; / cannot resize during GC traverse */
//虛擬機器分配的地址
newhash = luaM_newvector(L, newsize, GCObject );
tb = &G(L)->strt;
for (i=0; i<newsize; i++) newhash[i] = NULL;
/
for (i=0; i
GCObject p = tb->hash[i];
while (p) { / for each node in the list */
GCObject next = p->gch.next; / save next / //next:指向下一個GC連結串列的成員。
unsigned int h = gco2ts(p)->hash;
// 重新計算hash桶索引,這次需要mod新的hash桶大小
int h1 = lmod(h, newsize); / new position /
lua_assert(cast_int(h%newsize) == lmod(h, newsize));
p->gch.next = newhash[h1]; /
newhash[h1] = p;//舊資料放到新的桶上面
p = next; //p指向下一個(為了遍歷)
}
}
luaM_freearray(L, tb->hash, tb->size, TString *);
tb->size = newsize;
tb->hash = newhash;
}