]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
32/64 bit memory ref cleanup, part 4: GCproto ->varinfo.
authorMike Pall <mike>
Fri, 5 Feb 2010 00:35:38 +0000 (01:35 +0100)
committerMike Pall <mike>
Fri, 5 Feb 2010 00:35:38 +0000 (01:35 +0100)
src/lj_err.c
src/lj_func.c
src/lj_gc.c
src/lj_obj.h
src/lj_parse.c

index cf7f9ae4e1445ad69be360072627484d991da599..b0143c5a4774808d0ab871036d87c69ea9d4024c 100644 (file)
@@ -138,9 +138,9 @@ static BCLine currentline(lua_State *L, GCfunc *fn, cTValue *nextframe)
 static const char *getvarname(const GCproto *pt, BCPos pc, BCReg slot)
 {
   MSize i;
-  for (i = 0; i < pt->sizevarinfo && pt->varinfo[i].startpc <= pc; i++)
-    if (pc < pt->varinfo[i].endpc && slot-- == 0)
-      return strdata(pt->varinfo[i].name);
+  for (i = 0; i < pt->sizevarinfo && proto_varinfo(pt)[i].startpc <= pc; i++)
+    if (pc < proto_varinfo(pt)[i].endpc && slot-- == 0)
+      return strdata(gco2str(gcref(proto_varinfo(pt)[i].name)));
   return NULL;
 }
 
index 4354aa21750ede9d70d059d63fe4509c9d3c2532..74aba74546d051366fd2b6ed1b7a80e74c8a6e79 100644 (file)
@@ -38,7 +38,7 @@ GCproto *lj_func_newproto(lua_State *L)
   pt->linedefined = 0;
   pt->lastlinedefined = 0;
   setmref(pt->lineinfo, NULL);
-  pt->varinfo = NULL;
+  setmref(pt->varinfo, NULL);
   setmref(pt->uvname, NULL);
   setgcrefnull(pt->chunkname);
   return pt;
@@ -53,7 +53,7 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt)
   lj_mem_freevec(g, proto_bc(pt), pt->sizebc, BCIns);
   lj_mem_freevec(g, proto_uv(pt), pt->sizeuv, uint16_t);
   lj_mem_freevec(g, proto_lineinfo(pt), pt->sizelineinfo, BCLine);
-  lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo);
+  lj_mem_freevec(g, proto_varinfo(pt), pt->sizevarinfo, VarInfo);
   lj_mem_freevec(g, mref(pt->uvname, GCRef), pt->sizeuvname, GCRef);
   lj_trace_freeproto(g, pt);
   lj_mem_freet(g, pt);
index 04aa71617147659d0b49a6804871b580bf6e7494..c1ade95a3a5a242c6ed78c0733843115d933db05 100644 (file)
@@ -259,8 +259,8 @@ static void gc_traverse_proto(global_State *g, GCproto *pt)
     if (proto_uvname(pt, i))
       gc_mark_str(gco2str(proto_uvname(pt, i)));
   for (i = 0; i < (ptrdiff_t)pt->sizevarinfo; i++)  /* Mark names of locals. */
-    if (pt->varinfo[i].name)
-      gc_mark_str(pt->varinfo[i].name);
+    if (gcref(proto_varinfo(pt)[i].name))
+      gc_mark_str(gco2str(gcref(proto_varinfo(pt)[i].name)));
 }
 
 /* Traverse the frame structure of a stack. */
index cdb90dffbad2edaca62588cfa5ebf67bd23deb74..a0dc689cc0f615b0c3bc6d2870048d722234e739 100644 (file)
@@ -339,7 +339,7 @@ enum {
 #define round_nkgc(n)  (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))
 
 typedef struct VarInfo {
-  GCstr *name;         /* Local variable name. */
+  GCRef name;          /* Local variable name. */
   BCPos startpc;       /* First point where the local variable is active. */
   BCPos endpc;         /* First point where the local variable is dead. */
 } VarInfo;
@@ -365,7 +365,7 @@ typedef struct GCproto {
   BCLine linedefined;  /* First line of the function definition. */
   BCLine lastlinedefined;  /* Last line of the function definition. */
   MRef lineinfo;       /* Map from bytecode instructions to source lines. */
-  struct VarInfo *varinfo;  /* Names and extents of local variables. */
+  MRef varinfo;                /* Names and extents of local variables. */
   MRef uvname;         /* Array of upvalue names (GCRef of GCstr). */
   GCRef chunkname;     /* Name of the chunk this function was defined in. */
 } GCproto;
@@ -396,6 +396,7 @@ typedef struct GCproto {
 #define proto_lineinfo(pt)     (mref((pt)->lineinfo, BCLine))
 #define proto_line(pt, pos) \
   check_exp((uintptr_t)(pos) < (pt)->sizebc, proto_lineinfo(pt)[(pos)])
+#define proto_varinfo(pt)      (mref((pt)->varinfo, VarInfo))
 
 /* -- Upvalue object ------------------------------------------------------ */
 
index a3291553ff02ed8a7e5188d10cc61e88df3c4bfb..30a423bd25caf4bfe06c372423fba85de08fe59c 100644 (file)
@@ -974,19 +974,21 @@ static void checkname(LexState *ls, ExpDesc *e)
 
 /* -- Variable handling --------------------------------------------------- */
 
-#define getlocvar(fs, i)       ((fs)->pt->varinfo[(fs)->actvar[(i)]])
+#define getlocvar(fs, i)       (proto_varinfo((fs)->pt)[(fs)->actvar[(i)]])
 
 static BCReg registerlocalvar(LexState *ls, GCstr *name)
 {
   FuncState *fs = ls->fs;
   GCproto *pt = fs->pt;
+  VarInfo *varinfo = proto_varinfo(pt);
   if (LJ_UNLIKELY(fs->nlocvars >= pt->sizevarinfo)) {
     MSize oldsize = pt->sizevarinfo;
     checklimit(fs, fs->nlocvars, 32767, "local variables");
-    lj_mem_growvec(fs->L, pt->varinfo, pt->sizevarinfo, 32767, VarInfo);
-    while (oldsize < pt->sizevarinfo) pt->varinfo[oldsize++].name = NULL;
+    lj_mem_growvec(fs->L, varinfo, pt->sizevarinfo, 32767, VarInfo);
+    setmref(pt->varinfo, varinfo);
+    while (oldsize < pt->sizevarinfo) setgcrefnull(varinfo[oldsize++].name);
   }
-  pt->varinfo[fs->nlocvars].name = name;
+  setgcref(varinfo[fs->nlocvars].name, obj2gco(name));
   lj_gc_objbarrier(ls->L, pt, name);
   return fs->nlocvars++;
 }
@@ -1048,7 +1050,7 @@ static BCReg searchvar(FuncState *fs, GCstr *n)
 {
   int i;
   for (i = fs->nactvar-1; i >= 0; i--) {
-    if (n == getlocvar(fs, i).name)
+    if (n == gco2str(gcref(getlocvar(fs, i).name)))
       return (BCReg)i;
   }
   return (BCReg)-1;  /* Not found. */
@@ -1237,6 +1239,7 @@ static void close_func(LexState *ls)
   BCIns *bc;
   GCRef *uvname;
   BCLine *lineinfo;
+  VarInfo *varinfo;
   removevars(ls, 0);
   finalret(fs, pt);
   bc = proto_bc(pt);
@@ -1249,7 +1252,9 @@ static void close_func(LexState *ls)
   lj_mem_reallocvec(L, lineinfo, pt->sizelineinfo, fs->pc, BCLine);
   setmref(pt->lineinfo, lineinfo);
   pt->sizelineinfo = fs->pc;
-  lj_mem_reallocvec(L, pt->varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
+  varinfo = proto_varinfo(pt);
+  lj_mem_reallocvec(L, varinfo, pt->sizevarinfo, fs->nlocvars, VarInfo);
+  setmref(pt->varinfo, varinfo);
   pt->sizevarinfo = fs->nlocvars;
   uvname = mref(pt->uvname, GCRef);
   lj_mem_reallocvec(L, uvname, pt->sizeuvname, fs->nuv, GCRef);