private CompiledExpression CreateExpressionClass(ISpelNode expressionToCompile) { var compiledExpression = new SpelCompiledExpression(_loggerFactory); var methodName = "SpelExpression" + _suffixId.GetAndIncrement(); var method = new DynamicMethod(methodName, typeof(object), new Type[] { typeof(SpelCompiledExpression), typeof(object), typeof(IEvaluationContext) }, typeof(SpelCompiledExpression)); var ilGenerator = method.GetILGenerator(4096); var cf = new CodeFlow(compiledExpression); try { expressionToCompile.GenerateCode(ilGenerator, cf); var lastDescriptor = cf.LastDescriptor(); CodeFlow.InsertBoxIfNecessary(ilGenerator, lastDescriptor); if (lastDescriptor == TypeDescriptor.V) { ilGenerator.Emit(OpCodes.Ldnull); } ilGenerator.Emit(OpCodes.Ret); compiledExpression.MethodDelegate = method.CreateDelegate(typeof(SpelExpressionDelegate)); var initMethod = cf.Finish(_suffixId.Value); if (initMethod != null) { compiledExpression.InitDelegate = initMethod.CreateDelegate(typeof(SpelExpressionInitDelegate)); } return(compiledExpression); } catch (Exception ex) { _logger?.LogDebug(expressionToCompile.GetType().Name + ".GenerateCode opted out of compilation: " + ex.Message); return(null); } }