move loop unrolling code to wala from Miniatur/MemSAT
This commit is contained in:
parent
fae5c86114
commit
f7a7d66b28
|
@ -16,8 +16,8 @@ import com.ibm.wala.cast.java.translator.polyglot.IRTranslatorExtension;
|
|||
import com.ibm.wala.cast.java.translator.polyglot.JavaIRTranslatorExtension;
|
||||
import com.ibm.wala.cast.java.translator.polyglot.PolyglotJavaSourceAnalysisEngine;
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
*/
|
||||
package com.ibm.wala.cast.java.translator.polyglot;
|
||||
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
|
||||
public interface IRTranslatorExtension {
|
||||
void setSourceLoader(PolyglotSourceLoaderImpl jsli);
|
||||
|
|
|
@ -21,7 +21,7 @@ import polyglot.frontend.JLScheduler;
|
|||
import polyglot.frontend.Job;
|
||||
import polyglot.frontend.Scheduler;
|
||||
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
|
||||
/**
|
||||
* A Polyglot extension descriptor for a test harness extension that generates WALA IR for
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
package com.ibm.wala.cast.java.translator.polyglot;
|
||||
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.rewrite.AstLoopUnwinder;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
|
||||
public class PolyglotUnwoundIRTranslatorExtension
|
||||
extends JavaIRTranslatorExtension
|
||||
{
|
||||
private final int unrollDepth;
|
||||
|
||||
public PolyglotUnwoundIRTranslatorExtension(int unrollDepth) {
|
||||
this.unrollDepth = unrollDepth;
|
||||
}
|
||||
|
||||
public CAstRewriterFactory<CAstRewriter.RewriteContext<AstLoopUnwinder.UnwindKey>,AstLoopUnwinder.UnwindKey> getCAstRewriterFactory() {
|
||||
return new CAstRewriterFactory<CAstRewriter.RewriteContext<AstLoopUnwinder.UnwindKey>,AstLoopUnwinder.UnwindKey>() {
|
||||
public AstLoopUnwinder createCAstRewriter(CAst ast) {
|
||||
return new AstLoopUnwinder(ast, true, unrollDepth);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
|
@ -8,7 +8,7 @@ import com.ibm.wala.cast.tree.CAstEntity;
|
|||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.classLoader.CallSiteReference;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
||||
|
|
|
@ -19,8 +19,8 @@ import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl;
|
|||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.util.CAstPrinter;
|
||||
import com.ibm.wala.classLoader.ModuleEntry;
|
||||
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
package com.ibm.wala.cast.js.translator;
|
||||
|
||||
import com.ibm.wala.cast.ir.translator.TranslatorToCAst;
|
||||
import com.ibm.wala.cast.js.translator.JavaScriptLoopUnwindingTranslatorFactory;
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.classLoader.SourceModule;
|
||||
|
||||
public class CAstRhinoLoopUnwindingTranslatorFactory
|
||||
extends JavaScriptLoopUnwindingTranslatorFactory
|
||||
{
|
||||
public CAstRhinoLoopUnwindingTranslatorFactory(int unwindFactor) {
|
||||
super(unwindFactor);
|
||||
}
|
||||
|
||||
public CAstRhinoLoopUnwindingTranslatorFactory() {
|
||||
this(3);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TranslatorToCAst translateInternal(CAst Ast, SourceModule M, String N) {
|
||||
return new CAstRhinoTranslator(M, true);
|
||||
}
|
||||
}
|
||||
|
|
@ -17,9 +17,9 @@ import java.util.List;
|
|||
import com.ibm.wala.cast.ir.translator.TranslatorToCAst;
|
||||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter.CopyKey;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter.RewriteContext;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.CopyKey;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.RewriteContext;
|
||||
import com.ibm.wala.classLoader.SourceFileModule;
|
||||
import com.ibm.wala.classLoader.SourceModule;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ import com.ibm.wala.cast.tree.CAst;
|
|||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
|
||||
|
|
|
@ -15,8 +15,8 @@ import com.ibm.wala.cast.tree.CAst;
|
|||
import com.ibm.wala.cast.tree.CAstControlFlowMap;
|
||||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter;
|
||||
import com.ibm.wala.cast.util.CAstPattern;
|
||||
import com.ibm.wala.cast.util.CAstPattern.Segments;
|
||||
import com.ibm.wala.cfg.AbstractCFG;
|
||||
|
|
|
@ -30,7 +30,7 @@ import com.ibm.wala.cast.loader.AstMethod.DebuggingInformation;
|
|||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.visit.CAstVisitor;
|
||||
import com.ibm.wala.cast.types.AstMethodReference;
|
||||
import com.ibm.wala.cast.util.CAstPrinter;
|
||||
|
|
|
@ -23,9 +23,9 @@ import com.ibm.wala.cast.tree.CAstControlFlowMap;
|
|||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
|
|
@ -46,10 +46,10 @@ import com.ibm.wala.cast.tree.CAstEntity;
|
|||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.CAstNodeTypeMap;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.cast.tree.impl.CAstSymbolImpl;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
|
|
@ -20,9 +20,9 @@ import com.ibm.wala.cast.js.ipa.callgraph.correlations.CorrelationSummary;
|
|||
import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory;
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.classLoader.IMethod;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ import com.ibm.wala.cast.tree.CAstQualifier;
|
|||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
|
||||
import com.ibm.wala.cast.tree.CAstType;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter.Rewrite;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.Rewrite;
|
||||
import com.ibm.wala.util.collections.EmptyIterator;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
package com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction;
|
||||
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter.NoKey;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter.NoKey;
|
||||
|
||||
/**
|
||||
* Representation of a node's position in a CAst entity's syntax tree. The position is stored as a zipper
|
||||
|
|
|
@ -61,7 +61,7 @@ import com.ibm.wala.cast.tree.CAst;
|
|||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.CAstQualifier;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.types.AstMethodReference;
|
||||
import com.ibm.wala.cfg.AbstractCFG;
|
||||
import com.ibm.wala.classLoader.CallSiteReference;
|
||||
|
|
|
@ -13,7 +13,7 @@ package com.ibm.wala.cast.js.loader;
|
|||
import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory;
|
||||
import com.ibm.wala.cast.js.types.JavaScriptTypes;
|
||||
import com.ibm.wala.cast.loader.SingleClassLoaderFactory;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
package com.ibm.wala.cast.js.translator;
|
||||
|
||||
import com.ibm.wala.cast.ir.translator.TranslatorToCAst;
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.rewrite.AstLoopUnwinder;
|
||||
import com.ibm.wala.cast.tree.rewrite.AstLoopUnwinder.UnwindKey;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.RewriteContext;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.classLoader.SourceFileModule;
|
||||
import com.ibm.wala.classLoader.SourceModule;
|
||||
|
||||
public abstract class JavaScriptLoopUnwindingTranslatorFactory
|
||||
implements JavaScriptTranslatorFactory
|
||||
{
|
||||
private final int unwindFactor;
|
||||
|
||||
protected JavaScriptLoopUnwindingTranslatorFactory(int unwindFactor) {
|
||||
this.unwindFactor = unwindFactor;
|
||||
}
|
||||
|
||||
JavaScriptLoopUnwindingTranslatorFactory() {
|
||||
this(3);
|
||||
}
|
||||
|
||||
protected abstract TranslatorToCAst translateInternal(CAst Ast, SourceModule M, String N);
|
||||
|
||||
public TranslatorToCAst make(CAst ast, final SourceModule M) {
|
||||
String N;
|
||||
if (M instanceof SourceFileModule) {
|
||||
N = ((SourceFileModule) M).getClassName();
|
||||
} else {
|
||||
N = M.getName();
|
||||
}
|
||||
|
||||
TranslatorToCAst xlator = translateInternal(ast, M, N);
|
||||
xlator.addRewriter(new CAstRewriterFactory<CAstRewriter.RewriteContext<AstLoopUnwinder.UnwindKey>,AstLoopUnwinder.UnwindKey>() {
|
||||
public CAstRewriter<RewriteContext<UnwindKey>, UnwindKey> createCAstRewriter(CAst ast) {
|
||||
return new AstLoopUnwinder(ast, true, unwindFactor);
|
||||
}
|
||||
}, false);
|
||||
|
||||
return xlator;
|
||||
}
|
||||
}
|
||||
|
|
@ -7,8 +7,8 @@ import com.ibm.wala.cast.tree.CAst;
|
|||
import com.ibm.wala.cast.tree.CAstControlFlowMap;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter.CopyKey;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.CopyKey;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
import com.ibm.wala.util.debug.Assertions;
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ Export-Package: com.ibm.wala.cast.analysis.typeInference,
|
|||
com.ibm.wala.cast.tree,
|
||||
com.ibm.wala.cast.tree.impl,
|
||||
com.ibm.wala.cast.tree.pattern,
|
||||
com.ibm.wala.cast.tree.rewrite,
|
||||
com.ibm.wala.cast.tree.visit,
|
||||
com.ibm.wala.cast.types,
|
||||
com.ibm.wala.cast.util
|
||||
|
|
|
@ -45,12 +45,12 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
|||
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
|
||||
import com.ibm.wala.cast.tree.CAstSymbol;
|
||||
import com.ibm.wala.cast.tree.CAstType;
|
||||
import com.ibm.wala.cast.tree.impl.CAstCloner;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstSymbolImpl;
|
||||
import com.ibm.wala.cast.tree.impl.CAstSymbolImplBase;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstCloner;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.visit.CAstVisitor;
|
||||
import com.ibm.wala.cast.types.AstTypeReference;
|
||||
import com.ibm.wala.cast.util.CAstPrinter;
|
||||
|
|
|
@ -5,8 +5,8 @@ import java.util.Map;
|
|||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.CAstControlFlowMap;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstBasicRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstBasicRewriter;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
||||
public abstract class ConstantFoldingRewriter extends CAstBasicRewriter {
|
||||
|
|
|
@ -8,14 +8,14 @@ import java.util.Map;
|
|||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.impl.CAstCloner;
|
||||
import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.CAstNodeTypeMapRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter.CopyKey;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriter.RewriteContext;
|
||||
import com.ibm.wala.cast.tree.impl.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.impl.CAstSourcePositionRecorder;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstCloner;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.CopyKey;
|
||||
import com.ibm.wala.cast.tree.rewrite.CAstRewriter.RewriteContext;
|
||||
|
||||
public interface TranslatorToCAst {
|
||||
public <C extends RewriteContext<K>, K extends CopyKey<K>> void addRewriter(CAstRewriterFactory<C, K> factory, boolean prepend);
|
||||
|
|
|
@ -0,0 +1,134 @@
|
|||
package com.ibm.wala.cast.tree.rewrite;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
import com.ibm.wala.cast.tree.CAstControlFlowMap;
|
||||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
||||
public class AstLoopUnwinder
|
||||
extends CAstRewriter<CAstRewriter.RewriteContext<AstLoopUnwinder.UnwindKey>,AstLoopUnwinder.UnwindKey>
|
||||
{
|
||||
|
||||
public static class UnwindKey implements CAstRewriter.CopyKey<UnwindKey> {
|
||||
private int iteration;
|
||||
private UnwindKey rest;
|
||||
|
||||
private UnwindKey(int iteration, UnwindKey rest) {
|
||||
this.rest = rest;
|
||||
this.iteration = iteration;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return iteration * (rest == null? 1: rest.hashCode());
|
||||
}
|
||||
|
||||
public UnwindKey parent() {
|
||||
return rest;
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
return (o instanceof UnwindKey) &&
|
||||
((UnwindKey)o).iteration == iteration &&
|
||||
( rest==null? ((UnwindKey)o).rest == null: rest.equals(((UnwindKey)o).rest) );
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "#"+iteration+ ((rest==null)?"":rest.toString());
|
||||
}
|
||||
}
|
||||
|
||||
// private static final boolean DEBUG = false;
|
||||
|
||||
private final int unwindFactor;
|
||||
|
||||
public AstLoopUnwinder(CAst Ast, boolean recursive) {
|
||||
this(Ast, recursive, 3);
|
||||
}
|
||||
|
||||
public AstLoopUnwinder(CAst Ast, boolean recursive, int unwindFactor) {
|
||||
super(Ast, recursive, new RootContext());
|
||||
this.unwindFactor = unwindFactor;
|
||||
}
|
||||
|
||||
public CAstEntity translate(CAstEntity original) {
|
||||
return rewrite(original);
|
||||
}
|
||||
|
||||
private static class RootContext implements RewriteContext<UnwindKey> {
|
||||
|
||||
public UnwindKey key() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private class LoopContext implements RewriteContext<UnwindKey> {
|
||||
private final CAstRewriter.RewriteContext<UnwindKey> parent;
|
||||
private final int iteration;
|
||||
|
||||
private LoopContext(int iteration, RewriteContext<UnwindKey> parent) {
|
||||
this.iteration = iteration;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public UnwindKey key() {
|
||||
return new UnwindKey(iteration, parent.key());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected CAstNode flowOutTo(Map nodeMap,
|
||||
CAstNode oldSource,
|
||||
Object label,
|
||||
CAstNode oldTarget,
|
||||
CAstControlFlowMap orig,
|
||||
CAstSourcePositionMap src)
|
||||
{
|
||||
assert oldTarget == CAstControlFlowMap.EXCEPTION_TO_EXIT;
|
||||
return oldTarget;
|
||||
}
|
||||
|
||||
protected CAstNode copyNodes(CAstNode n, final CAstControlFlowMap cfg, RewriteContext<UnwindKey> c, Map<Pair<CAstNode,UnwindKey>,CAstNode> nodeMap) {
|
||||
if (n instanceof CAstOperator) {
|
||||
return n;
|
||||
} else if (n.getValue() != null) {
|
||||
return Ast.makeConstant( n.getValue() );
|
||||
} else if (n.getKind() == CAstNode.LOOP) {
|
||||
CAstNode test = n.getChild(0);
|
||||
CAstNode body = n.getChild(1);
|
||||
|
||||
int count = unwindFactor;
|
||||
RewriteContext<UnwindKey> lc = new LoopContext(count, c);
|
||||
CAstNode code =
|
||||
Ast.makeNode(CAstNode.ASSERT,
|
||||
Ast.makeNode(CAstNode.UNARY_EXPR,
|
||||
CAstOperator.OP_NOT,
|
||||
copyNodes(test, cfg, lc, nodeMap)),
|
||||
Ast.makeConstant(false));
|
||||
while (count-- > 0) {
|
||||
lc = new LoopContext(count, c);
|
||||
code = Ast.makeNode(CAstNode.IF_STMT,
|
||||
copyNodes(test, cfg, lc, nodeMap),
|
||||
Ast.makeNode(CAstNode.BLOCK_STMT,
|
||||
copyNodes(body, cfg, lc, nodeMap),
|
||||
code));
|
||||
}
|
||||
|
||||
return code;
|
||||
} else {
|
||||
CAstNode[] newChildren = new CAstNode[ n.getChildCount() ];
|
||||
for(int i = 0; i < newChildren.length; i++)
|
||||
newChildren[i] = copyNodes(n.getChild(i), cfg, c, nodeMap);
|
||||
|
||||
CAstNode newN = Ast.makeNode(n.getKind(), newChildren);
|
||||
|
||||
nodeMap.put(Pair.make(n, c.key()), newN);
|
||||
|
||||
return newN;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.ibm.wala.cast.tree.impl;
|
||||
package com.ibm.wala.cast.tree.rewrite;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
|
@ -8,7 +8,7 @@
|
|||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
*****************************************************************************/
|
||||
package com.ibm.wala.cast.tree.impl;
|
||||
package com.ibm.wala.cast.tree.rewrite;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
@ -19,6 +19,7 @@ import com.ibm.wala.cast.tree.CAstEntity;
|
|||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.CAstNodeTypeMap;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstOperator;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
||||
public class CAstCloner extends CAstBasicRewriter {
|
|
@ -8,7 +8,7 @@
|
|||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
*****************************************************************************/
|
||||
package com.ibm.wala.cast.tree.impl;
|
||||
package com.ibm.wala.cast.tree.rewrite;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
|
@ -25,6 +25,10 @@ import com.ibm.wala.cast.tree.CAstEntity;
|
|||
import com.ibm.wala.cast.tree.CAstNode;
|
||||
import com.ibm.wala.cast.tree.CAstNodeTypeMap;
|
||||
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
|
||||
import com.ibm.wala.cast.tree.impl.CAstControlFlowRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.CAstNodeTypeMapRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.CAstSourcePositionRecorder;
|
||||
import com.ibm.wala.cast.tree.impl.DelegatingEntity;
|
||||
import com.ibm.wala.cast.util.CAstPrinter;
|
||||
import com.ibm.wala.util.collections.EmptyIterator;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
|
@ -1,4 +1,4 @@
|
|||
package com.ibm.wala.cast.tree.impl;
|
||||
package com.ibm.wala.cast.tree.rewrite;
|
||||
|
||||
import com.ibm.wala.cast.tree.CAst;
|
||||
|
Loading…
Reference in New Issue