restore state from subroutine after jsr to avoid later confusion determining basic block boundaries

This commit is contained in:
Joel Dice 2009-07-20 08:26:01 -06:00
parent 5f6f8039e6
commit d12b441aa1
4 changed files with 36 additions and 6 deletions

View File

@ -1480,7 +1480,7 @@ class Frame {
} }
void endSubroutine(unsigned nextIndexIndex) { void endSubroutine(unsigned nextIndexIndex) {
c->cleanLocals(); c->linkSubroutine(subroutine->handle);
poppedInt(); poppedInt();

View File

@ -4952,9 +4952,14 @@ class MyCompiler: public Compiler {
} }
virtual void endSubroutine(Subroutine* subroutine) { virtual void endSubroutine(Subroutine* subroutine) {
appendCleanLocals(&c);
static_cast<MySubroutine*>(subroutine)->forkState = ::saveState(&c); static_cast<MySubroutine*>(subroutine)->forkState = ::saveState(&c);
} }
virtual void linkSubroutine(Subroutine* subroutine) {
restoreState(static_cast<MySubroutine*>(subroutine)->forkState);
}
virtual void init(unsigned logicalCodeLength, unsigned parameterFootprint, virtual void init(unsigned logicalCodeLength, unsigned parameterFootprint,
unsigned localFootprint, unsigned alignedFrameSize) unsigned localFootprint, unsigned alignedFrameSize)
{ {
@ -5372,10 +5377,6 @@ class MyCompiler: public Compiler {
appendSaveLocals(&c); appendSaveLocals(&c);
} }
virtual void cleanLocals() {
appendCleanLocals(&c);
}
virtual void checkBounds(Operand* object, unsigned lengthOffset, virtual void checkBounds(Operand* object, unsigned lengthOffset,
Operand* index, intptr_t handler) Operand* index, intptr_t handler)
{ {

View File

@ -43,6 +43,7 @@ class Compiler {
virtual Subroutine* startSubroutine() = 0; virtual Subroutine* startSubroutine() = 0;
virtual void endSubroutine(Subroutine* subroutine) = 0; virtual void endSubroutine(Subroutine* subroutine) = 0;
virtual void linkSubroutine(Subroutine* subroutine) = 0;
virtual void init(unsigned logicalCodeSize, unsigned parameterFootprint, virtual void init(unsigned logicalCodeSize, unsigned parameterFootprint,
unsigned localFootprint, unsigned alignedFrameSize) = 0; unsigned localFootprint, unsigned alignedFrameSize) = 0;
@ -95,7 +96,6 @@ class Compiler {
unsigned index) = 0; unsigned index) = 0;
virtual Operand* loadLocal(unsigned footprint, unsigned index) = 0; virtual Operand* loadLocal(unsigned footprint, unsigned index) = 0;
virtual void saveLocals() = 0; virtual void saveLocals() = 0;
virtual void cleanLocals() = 0;
virtual void checkBounds(Operand* object, unsigned lengthOffset, virtual void checkBounds(Operand* object, unsigned lengthOffset,
Operand* index, intptr_t handler) = 0; Operand* index, intptr_t handler) = 0;

View File

@ -113,6 +113,31 @@ public class Subroutine {
} }
} }
private static long test4(int path) {
try {
try {
switch (path) {
case 1:
return 42L;
case 2: {
int a = 42;
return 52L;
}
case 3:
throw new DummyException();
}
} finally {
System.gc();
}
return 0L;
} catch (DummyException e) {
e.printStackTrace();
return 0L;
}
}
public static void main(String[] args) { public static void main(String[] args) {
test(false, false); test(false, false);
test(false, true); test(false, true);
@ -157,6 +182,10 @@ public class Subroutine {
String.valueOf(test3(1, 3, 3)); String.valueOf(test3(1, 3, 3));
String.valueOf(test3(2, 3, 3)); String.valueOf(test3(2, 3, 3));
String.valueOf(test3(3, 3, 3)); String.valueOf(test3(3, 3, 3));
String.valueOf(test4(1));
String.valueOf(test4(2));
String.valueOf(test4(3));
} }
private static class DummyException extends RuntimeException { } private static class DummyException extends RuntimeException { }