Skip to content

VerifyErrors when using SpEL compilation with Thymeleaf [SPR-12271] #16876

Closed
@spring-projects-issues

Description

@spring-projects-issues

Joris Kuipers opened SPR-12271 and commented

I tried to enable SpEL compilation support in my project using -Dspring.expression.compiler.mode=immediate. This project uses Thymeleaf for views, and thus relies rather heavily on SpEL expressions.
When running the application I can see that the compiler kicks in, but I'm seeing VerifyErrors on the generated SpEL classes:

Caused by: java.lang.VerifyError: (class: spel/Ex7, method: getValue signature: (Ljava/lang/Object;Lorg/springframework/expression/EvaluationContext;)Ljava/lang/Object;) Expecting to find integer on stack
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2532)
	at java.lang.Class.getConstructor0(Class.java:2842)
	at java.lang.Class.newInstance(Class.java:345)
	at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:106)
	at org.springframework.expression.spel.standard.SpelExpression.compileExpression(SpelExpression.java:464)
	at org.springframework.expression.spel.standard.SpelExpression.checkCompile(SpelExpression.java:434)
	at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:266)
	at org.thymeleaf.spring4.expression.SpelVariableExpressionEvaluator.evaluate(SpelVariableExpressionEvaluator.java:139)
	at org.thymeleaf.standard.expression.VariableExpression.executeVariable(VariableExpression.java:149)
	at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:59)
	at org.thymeleaf.standard.expression.Expression.execute(Expression.java:103)
	at org.thymeleaf.standard.expression.Expression.execute(Expression.java:133)
	at org.thymeleaf.standard.expression.Expression.execute(Expression.java:120)
	at org.thymeleaf.standard.processor.attr.AbstractStandardSingleAttributeModifierAttrProcessor.getTargetAttributeValue(AbstractStandardSingleAttributeModifierAttrProcessor.java:67)
	at org.thymeleaf.processor.attr.AbstractSingleAttributeModifierAttrProcessor.getModifiedAttributeValues(AbstractSingleAttributeModifierAttrProcessor.java:59)
	at org.thymeleaf.processor.attr.AbstractAttributeModifierAttrProcessor.processAttribute(AbstractAttributeModifierAttrProcessor.java:61)
	at org.thymeleaf.processor.attr.AbstractAttrProcessor.doProcess(AbstractAttrProcessor.java:87)
	at org.thymeleaf.processor.AbstractProcessor.process(AbstractProcessor.java:212)
	at org.thymeleaf.dom.Node.applyNextProcessor(Node.java:1016)
	at org.thymeleaf.dom.Node.processNode(Node.java:971)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:672)
	at org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:655)
	at org.thymeleaf.dom.Node.processNode(Node.java:990)
	at org.thymeleaf.dom.Document.process(Document.java:93)
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1155)
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
	at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
	at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:190)
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
	... 68 more

I haven't tried to dig any deeper into the root cause, as byte code generation isn't really my cup of tea.

Thymeleaf has a lot of runtime overhead compared to JPSs or FreeMarker: if Spring could support compiled SpEL expressions in Thymeleaf views I think it could have a very positive impact on performance, so I'm eager to get this to work.


Affects: 4.1 GA

Attachments:

Issue Links:

Referenced from: commits bd7d56a

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)type: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions