internal BoundExpression(CachedDynamicExpression dynamicExpression, Type ownerType, Import[] imports, Type[] identifierTypes, BoundExpressionOptions options) { Require.NotNull(dynamicExpression, "dynamicExpression"); Require.NotNull(imports, "imports"); Require.NotNull(identifierTypes, "identifierTypes"); _dynamicExpression = dynamicExpression; _parameterMap = BuildParameterMap(ownerType, identifierTypes); var resolver = new Resolver(_dynamicExpression, ownerType, imports, identifierTypes, _parameterMap, options); var resolvedTree = resolver.Resolve(_dynamicExpression.ParseResult.RootNode); #if DEBUG ResolvedExpression = resolvedTree; #endif _compiledMethod = CompileExpression(resolvedTree, ownerType, imports, identifierTypes, options, resolver); }
public static CachedDynamicExpression GetOrCreateCachedDynamicExpression(string expression, ExpressionLanguage language) { var key = new CacheKey(expression, language); lock (_syncRoot) { CachedDynamicExpression cached; if (!_cache.TryGetValue(key, out cached)) { var parseResult = ParseExpression(expression, language); cached = new CachedDynamicExpression(parseResult, language); _cache.Add(key, cached); } return(cached); } }
public static CachedDynamicExpression GetOrCreateCachedDynamicExpression(string expression, ExpressionLanguage language) { var key = new CacheKey(expression, language); lock (_syncRoot) { CachedDynamicExpression cached; if (!_cache.TryGetValue(key, out cached)) { var parseResult = ParseExpression(expression, language); cached = new CachedDynamicExpression(parseResult, language); _cache.Add(key, cached); } return cached; } }
public Resolver(CachedDynamicExpression dynamicExpression, Type ownerType, Import[] imports, Type[] identifierTypes, int[] parameterMap, BoundExpressionOptions options) { Require.NotNull(dynamicExpression, "dynamicExpression"); Require.NotNull(imports, "imports"); Require.NotNull(identifierTypes, "identifierTypes"); Require.NotNull(parameterMap, "parameterMap"); DynamicExpression = dynamicExpression; OwnerType = ownerType; Imports = imports; IdentifierTypes = identifierTypes; Options = options; // Inverse the parameter map. IdentifierIndexes = new int[IdentifierTypes.Length]; for (int i = 0; i < IdentifierTypes.Length; i++) { IdentifierIndexes[i] = -1; if (IdentifierTypes[i] != null) { for (int j = 0; j < parameterMap.Length; j++) { if (parameterMap[j] == i) { IdentifierIndexes[i] = j; break; } } Debug.Assert(IdentifierIndexes[i] != -1); } } IgnoreCase = !global::Expressions.DynamicExpression.IsLanguageCaseSensitive(DynamicExpression.Language); }
public BoundExpressionCache(CachedDynamicExpression dynamicExpression) { Require.NotNull(dynamicExpression, "dynamicExpression"); _dynamicExpression = dynamicExpression; }