]> git.mxchange.org Git - simgear.git/commitdiff
Parse/GC interaction fixed.
authorandy <andy>
Mon, 22 Dec 2003 19:27:51 +0000 (19:27 +0000)
committerandy <andy>
Mon, 22 Dec 2003 19:27:51 +0000 (19:27 +0000)
Remove the OP_NEWARGS "optimization" (it wasn't).

simgear/nasal/code.c
simgear/nasal/code.h
simgear/nasal/codegen.c
simgear/nasal/parse.c

index 9333c88f2dc4e1ebb013139f640f23c2f7a20c19..3bd1e5ab65b24eb8271bf3b0dd6abb4fc0bb654b 100644 (file)
@@ -102,8 +102,6 @@ static void initContext(struct Context* c)
     for(i=0; i<MAX_RECURSION; i++)
         c->fStack[i].args = naNil();
 
-    c->argPool = naNewVector(c);
-
     // Note we can't use naNewVector() for this; it requires that
     // temps exist first.
     c->temps = naObj(T_VEC, naGC_get(&(c->pools[T_VEC])));
@@ -138,7 +136,6 @@ void naGarbageCollect()
     for(i=0; i < c->opTop; i++)
         naGC_mark(c->opStack[i]);
 
-    naGC_mark(c->argPool);
     naGC_mark(c->temps);
     naGC_mark(c->save);
 
@@ -465,7 +462,6 @@ static void run1(struct Context* ctx, struct Frame* f, naRef code)
         ctx->opTop = f->bp; // restore the correct stack frame!
         ctx->fTop--;
        ctx->fStack[ctx->fTop].args.ref.ptr.vec->size = 0;
-        naVec_append(ctx->argPool, ctx->fStack[ctx->fTop].args);
         PUSH(ctx, a);
         break;
     case OP_LINE:
@@ -483,10 +479,6 @@ static void run1(struct Context* ctx, struct Frame* f, naRef code)
     case OP_BREAK: // restore stack state (FOLLOW WITH JMP!)
         ctx->opTop = ctx->markStack[--ctx->markTop];
         break;
-    case OP_NEWARGS: // push a new function arg vector
-        PUSH(ctx, (naVec_size(ctx->argPool) ?
-                   naVec_removelast(ctx->argPool) : naNewVector(ctx)));
-        break;
     default:
         ERR(ctx, "BUG: bad opcode");
     }
index 89c07fe9d6719bc86bf1c8bc55ae11c08bd2ebb1..7e9c765318ac252a0d13623348be3104f1185c52 100644 (file)
@@ -16,7 +16,7 @@ enum {
     OP_PUSHCONST, OP_PUSHONE, OP_PUSHZERO, OP_PUSHNIL, OP_POP,
     OP_DUP, OP_XCHG, OP_INSERT, OP_EXTRACT, OP_MEMBER, OP_SETMEMBER,
     OP_LOCAL, OP_SETLOCAL, OP_NEWVEC, OP_VAPPEND, OP_NEWHASH, OP_HAPPEND,
-    OP_LINE, OP_MARK, OP_UNMARK, OP_BREAK, OP_NEWARGS
+    OP_LINE, OP_MARK, OP_UNMARK, OP_BREAK
 };
 
 struct Frame {
@@ -41,10 +41,6 @@ struct Context {
     int markTop;
     int done;
 
-    // Vector of arguments vectors.  A LIFO cache, basically, to avoid
-    // thrashing the GC just for function call arguments.
-    naRef argPool;
-
     // Constants
     naRef meRef;
     naRef argRef;
index 2f2b6baa527802310fc52ab7a3511b89769e844d..e75f75f5c0d40716d8510bdf6ce5eeabcfc1e3da 100644 (file)
@@ -163,7 +163,7 @@ static void genFuncall(struct Parser* p, struct Token* t)
     } else {
         genExpr(p, LEFT(t));
     }
-    emit(p, OP_NEWARGS);
+    emit(p, OP_NEWVEC);
     if(RIGHT(t)) genList(p, RIGHT(t));
     emit(p, op);
 }
index a17452c49c707a9760ef5b99489a84422d51b79b..920d7342acbaaa4642a1d7a7c994c6a157359a3d 100644 (file)
@@ -489,6 +489,9 @@ naRef naParseCode(struct Context* c, naRef srcFile, int firstLine,
     struct Token* t;
     struct Parser p;
 
+    // Protect from garbage collection
+    naVec_append(c->temps, srcFile);
+
     // Catch parser errors here.
     *errLine = 0;
     if(setjmp(p.jumpHandle)) {
@@ -520,6 +523,7 @@ naRef naParseCode(struct Context* c, naRef srcFile, int firstLine,
 
     // Clean up our mess
     naParseDestroy(&p);
+    naVec_append(c->temps, codeObj);
 
     return codeObj;
 }