Browse Source

fix for Bugzilla Bug 72150

	  	AJC possible bug with static nested classes
tags/V1_2_1
aclement 20 years ago
parent
commit
b5e6307a63

+ 6
- 0
tests/bugs/java5/arrayCloning/A.java View File

@@ -0,0 +1,6 @@
aspect A {
Object around(): call(* clone(..)) {
return proceed();
}
}


+ 41
- 0
tests/bugs/java5/arrayCloning/C.java View File

@@ -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;}
}
}

BIN
tests/bugs/java5/arrayCloning/OneFiveCode.jar View File


+ 2
- 0
tests/bugs/java5/arrayCloning/explanation.txt View File

@@ -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.

+ 4
- 0
tests/bugs/java5/arrayCloning/rebuild.bat View File

@@ -0,0 +1,4 @@
erase *.class
javac C.java
jar -cvMf OneFiveCode.jar *.class
erase *.class

+ 4
- 0
tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java View File

@@ -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");
}
}


+ 6
- 0
tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml View File

@@ -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>

+ 7
- 2
weaver/src/org/aspectj/weaver/TypeX.java View File

@@ -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);
}

Loading…
Cancel
Save