Groovy 4.0.2 MarkupTemplateEngine Internal Compiler Error

"[email protected]" <[email protected]>
Newsgroups gmane.comp.lang.groovy.user
Message-ID <CAKdsXoHTKBdZCpb5tuAbXD0+grYrXVph4hrCYTYCMwSSRiaHHQ@mail.gmail.com>
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
markup-template-test.groovy (text/x-groovy, 748 B)
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()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.