@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (caller == null) { throw new IllegalArgumentException("null caller"); } return delegate.getCalleeTarget(caller, site, callee, receiver); }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (caller == null) { throw new IllegalArgumentException("null caller"); } return delegate.getCalleeTarget(caller, site, callee, receiver); }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (methodsToSpecialize.contains(site.getDeclaredTarget()) || methodsToSpecialize.contains(callee.getReference())) { return specialPolicy.getCalleeTarget(caller, site, callee, receiver); } else { return basePolicy.getCalleeTarget(caller, site, callee, receiver); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); assert !recursiveContext(baseContext, callee); return baseContext; }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context target = base.getCalleeTarget(caller, site, callee, actualParameters); if (actualParameters != null && actualParameters.length > 0) { return new CPAContext(target, actualParameters); } else { return target; } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context target = base.getCalleeTarget(caller, site, callee, actualParameters); if (actualParameters != null && actualParameters.length > 0) { return new CPAContext(target, actualParameters); } else { return target; } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { final Context base = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (receiver != null && receiver[0] != null && receiver[0] instanceof ScopeMappingInstanceKey) { final ScopeMappingInstanceKey smik = (ScopeMappingInstanceKey) receiver[0]; return new ArgumentInstanceContext(base, 0, smik); } else { return base; } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { final Context base = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (receiver != null && receiver[0] != null && receiver[0] instanceof ScopeMappingInstanceKey) { final ScopeMappingInstanceKey smik = (ScopeMappingInstanceKey) receiver[0]; return new ArgumentInstanceContext(base, 0, smik); } else { return base; } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (methodsToSpecialize.contains(site.getDeclaredTarget()) || methodsToSpecialize.contains(callee.getReference())) { return specialPolicy.getCalleeTarget(caller, site, callee, receiver); } else { return basePolicy.getCalleeTarget(caller, site, callee, receiver); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return getSelector(site).getCalleeTarget(caller, site, callee, receiver); }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); assert !recursiveContext(baseContext, callee); return baseContext; }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { return getSelector(site).getCalleeTarget(caller, site, callee, receiver); }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (baseContext.equals(Everywhere.EVERYWHERE)) { return new CallerSiteContext(caller, site); } else { return new CallerSiteContextPair(caller, site, baseContext); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = baseSelector.getCalleeTarget(caller, site, callee, receiver); if (baseContext.equals(Everywhere.EVERYWHERE)) { return new CallerSiteContext(caller, site); } else { return new CallerSiteContextPair(caller, site, baseContext); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] arguments) { Context baseContext = base.getCalleeTarget(caller, site, callee, arguments); if(returnsThis(callee)) { if(arguments.length > 1 && arguments[1] != null) { return new ArgumentInstanceContext(baseContext, 1, arguments[1]); } } return baseContext; }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] arguments) { Context baseContext = base.getCalleeTarget(caller, site, callee, arguments); if(returnsThis(callee)) { if(arguments.length > 1 && arguments[1] != null) { return new ArgumentInstanceContext(baseContext, 1, arguments[1]); } } return baseContext; }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); CallString cs = getCallString(caller, site, callee); if (cs == null) { return baseContext; } else if (baseContext == Everywhere.EVERYWHERE) { return new CallStringContext(cs); } else { return new CallStringContextPair(cs, baseContext); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { Context baseContext = base.getCalleeTarget(caller, site, callee, receiver); CallString cs = getCallString(caller, site, callee); if (cs == null) { return baseContext; } else if (baseContext == Everywhere.EVERYWHERE) { return new CallStringContext(cs); } else { return new CallStringContextPair(cs, baseContext); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); final boolean exceedsRecursionBound = exceedsRecursionBound(baseContext, 0); if (!exceedsRecursionBound) { return baseContext; } else if (callee instanceof JavaScriptConstructor) { // for constructors, we want to keep some basic context sensitivity to // avoid horrible imprecision return new CallStringContext(new CallString(site, caller.getMethod())); } else { // TODO somehow k-limit more smartly? return Everywhere.EVERYWHERE; } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] actualParameters) { Context baseContext = base.getCalleeTarget(caller, site, callee, actualParameters); final boolean exceedsRecursionBound = exceedsRecursionBound(baseContext, 0); if (!exceedsRecursionBound) { return baseContext; } else if (callee instanceof JavaScriptConstructor) { // for constructors, we want to keep some basic context sensitivity to // avoid horrible imprecision return new CallStringContext(new CallString(site, caller.getMethod())); } else { // TODO somehow k-limit more smartly? return Everywhere.EVERYWHERE; } }