Hello,

not everything works smoothly in Groovy 4 MarkupTemplateEngine.

A "minus null" operation on list concatenation gives an internal compiler
error in the MarkupTemplateEngine but works outside of it. Groovy 3.0.10
does not have this problem.

Consider the example in the attachment.

$ groovy markup-template-test.groovy
Groovy: 3.0.10 JDK: 17.0.2
a
<div>a</div>

$ groovy markup-template-test.groovy
Groovy: 4.0.2 JDK: 17.0.2
a
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup
failed:
General error during instruction selection: Internal compiler error while
compiling GeneratedMarkupTemplate0
Method: org.codehaus.groovy.ast.MethodNode@5f13be1[java.lang.Object run()
from GeneratedMarkupTemplate0]
Line 4, expecting casting to java.util.List<?> but operand stack is empty

java.lang.ArrayIndexOutOfBoundsException: Internal compiler error while
compiling GeneratedMarkupTemplate0
Method: org.codehaus.groovy.ast.MethodNode@5f13be1[java.lang.Object run()
from GeneratedMarkupTemplate0]
Line 4, expecting casting to java.util.List<?> but operand stack is empty
at
org.codehaus.groovy.classgen.asm.OperandStack.throwExceptionForNoStackElement(OperandStack.java:335)
at
org.codehaus.groovy.classgen.asm.OperandStack.doConvertAndCast(OperandStack.java:340)
at
org.codehaus.groovy.classgen.asm.OperandStack.doGroovyCast(OperandStack.java:305)
at
org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.visitArgument(StaticInvocationWriter.java:509)
at
org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.loadArguments(StaticInvocationWriter.java:454)
at
org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.writeDirectMethodCall(StaticInvocationWriter.java:298)
at
org.codehaus.groovy.classgen.asm.InvocationWriter.makeDirectCall(InvocationWriter.java:309)
at
org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:127)
at
org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:121)
at
org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.makeCall(StaticInvocationWriter.java:642)
at
org.codehaus.groovy.classgen.asm.InvocationWriter.writeInvokeMethod(InvocationWriter.java:452)
at
org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.writeInvokeMethod(StaticInvocationWriter.java:131)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitMethodCallExpression(AsmClassGenerator.java:974)
at
org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:77)
at
org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:397)
at
org.codehaus.groovy.classgen.asm.sc.StaticTypesBinaryExpressionMultiTypeDispatcher.evaluateEqual(StaticTypesBinaryExpressionMultiTypeDispatcher.java:217)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitDeclarationExpression(AsmClassGenerator.java:832)
at
org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89)
at
org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:611)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:816)
at
org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:41)
at
org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:94)
at
org.codehaus.groovy.classgen.asm.sc.StaticTypesStatementWriter.writeBlockStatement(StaticTypesStatementWriter.java:77)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:747)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:70)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:601)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:546)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:110)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:685)
at org.codehaus.groovy.ast.ClassNode.visitMethods(ClassNode.java:1131)
at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1124)
at
org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52)
at
org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:364)
at
org.codehaus.groovy.control.CompilationUnit$3.call(CompilationUnit.java:797)
at
org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:937)
at
org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:692)
at
org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:666)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:373)
at
groovy.lang.GroovyClassLoader.lambda$parseClass$2(GroovyClassLoader.java:316)
at
org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
at
org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:298)
at
groovy.text.markup.MarkupTemplateEngine$TemplateGroovyClassLoader.parseClass(MarkupTemplateEngine.java:261)
at
groovy.text.markup.MarkupTemplateEngine$MarkupTemplateMaker.<init>(MarkupTemplateEngine.java:211)
at
groovy.text.markup.MarkupTemplateEngine.createTemplate(MarkupTemplateEngine.java:144)
at groovy.text.TemplateEngine.createTemplate(TemplateEngine.java:47)
at
org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
at markup-template-test.run(markup-template-test.groovy:14)
at
groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:268)
at groovy.lang.GroovyShell.run(GroovyShell.java:374)
at groovy.lang.GroovyShell.run(GroovyShell.java:363)
at groovy.ui.GroovyMain.processOnce(GroovyMain.java:649)
at groovy.ui.GroovyMain.run(GroovyMain.java:389)
at groovy.ui.GroovyMain.access$1400(GroovyMain.java:67)
at groovy.ui.GroovyMain$GroovyCommand.process(GroovyMain.java:313)
at groovy.ui.GroovyMain.processArgs(GroovyMain.java:141)
at groovy.ui.GroovyMain.main(GroovyMain.java:114)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109)
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:132)

1 error

A workaround is

def l = (a + b).findAll{it}.flatten()

Should I open an issue?

Best regards, Jörg
import groovy.text.Template
import groovy.text.markup.MarkupTemplateEngine
import groovy.text.markup.TemplateConfiguration

println "Groovy: " + GroovySystem.version + " JDK: " + System.getProperty("java.version")

def a = [ 'a' ]
def b = null
def l = (a + b - null).flatten()
println l.join(',')

TemplateConfiguration config = new TemplateConfiguration()      
MarkupTemplateEngine engine = new MarkupTemplateEngine(config)
Template template = engine.createTemplate("""
   def a = [ 'a' ]
   def b = null
   def l = (a + b - null).flatten()
   div {
      yield l.join(',')
   }
""")
Map<String, Object> model = [:]
StringWriter writer = new StringWriter()
Writable output = template.make(model)
output.writeTo(writer)
println writer.toString()

Reply via email to