Fix StackOverflowError after recent change in jdt.core
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java
index 64386b7..2880126 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/MethodInfo.java
@@ -545,7 +545,7 @@
 //{ObjectTeams: read method attributes
 					break;
 				default:
-					readOTAttribute(attributeName, this, readOffset+6, this.structOffset, this.constantPoolOffsets);
+					readOTAttribute(attributeName, this, readOffset+6, this.structOffset, this.constantPoolOffsets, flags);
 // SH}
 			}
 		}
@@ -568,7 +568,8 @@
             MethodInfo info,
             int        readOffset,
             int        aStructOffset,
-            int[]      someConstantPoolOffsets)
+            int[]      someConstantPoolOffsets,
+            int        flagsSoFar)
     {
     	if (CharOperation.equals(attributeName, AttributeNamesConstants.CodeName))
     		return; // optimization only.
@@ -579,7 +580,7 @@
         }
         else if (CharOperation.equals(attributeName, ROLECLASS_METHOD_MODIFIERS_NAME))
         {
-        	WordValueAttribute.readRoleClassMethodModifiersAttribute(info, readOffset);
+        	WordValueAttribute.readRoleClassMethodModifiersAttribute(info, readOffset, flagsSoFar);
             // not added to _readAttributes because evaluated immediately.
         }
         else if (CharOperation.equals(attributeName, CALLS_BASE_CTOR))
@@ -589,7 +590,7 @@
         }
         else if (CharOperation.equals(attributeName, CALLIN_FLAGS))
         {
-            this.methodAttributes.add(WordValueAttribute.readCallinFlags(info, readOffset));
+            this.methodAttributes.add(WordValueAttribute.readCallinFlags(info, readOffset, flagsSoFar));
         }
         else if (CharOperation.equals(attributeName, TYPE_ANCHOR_LIST))
         {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/WordValueAttribute.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/WordValueAttribute.java
index 81e70db..a8dfa1d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/WordValueAttribute.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/WordValueAttribute.java
@@ -209,8 +209,8 @@
         return new WordValueAttribute(ROLECLASS_METHOD_MODIFIERS_NAME, modifiers);
     }
 
-    public static void readRoleClassMethodModifiersAttribute(MethodInfo info, int readOffset) {
-		int binaryFlags = info.getModifiers() & ~ExtraCompilerModifiers.AccVisibilityMASK; // reset these bits first
+    public static void readRoleClassMethodModifiersAttribute(MethodInfo info, int readOffset, int flagsSoFar) {
+		int binaryFlags = flagsSoFar & ~ExtraCompilerModifiers.AccVisibilityMASK; // reset these bits first
 		int newFlags = info.u2At(readOffset);
     	info.setAccessFlags(binaryFlags | newFlags);
 	}
@@ -222,10 +222,11 @@
      */
     public static WordValueAttribute readCallinFlags(
             MethodInfo      method,
-            int             readOffset)
+            int             readOffset,
+            int				flagsSoFar)
     {
         int  value = method.u2At(readOffset);
-        method.setAccessFlags(method.getModifiers()|ExtraCompilerModifiers.AccCallin);
+        method.setAccessFlags(flagsSoFar|ExtraCompilerModifiers.AccCallin);
         // create and store an attribute anyway, in order to store the actual bits.
         WordValueAttribute result = callinFlagsAttribute(value);
         result._methodInfo = method;