// 这里需要问一下: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;

/
rehash */

for (i=0; isize; 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]; /
chain it */

newhash[h1] = p;//旧数据放到新的桶上面

p = next; //p指向下一个(为了遍历)

}

}

luaM_freearray(L, tb->hash, tb->size, TString *);

tb->size = newsize;

tb->hash = newhash;

}


最新文章

  1. .NET中提升UAC权限的方法总结
  2. This build of Sublime Text 2 has expired
  3. HTML5学习笔记
  4. linux 安装beyond compare
  5. 44、NLP的其他分词功能测试
  6. android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色
  7. linux下测试宽带速度
  8. python之路:进阶篇
  9. JavaScript定时器分析
  10. 21 python 初学(json pickle shelve)
  11. 使用exec和sp_executesql动态执行SQL语句(转载)
  12. 转转hybrid app web静态资源离线系统实践
  13. 人工智能(AI)库TensorFlow 踩坑日记之一
  14. Swift5 语言指南(十五) 继承
  15. 【添加tomcat里lib下的jar包】eclipse中The project cannot be built until build path errors are resolved
  16. vue之v-bind
  17. java指针与引用(转载)
  18. [ML学习笔记] 决策树与随机森林(Decision Tree&amp;Random Forest)
  19. ThinkPHP框架知识(比较全的知识)
  20. Oracle中V$SESSION等各表的字段解释,Oracle官方解释

热门文章

  1. elasticsearch unassigned shards 导致RED解决
  2. python基础整理(2)
  3. excel筛选重复项代码
  4. C常见错误小记(未完)
  5. Appium 自动化实例代码
  6. 你所不知道的redis安装方法,穿一手鞋,看一手资料
  7. 【DP-动态代理】JDK&amp;Cglib
  8. 用Python进行实时计算——PyFlink快速入门
  9. Jmeter系列(31)- 获取并使用 JDBC Request 返回的数据
  10. 入门大数据---Storm搭建与应用