jdaugherty commented on code in PR #16385:
URL: https://github.com/apache/grails-core/pull/16385#discussion_r4088119275


##########
grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.groovy:
##########
@@ -237,6 +284,33 @@ abstract class GenerateScaffoldedViewsTask extends 
DefaultTask {
         found
     }
 
+    /** Read declarations, including inherited ones, without evaluating 
application code. */
+    private boolean hasNamespace(ClassReader reader, ClassLoader resources) {
+        boolean declared = false
+        reader.accept(new ClassVisitor(Opcodes.ASM9) {
+            @Override
+            FieldVisitor visitField(int access, String name, String 
descriptor, String signature, Object value) {
+                if (name == 'namespace' && (access & Opcodes.ACC_STATIC) != 0) 
{
+                    declared = true
+                }
+                null
+            }
+
+            @Override
+            MethodVisitor visitMethod(int access, String name, String 
descriptor, String signature, String[] exceptions) {
+                if (name == 'getNamespace' && descriptor.startsWith('()') && 
(access & Opcodes.ACC_STATIC) != 0) {
+                    declared = true
+                }
+                null
+            }
+        }, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | 
ClassReader.SKIP_FRAMES)
+        if (declared || reader.superName == null || reader.superName == 
'java/lang/Object') {
+            return declared
+        }
+        InputStream parent = 
resources.getResourceAsStream("${reader.superName}.class")
+        parent == null ? false : parent.withCloseable { InputStream input -> 
hasNamespace(new ClassReader(input), resources) }

Review Comment:
   Memoization confirmed — a base class shared by several controllers is read 
once now, and a spec pins it.
   
   The graceful-degradation half only partly landed: `IllegalArgumentException` 
is what ASM raises for an unsupported major version, but a truncated or empty 
class file comes out as `ArrayIndexOutOfBoundsException`, and 
`ClassReader(InputStream)` also declares `IOException`. I have carried that 
into a thread of its own on the catch, so this one can close.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to