Skip to content

Commit 812511f

Browse files
committed
Add HashMap Entry stubs for clean translator builds
1 parent e1c1611 commit 812511f

File tree

2 files changed

+71
-25
lines changed

2 files changed

+71
-25
lines changed

vm/tests/src/test/java/com/codename1/tools/translator/ReadWriteLockIntegrationTest.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -467,38 +467,55 @@ private void writeMockJavaClasses(Path sourceDir) throws Exception {
467467
// java.util.HashMap
468468
Files.write(util.resolve("HashMap.java"), ("package java.util;\n" +
469469
"public class HashMap<K,V> implements Map<K,V> {\n" +
470-
" private Object[] keys = new Object[16];\n" +
471-
" private Object[] values = new Object[16];\n" +
470+
" public static class Entry<K,V> {\n" +
471+
" public K key;\n" +
472+
" public V value;\n" +
473+
" public int hash;\n" +
474+
" public int origKeyHash;\n" +
475+
" public Entry<K,V> next;\n" +
476+
" public Entry(K key, V value, int hash, Entry<K,V> next) {\n" +
477+
" this.key = key;\n" +
478+
" this.value = value;\n" +
479+
" this.hash = hash;\n" +
480+
" this.origKeyHash = hash;\n" +
481+
" this.next = next;\n" +
482+
" }\n" +
483+
" }\n" +
484+
" private Entry[] elementData = new Entry[16];\n" +
472485
" private int size = 0;\n" +
473486
" public V get(Object key) {\n" +
474-
" for(int i=0; i<size; i++) if(keys[i] == key) return (V)values[i];\n" +
487+
" int h = key == null ? 0 : key.hashCode();\n" +
488+
" int idx = (h & 0x7fffffff) % elementData.length;\n" +
489+
" for (Entry e = elementData[idx]; e != null; e = e.next) {\n" +
490+
" if (e.key == key) return (V)e.value;\n" +
491+
" }\n" +
475492
" return null;\n" +
476493
" }\n" +
477494
" public V put(K key, V value) {\n" +
478-
" for(int i=0; i<size; i++) {\n" +
479-
" if(keys[i] == key) {\n" +
480-
" V old = (V)values[i];\n" +
481-
" values[i] = value;\n" +
482-
" return old;\n" +
483-
" }\n" +
495+
" int h = key == null ? 0 : key.hashCode();\n" +
496+
" int idx = (h & 0x7fffffff) % elementData.length;\n" +
497+
" Entry e = elementData[idx];\n" +
498+
" while (e != null) {\n" +
499+
" if (e.key == key) { V old = (V)e.value; e.value = value; return old; }\n" +
500+
" e = e.next;\n" +
484501
" }\n" +
485-
" if (size >= keys.length) return null;\n" + // overflow ignored for mock
486-
" keys[size] = key;\n" +
487-
" values[size] = value;\n" +
502+
" elementData[idx] = new Entry(key, value, h, elementData[idx]);\n" +
488503
" size++;\n" +
489504
" return null;\n" +
490505
" }\n" +
491506
" public V remove(Object key) {\n" +
492-
" for(int i=0; i<size; i++) {\n" +
493-
" if(keys[i] == key) {\n" +
494-
" V old = (V)values[i];\n" +
507+
" int h = key == null ? 0 : key.hashCode();\n" +
508+
" int idx = (h & 0x7fffffff) % elementData.length;\n" +
509+
" Entry prev = null;\n" +
510+
" Entry e = elementData[idx];\n" +
511+
" while (e != null) {\n" +
512+
" if (e.key == key) {\n" +
513+
" if (prev == null) elementData[idx] = e.next; else prev.next = e.next;\n" +
495514
" size--;\n" +
496-
" keys[i] = keys[size];\n" +
497-
" values[i] = values[size];\n" +
498-
" keys[size] = null;\n" +
499-
" values[size] = null;\n" +
500-
" return old;\n" +
515+
" return (V)e.value;\n" +
501516
" }\n" +
517+
" prev = e;\n" +
518+
" e = e.next;\n" +
502519
" }\n" +
503520
" return null;\n" +
504521
" }\n" +

vm/tests/src/test/java/com/codename1/tools/translator/StampedLockIntegrationTest.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,44 @@ private void writeMockJavaClasses(Path sourceDir) throws Exception {
127127
// java.util.HashMap (needed for generated native stubs)
128128
Files.write(util.resolve("HashMap.java"), ("package java.util;\n" +
129129
"public class HashMap<K,V> {\n" +
130-
" public HashMap() {}\n" +
131-
" public V put(K key, V value) { return value; }\n" +
132-
" public V get(Object key) { return null; }\n" +
133-
" public int size() { return 0; }\n" +
134130
" public static class Entry<K,V> {\n" +
135131
" public K key;\n" +
136132
" public V value;\n" +
137-
" public Entry(K key, V value) { this.key = key; this.value = value; }\n" +
133+
" public int hash;\n" +
134+
" public int origKeyHash;\n" +
135+
" public Entry<K,V> next;\n" +
136+
" public Entry(K key, V value, int hash, Entry<K,V> next) {\n" +
137+
" this.key = key;\n" +
138+
" this.value = value;\n" +
139+
" this.hash = hash;\n" +
140+
" this.origKeyHash = hash;\n" +
141+
" this.next = next;\n" +
142+
" }\n" +
143+
" }\n" +
144+
" private Entry[] elementData = new Entry[16];\n" +
145+
" private int size = 0;\n" +
146+
" public HashMap() {}\n" +
147+
" public V put(K key, V value) {\n" +
148+
" int h = key == null ? 0 : key.hashCode();\n" +
149+
" int idx = (h & 0x7fffffff) % elementData.length;\n" +
150+
" Entry e = elementData[idx];\n" +
151+
" while (e != null) {\n" +
152+
" if (e.key == key) { V old = (V)e.value; e.value = value; return old; }\n" +
153+
" e = e.next;\n" +
154+
" }\n" +
155+
" elementData[idx] = new Entry(key, value, h, elementData[idx]);\n" +
156+
" size++;\n" +
157+
" return null;\n" +
158+
" }\n" +
159+
" public V get(Object key) {\n" +
160+
" int h = key == null ? 0 : key.hashCode();\n" +
161+
" int idx = (h & 0x7fffffff) % elementData.length;\n" +
162+
" for (Entry e = elementData[idx]; e != null; e = e.next) {\n" +
163+
" if (e.key == key) return (V)e.value;\n" +
164+
" }\n" +
165+
" return null;\n" +
138166
" }\n" +
167+
" public int size() { return size; }\n" +
139168
"}\n").getBytes(StandardCharsets.UTF_8));
140169

141170
// java.lang.Object

0 commit comments

Comments
 (0)