1 2 class Blort { 3 methodThatNeedsInvokeRange(int a, int b, int c, int d, int e, int f)4 static void methodThatNeedsInvokeRange 5 (int a, int b, int c, int d, int e, int f) { 6 } 7 testNoLocals()8 void testNoLocals() { 9 methodThatNeedsInvokeRange(5, 0, 5, 0, 5, 0); 10 } 11 testMixedLocals()12 void testMixedLocals() { 13 int src = 6; 14 int dest = 7; 15 16 methodThatNeedsInvokeRange(src, 0, dest, 1, 5, 0); 17 methodThatNeedsInvokeRange(src, 0, dest, 1, 5, 0); 18 } 19 20 // here the current algorithm partial-overlapping will stumble a bit 21 // The register containing "zero" will be marked as "reserved for locals" 22 // Then the subsequent arraycopy will need a whole new set of 5 registers testMixedWorseCase()23 void testMixedWorseCase() { 24 int src = 6; 25 int dest = 7; 26 int zero = 0; 27 28 methodThatNeedsInvokeRange(src, zero, dest, 1, 5, 0); 29 methodThatNeedsInvokeRange(src, 0, dest, 1, 5, 0); 30 } 31 testAllParams(int a, int b, int c, int d, int e, int f)32 void testAllParams(int a, int b, int c, int d, int e, int f) { 33 methodThatNeedsInvokeRange(a, b, c, d, e, f); 34 } 35 36 // this could try to make use of param positions, but doesn't testTailParams(int destPos, int length)37 static void testTailParams(int destPos, int length) { 38 int src = 6; 39 int dest = 7; 40 41 methodThatNeedsInvokeRange(src, 0, dest, 0, destPos, length); 42 } 43 44 45 // This presently requires a whole N new registers testFlip()46 void testFlip() { 47 int src = 6; 48 int dest = 7; 49 50 methodThatNeedsInvokeRange(src, 0, dest, 1, 5, 0); 51 methodThatNeedsInvokeRange(dest, 0, src, 1, 5, 0); 52 } 53 54 // ensure that an attempt to combine registers for a local 55 // with a differing category doesn't mess us up. testMixedCategory(boolean foo)56 long testMixedCategory(boolean foo) { 57 if (foo) { 58 int offset = 1; 59 int src = 6; 60 int dest = 7; 61 62 methodThatNeedsInvokeRange(src, 0, dest, offset, 5, 0); 63 return offset; 64 } else { 65 long offset = System.currentTimeMillis();; 66 return offset; 67 } 68 } 69 } 70