Changeset 18164


Ignore:
Timestamp:
2009-10-26T15:27:30+01:00 (7 years ago)
Author:
nbd
Message:

lua: fix regressions in operator overloading caused by the refcounting patch, also fix some more variable cleanup issues => even more performance, less memory utilization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/lua/patches/600-refcounting.patch

    r18158 r18164  
    206206   return res; 
    207207 } 
    208 @@ -1040,20 +1046,22 @@ LUA_API int lua_next (lua_State *L, int  
     208@@ -1040,20 +1046,21 @@ LUA_API int lua_next (lua_State *L, int  
    209209   if (more) { 
    210210     api_incr_top(L); 
     
    221221  
    222222 LUA_API void lua_concat (lua_State *L, int n) { 
    223 +  int i; 
    224223   lua_lock(L); 
    225224   api_checknelems(L, n); 
     
    520519   } 
    521520   return p; 
    522 @@ -452,22 +455,27 @@ static void GCTM (lua_State *L) { 
    523      g->tmudata = NULL; 
    524    else 
    525      g->tmudata->gch.next = udata->uv.next; 
    526 +  udata->uv.prev = (GCObject *)g->mainthread; 
    527    udata->uv.next = g->mainthread->next;  /* return it to `root' list */ 
    528    g->mainthread->next = o; 
    529 +  if (udata->uv.next) 
    530 +    udata->uv.next->uv.prev = o; 
    531    makewhite(g, o); 
    532 +  L->top++; 
    533    tm = fasttm(L, udata->uv.metatable, TM_GC); 
    534    if (tm != NULL) { 
    535      lu_byte oldah = L->allowhook; 
    536      lu_mem oldt = g->GCthreshold; 
    537      L->allowhook = 0;  /* stop debug hooks during GC tag method */ 
    538      g->GCthreshold = 2*g->totalbytes;  /* avoid GC steps */ 
    539 -    setobj2s(L, L->top, tm); 
    540 -    setuvalue(L, L->top+1, udata); 
    541      L->top += 2; 
    542 +    setobj2s(L, L->top - 2, tm); 
    543 +    setuvalue(L, L->top - 1, udata); 
    544      luaD_call(L, L->top - 2, 0); 
    545      L->allowhook = oldah;  /* restore hooks */ 
    546      g->GCthreshold = oldt;  /* restore threshold */ 
    547    } 
    548 +  L->top--; 
    549  } 
    550   
    551   
    552521@@ -543,7 +551,7 @@ static void atomic (lua_State *L) { 
    553522   udsize = luaC_separateudata(L, 0);  /* separate userdata to be finalized */ 
     
    1009978   lua_Integer i; 
    1010979    
    1011 @@ -104,6 +105,7 @@ static void callTMres (lua_State *L, Stk 
    1012    res = restorestack(L, result); 
    1013    L->top--; 
    1014    setobjs2s(L, res, L->top); 
    1015 +  setnilvalue(L, L->top); 
    1016  } 
    1017   
    1018   
    1019980@@ -384,6 +386,7 @@ void luaV_concat (lua_State *L, int tota 
    1020981         size_t l = tsvalue(top-i)->len; 
     
    10611022         lua_assert(ttisstring(KBx(i))); 
    10621023         Protect(luaV_settable(L, &g, KBx(i), ra)); 
    1063 @@ -693,7 +696,7 @@ void luaV_execute (lua_State *L, int nex 
    1064        } 
    1065        OPCODE_TARGET(SETUPVAL) { 
    1066          UpVal *uv = cl->upvals[GETARG_B(i)]; 
    1067 -        setobj(L, uv->v, ra); 
    1068 +        setobj(L, uv->v, luaV_ref(ra)); 
    1069          luaC_barrier(L, uv, ra); 
    1070          continue; 
    1071        } 
    1072 @@ -856,7 +859,8 @@ void luaV_execute (lua_State *L, int nex 
    1073        } 
    1074        OPCODE_TARGET(TAILCALL) { 
    1075          int b = GETARG_B(i); 
    1076 -        if (b != 0) L->top = ra+b;  /* else previous instruction set top */ 
    1077 +        if (b != 0) 
    1078 +          L->top = ra+b;  /* else previous instruction set top */ 
    1079          L->savedpc = pc; 
    1080          lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); 
    1081          switch (luaD_precall(L, ra, LUA_MULTRET)) { 
    1082 @@ -870,7 +874,8 @@ void luaV_execute (lua_State *L, int nex 
    1083              L->base = ci->base = ci->func + ((ci+1)->base - pfunc); 
    1084              for (aux = 0; pfunc+aux < L->top; aux++)  /* move frame down */ 
    1085                setobjs2s(L, func+aux, pfunc+aux); 
    1086 -            ci->top = L->top = func+aux;  /* correct top */ 
    1087 +            ci->top = func+aux;  /* correct top */ 
    1088 +                       L->top = ci->top; 
    1089              lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); 
    1090              ci->savedpc = L->savedpc; 
    1091              ci->tailcalls++;  /* one more call lost */ 
    10921024@@ -895,7 +900,7 @@ void luaV_execute (lua_State *L, int nex 
    10931025         if (--nexeccalls == 0)  /* was previous function running `here'? */ 
     
    11031035           TValue *val = ra+n; 
    11041036           setobj2t(L, luaH_setint(L, h, last--), val); 
    1105 +                 setnilvalue(L, val); 
     1037+          setnilvalue(L, val); 
    11061038           luaC_barriert(L, h, val); 
    11071039         } 
     
    11921124+       int __i; \ 
    11931125+       for (__i = L->top - val; __i-- > 0;) \ 
    1194 +               setnilvalue(L, L->top + __i); \ 
     1126+               setnilvalue(L, val + __i); \ 
    11951127+       L->top = val; \ 
    11961128+} while (0) 
Note: See TracChangeset for help on using the changeset viewer.