diff --git a/src/compile.cpp b/src/compile.cpp index 96748b62a1..0d78e5e5ad 100644 --- a/src/compile.cpp +++ b/src/compile.cpp @@ -1816,14 +1816,13 @@ void saveStateAndCompile(MyThread* t, Frame* initialFrame, unsigned ip, bool exceptionHandler = false) { - Compiler::State* state = c->saveState(); - compile(t, frame, ipTable[i], exceptionHandler); - c->restoreState(state); + Compiler::State* state = initialFrame->c->saveState(); + compile(t, initialFrame, ip, exceptionHandler); + initialFrame->c->restoreState(state); } void -compile(MyThread* t, Frame* initialFrame, unsigned ip, - bool exceptionHandler = false) +compile(MyThread* t, Frame* initialFrame, unsigned ip, bool exceptionHandler) { uint8_t stackMap [codeMaxStack(t, methodCode(t, initialFrame->context->method))]; @@ -3857,7 +3856,7 @@ finish(MyThread* t, Context* context) } // for debugging: - if (false and + if (//false and strcmp (reinterpret_cast (&byteArrayBody(t, className(t, methodClass(t, context->method)), 0)), diff --git a/src/compiler.cpp b/src/compiler.cpp index 6ee2f99656..8c7540e352 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -32,6 +32,7 @@ class Event; class PushEvent; class Read; class MultiRead; +class StubRead; class Block; void NO_RETURN abort(Context*); @@ -106,6 +107,12 @@ class Stack: public Compiler::StackElement { Stack* next; }; +class MultiReadPair { + public: + Value* value; + MultiRead* read; +}; + class MyState: public Compiler::State { public: MyState(Stack* stack, Value** locals, Event* predecessor, @@ -344,7 +351,7 @@ class CodePromise: public Promise { unsigned machineOffset(Context* c, int logicalIp) { - return c->logicalCode[n]->machineOffset->value(); + return c->logicalCode[logicalIp]->machineOffset->value(); } class IpPromise: public Promise { @@ -426,13 +433,19 @@ count(Cell* c) return n; } +class StubReadPair { + public: + Value* value; + StubRead* read; +}; + class Event { public: Event(Context* c): next(0), stack(c->stack), locals(c->locals), promises(0), reads(0), junctionSites(0), savedSites(0), predecessors(0), successors(0), block(0), logicalInstruction(c->logicalCode[c->logicalIp]), - state(c->state), junctionReads(0), junctionReadCount(0), readCount(0) + state(c->state), junctionReads(0), readCount(0) { assert(c, c->logicalIp >= 0); @@ -479,7 +492,6 @@ class Event { LogicalInstruction* logicalInstruction; MyState* state; StubReadPair* junctionReads; - unsigned junctionReadCount; unsigned readCount; }; @@ -1191,12 +1203,6 @@ multiRead(Context* c) return new (c->zone->allocate(sizeof(MultiRead))) MultiRead(); } -class MultiReadPair { - public: - Value* value; - MultiRead* read; -}; - class StubRead: public Read { public: StubRead(): @@ -1263,12 +1269,6 @@ stubRead(Context* c) return new (c->zone->allocate(sizeof(StubRead))) StubRead(); } -class StubReadPair { - public: - Value* value; - StubRead* read; -}; - Site* targetOrRegister(Context* c, Value* v) { @@ -2653,12 +2653,12 @@ populateSources(Context* c, Event* e) } void -addStubRead(Context* c, Value* v, StubReadPair* reads, unsigned* count) +addStubRead(Context* c, Value* v, StubReadPair** reads) { if (v) { StubRead* r; if (v->visited) { - r = static_cast(e->lastRead); + r = static_cast(v->lastRead); } else { v->visited = true; @@ -2666,7 +2666,7 @@ addStubRead(Context* c, Value* v, StubReadPair* reads, unsigned* count) addRead(c, 0, v, r); } - StubReadPair* p = reads + ((*count)++); + StubReadPair* p = (*reads)++; p->value = v; p->read = r; } @@ -2677,26 +2677,24 @@ populateJunctionReads(Context* c, Event* e) { StubReadPair* reads = static_cast (c->zone->allocate(sizeof(StubReadPair) * frameFootprint(c, c->stack))); - unsigned count = 0; + + e->junctionReads = reads; for (unsigned i = 0; i < c->localFootprint; ++i) { - addStubRead(c, c->locals[i], reads, &count); + addStubRead(c, c->locals[i], &reads); } for (Stack* s = c->stack; s; s = s->next) { - addStubRead(c, s->value, reads, &count); + addStubRead(c, s->value, &reads); } - - for (unsigned i = 0; i < count; ++i) { - reads[i]->value->visited = false; + + for (StubReadPair* r = e->junctionReads; r < reads; ++r) { + r->value->visited = false; } - - e->junctionReads = reads; - e->junctionReadCount = count; } void -updateStubRead(Context* c, StubReadPair* p, Read* r) +updateStubRead(Context*, StubReadPair* p, Read* r) { if (p->read->read == 0) p->read->read = r; } @@ -2705,7 +2703,6 @@ void updateJunctionReads(Context* c, Event* e, Event* successor) { StubReadPair* reads = e->junctionReads; - unsigned count = 0; for (unsigned i = 0; i < c->localFootprint; ++i) { updateStubRead(c, reads++, successor->locals[i]->reads); @@ -2774,7 +2771,7 @@ compile(Context* c) MyState* state = e->state; if (state) { for (unsigned i = 0; i < state->readCount; ++i) { - MultiReadPair* p = state->reads[i]; + MultiReadPair* p = state->reads + i; p->value->reads = p->read->nextTarget(); } } @@ -2782,7 +2779,7 @@ compile(Context* c) if (e->predecessors) { Event* predecessor = static_cast(e->predecessors->value); if (e->predecessors->next) { - for (Cell* cell = e->predecessors->next; cell; cell = cell->next) { + for (Cell* cell = e->predecessors; cell->next; cell = cell->next) { updateJunctionReads(c, static_cast(cell->value), e); } setSites(c, e, predecessor->junctionSites); @@ -2845,7 +2842,7 @@ void allocateTargets(Context* c, MyState* state) { for (unsigned i = 0; i < state->readCount; ++i) { - MultiReadPair* p = state->reads[i]; + MultiReadPair* p = state->reads + i; p->value->lastRead = p->read; p->read->allocateTarget(c); } @@ -2870,9 +2867,8 @@ MyState* saveState(Context* c) { MyState* state = new - (c->zone->allocate(sizeof(MyState)) - + (c->zone->allocate - (sizeof(MultiReadPair) * frameFootprint(c, c->stack)))) + (c->zone->allocate + (sizeof(MyState) + (sizeof(MultiReadPair) * frameFootprint(c, c->stack)))) MyState(c->stack, c->locals, c->predecessor, c->logicalIp); if (c->predecessor) { @@ -2889,7 +2885,7 @@ saveState(Context* c) } for (unsigned i = 0; i < count; ++i) { - state->reads[i]->value->visited = false; + state->reads[i].value->visited = false; } state->readCount = count; @@ -2910,7 +2906,7 @@ restoreState(Context* c, MyState* s) c->stack = s->stack; c->locals = s->locals; c->predecessor = s->predecessor; - c->logicalIp = logicalIp; + c->logicalIp = s->logicalIp; if (c->predecessor) { c->state = s; diff --git a/src/compiler.h b/src/compiler.h index ce1e1f395c..380b78a1ad 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -63,6 +63,7 @@ class Compiler { virtual Operand* stackTop() = 0; + virtual void push(unsigned size) = 0; virtual void push(unsigned size, Operand* value) = 0; virtual Operand* pop(unsigned size) = 0; virtual void pushed() = 0;