You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sj...@apache.org on 2008/03/31 12:54:05 UTC

svn commit: r642960 - in /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200: ClassBands.java Segment.java bytecode/CPMethod.java

Author: sjanuary
Date: Mon Mar 31 03:53:52 2008
New Revision: 642960

URL: http://svn.apache.org/viewvc?rev=642960&view=rev
Log:
Fix for HARMONY-5654 ([classlib][pack200] Init methods cannot be synchronized)

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethod.java

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java?rev=642960&r1=642959&r2=642960&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java Mon Mar 31 03:53:52 2008
@@ -47,6 +47,8 @@
 
     private long[] classFlags;
 
+    private long[] classAccessFlags; // Access flags for writing to the class file
+
     private String[][] classInterfaces;
 
     private int[] classMethodCount;
@@ -77,11 +79,15 @@
 
     private long[][] fieldFlags;
 
+    private long[][] fieldAccessFlags;
+
     private ArrayList[][] methodAttributes;
 
     private String[][] methodDescr;
 
     private long[][] methodFlags;
+    
+    private long[][] methodAccessFlags;
 
     private final AttributeLayoutMap attrMap;
 
@@ -1203,10 +1209,27 @@
         return classFieldCount;
     }
 
-    public long[] getClassFlags() {
+    public long[] getRawClassFlags() {
         return classFlags;
     }
 
+    public long[] getClassFlags() throws Pack200Exception {
+    	if(classAccessFlags == null) {
+    		long mask = 0x7FFF;
+    		for (int i = 0; i < 16; i++) {
+				AttributeLayout layout = attrMap.getAttributeLayout(i, AttributeLayout.CONTEXT_CLASS);
+				if(layout != null && !layout.isDefaultLayout()) {
+					mask &= ~(1 << i);
+				}
+			}
+    		classAccessFlags = new long[classFlags.length];
+    		for (int i = 0; i < classFlags.length; i++) {
+    				classAccessFlags[i] = classFlags[i] & mask;
+    		}
+    	}
+        return classAccessFlags;
+    }
+
     public String[][] getClassInterfaces() {
         return classInterfaces;
     }
@@ -1239,8 +1262,24 @@
         return fieldDescr;
     }
 
-    public long[][] getFieldFlags() {
-        return fieldFlags;
+    public long[][] getFieldFlags() throws Pack200Exception {
+    	if(fieldAccessFlags == null) {
+    		long mask = 0x7FFF;
+    		for (int i = 0; i < 16; i++) {
+				AttributeLayout layout = attrMap.getAttributeLayout(i, AttributeLayout.CONTEXT_FIELD);
+				if(layout != null && !layout.isDefaultLayout()) {
+					mask &= ~(1 << i);
+				}
+			}
+    		fieldAccessFlags = new long[fieldFlags.length][];
+    		for (int i = 0; i < fieldFlags.length; i++) {
+    			fieldAccessFlags[i] = new long[fieldFlags[i].length];
+				for (int j = 0; j < fieldFlags[i].length; j++) {
+					fieldAccessFlags[i][j] = fieldFlags[i][j] & mask;
+				}
+    		}
+    	}
+        return fieldAccessFlags;
     }
 
     /**
@@ -1272,8 +1311,24 @@
         return methodDescr;
     }
 
-    public long[][] getMethodFlags() {
-        return methodFlags;
+    public long[][] getMethodFlags() throws Pack200Exception {
+    	if(methodAccessFlags == null) {
+    		long mask = 0x7FFF;
+    		for (int i = 0; i < 16; i++) {
+				AttributeLayout layout = attrMap.getAttributeLayout(i, AttributeLayout.CONTEXT_METHOD);
+				if(layout != null && !layout.isDefaultLayout()) {
+					mask &= ~(1 << i);
+				}
+			}
+    		methodAccessFlags = new long[methodFlags.length][];
+    		for (int i = 0; i < methodFlags.length; i++) {
+    			methodAccessFlags[i] = new long[methodFlags[i].length];
+				for (int j = 0; j < methodFlags[i].length; j++) {
+					methodAccessFlags[i][j] = methodFlags[i][j] & mask;
+				}
+    		}
+    	}
+        return methodAccessFlags;
     }
 
     /**

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java?rev=642960&r1=642959&r2=642960&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java Mon Mar 31 03:53:52 2008
@@ -143,7 +143,7 @@
             AttributeLayout SOURCE_FILE = attrDefinitionBands.getAttributeDefinitionMap()
     				.getAttributeLayout(AttributeLayout.ATTRIBUTE_SOURCE_FILE,
     						AttributeLayout.CONTEXT_CLASS);
-    		if (SOURCE_FILE.matches(classBands.getClassFlags()[classNum])) {
+    		if (SOURCE_FILE.matches(classBands.getRawClassFlags()[classNum])) {
     		    int firstDollar = SegmentUtils.indexOfFirstDollar(fullName);
     		    String fileName = null;
 
@@ -202,13 +202,13 @@
 		}
 		// add methods
 		ClassFileEntry cfMethods[] = new ClassFileEntry[classBands.getClassMethodCount()[classNum]];
-		// fieldDescr and fieldFlags used to create this
+		// methodDescr and methodFlags used to create this
 		for (i = 0; i < cfMethods.length; i++) {
             String descriptorStr = classBands.getMethodDescr()[classNum][i];
             int colon = descriptorStr.indexOf(':');
             CPUTF8 name = cpBands.cpUTF8Value(descriptorStr.substring(0,colon), ClassConstantPool.DOMAIN_NORMALASCIIZ);
             CPUTF8 descriptor = cpBands.cpUTF8Value(descriptorStr.substring(colon+1), ClassConstantPool.DOMAIN_SIGNATUREASCIIZ);
-			cfMethods[i] = cp.add(new CPMethod(name, descriptor, classBands
+            cfMethods[i] = cp.add(new CPMethod(name, descriptor, classBands
                     .getMethodFlags()[classNum][i], classBands
                     .getMethodAttributes()[classNum][i]));
 		}

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethod.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethod.java?rev=642960&r1=642959&r2=642960&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethod.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethod.java Mon Mar 31 03:53:52 2008
@@ -21,8 +21,7 @@
 public class CPMethod extends CPMember {
 
 	public CPMethod(CPUTF8 name, CPUTF8 descriptor, long flags, List attributes) {
-		// TODO Check that we only pass these on, or remap
-		super(name, descriptor, 0x7FFF & flags, attributes);
+		super(name, descriptor, flags, attributes);
 	}
 
 }