zoukankan      html  css  js  c++  java
  • Lua-源码-字符串的resize函数-luaS_resize

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

    
    
  • 相关阅读:
    Win7下配置IIS服务器以及网站发布
    Visual Studio 2015 移动跨平台开发初体验
    C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
    借用jquery实现:使浏览器的“前进”按钮功能失效
    C# 之 String.Empty
    关于ASP.NET中fileupload控件的缺点
    从关系型数据库到非关系型数据库
    jquery中prop()方法和attr()方法的区别
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
    无法连接asp.net development server
  • 原文地址:https://www.cnblogs.com/Jaysonhome/p/13028759.html
Copyright © 2011-2022 走看看