@@ -0,0 +1,6 @@ | |||
aspect A { | |||
Object around(): call(* clone(..)) { | |||
return proceed(); | |||
} | |||
} | |||
@@ -0,0 +1,41 @@ | |||
import java.lang.reflect.*; | |||
class C { | |||
public static B.D[] arr = new B.D[5]; | |||
public static void main(String[]argv) { | |||
arr[0] = new B.D(42); | |||
arr[1] = new B.D(22); | |||
arr[2] = new B.D(46); | |||
arr[3] = new B.D(50); | |||
arr[4] = new B.D(54); | |||
B.D[] arr2 = arr.clone(); | |||
// Check the clone is OK | |||
if (arr2[0].i!=42) throw new RuntimeException("Call that a clone 0"); | |||
if (arr2[1].i!=22) throw new RuntimeException("Call that a clone 1"); | |||
if (arr2[2].i!=46) throw new RuntimeException("Call that a clone 2"); | |||
if (arr2[3].i!=50) throw new RuntimeException("Call that a clone 3"); | |||
if (arr2[4].i!=54) throw new RuntimeException("Call that a clone 4"); | |||
System.err.println("Clone OK - attempting value manipulation"); | |||
// Change the clone, check the original is OK | |||
arr2[2] = new B.D(1); | |||
if (arr[2].i == 1) throw new RuntimeException("Shouldnt have affected original"); | |||
if (arr2[2].i != 1) throw new RuntimeException("Should have affected clone"); | |||
System.err.println("Clone OK - finished"); | |||
} | |||
} | |||
class B { | |||
public static class D { | |||
public int i; | |||
D(int x) { i=x;} | |||
} | |||
} |
@@ -0,0 +1,2 @@ | |||
Under Java 1.4 the target of a clone() method called on an array type was 'Object.clone' in the byte code. | |||
Under Java 1.5 this has been changed to be (correctly) a call to the clone() method on the array type. |
@@ -0,0 +1,4 @@ | |||
erase *.class | |||
javac C.java | |||
jar -cvMf OneFiveCode.jar *.class | |||
erase *.class |
@@ -267,5 +267,9 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase { | |||
public void test050_typePatternMatchingWithArrays() { | |||
runTest("declare warning warns at wrong points"); | |||
} | |||
public void test051_arrayCloningInJava5() { | |||
runTest("AJC possible bug with static nested classes"); | |||
} | |||
} | |||
@@ -412,4 +412,10 @@ | |||
<message kind="warning" line="22" text="*[] returning method called"/> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs/java5/arrayCloning" pr="72150" | |||
title="AJC possible bug with static nested classes"> | |||
<compile files="A.java" inpath="OneFiveCode.jar"/> | |||
<!--run class="C"/--> | |||
</ajc-test> | |||
@@ -583,8 +583,13 @@ public class TypeX { | |||
if (name.equals("void")) return "V"; | |||
if (name.endsWith("[]")) | |||
return "[" + nameToSignature(name.substring(0, name.length() - 2)); | |||
if (name.length() != 0) // lots more tests could be made here... | |||
return "L" + name.replace('.', '/') + ";"; | |||
if (name.length() != 0) { | |||
// lots more tests could be made here... | |||
// 1) If it is already an array type, do not mess with it. | |||
if (name.charAt(0)=='[' && name.charAt(name.length()-1)==';') return name; | |||
else return "L" + name.replace('.', '/') + ";"; | |||
} | |||
else | |||
throw new BCException("Bad type name: " + name); | |||
} |