private void markStackEntryAfter(int instructionOffset, int stackIndex) { if (!isStackEntryNecessaryAfter(instructionOffset, stackIndex)) { if (DEBUG) System.out.print("["+instructionOffset+".s"+stackIndex+"],"); stacksNecessaryAfter[instructionOffset][stackIndex] = true; if (maxMarkedOffset < instructionOffset) { maxMarkedOffset = instructionOffset; } } }
/** * Returns whether the given stack entry is present after execution of the * instruction at the given offset. */ private boolean isStackEntriesNecessaryAfter(int instructionOffset, int stackIndex1, int stackIndex2) { boolean present1 = isStackEntryNecessaryAfter(instructionOffset, stackIndex1); boolean present2 = isStackEntryNecessaryAfter(instructionOffset, stackIndex2); // if (present1 ^ present2) // { // throw new UnsupportedOperationException("Can't handle partial use of dup2 instructions"); // } return present1 || present2; }
private boolean isAnyStackEntryNecessaryAfter(InstructionOffsetValue instructionOffsets, int stackIndex) { int offsetCount = instructionOffsets.instructionOffsetCount(); for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) { if (isStackEntryNecessaryAfter(instructionOffsets.instructionOffset(offsetIndex), stackIndex)) { return true; } } return false; }
boolean stackEntryPresent0 = isStackEntryNecessaryAfter(dupOffset, top - 0); boolean stackEntryPresent1 = isStackEntryNecessaryAfter(dupOffset, top - 1); boolean stackEntryPresent0 = isStackEntryNecessaryAfter(dupOffset, top - 0); boolean stackEntryPresent1 = isStackEntryNecessaryAfter(dupOffset, top - 1); boolean stackEntryPresent2 = isStackEntryNecessaryAfter(dupOffset, top - 2); boolean stackEntryPresent0 = isStackEntryNecessaryAfter(dupOffset, top - 0); boolean stackEntryPresent1 = isStackEntryNecessaryAfter(dupOffset, top - 1); boolean stackEntryPresent2 = isStackEntryNecessaryAfter(dupOffset, top - 2); boolean stackEntryPresent3 = isStackEntryNecessaryAfter(dupOffset, top - 3); boolean stackEntryPresent2 = isStackEntryNecessaryAfter(dupOffset, top - 2); boolean stackEntriesPresent34 = isStackEntriesNecessaryAfter(dupOffset, top - 3, top - 4); boolean stackEntryPresent2 = isStackEntryNecessaryAfter(dupOffset, top - 2); boolean stackEntryPresent3 = isStackEntryNecessaryAfter(dupOffset, top - 3); boolean stackEntriesPresent45 = isStackEntriesNecessaryAfter(dupOffset, top - 4, top - 5); boolean stackEntryPresent0 = isStackEntryNecessaryAfter(dupOffset, top - 0); boolean stackEntryPresent1 = isStackEntryNecessaryAfter(dupOffset, top - 1);
/** * Marks the stack entry and the corresponding producing instructions * of the consumer at the given offset, if the stack entry of the * consumer is marked. * @param consumerOffset the offset of the consumer. * @param consumerStackIndex the index of the stack entry to be checked * (counting from the top). * @param producerStackIndex the index of the stack entry to be marked * (counting from the top). */ private void conditionallyMarkStackEntryProducers(int consumerOffset, int consumerStackIndex, int producerStackIndex) { int top = partialEvaluator.getStackAfter(consumerOffset).size() - 1; if (isStackEntryNecessaryAfter(consumerOffset, top - consumerStackIndex)) { markStackEntryProducers(consumerOffset, producerStackIndex); } }