diff --git a/simgear/nasal/code.c b/simgear/nasal/code.c index 88b2c207..5b3339ce 100644 --- a/simgear/nasal/code.c +++ b/simgear/nasal/code.c @@ -248,7 +248,7 @@ void naFreeContext(naContext c) // than I have right now. So instead I'm clearing the stack tops here, so // a freed context looks the same as a new one returned by initContext. - c->fTop = c->opTop = c->markTop = 0; + c->fTop = c->opTop = c->markTop = c->ntemps = 0; c->nextFree = globals->freeContexts; globals->freeContexts = c; diff --git a/simgear/nasal/misc.c b/simgear/nasal/misc.c index 0a5c8615..d557a8bd 100644 --- a/simgear/nasal/misc.c +++ b/simgear/nasal/misc.c @@ -100,7 +100,14 @@ naRef naNewHash(struct Context* c) naRef naNewCode(struct Context* c) { - return naNew(c, T_CODE); + naRef r = naNew(c, T_CODE); + // naNew can return a previously used naCode. naCodeGen will init + // all these members but a GC can occur inside naCodeGen, so we see + // partially initalized state here. To avoid this, clear out the values + // which mark() cares about. + PTR(r).code->srcFile = naNil(); + PTR(r).code->nConstants = 0; + return r; } naRef naNewCCode(struct Context* c, naCFunction fptr)