You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bcel-dev@jakarta.apache.org by en...@apache.org on 2003/07/24 16:14:47 UTC
cvs commit: jakarta-bcel/src/java/org/apache/bcel/generic Type.java
enver 2003/07/24 07:14:47
Modified: src/java/org/apache/bcel/classfile Utility.java
src/java/org/apache/bcel/generic Type.java
Log:
PR: This patch was submitted via the BCEL mailing list; it makes certain
static variables thread safe (although BCEL was never designed with
thread safety in mind, maybe one should check all the framework for
thread safety).
Submitted by: [forgot the name, I'm sorry]
Reviewed by: Enver
Revision Changes Path
1.7 +31 -9 jakarta-bcel/src/java/org/apache/bcel/classfile/Utility.java
Index: Utility.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/classfile/Utility.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Utility.java 23 May 2003 07:55:12 -0000 1.6
+++ Utility.java 24 Jul 2003 14:14:46 -0000 1.7
@@ -67,11 +67,25 @@
* @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
*/
public abstract class Utility {
- private static int consumed_chars; /* How many chars have been consumed
+
+ private static int unwrap(ThreadLocal tl) {
+ return ((Integer)tl.get()).intValue();
+ }
+
+ private static void wrap(ThreadLocal tl, int value) {
+ tl.set(new Integer(value));
+ }
+
+ private static ThreadLocal consumed_chars = new ThreadLocal() {
+ protected Object initialValue() {
+ return new Integer(0);
+ }
+ };/* How many chars have been consumed
* during parsing in signatureToString().
* Read by methodSignatureToString().
* Set by side effect,but only internally.
*/
+
private static boolean wide=false; /* The `WIDE' instruction is used in the
* byte code to allow 16-bit wide indices
* for local variables. This opcode
@@ -591,7 +605,8 @@
while(signature.charAt(index) != ')') {
vec.add(signatureToString(signature.substring(index), chopit));
- index += consumed_chars; // update position
+ //corrected concurrent private static field acess
+ index += unwrap(consumed_chars); // update position
}
} catch(StringIndexOutOfBoundsException e) { // Should never occur
throw new ClassFormatException("Invalid method signature: " + signature);
@@ -719,7 +734,8 @@
var_index++;
buf.append(", ");
- index += consumed_chars; // update position
+ //corrected concurrent private static field acess
+ index += unwrap(consumed_chars); // update position
}
index++; // update position
@@ -826,7 +842,8 @@
public static final String signatureToString(String signature,
boolean chopit)
{
- consumed_chars = 1; // This is the default, read just one char like `B'
+ //corrected concurrent private static field acess
+ wrap(consumed_chars, 1); // This is the default, read just one char like `B'
try {
switch(signature.charAt(0)) {
@@ -842,8 +859,9 @@
if(index < 0)
throw new ClassFormatException("Invalid signature: " + signature);
-
- consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed
+
+ //corrected concurrent private static field acess
+ wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed
return compactClassName(signature.substring(1, index), chopit);
}
@@ -868,8 +886,12 @@
// The rest of the string denotes a `<field_type>'
type = signatureToString(signature.substring(n), chopit);
-
- Utility.consumed_chars += consumed_chars;
+
+ //corrected concurrent private static field acess
+ //Utility.consumed_chars += consumed_chars; is replaced by:
+ int _temp = unwrap(Utility.consumed_chars)+consumed_chars;
+ wrap(Utility.consumed_chars, _temp);
+
return type + brackets.toString();
}
1.10 +26 -7 jakarta-bcel/src/java/org/apache/bcel/generic/Type.java
Index: Type.java
===================================================================
RCS file: /home/cvs/jakarta-bcel/src/java/org/apache/bcel/generic/Type.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Type.java 23 May 2003 07:55:18 -0000 1.9
+++ Type.java 24 Jul 2003 14:14:47 -0000 1.10
@@ -66,6 +66,7 @@
* @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
*/
public abstract class Type implements java.io.Serializable {
+
protected byte type;
protected String signature; // signature for the type
@@ -145,7 +146,19 @@
return buf.toString();
}
- private static int consumed_chars=0; // Remember position in string, see getArgumentTypes
+ private static ThreadLocal consumed_chars = new ThreadLocal() {
+ protected Object initialValue() {
+ return new Integer(0);
+ }
+ };//int consumed_chars=0; // Remember position in string, see getArgumentTypes
+
+ private static int unwrap(ThreadLocal tl) {
+ return ((Integer)tl.get()).intValue();
+ }
+
+ private static void wrap(ThreadLocal tl, int value) {
+ tl.set(new Integer(value));
+ }
/**
* Convert signature to a Type object.
@@ -158,7 +171,8 @@
byte type = Utility.typeOfSignature(signature);
if(type <= Constants.T_VOID) {
- consumed_chars = 1;
+ //corrected concurrent private static field acess
+ wrap(consumed_chars, 1);
return BasicType.getType(type);
} else if(type == Constants.T_ARRAY) {
int dim=0;
@@ -169,7 +183,10 @@
// Recurse, but just once, if the signature is ok
Type t = getType(signature.substring(dim));
- consumed_chars += dim; // update counter
+ //corrected concurrent private static field acess
+ // consumed_chars += dim; // update counter - is replaced by
+ int _temp = unwrap(consumed_chars) + dim;
+ wrap(consumed_chars, _temp);
return new ArrayType(t, dim);
} else { // type == T_REFERENCE
@@ -177,8 +194,9 @@
if(index < 0)
throw new ClassFormatException("Invalid signature: " + signature);
-
- consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed
+
+ //corrected concurrent private static field acess
+ wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed
return new ObjectType(signature.substring(1, index).replace('/', '.'));
}
@@ -218,7 +236,8 @@
while(signature.charAt(index) != ')') {
vec.add(getType(signature.substring(index)));
- index += consumed_chars; // update position
+ //corrected concurrent private static field acess
+ index += unwrap(consumed_chars); // update position
}
} catch(StringIndexOutOfBoundsException e) { // Should never occur
throw new ClassFormatException("Invalid method signature: " + signature);
---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-dev-help@jakarta.apache.org