--- /dev/null
+aspect A {
+ Object around(): call(* clone(..)) {
+ return proceed();
+ }
+}
+
--- /dev/null
+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;}
+ }
+}
--- /dev/null
+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.
\ No newline at end of file
--- /dev/null
+erase *.class\r
+javac C.java\r
+jar -cvMf OneFiveCode.jar *.class\r
+erase *.class\r
public void test050_typePatternMatchingWithArrays() {
runTest("declare warning warns at wrong points");
}
+
+ public void test051_arrayCloningInJava5() {
+ runTest("AJC possible bug with static nested classes");
+ }
}
<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>
\ No newline at end of file
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);
}