Skip to content

Commit c29f8a8

Browse files
committed
Fixed incompatibility with Java 8 by inlining outer class methods
1 parent 733c617 commit c29f8a8

File tree

1 file changed

+42
-5
lines changed

1 file changed

+42
-5
lines changed

nondex-instrumentation/src/main/java/edu/illinois/nondex/instr/IdentityHashMapShufflingAdder.java

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,23 @@ public void addRemove() {
272272
mv.visitInsn(Opcodes.ISUB);
273273
mv.visitFieldInsn(Opcodes.PUTFIELD, "java/util/IdentityHashMap", "size", "I");
274274

275+
// Inlined nextKeyIndex()
275276
mv.visitVarInsn(Opcodes.ILOAD, 4);
277+
mv.visitInsn(Opcodes.ICONST_2);
278+
mv.visitInsn(Opcodes.IADD);
279+
mv.visitInsn(Opcodes.DUP);
276280
mv.visitVarInsn(Opcodes.ILOAD, 3);
277-
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/IdentityHashMap", "nextKeyIndex", "(II)I", false);
281+
282+
Label elseLabel = new Label();
283+
Label endLabel = new Label();
284+
mv.visitJumpInsn(Opcodes.IF_ICMPGE, elseLabel);
285+
mv.visitJumpInsn(Opcodes.GOTO, endLabel);
286+
mv.visitLabel(elseLabel);
287+
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { Opcodes.INTEGER });
288+
mv.visitInsn(Opcodes.POP);
289+
mv.visitInsn(Opcodes.ICONST_0);
290+
mv.visitLabel(endLabel);
291+
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { Opcodes.INTEGER });
278292
mv.visitVarInsn(Opcodes.ISTORE, 6); // i in local var 6
279293

280294
Label loopStart = new Label();
@@ -293,10 +307,20 @@ public void addRemove() {
293307
// Check if item==null
294308
mv.visitJumpInsn(Opcodes.IFNULL, loopEnd);
295309

296-
// Compute hash
310+
// Compute hash by inlining hash(item, len): ((h << 1) - (h << 8)) & (length - 1)
297311
mv.visitVarInsn(Opcodes.ALOAD, 7);
312+
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "identityHashCode", "(Ljava/lang/Object;)I", false);
313+
mv.visitInsn(Opcodes.DUP);
314+
mv.visitInsn(Opcodes.ICONST_1);
315+
mv.visitInsn(Opcodes.ISHL); // h << 1
316+
mv.visitInsn(Opcodes.SWAP);
317+
mv.visitIntInsn(Opcodes.BIPUSH, 8);
318+
mv.visitInsn(Opcodes.ISHL);
319+
mv.visitInsn(Opcodes.ISUB);
298320
mv.visitVarInsn(Opcodes.ILOAD, 3);
299-
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/IdentityHashMap", "hash", "(Ljava/lang/Object;I)I", false);
321+
mv.visitInsn(Opcodes.ICONST_1);
322+
mv.visitInsn(Opcodes.ISUB);
323+
mv.visitInsn(Opcodes.IAND);
300324
mv.visitVarInsn(Opcodes.ISTORE, 8); // r in local var 8
301325

302326
// Complex conditional: if ((i < r && (r <= d || d <= i)) || (r <= d && d <= i))
@@ -366,10 +390,23 @@ public void addRemove() {
366390
mv.visitVarInsn(Opcodes.ILOAD, 6);
367391
mv.visitVarInsn(Opcodes.ISTORE, 4);
368392

369-
// Update i = nextKeyIndex(i, len);
393+
// Update i = nextKeyIndex(i, len), inlined
370394
mv.visitVarInsn(Opcodes.ILOAD, 6);
395+
mv.visitInsn(Opcodes.ICONST_2);
396+
mv.visitInsn(Opcodes.IADD);
397+
mv.visitInsn(Opcodes.DUP);
371398
mv.visitVarInsn(Opcodes.ILOAD, 3);
372-
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/IdentityHashMap", "nextKeyIndex", "(II)I", false);
399+
400+
Label elseLabel2 = new Label();
401+
Label endLabel2 = new Label();
402+
mv.visitJumpInsn(Opcodes.IF_ICMPGE, elseLabel2);
403+
mv.visitJumpInsn(Opcodes.GOTO, endLabel2);
404+
mv.visitLabel(elseLabel2);
405+
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { Opcodes.INTEGER });
406+
mv.visitInsn(Opcodes.POP);
407+
mv.visitInsn(Opcodes.ICONST_0);
408+
mv.visitLabel(endLabel2);
409+
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { Opcodes.INTEGER });
373410
mv.visitVarInsn(Opcodes.ISTORE, 6);
374411

375412
mv.visitJumpInsn(Opcodes.GOTO, loopStart);

0 commit comments

Comments
 (0)