From 300377a428f9c61536547fba4f266167399cb3bb Mon Sep 17 00:00:00 2001 From: msridhar1 Date: Fri, 17 Feb 2012 20:16:15 +0000 Subject: [PATCH] disabled LexicalScopingResolverContexts with new scheme git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@4468 f5eafffb-2e1d-0410-98e4-8ec43c5233c4 --- .../ipa/callgraph/JSZeroOrOneXCFABuilder.java | 5 +- .../JavaScriptConstructorContextSelector.java | 8 +- .../LexicalScopingResolverContexts.java | 2 +- .../callgraph/ScopeMappingInstanceKeys.java | 88 +++++++++++++------ 4 files changed, 71 insertions(+), 32 deletions(-) diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java index 441cf1ad9..c0da8137b 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java @@ -12,6 +12,7 @@ package com.ibm.wala.cast.js.ipa.callgraph; import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts; import com.ibm.wala.cast.ipa.callgraph.ScopeMappingKeysContextSelector; +import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.ipa.callgraph.AnalysisCache; import com.ibm.wala.ipa.callgraph.AnalysisScope; import com.ibm.wala.ipa.callgraph.ContextSelector; @@ -64,7 +65,9 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder { if (options.handleCallApply()) { contextSelector = new JavaScriptFunctionApplyContextSelector(contextSelector); } - contextSelector = new LexicalScopingResolverContexts(this, contextSelector); + if (!AstTranslator.NEW_LEXICAL) { + contextSelector = new LexicalScopingResolverContexts(this, contextSelector); + } if (doOneCFA) { contextSelector = new nCFAContextSelector(1, contextSelector); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java index 7d1740da1..ed5ebbf55 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JavaScriptConstructorContextSelector.java @@ -1,6 +1,8 @@ package com.ibm.wala.cast.js.ipa.callgraph; +import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts; import com.ibm.wala.cast.ipa.callgraph.ScopeMappingKeysContextSelector.ScopeMappingContext; +import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptConstructTargetSelector.JavaScriptConstructor; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IMethod; @@ -9,6 +11,7 @@ import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.ContextSelector; import com.ibm.wala.ipa.callgraph.DelegatingContext; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.cfa.CallerSiteContext; import com.ibm.wala.ipa.callgraph.propagation.cfa.nCFAContextSelector; import com.ibm.wala.util.intset.IntSet; @@ -33,8 +36,11 @@ public class JavaScriptConstructorContextSelector implements ContextSelector { if (callee instanceof JavaScriptConstructor) { final Context oneLevelContext = oneLevel.getCalleeTarget(caller, site, callee, receiver); final Context callerContext = caller.getContext(); - if (callerContext instanceof ScopeMappingContext) { + if (!AstTranslator.NEW_LEXICAL && callerContext instanceof ScopeMappingContext) { return new DelegatingContext(callerContext, new DelegatingContext(oneLevelContext, baseCtxt)); + } else if (AstTranslator.NEW_LEXICAL && LexicalScopingResolverContexts.hasExposedUses(caller, site)) { + // use a caller-site context, to enable lexical scoping lookups + return new DelegatingContext(new CallerSiteContext(caller, site), baseCtxt); } else { // use at least one-level of call-string sensitivity for constructors always return oneLevelContext; diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java index 6ffcf7142..196de3512 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/LexicalScopingResolverContexts.java @@ -548,7 +548,7 @@ public final class LexicalScopingResolverContexts implements ContextSelector { return null; } - private boolean hasExposedUses(CGNode caller, CallSiteReference site) { + public static boolean hasExposedUses(CGNode caller, CallSiteReference site) { int uses[] = ((AstMethod) caller.getMethod()).lexicalInfo().getExposedUses(site.getProgramCounter()); if (uses != null && uses.length > 0) { for (int use : uses) { diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java index 4e3423393..ffc234812 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ipa/callgraph/ScopeMappingInstanceKeys.java @@ -13,11 +13,13 @@ package com.ibm.wala.cast.ipa.callgraph; import java.util.Iterator; import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts.LexicalScopingResolver; +import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.classLoader.ProgramCounter; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.ContextItem; +import com.ibm.wala.ipa.callgraph.ContextKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; @@ -91,37 +93,65 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { * @return */ Iterator getFunargNodes(Pair name) { - Iterator result = EmptyIterator.instance(); - - LexicalScopingResolver r = (LexicalScopingResolver) creator.getContext().get(LexicalScopingResolverContexts.RESOLVER); - if (r != null) { - CGNode def = r.getOriginalDefiner(name); - if (def != null) { - result = new NonNullSingletonIterator(def); + if (AstTranslator.NEW_LEXICAL) { + CGNode callerOfConstructor = (CGNode) creator.getContext().get(ContextKey.CALLER); + if (callerOfConstructor == null) { + System.err.println(creator); + assert false; } - } - - // with multiple levels of nested functions, the creator itself may have - // been invoked by a function represented by a SMIK. E.g., see - // wrap3.js; the constructor of set() is invoked by wrapper(), and - // the wrapper() function object is a SMIK. In such cases, we need to - // recurse to find all the relevant CGNodes. - ContextItem nested = creator.getContext().get(ScopeMappingKeysContextSelector.scopeKey); - if (nested != null) { - result = new CompoundIterator(result, ((ScopeMappingInstanceKey) nested).getFunargNodes(name)); - } - - // TODO what does this code do??? commenting out does not cause any - // regression failures --MS - PointerKey funcKey = builder.getPointerKeyForLocal(creator, 1); - OrdinalSet funcPtrs = builder.getPointerAnalysis().getPointsToSet(funcKey); - for (InstanceKey x : funcPtrs) { - if (x instanceof ScopeMappingInstanceKey) { - result = new CompoundIterator(result, ((ScopeMappingInstanceKey) x).getFunargNodes(name)); + if (callerOfConstructor.getMethod().getReference().getDeclaringClass().getName().toString().equals(name.snd)){ + return new NonNullSingletonIterator(callerOfConstructor); + } else { + PointerKey funcKey = builder.getPointerKeyForLocal(callerOfConstructor, 1); + OrdinalSet funcPtrs = builder.getPointerAnalysis().getPointsToSet(funcKey); + assert funcPtrs.size() == 1; + InstanceKey funcPtr = funcPtrs.iterator().next(); + if (funcPtr instanceof ScopeMappingInstanceKey) { + return ((ScopeMappingInstanceKey) funcPtr).getFunargNodes(name); + } else { + return EmptyIterator.instance(); + } +// Iterator result = EmptyIterator.instance(); +// for (InstanceKey x : funcPtrs) { +// if (x instanceof ScopeMappingInstanceKey) { +// result = new CompoundIterator(result, ((ScopeMappingInstanceKey) x).getFunargNodes(name)); +// } +// } +// return result; } - } + } else { + Iterator result = EmptyIterator.instance(); - return result; + LexicalScopingResolver r = (LexicalScopingResolver) creator.getContext().get(LexicalScopingResolverContexts.RESOLVER); + if (r != null) { + CGNode def = r.getOriginalDefiner(name); + if (def != null) { + result = new NonNullSingletonIterator(def); + } + } + + // with multiple levels of nested functions, the creator itself may have + // been invoked by a function represented by a SMIK. E.g., see + // wrap3.js; the constructor of set() is invoked by wrapper(), and + // the wrapper() function object is a SMIK. In such cases, we need to + // recurse to find all the relevant CGNodes. + ContextItem nested = creator.getContext().get(ScopeMappingKeysContextSelector.scopeKey); + if (nested != null) { + result = new CompoundIterator(result, ((ScopeMappingInstanceKey) nested).getFunargNodes(name)); + } + + // TODO what does this code do??? commenting out does not cause any + // regression failures --MS + PointerKey funcKey = builder.getPointerKeyForLocal(creator, 1); + OrdinalSet funcPtrs = builder.getPointerAnalysis().getPointsToSet(funcKey); + for (InstanceKey x : funcPtrs) { + if (x instanceof ScopeMappingInstanceKey) { + result = new CompoundIterator(result, ((ScopeMappingInstanceKey) x).getFunargNodes(name)); + } + } + + return result; + } } public int hashCode() { @@ -136,7 +166,7 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory { public String toString() { return "SMIK:" + base + "@" + creator; } - + public InstanceKey getBase() { return base; }