if(rwy._id != id) break;
if(rwy._type[0] != 'r') continue;
+ naRef rwyid = naStr_fromdata(naNewString(c),
+ const_cast<char *>(rwy._rwy_no.c_str()),
+ rwy._rwy_no.length());
+
naRef rwydata = naNewHash(c);
#define HASHSET(s,l,n) naHash_set(rwydata, naStr_fromdata(naNewString(c),s,l),n)
+ HASHSET("id", 2, rwyid);
HASHSET("lat", 3, naNum(rwy._lat));
HASHSET("lon", 3, naNum(rwy._lon));
HASHSET("heading", 7, naNum(rwy._heading));
HASHSET("stopway1", 8, naNum(rwy._stopway1 * SG_FEET_TO_METER));
HASHSET("stopway2", 8, naNum(rwy._stopway2 * SG_FEET_TO_METER));
#undef HASHSET
-
- naRef no = naStr_fromdata(naNewString(c),
- const_cast<char *>(rwy._rwy_no.c_str()),
- rwy._rwy_no.length());
- naHash_set(rwys, no, rwydata);
+ naHash_set(rwys, rwyid, rwydata);
} while(rwylst->next(&rwy));
}
for(it = _dead_listener.begin(); it != end; ++it) delete *it;
_dead_listener.clear();
}
+
+ // The global context is a legacy thing. We use dynamically
+ // created contexts for naCall() now, so that we can call them
+ // recursively. But there are still spots that want to use it for
+ // naNew*() calls, which end up leaking memory because the context
+ // only clears out its temporary vector when it's *used*. So just
+ // junk it and fetch a new/reinitialized one every frame. This is
+ // clumsy: the right solution would use the dynamic context in all
+ // cases and eliminate _context entirely. But that's more work,
+ // and this works fine (yes, they say "New" and "Free", but
+ // they're very fast, just trust me). -Andy
+ naFreeContext(_context);
+ _context = naNewContext();
}
// Loads the scripts found under /nasal in the global tree
return naNil();
}
- int type = argc > 3 && naIsNum(args[3]) ? args[3].num : 1;
+ int type = argc > 3 && naIsNum(args[3]) ? (int)args[3].num : 1;
FGNasalListener *nl = new FGNasalListener(node, code, this,
gcSave(code), _listenerId, type);