This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch GROOVY_2_5_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 1af7790d8eb5c8d5576d9afc993b5dee1493228a Author: Eric Milles <[email protected]> AuthorDate: Fri Oct 23 20:47:55 2020 -0500 extract method for property access error and remove duplicate test cases (port to 2_5_X) --- .../classgen/asm/sc/StaticTypesCallSiteWriter.java | 43 ++++++++---------- .../asm/sc/StaticCompileFieldAccessTest.groovy | 51 +--------------------- 2 files changed, 20 insertions(+), 74 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java index ac6862c..82b8316 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java @@ -126,10 +126,10 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes } @Override - public void makeGetPropertySite(Expression receiver, final String methodName, final boolean safe, final boolean implicitThis) { + public void makeGetPropertySite(Expression receiver, final String propertyName, final boolean safe, final boolean implicitThis) { Object dynamic = receiver.getNodeMetaData(StaticCompilationMetadataKeys.RECEIVER_OF_DYNAMIC_PROPERTY); if (dynamic !=null) { - makeDynamicGetProperty(receiver, methodName, safe); + makeDynamicGetProperty(receiver, propertyName, safe); return; } TypeChooser typeChooser = controller.getTypeChooser(); @@ -163,7 +163,7 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes MethodVisitor mv = controller.getMethodVisitor(); - if (receiverType.isArray() && methodName.equals("length")) { + if (receiverType.isArray() && propertyName.equals("length")) { receiver.visit(controller.getAcg()); ClassNode arrayGetReturnType = typeChooser.resolveType(receiver, classNode); controller.getOperandStack().doGroovyCast(arrayGetReturnType); @@ -172,7 +172,7 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes return; } else if ( (receiverType.implementsInterface(COLLECTION_TYPE) - || COLLECTION_TYPE.equals(receiverType)) && ("size".equals(methodName) || "length".equals(methodName))) { + || COLLECTION_TYPE.equals(receiverType)) && ("size".equals(propertyName) || "length".equals(propertyName))) { MethodCallExpression expr = new MethodCallExpression( receiver, "size", @@ -190,26 +190,26 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes if (!isStaticProperty && (receiverType.implementsInterface(MAP_TYPE) || MAP_TYPE.equals(receiverType))) { // for maps, replace map.foo with map.get('foo') - writeMapDotProperty(receiver, methodName, mv, safe); + writeMapDotProperty(receiver, propertyName, mv, safe); return; } - if (makeGetPropertyWithGetter(receiver, receiverType, methodName, safe, implicitThis)) return; - if (makeGetField(receiver, receiverType, methodName, safe, implicitThis)) return; + if (makeGetPropertyWithGetter(receiver, receiverType, propertyName, safe, implicitThis)) return; + if (makeGetField(receiver, receiverType, propertyName, safe, implicitThis)) return; if (receiver instanceof ClassExpression) { - if (makeGetField(receiver, receiver.getType(), methodName, safe, implicitThis)) return; - if (makeGetPropertyWithGetter(receiver, receiver.getType(), methodName, safe, implicitThis)) return; - if (makeGetPrivateFieldWithBridgeMethod(receiver, receiver.getType(), methodName, safe, implicitThis)) return; + if (makeGetField(receiver, receiver.getType(), propertyName, safe, implicitThis)) return; + if (makeGetPropertyWithGetter(receiver, receiver.getType(), propertyName, safe, implicitThis)) return; + if (makeGetPrivateFieldWithBridgeMethod(receiver, receiver.getType(), propertyName, safe, implicitThis)) return; } if (isClassReceiver) { // we are probably looking for a property of the class - if (makeGetPropertyWithGetter(receiver, CLASS_Type, methodName, safe, implicitThis)) return; - if (makeGetField(receiver, CLASS_Type, methodName, safe, false)) return; + if (makeGetPropertyWithGetter(receiver, CLASS_Type, propertyName, safe, implicitThis)) return; + if (makeGetField(receiver, CLASS_Type, propertyName, safe, false)) return; } - if (makeGetPrivateFieldWithBridgeMethod(receiver, receiverType, methodName, safe, implicitThis)) return; + if (makeGetPrivateFieldWithBridgeMethod(receiver, receiverType, propertyName, safe, implicitThis)) return; // GROOVY-5580, it is still possible that we're calling a superinterface property - String getterName = "get" + MetaClassHelper.capitalize(methodName); - String altGetterName = "is" + MetaClassHelper.capitalize(methodName); + String getterName = "get" + MetaClassHelper.capitalize(propertyName); + String altGetterName = "is" + MetaClassHelper.capitalize(propertyName); if (receiverType.isInterface()) { Set<ClassNode> allInterfaces = receiverType.getAllInterfaces(); MethodNode getterMethod = null; @@ -263,15 +263,11 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes } if (!isStaticProperty && (receiverType.implementsInterface(LIST_TYPE) || LIST_TYPE.equals(receiverType))) { - writeListDotProperty(receiver, methodName, mv, safe); + writeListDotProperty(receiver, propertyName, mv, safe); return; } - controller.getSourceUnit().addError( - new SyntaxException("Access to "+ - (receiver instanceof ClassExpression ?receiver.getType():receiverType).toString(false) - +"#"+methodName+" is forbidden", receiver.getLineNumber(), receiver.getColumnNumber(), receiver.getLastLineNumber(), receiver.getLastColumnNumber()) - ); + addPropertyAccessError(receiver, propertyName, receiverType); controller.getMethodVisitor().visitInsn(ACONST_NULL); controller.getOperandStack().push(OBJECT_TYPE); } @@ -943,14 +939,11 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes return true; } return false; -<<<<<<< HEAD -======= - }*/ + } private void addPropertyAccessError(final Expression receiver, final String propertyName, final ClassNode receiverType) { String receiverName = (receiver instanceof ClassExpression ? receiver.getType() : receiverType).toString(false); String message = "Access to " + receiverName + "#" + propertyName + " is forbidden"; controller.getSourceUnit().addError(new SyntaxException(message, receiver)); ->>>>>>> c27b2c3e51... GROOVY-9093: SC: add compile-time error for inaccessible field or getter (port to 3_0_X) } } diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileFieldAccessTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileFieldAccessTest.groovy index 15feadd..d18d9d3 100644 --- a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileFieldAccessTest.groovy +++ b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileFieldAccessTest.groovy @@ -23,7 +23,8 @@ import org.codehaus.groovy.classgen.asm.AbstractBytecodeTestCase /** * Unit tests for static compilation: access field nodes. */ -class StaticCompileFieldAccessTest extends AbstractBytecodeTestCase { +final class StaticCompileFieldAccessTest extends AbstractBytecodeTestCase { + void testAccessProperty() { compile(method:'m', ''' class A { @@ -126,26 +127,6 @@ class StaticCompileFieldAccessTest extends AbstractBytecodeTestCase { clazz.newInstance().run() } - void testReturnProtectedFieldInDifferentPackage() { - compile(method:'m', ''' - import org.codehaus.groovy.classgen.asm.sc.StaticCompileFieldAccessTest.StaticCompileFieldAccessSupport1 as A - - A a = new A() - @groovy.transform.CompileStatic - int m(A a) { - return a.x - } - assert m(a) == 10 - ''') - assert sequence.hasStrictSequence([ - 'ALOAD', - 'LDC "x"', - 'INVOKEINTERFACE groovy/lang/GroovyObject.getProperty (Ljava/lang/String;)Ljava/lang/Object;' - ]) - - clazz.newInstance().run() - } - void testReturnPublicFieldFromNonGroovyObject() { compile(method:'m', ''' java.awt.Point a = [100,200] @@ -215,32 +196,4 @@ class StaticCompileFieldAccessTest extends AbstractBytecodeTestCase { ''') } } - - /* - * this test should fail, but passes because it generates ScriptBytecodeAdapter.getGroovyObjectField - * instead of direct field access - void testShouldFailToReturnPrivateField() { - shouldFail { - compile(method: 'm', ''' - package test - - class A { - int x = 10 - } - - A a = new A() - @groovy.transform.CompileStatic - int m(A a) { - return a.@x // x is a private member, direct access should not be allowed - } - assert m(a) == 10 - ''') - println sequence - } - }*/ - - public static class StaticCompileFieldAccessSupport1 { - protected int x = 10 - } - }
