Exemple #1
0
        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));
        }