Пример #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));
        }
Пример #2
0
        public static SkryptObject GetSizeOfAction(SkryptEngine engine, SkryptObject self, Arguments arguments)
        {
            var target = arguments.GetAs <FunctionInstance>(0);

            var before = SkryptEngine.GetAllocatedBytesForCurrentThread();

            target.Run();

            var after = SkryptEngine.GetAllocatedBytesForCurrentThread();

            return(engine.CreateNumber(after - before));
        }
Пример #3
0
        public static SkryptObject GetSizeOfObject(SkryptEngine engine, SkryptObject self, Arguments arguments)
        {
            var target = arguments.GetAs <SkryptObject>(0);
            var clone  = default(SkryptObject);

            var before = SkryptEngine.GetAllocatedBytesForCurrentThread();

            clone = target != null?target.Clone() : null;

            var after = SkryptEngine.GetAllocatedBytesForCurrentThread();

            clone = null;

            return(engine.CreateNumber(after - before));
        }
Пример #4
0
        public static SkryptObject GetAllocatedBytes(SkryptEngine engine, SkryptObject self, Arguments arguments)
        {
            var bytes = SkryptEngine.GetAllocatedBytesForCurrentThread() - engine.InitialMemoryUsage;

            return(engine.CreateNumber(bytes));
        }