Skip to content

Commit de8d164

Browse files
gkdnGerrit Code Review
authored and
Gerrit Code Review
committed
Removes LongLib dependency from GWT-RPC.
Change-Id: I180101b1543d18ef586e57f6539273db5769ffc6
1 parent 861bb7c commit de8d164

File tree

4 files changed

+89
-5
lines changed

4 files changed

+89
-5
lines changed

user/src/com/google/gwt/user/client/rpc/impl/AbstractSerializationStream.java

+86
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,90 @@ public final void setFlags(int flags) {
110110
protected final void setVersion(int version) {
111111
this.version = version;
112112
}
113+
114+
/**
115+
* Parse a string containing a base-64 encoded version of a long value.
116+
*
117+
* Keep this synchronized with the version in Base64Utils.
118+
*/
119+
public static long longFromBase64(String value) {
120+
int pos = 0;
121+
long longVal = base64Value(value.charAt(pos++));
122+
int len = value.length();
123+
while (pos < len) {
124+
longVal <<= 6;
125+
longVal |= base64Value(value.charAt(pos++));
126+
}
127+
return longVal;
128+
}
129+
130+
/**
131+
* Return an optionally single-quoted string containing a base-64 encoded
132+
* version of the given long value.
133+
*
134+
* Keep this synchronized with the version in Base64Utils.
135+
*/
136+
public static String longToBase64(long value) {
137+
// Convert to ints early to avoid need for long ops
138+
int low = (int) (value & 0xffffffff);
139+
int high = (int) (value >> 32);
140+
141+
StringBuilder sb = new StringBuilder();
142+
boolean haveNonZero = base64Append(sb, (high >> 28) & 0xf, false);
143+
haveNonZero = base64Append(sb, (high >> 22) & 0x3f, haveNonZero);
144+
haveNonZero = base64Append(sb, (high >> 16) & 0x3f, haveNonZero);
145+
haveNonZero = base64Append(sb, (high >> 10) & 0x3f, haveNonZero);
146+
haveNonZero = base64Append(sb, (high >> 4) & 0x3f, haveNonZero);
147+
int v = ((high & 0xf) << 2) | ((low >> 30) & 0x3);
148+
haveNonZero = base64Append(sb, v, haveNonZero);
149+
haveNonZero = base64Append(sb, (low >> 24) & 0x3f, haveNonZero);
150+
haveNonZero = base64Append(sb, (low >> 18) & 0x3f, haveNonZero);
151+
haveNonZero = base64Append(sb, (low >> 12) & 0x3f, haveNonZero);
152+
base64Append(sb, (low >> 6) & 0x3f, haveNonZero);
153+
base64Append(sb, low & 0x3f, true);
154+
155+
return sb.toString();
156+
}
157+
158+
private static boolean base64Append(StringBuilder sb, int digit, boolean haveNonZero) {
159+
if (digit > 0) {
160+
haveNonZero = true;
161+
}
162+
if (haveNonZero) {
163+
int c;
164+
if (digit < 26) {
165+
c = 'A' + digit;
166+
} else if (digit < 52) {
167+
c = 'a' + digit - 26;
168+
} else if (digit < 62) {
169+
c = '0' + digit - 52;
170+
} else if (digit == 62) {
171+
c = '$';
172+
} else {
173+
c = '_';
174+
}
175+
sb.append((char) c);
176+
}
177+
return haveNonZero;
178+
}
179+
180+
// Assume digit is one of [A-Za-z0-9$_]
181+
private static int base64Value(char digit) {
182+
if (digit >= 'A' && digit <= 'Z') {
183+
return digit - 'A';
184+
}
185+
// No need to check digit <= 'z'
186+
if (digit >= 'a') {
187+
return digit - 'a' + 26;
188+
}
189+
if (digit >= '0' && digit <= '9') {
190+
return digit - '0' + 52;
191+
}
192+
if (digit == '$') {
193+
return 62;
194+
}
195+
// digit == '_'
196+
return 63;
197+
}
198+
113199
}

user/src/com/google/gwt/user/client/rpc/impl/ClientSerializationStreamReader.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import com.google.gwt.dev.js.ast.JsUnaryOperator;
3636
import com.google.gwt.dev.js.ast.JsValueLiteral;
3737
import com.google.gwt.dev.js.ast.JsVisitor;
38-
import com.google.gwt.lang.LongLib;
3938
import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException;
4039
import com.google.gwt.user.client.rpc.SerializationException;
4140

@@ -383,7 +382,7 @@ public int readInt() {
383382

384383
@Override
385384
public long readLong() {
386-
return LongLib.longFromBase64(((JsStringLiteral) decoder.getValues().get(--index)).getValue());
385+
return longFromBase64(((JsStringLiteral) decoder.getValues().get(--index)).getValue());
387386
}
388387

389388
@Override

user/src/com/google/gwt/user/client/rpc/impl/ClientSerializationStreamWriter.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package com.google.gwt.user.client.rpc.impl;
1717

1818
import com.google.gwt.core.client.JavaScriptObject;
19-
import com.google.gwt.lang.LongLib;
2019
import com.google.gwt.user.client.rpc.SerializationException;
2120

2221
import java.util.List;
@@ -154,7 +153,7 @@ public String toString() {
154153

155154
@Override
156155
public void writeLong(long value) {
157-
append(LongLib.toBase64(value));
156+
append(longToBase64(value));
158157
}
159158

160159
/**

user/super/com/google/gwt/user/translatable/com/google/gwt/user/client/rpc/impl/ClientSerializationStreamReader.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public native int readInt() /*-{
111111
@UnsafeNativeLong
112112
public native long readLong() /*-{
113113
var s = this.@com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader::results[--this.@com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader::index];
114-
return @com.google.gwt.lang.LongLib::longFromBase64(Ljava/lang/String;)(s);
114+
return @ClientSerializationStreamReader::longFromBase64(Ljava/lang/String;)(s);
115115
}-*/;
116116

117117
public native short readShort() /*-{

0 commit comments

Comments
 (0)