git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@62 379699f6-c40d-0410-875b-85095c16579estable
parent
a75ab0fb9f
commit
f26415d787
@ -0,0 +1,86 @@ |
|||||||
|
/* |
||||||
|
* CompleteSynchronized (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; |
||||||
|
import jode.MonitorEnterOperator; |
||||||
|
import jode.ComplexExpression; |
||||||
|
import jode.LocalLoadOperator; |
||||||
|
import jode.LocalStoreOperator; |
||||||
|
import jode.Expression; |
||||||
|
|
||||||
|
public class CompleteSynchronized implements Transformation { |
||||||
|
|
||||||
|
/** |
||||||
|
* This combines the monitorenter and the initial expression |
||||||
|
* into a synchronized statement |
||||||
|
* @param flow The FlowBlock that is transformed |
||||||
|
*/ |
||||||
|
public boolean transform(FlowBlock flow) { |
||||||
|
|
||||||
|
SynchronizedBlock synBlock; |
||||||
|
try { |
||||||
|
synBlock = (SynchronizedBlock) flow.lastModified; |
||||||
|
|
||||||
|
SequentialBlock sequBlock = |
||||||
|
(SequentialBlock) synBlock.outer; |
||||||
|
|
||||||
|
ComplexExpression monenter = (ComplexExpression) |
||||||
|
((InstructionBlock) sequBlock.subBlocks[0]).getInstruction(); |
||||||
|
|
||||||
|
if (!(monenter.getOperator() instanceof MonitorEnterOperator) |
||||||
|
|| ((LocalLoadOperator) monenter.getSubExpressions()[0]). |
||||||
|
getLocalInfo() != synBlock.local.getLocalInfo()) |
||||||
|
return false; |
||||||
|
} catch (ClassCastException ex) { |
||||||
|
return false; |
||||||
|
} catch (NullPointerException ex) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (jode.Decompiler.isVerbose) |
||||||
|
System.err.print("f"); |
||||||
|
|
||||||
|
synBlock.isEntered = true; |
||||||
|
synBlock.replace(synBlock.outer, synBlock); |
||||||
|
|
||||||
|
Expression object; |
||||||
|
try { |
||||||
|
SequentialBlock sequBlock = |
||||||
|
(SequentialBlock) synBlock.outer; |
||||||
|
|
||||||
|
ComplexExpression assign = (ComplexExpression) |
||||||
|
((InstructionBlock) sequBlock.subBlocks[0]).getInstruction(); |
||||||
|
|
||||||
|
if (((LocalStoreOperator) assign.getOperator()). |
||||||
|
getLocalInfo() != synBlock.local.getLocalInfo()) |
||||||
|
return true; |
||||||
|
|
||||||
|
object = assign.getSubExpressions()[0]; |
||||||
|
|
||||||
|
} catch (ClassCastException ex) { |
||||||
|
return true; |
||||||
|
} catch (NullPointerException ex) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
synBlock.object = object; |
||||||
|
synBlock.replace(synBlock.outer, synBlock); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
/* SynchronizedBlock - Copyright (C) 1997-1998 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
package jode.flow; |
||||||
|
import jode.Instruction; |
||||||
|
import jode.LocalInfo; |
||||||
|
import jode.TabbedPrintWriter; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class represents a synchronized structured block. |
||||||
|
* |
||||||
|
* @author Jochen Hoenicke |
||||||
|
*/ |
||||||
|
public class SynchronizedBlock extends StructuredBlock { |
||||||
|
|
||||||
|
Instruction object; |
||||||
|
LocalInfo local; |
||||||
|
boolean isEntered; |
||||||
|
|
||||||
|
StructuredBlock bodyBlock; |
||||||
|
|
||||||
|
public SynchronizedBlock(LocalInfo local) { |
||||||
|
this.local = local; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sets the body block. |
||||||
|
*/ |
||||||
|
public void setBodyBlock(StructuredBlock body) { |
||||||
|
bodyBlock = body; |
||||||
|
body.outer = this; |
||||||
|
body.setFlowBlock(flowBlock); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns all sub block of this structured block. |
||||||
|
*/ |
||||||
|
public StructuredBlock[] getSubBlocks() { |
||||||
|
return new StructuredBlock[] { bodyBlock }; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 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. |
||||||
|
*/ |
||||||
|
public boolean replaceSubBlock(StructuredBlock oldBlock, |
||||||
|
StructuredBlock newBlock) { |
||||||
|
if (bodyBlock == oldBlock) |
||||||
|
bodyBlock = newBlock; |
||||||
|
else |
||||||
|
return false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public void dumpDeclaration(TabbedPrintWriter writer, LocalInfo local) |
||||||
|
throws java.io.IOException |
||||||
|
{ |
||||||
|
if (local.getLocalInfo() != this.local.getLocalInfo() |
||||||
|
|| object == null) |
||||||
|
super.dumpDeclaration(writer, local); |
||||||
|
} |
||||||
|
|
||||||
|
public void dumpInstruction(TabbedPrintWriter writer) |
||||||
|
throws java.io.IOException |
||||||
|
{ |
||||||
|
boolean needsBrace = bodyBlock.needsBraces(); |
||||||
|
if (!isEntered) |
||||||
|
writer.print("/* missing monitorenter */"); |
||||||
|
writer.println("synchronized (" |
||||||
|
+ (object != null |
||||||
|
? object.simplify().toString() |
||||||
|
: local.getName()) + ")" |
||||||
|
+ (needsBrace ? " {" :"")); |
||||||
|
writer.tab(); |
||||||
|
bodyBlock.dumpSource(writer); |
||||||
|
writer.untab(); |
||||||
|
if (needsBrace) |
||||||
|
writer.println("}"); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue