Browse Source

32/64 bit memory ref cleanup, part 4: GCproto ->varinfo.

Mike Pall 16 years ago
parent
commit
a0914c409b
5 changed files with 21 additions and 15 deletions
  1. 3 3
      src/lj_err.c
  2. 2 2
      src/lj_func.c
  3. 2 2
      src/lj_gc.c
  4. 3 2
      src/lj_obj.h
  5. 11 6
      src/lj_parse.c

+ 3 - 3
src/lj_err.c

@@ -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;
 }
 

+ 2 - 2
src/lj_func.c

@@ -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);

+ 2 - 2
src/lj_gc.c

@@ -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. */

+ 3 - 2
src/lj_obj.h

@@ -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 ------------------------------------------------------ */
 

+ 11 - 6
src/lj_parse.c

@@ -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);