Skip to content

Commit 0cab9dc

Browse files
committed
fast Map fix to switch to standard Java anytime an Object key is used
- even for contains(), remove(), etc.
1 parent 5f8afb2 commit 0cab9dc

File tree

3 files changed

+84
-15
lines changed

3 files changed

+84
-15
lines changed

sources/net.sf.j2s.java.core/src/java/util/HashMap.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,8 @@ public V get(Object key) {
593593
case NOT_SIMPLE:
594594
break;
595595
case INVALID_KEY:
596+
Map.秘ensureJavaMap(this);
597+
break;
596598
case NO_SUCH_KEY:
597599
return null;
598600
case HAS_KEY:
@@ -649,6 +651,8 @@ public boolean containsKey(Object key) {
649651
case NOT_SIMPLE:
650652
break;
651653
case INVALID_KEY:
654+
Map.秘ensureJavaMap(this);
655+
break;
652656
case NO_SUCH_KEY:
653657
return false;
654658
case HAS_KEY:
@@ -895,6 +899,8 @@ public V remove(Object key) {
895899
case NOT_SIMPLE:
896900
break;
897901
case INVALID_KEY:
902+
Map.秘ensureJavaMap(this);
903+
break;
898904
case NO_SUCH_KEY:
899905
return null;
900906
case HAS_KEY:
@@ -1094,6 +1100,8 @@ public final boolean remove(Object key) {
10941100
case NOT_SIMPLE:
10951101
break;
10961102
case INVALID_KEY:
1103+
Map.秘ensureJavaMap(HashMap.this);
1104+
break;
10971105
case NO_SUCH_KEY:
10981106
return false;
10991107
case HAS_KEY:
@@ -1287,6 +1295,8 @@ public final boolean remove(Object o) {
12871295
case NOT_SIMPLE:
12881296
return removeNode(hash(key), key, value, true, true, NOT_SIMPLE) != null;
12891297
case INVALID_KEY:
1298+
Map.秘ensureJavaMap(HashMap.this);
1299+
return removeNode(hash(key), key, value, true, true, NOT_SIMPLE) != null;
12901300
case NO_SUCH_KEY:
12911301
return false;
12921302
case HAS_KEY:
@@ -1327,6 +1337,8 @@ public V getOrDefault(Object key, V defaultValue) {
13271337
case NOT_SIMPLE:
13281338
break;
13291339
case INVALID_KEY:
1340+
Map.秘ensureJavaMap(this);
1341+
break;
13301342
case NO_SUCH_KEY:
13311343
return defaultValue;
13321344
case HAS_KEY:
@@ -1374,6 +1386,8 @@ public boolean remove(Object key, Object value) {
13741386
case NOT_SIMPLE:
13751387
break;
13761388
case INVALID_KEY:
1389+
Map.秘ensureJavaMap(this);
1390+
break;
13771391
case NO_SUCH_KEY:
13781392
return false;
13791393
case HAS_KEY:
@@ -1393,6 +1407,8 @@ public boolean replace(K key, V oldValue, V newValue) {
13931407
case NOT_SIMPLE:
13941408
break;
13951409
case INVALID_KEY:
1410+
Map.秘ensureJavaMap(this);
1411+
break;
13961412
case NO_SUCH_KEY:
13971413
return false;
13981414
case HAS_KEY:
@@ -1430,6 +1446,8 @@ public V replace(K key, V value) {
14301446
case NOT_SIMPLE:
14311447
break;
14321448
case INVALID_KEY:
1449+
Map.秘ensureJavaMap(this);
1450+
break;
14331451
case NO_SUCH_KEY:
14341452
return null;
14351453
case HAS_KEY:
@@ -1569,6 +1587,8 @@ public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> r
15691587
case NOT_SIMPLE:
15701588
break;
15711589
case INVALID_KEY:
1590+
Map.秘ensureJavaMap(this);
1591+
break;
15721592
case NO_SUCH_KEY:
15731593
return null;
15741594
case HAS_KEY:

sources/net.sf.j2s.java.core/src/java/util/Hashtable.java

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,8 @@ public synchronized boolean containsKey(Object key) {
369369
case NOT_SIMPLE:
370370
break;
371371
case INVALID_KEY:
372+
Map.秘ensureJavaMap(this);
373+
break;
372374
case NO_SUCH_KEY:
373375
return false;
374376
case HAS_KEY:
@@ -408,6 +410,8 @@ public synchronized V get(Object key) {
408410
case NOT_SIMPLE:
409411
break;
410412
case INVALID_KEY:
413+
Map.秘ensureJavaMap(this);
414+
break;
411415
case NO_SUCH_KEY:
412416
return null;
413417
case HAS_KEY:
@@ -581,6 +585,8 @@ public synchronized V remove(Object key) {
581585
case NOT_SIMPLE:
582586
break;
583587
case INVALID_KEY:
588+
Map.秘ensureJavaMap(this);
589+
break;
584590
case NO_SUCH_KEY:
585591
return null;
586592
case HAS_KEY:
@@ -856,24 +862,27 @@ public boolean contains(Object o) {
856862
Object key = entry.getKey();
857863

858864
switch (Map.秘hasKey(Hashtable.this, key)) {
865+
case NOT_SIMPLE:
866+
break;
867+
case INVALID_KEY:
868+
Map.秘ensureJavaMap(Hashtable.this);
869+
break;
859870
case HAS_KEY:
860871
Object value = entry.getValue();
861872
Object v = Hashtable.this.get(key);
862873
return (value == v || value != null && value.equals(key));
863-
case NOT_SIMPLE:
864-
Entry<?,?>[] tab = table;
865-
int hash = key.hashCode();
866-
int index = (hash & 0x7FFFFFFF) % tab.length;
867-
868-
for (Entry<?,?> e = tab[index]; e != null; e = e.next_)
869-
if (e.hash==hash && e.equals(entry))
870-
return true;
871-
return false;
872-
default:
873-
case INVALID_KEY:
874874
case NO_SUCH_KEY:
875875
return false;
876876
}
877+
Entry<?,?>[] tab = table;
878+
int hash = key.hashCode();
879+
int index = (hash & 0x7FFFFFFF) % tab.length;
880+
881+
for (Entry<?,?> e = tab[index]; e != null; e = e.next_)
882+
if (e.hash==hash && e.equals(entry))
883+
return true;
884+
return false;
885+
877886
}
878887

879888
@Override
@@ -884,6 +893,11 @@ public boolean remove(Object o) {
884893
Object key = entry.getKey();
885894

886895
switch (Map.秘hasKey(Hashtable.this, key)) {
896+
case NOT_SIMPLE:
897+
break;
898+
case INVALID_KEY:
899+
Map.秘ensureJavaMap(Hashtable.this);
900+
break;
887901
case HAS_KEY:
888902
Object value = entry.getValue();
889903
if (value == null)
@@ -894,11 +908,8 @@ public boolean remove(Object o) {
894908
return true;
895909
}
896910
return false;
897-
case INVALID_KEY:
898911
case NO_SUCH_KEY:
899912
return false;
900-
case NOT_SIMPLE:
901-
break;
902913
}
903914
Entry<?,?>[] tab = table;
904915
int hash = key.hashCode();
@@ -1151,6 +1162,8 @@ public synchronized V putIfAbsent(K key, V value) {
11511162

11521163

11531164
switch (Map.秘hasKey(this, key)) {
1165+
case NOT_SIMPLE:
1166+
break;
11541167
case INVALID_KEY:
11551168
Map.秘ensureJavaMap(this);
11561169
break;
@@ -1196,7 +1209,11 @@ public synchronized V putIfAbsent(K key, V value) {
11961209
public synchronized boolean remove(Object key, Object value) {
11971210
Objects.requireNonNull(value);
11981211
switch (Map.秘hasKey(this, key)) {
1199-
case INVALID_KEY:
1212+
case NOT_SIMPLE:
1213+
break;
1214+
case INVALID_KEY:
1215+
Map.秘ensureJavaMap(this);
1216+
break;
12001217
case NO_SUCH_KEY:
12011218
return false;
12021219
case HAS_KEY:
@@ -1244,6 +1261,8 @@ public synchronized boolean replace(K key, V oldValue, V newValue) {
12441261
case NOT_SIMPLE:
12451262
break;
12461263
case INVALID_KEY:
1264+
Map.秘ensureJavaMap(this);
1265+
break;
12471266
case NO_SUCH_KEY:
12481267
return false;
12491268
case HAS_KEY:
@@ -1286,7 +1305,11 @@ public synchronized boolean replace(K key, V oldValue, V newValue) {
12861305
public synchronized V replace(K key, V value) {
12871306

12881307
switch (Map.秘hasKey(this, key)) {
1308+
case NOT_SIMPLE:
1309+
break;
12891310
case INVALID_KEY:
1311+
Map.秘ensureJavaMap(this);
1312+
break;
12901313
case NO_SUCH_KEY:
12911314
return null;
12921315
case HAS_KEY:
@@ -1384,6 +1407,8 @@ public synchronized V computeIfPresent(K key, BiFunction<? super K, ? super V, ?
13841407
case NOT_SIMPLE:
13851408
break;
13861409
case INVALID_KEY:
1410+
Map.秘ensureJavaMap(this);
1411+
break;
13871412
case NO_SUCH_KEY:
13881413
return null;
13891414
case HAS_KEY:

sources/net.sf.j2s.java.core/src/java/util/Map.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,6 +1231,11 @@ default V merge(K key, V value,
12311231
static int 秘hasKey(Map map, Object key) {
12321232

12331233
/**
1234+
*
1235+
* Note that JavaScript Map.has() will distinguish between new String("") and "".
1236+
* And yet Java will not. So the "1" return here must be handled as "invalid -- convert now"
1237+
* even if it is just a remove or contains check.
1238+
*
12341239
* @j2sNative
12351240
*
12361241
* return (!map.秘m ? 0 : key != null && typeof key != "string"
@@ -1242,5 +1247,24 @@ default V merge(K key, V value,
12421247
}
12431248
}
12441249

1250+
1251+
static void 秘set(Map map, Object key, Object value) {
1252+
/**
1253+
* @j2sNative
1254+
*
1255+
* map.秘m.set(key == null ? null : key + "", value)
1256+
*/
1257+
}
1258+
1259+
static Object 秘get(Object map, Object key) {
1260+
/**
1261+
* @j2sNative
1262+
*
1263+
* return map.秘m.get(key == null ? null : key + "")
1264+
*/
1265+
{
1266+
return null;
1267+
}
1268+
}
12451269

12461270
}

0 commit comments

Comments
 (0)