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)); }
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)); }
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)); }
public static SkryptObject GetAllocatedBytes(SkryptEngine engine, SkryptObject self, Arguments arguments) { var bytes = SkryptEngine.GetAllocatedBytesForCurrentThread() - engine.InitialMemoryUsage; return(engine.CreateNumber(bytes)); }