public override SkryptObject Visit([NotNull] IParseTree tree) { if (_engine.MemoryLimit > 0) { if (SkryptEngine.GetAllocatedBytesForCurrentThread != null) { var bytes = SkryptEngine.GetAllocatedBytesForCurrentThread(); var realBytes = bytes - _engine.InitialMemoryUsage; if (realBytes > _engine.MemoryLimit) { if (_engine.HaltMemory) { throw new SkryptException($"Engine exceeded memory limit ({_engine.MemoryLimit} bytes) at {realBytes} bytes"); } else { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); _engine.ResetMemoryUsage(); } } } } return(base.Visit(tree)); }