public static LogicalExpression Compile(string expression, bool nocache) { LogicalExpression logicalExpression = null; if (_cacheEnabled && !nocache) { try { Rwl.EnterReadLock(); if (_compiledExpressions.ContainsKey(expression)) { Debug.WriteLine("Expression retrieved from cache: " + expression); var wr = _compiledExpressions[expression]; logicalExpression = wr.Target as LogicalExpression; if (wr.IsAlive && logicalExpression != null) { return(logicalExpression); } } } finally { Rwl.ExitReadLock(); } } if (logicalExpression == null) { var lexer = new NCalcLexer(new ANTLRStringStream(expression)); var parser = new NCalcParser(new CommonTokenStream(lexer)); logicalExpression = parser.ncalcExpression().value; if (parser.Errors != null && parser.Errors.Count > 0) { throw new EvaluationException(String.Join(Environment.NewLine, parser.Errors.ToArray())); } if (_cacheEnabled && !nocache) { try { Rwl.EnterWriteLock(); _compiledExpressions[expression] = new WeakReference(logicalExpression); } finally { Rwl.ExitWriteLock(); } CleanCache(); Debug.WriteLine("Expression added to cache: " + expression); } } return(logicalExpression); }
public static LogicalExpression Compile(string expression, bool nocache) { LogicalExpression logicalExpression = null; if (_cacheEnabled && !nocache) { try { Rwl.AcquireReaderLock(Timeout.Infinite); if (_compiledExpressions.ContainsKey(expression)) { Trace.TraceInformation("Expression retrieved from cache: " + expression); var wr = _compiledExpressions[expression]; logicalExpression = wr.Target as LogicalExpression; if (wr.IsAlive && logicalExpression != null) { logicalExpression.RetrievedFromCache = true; return(logicalExpression); } } } finally { Rwl.ReleaseReaderLock(); } } if (logicalExpression == null) { var lexer = new NCalcLexer(new ANTLRStringStream(expression)); var parser = new NCalcParser(new CommonTokenStream(lexer)); logicalExpression = parser.ncalcExpression().value; if (parser.Errors != null && parser.Errors.Count > 0) { throw new EvaluationException(String.Join(Environment.NewLine, parser.Errors.ToArray())); } if (_cacheEnabled && !nocache) { try { Rwl.AcquireWriterLock(Timeout.Infinite); _compiledExpressions[expression] = new WeakReference(logicalExpression); } finally { Rwl.ReleaseWriterLock(); } CleanCache(); Trace.TraceInformation("Expression added to cache: " + expression); } } return(logicalExpression); }
public static LogicalExpression Compile(string expression, bool nocache) { LogicalExpression logicalExpression = null; if (_cacheEnabled && !nocache) { if (_compiledExpressions.ContainsKey(expression)) { //Debug.WriteLine("Expression retrieved from cache: " + expression); if (_compiledExpressions.TryGetValue(expression, out var wr)) { logicalExpression = wr.Target as LogicalExpression; if (wr.IsAlive && logicalExpression != null) { return(logicalExpression); } } } } if (logicalExpression == null) { var lexer = new NCalcLexer(new ANTLRStringStream(expression)); var parser = new NCalcParser(new CommonTokenStream(lexer)); logicalExpression = parser.ncalcExpression().value; if (parser.Errors != null && parser.Errors.Count > 0) { throw new EvaluationException(String.Join(Environment.NewLine, parser.Errors.ToArray())); } if (_cacheEnabled && !nocache) { try { if (_compiledExpressions.TryGetValue(expression, out var wr)) { _compiledExpressions.TryUpdate(expression, new WeakReference(logicalExpression), wr); } else { _compiledExpressions.TryAdd(expression, new WeakReference(logicalExpression)); } } finally { CleanCache(); } //Debug.WriteLine("Expression added to cache: " + expression); } } return(logicalExpression); }
public static LogicalExpression Compile(string expression, bool nocache) { LogicalExpression logicalExpression = null; if (_cacheEnabled && !nocache) { try { Rwl.AcquireReaderLock(Timeout.Infinite); if (_compiledExpressions.ContainsKey(expression)) { Trace.TraceInformation("Expression retrieved from cache: " + expression); var wr = _compiledExpressions[expression]; logicalExpression = wr.Target as LogicalExpression; if (wr.IsAlive && logicalExpression != null) { return logicalExpression; } } } finally { Rwl.ReleaseReaderLock(); } } if (logicalExpression == null) { var lexer = new NCalcLexer(new ANTLRStringStream(expression)); var parser = new NCalcParser(new CommonTokenStream(lexer)); logicalExpression = parser.ncalcExpression().value; if (parser.Errors != null && parser.Errors.Count > 0) { throw new EvaluationException(String.Join(Environment.NewLine, parser.Errors.ToArray())); } if (_cacheEnabled && !nocache) { try { Rwl.AcquireWriterLock(Timeout.Infinite); _compiledExpressions[expression] = new WeakReference(logicalExpression); } finally { Rwl.ReleaseWriterLock(); } CleanCache(); Trace.TraceInformation("Expression added to cache: " + expression); } } return logicalExpression; }