请选择 进入手机版 | 继续访问电脑版
  • 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Lua-源码-字符串的resize函数-luaS_resize

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Windows下Visual Studio 2013编译Lua 5.1.4版本发布时间:2022-07-22
下一篇:
lua的table表去重发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap