git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@19 379699f6-c40d-0410-875b-85095c16579estable
parent
c885953efd
commit
6ef8416dd6
@ -0,0 +1,99 @@ |
||||
/* SequentialBlock (c) 1998 Jochen Hoenicke |
||||
* |
||||
* You may distribute under the terms of the GNU General Public License. |
||||
* |
||||
* IN NO EVENT SHALL JOCHEN HOENICKE BE LIABLE TO ANY PARTY FOR DIRECT, |
||||
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF |
||||
* THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF JOCHEN HOENICKE |
||||
* HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
* JOCHEN HOENICKE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||||
* PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" |
||||
* BASIS, AND JOCHEN HOENICKE HAS NO OBLIGATION TO PROVIDE MAINTENANCE, |
||||
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
||||
* |
||||
* $Id$ |
||||
*/ |
||||
package jode.flow; |
||||
|
||||
/** |
||||
* A sequential block combines exactly two structured blocks to a new |
||||
* one. The first sub block mustn't be another sequential block, |
||||
* instead the second sub block should be used for this. This |
||||
* condition is temporarily violated, while the t1 transformation is |
||||
* done. |
||||
*/ |
||||
public class SequentialBlock { |
||||
StructuredBlock[] subBlocks; |
||||
|
||||
public SequentialBlock() { |
||||
subBlocks = new StructuredBlock[2]; |
||||
} |
||||
|
||||
public setFirst(StructuredBlock sb) { |
||||
subBlocks[0] = sb; |
||||
sb.outer = this; |
||||
} |
||||
|
||||
public setSecond(StructuredBlock sb) { |
||||
subBlocks[1] = sb; |
||||
sb.outer = this; |
||||
} |
||||
|
||||
/** |
||||
* Returns the block where the control will normally flow to, when |
||||
* the given sub block is finished (<em>not</em> ignoring the jump |
||||
* after this block). (This is overwritten by SequentialBlock and |
||||
* SwitchBlock). If this isn't called with a direct sub block, |
||||
* the behaviour is undefined, so take care. |
||||
* @return null, if the control flows to another FlowBlock. */ |
||||
StructuredBlock getNextBlock(StructuredBlock subBlock) { |
||||
if (subBlock == subBlocks[0]) |
||||
return subBlocks[1]; |
||||
return getNextBlock(); |
||||
} |
||||
|
||||
FlowBlock getNextFlowBlock(StructuredBlock subBlock) { |
||||
if (subBlock == subBlocks[0]) |
||||
return null; |
||||
return getNextFlowBlock(); |
||||
} |
||||
|
||||
/** |
||||
* Replaces the given sub block with a new block. |
||||
* @param oldBlock the old sub block. |
||||
* @param newBlock the new sub block. |
||||
* @return false, if oldBlock wasn't a direct sub block. |
||||
*/ |
||||
boolean replaceSubBlock(StructuredBlock oldBlock, |
||||
StructuredBlock newBlock) { |
||||
for (int i=0; i<2; i++) { |
||||
if (subBlocks[i] == oldBlock) { |
||||
subBlocks[i] = newBlock; |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* Returns all sub block of this structured block. |
||||
*/ |
||||
StructuredBlock[] getSubBlocks() { |
||||
return subBlocks; |
||||
} |
||||
|
||||
/** |
||||
* Determines if there is a sub block, that flows through to the end |
||||
* of this block. If this returns true, you know that jump is null. |
||||
* @return true, if the jump may be safely changed. |
||||
*/ |
||||
public boolean jumpMayBeChanged() { |
||||
return (subBlocks[1].jump != null || subBlocks[1].jumpMayBeChanged()); |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,156 @@ |
||||
/* VariableSet (c) 1998 Jochen Hoenicke |
||||
* |
||||
* You may distribute under the terms of the GNU General Public License. |
||||
* |
||||
* IN NO EVENT SHALL JOCHEN HOENICKE BE LIABLE TO ANY PARTY FOR DIRECT, |
||||
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF |
||||
* THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF JOCHEN HOENICKE |
||||
* HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
* JOCHEN HOENICKE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||||
* PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" |
||||
* BASIS, AND JOCHEN HOENICKE HAS NO OBLIGATION TO PROVIDE MAINTENANCE, |
||||
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
||||
* |
||||
* $Id$ |
||||
*/ |
||||
package jode.Flow; |
||||
|
||||
/** |
||||
* This class represents a set of Variables, which are mainly used in |
||||
* the in/out sets of StructuredBlock. The type of the Variables is |
||||
* LocalInfo. <p> |
||||
* |
||||
* It defines some Helper-Function, like intersecting, merging, union |
||||
* and difference. <p> |
||||
* |
||||
* Note that a variable set can contain LocalInfos that use the same |
||||
* slot, but are different. |
||||
*/ |
||||
public class VariableSet extends java.util.Vector { |
||||
/** |
||||
* Creates a new empty variable set |
||||
*/ |
||||
public VariableSet() { |
||||
} |
||||
|
||||
/** |
||||
* Adds a local variable to the variable set. |
||||
* @param li The local variable of type LocalInfo. |
||||
*/ |
||||
public addElement(LocalInfo li) { |
||||
super.addElement((Object)li); |
||||
} |
||||
|
||||
/** |
||||
* Merges the current VariableSet with another. For all slots occuring |
||||
* in both variable sets, all corresponding LocalInfos are merged. |
||||
* The variable sets are not changed (use union for this). |
||||
* @param vs the other variable set. |
||||
*/ |
||||
public void merge(VariableSet vs) { |
||||
for (int i=0; i<elementCount; i++) { |
||||
LocalInfo li1 = ((LocalInfo) elementData[i]).getLocalInfo(); |
||||
for (int j=0; j<vs.elementCount; j++) { |
||||
LocalInfo li2 = ((LocalInfo) vs.elementData[j]).getLocalInfo(); |
||||
if (li1.getSlot() = li2.getSlot()) { |
||||
li1.combineWith(li2); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Intersects the current VariableSet with another and returns the |
||||
* intersection. The existing VariableSet are not changed. |
||||
* @param vs the other variable set. |
||||
*/ |
||||
public VariableSet intersect(VariableSet vs) { |
||||
VariableSet intersection = new VariableSet(); |
||||
for (int i=0; i<elementCount; i++) { |
||||
LocalInfo li1 = ((LocalInfo) elementData[i]).getLocalInfo(); |
||||
for (int j=0; j<vs.elementCount; j++) { |
||||
LocalInfo li2 = ((LocalInfo) vs.elementData[j]).getLocalInfo(); |
||||
if (li1.getSlot() = li2.getSlot()) { |
||||
if (!intersection.contains(li1)) |
||||
intersection.addElement(li1); |
||||
if (!intersection.contains(li2)) |
||||
intersection.addElement(li2); |
||||
} |
||||
} |
||||
} |
||||
return intersection; |
||||
} |
||||
|
||||
/** |
||||
* Union the other variable set to the current. |
||||
*/ |
||||
public void union(VariableSet vs) { |
||||
int oldSize = elementCount; |
||||
iloop: |
||||
for (int i=0; i< vs.elementCount; i++) { |
||||
LocalInfo li2 = ((LocalInfo) vs.elementData[i]).getLocalInfo(); |
||||
/* check if this particular local info was already in the set */ |
||||
for (int j=0; j< oldSize; j++) { |
||||
LocalInfo li1 = ((LocalInfo) elementData[j]).getLocalInfo(); |
||||
if (li1 == li2) |
||||
/* Yes it was, take next variable */ |
||||
continue iloop; |
||||
} |
||||
addElement(li2); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Add the other variable set to the current, except when the slot |
||||
* is already in the current set. |
||||
*/ |
||||
public void union(VariableSet vs) { |
||||
int oldSize = elementCount; |
||||
iloop: |
||||
for (int i=0; i< vs.elementCount; i++) { |
||||
LocalInfo li2 = (LocalInfo) vs.elementData[i]; |
||||
/* check if this slot was already overwritten by this block */ |
||||
for (int j=0; j< oldSize; j++) { |
||||
LocalInfo li1 = (LocalInfo) elementData[j]; |
||||
if (li1.getSlot() == li2.getSlot()) |
||||
/* Yes it was, take next variable */ |
||||
continue iloop; |
||||
} |
||||
addElement(li2.getLocalInfo()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Substract the other variable set from this one. This removes |
||||
* every variable from this set, that uses a slot in the other |
||||
* variable set. |
||||
* @param vs The other variable set. |
||||
*/ |
||||
public void subtract(VariableSet vs) { |
||||
/* We count from top to bottom to have easier reorganization. |
||||
* Note, that the variables have not to be in any particular |
||||
* order. */ |
||||
int newCount = elementCount |
||||
for (int i=newCount-1; i>=0; i--) { |
||||
LocalInfo li1 = (LocalInfo) elementData[i]; |
||||
for (int j=0; j<vs.elementCount; j++) { |
||||
LocalInfo li2 = (LocalInfo) vs.elementData[j]; |
||||
if (li1.getSlot() == li2.getSlot()) { |
||||
/* remove the element from this variable list. */ |
||||
newCount--; |
||||
elementData[i] = elementData[newCount]; |
||||
/* break the j-loop */ |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
/* Now set the new size */ |
||||
setSize(newCount); |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,38 @@ |
||||
#----- PSP time and defect log-file ----- |
||||
# Project/Program: |
||||
# Author: |
||||
# Date of creation: 1998-09-16 18:01:38 |
||||
|
||||
#! begin=b; end=e; interrupt=i; defect=e |
||||
#! phase=ds |
||||
#! phase="design review"=dr |
||||
#! phase="code"=cd |
||||
#! phase=cr; phase=cp; phase=te; phase=pm |
||||
#! phase="test"=te |
||||
|
||||
#-------------------------------------------------- |
||||
1998-09-16 18:01:38 bcd |
||||
1998-09-16 18:11:37 be |
||||
1998-09-16 18:11:46 ee cd file ty EmptyBlock.java InstructionBlock.java |
||||
1998-09-16 18:44:48 ecd |
||||
1998-09-16 18:44:54 bdr |
||||
Need to rethink flowBlock union. |
||||
1998-09-16 19:49:35 edr |
||||
1998-09-17 14:14:57 bcd |
||||
1998-09-17 14:30:33 ecd |
||||
1998-09-17 14:30:38 bdr |
||||
What to do with in/out-Vectors? |
||||
1998-09-17 14:55:48 bi |
||||
auf Klo |
||||
Kaffe kochen |
||||
1998-09-17 15:01:09 ei |
||||
1998-09-17 15:33:08 edr |
||||
1998-09-17 15:33:14 bcd |
||||
1998-09-17 16:04:36 bi |
||||
zweiten Kaffe holen |
||||
1998-09-17 16:06:25 ei |
||||
1998-09-17 17:08:54 bi |
||||
auf klo |
||||
1998-09-17 17:11:45 ei |
||||
1998-09-17 17:49:35 ecd |
||||
|
Loading…
Reference in new issue