122122import org .eclipse .jdt .core .dom .WhileStatement ;
123123import org .eclipse .jdt .core .dom .WildcardType ;
124124
125+ // BH 5/15/2018 -- fix for a[pt++] |= 3 incrementing pt twice (see test/Test_Or.java)
125126// BH 3/27/2018 -- fix for anonymous inner classes of inner classes not having this.this$0
126127// BH 1/5/2018 -- @j2sKeep removed; refactored into one class
127128
@@ -1961,6 +1962,7 @@ void addType(String name) {
19611962 break ;
19621963 default :
19631964 case 'p' : // $p$
1965+ case 'j' : // $j$
19641966 break ;
19651967 }
19661968 added += ";\r \n " ;
@@ -2054,9 +2056,12 @@ public boolean visit(Assignment node) {
20542056 return false ;
20552057 }
20562058
2059+ int ptArray = (isArray ? buffer .length () : -1 );
2060+ left .accept (this );
2061+ int ptArray2 = (isArray ? buffer .length () : -1 );
2062+
20572063 if ("boolean" .equals (leftName )) {
20582064 // |=, &=, ^=
2059- left .accept (this );
20602065 buffer .append (" = (" );
20612066 left .accept (this );
20622067 switch (op ) {
@@ -2079,20 +2084,15 @@ public boolean visit(Assignment node) {
20792084 right .accept (this );
20802085 }
20812086 buffer .append (")" );
2082- isArray = wasArray ;
2083- return false ;
2084-
2087+ return fixAssignArray (ptArray , ptArray2 , wasArray );
20852088 }
20862089
2087- left .accept (this );
2088-
20892090 if (!("char" .equals (leftName ))) {
20902091 if (isNumericType (leftName )) {
20912092 // byte|short|int|long += ...
20922093 buffer .append (" = " );
20932094 addPrimitiveTypedExpression (left , toBinding , leftName , opType , right , rightName , null , true );
2094- isArray = wasArray ;
2095- return false ;
2095+ return fixAssignArray (ptArray , ptArray2 , wasArray );
20962096 }
20972097 // not char x ....
20982098 // not boolean x....
@@ -2131,8 +2131,7 @@ public boolean visit(Assignment node) {
21312131 if (needParenthesis ) {
21322132 buffer .append (")" );
21332133 }
2134- isArray = wasArray ;
2135- return false ;
2134+ return fixAssignArray (ptArray , ptArray2 , wasArray );
21362135 }
21372136
21382137 // char left op right where op is not just "="
@@ -2182,7 +2181,44 @@ public boolean visit(Assignment node) {
21822181 if (needCharCode )
21832182 buffer .append (CHARCODEAT0 );
21842183 buffer .append (')' );
2185- isArray = wasArray ;
2184+ return fixAssignArray (ptArray , ptArray2 , wasArray );
2185+ }
2186+
2187+ /**
2188+ * We must fix
2189+ *
2190+ * this.ctype[low++] = (this.ctype[low++]|(4)|0);
2191+ *
2192+ * to read
2193+ *
2194+ * this.ctype[$j$=low++] = (this.ctype[$j$]|(4)|0);
2195+ *
2196+ * so that the index does not get operated upon twice.
2197+ *
2198+ * @param ptArray
2199+ * @param ptArray2
2200+ * @param wasArray
2201+ * @return
2202+ */
2203+ private boolean fixAssignArray (int ptArray , int ptArray2 , boolean wasArray ) {
2204+
2205+ if (ptArray >= 0 ) {
2206+ trailingBuffer .addType ("j" );
2207+ String left = buffer .substring (ptArray , ptArray2 ); // zzz[xxx]
2208+ String right = buffer .substring (ptArray2 );
2209+ buffer .setLength (ptArray );
2210+ int ptIndex = left .indexOf ("[" ) + 1 ;
2211+ String left0 = left .substring (0 , ptIndex );
2212+ buffer .append (left0 );
2213+ buffer .append ("$j$=" );
2214+ buffer .append (left .substring (ptIndex ));
2215+ ptIndex = right .indexOf (left );
2216+ buffer .append (right .substring (0 , ptIndex ));
2217+ buffer .append (left0 );
2218+ buffer .append ("$j$]" );
2219+ buffer .append (right .substring (ptIndex + left .length ()));
2220+ isArray = wasArray ;
2221+ }
21862222 return false ;
21872223 }
21882224
0 commit comments