@Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isStatic()) { return EmptyIntSet.instance; } else { return receiver; } }
@Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { if (site.isStatic()) { return EmptyIntSet.instance; } else { return receiver; } }
/** * Is this a 'static' call? (invokestatic in Java) */ public boolean isStatic() { return getCallSite().isStatic(); }
/** * Is this a 'static' call? (invokestatic in Java) */ public boolean isStatic() { return getCallSite().isStatic(); }
public boolean isFixed() { return isStatic() || isSpecial(); }
public boolean isFixed() { return isStatic() || isSpecial(); }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (site.isStatic()) { return Everywhere.EVERYWHERE; } else { if (receiver == null) { throw new IllegalArgumentException("receiver is null"); } PointType P = new PointType(receiver[0].getConcreteType()); return new JavaTypeContext(P); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (site.isStatic()) { return Everywhere.EVERYWHERE; } else { if (receiver == null) { throw new IllegalArgumentException("receiver is null"); } PointType P = new PointType(receiver[0].getConcreteType()); return new JavaTypeContext(P); } }
private IntSet getRelevantParameters(final CGNode caller, final CallSiteReference site) throws UnimplementedError { IntSet params = contextSelector.getRelevantParameters(caller, site); if (!site.isStatic() && !params.contains(0)) { params = IntSetUtil.makeMutableCopy(params); ((MutableIntSet)params).add(0); } return params; }
private IntSet getRelevantParameters(final CGNode caller, final CallSiteReference site) throws UnimplementedError { IntSet params = contextSelector.getRelevantParameters(caller, site); if (!site.isStatic() && !params.contains(0)) { params = IntSetUtil.makeMutableCopy(params); ((MutableIntSet)params).add(0); } return params; }
public static void assertParamsKosher(int result, int[] params, CallSiteReference site) throws IllegalArgumentException { if (site == null) { throw new IllegalArgumentException("site cannot be null"); } if (site.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) { if (result != -1) { assert result == -1 : "bogus call to " + site; } } int nExpected = 0; if (!site.isStatic()) { nExpected++; } nExpected += site.getDeclaredTarget().getNumberOfParameters(); if (nExpected > 0) { assert params != null : "null params for " + site; if (params.length != nExpected) { assert params.length == nExpected : "wrong number of params for " + site + " Expected " + nExpected + " got " + params.length; } } }
public static void assertParamsKosher(int result, int[] params, CallSiteReference site) throws IllegalArgumentException { if (site == null) { throw new IllegalArgumentException("site cannot be null"); } if (site.getDeclaredTarget().getReturnType().equals(TypeReference.Void)) { if (result != -1) { assert result == -1 : "bogus call to " + site; } } int nExpected = 0; if (!site.isStatic()) { nExpected++; } nExpected += site.getDeclaredTarget().getNumberOfParameters(); if (nExpected > 0) { assert params != null : "null params for " + site; if (params.length != nExpected) { assert params.length == nExpected : "wrong number of params for " + site + " Expected " + nExpected + " got " + params.length; } } }
private static boolean dispatchIndex(CallSiteReference ref, int i) { if (ref.isStatic()) { return ! ref.getDeclaredTarget().getParameterType(i).isPrimitiveType(); } else { return i==0 || ! ref.getDeclaredTarget().getParameterType(i-1).isPrimitiveType(); } }
private static boolean dispatchIndex(CallSiteReference ref, int i) { if (ref.isStatic()) { return ! ref.getDeclaredTarget().getParameterType(i).isPrimitiveType(); } else { return i==0 || ! ref.getDeclaredTarget().getParameterType(i-1).isPrimitiveType(); } }
@Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { ClassLoaderReference loader = (site.isStatic() || receiver==null)? site.getDeclaredTarget().getDeclaringClass().getClassLoader(): receiver.getClassLoader().getReference(); TypeReference functionTypeRef = TypeReference.findOrCreate(loader, AstTypeReference.functionTypeName); IClass declarer = site.isStatic()? cha.lookupClass(site.getDeclaredTarget().getDeclaringClass()): receiver; if (declarer == null) { System.err.println(("cannot find declarer for " + site + ", " + receiver + " in " + caller)); } IClass fun = cha.lookupClass(functionTypeRef); if (fun == null) { System.err.println(("cannot find function " + functionTypeRef + " for " + site + ", " + receiver + " in " + caller)); } if (fun != null && declarer != null && cha.isSubclassOf(declarer, fun)) { return declarer.getMethod(AstMethodReference.fnSelector); } else { return base.getCalleeTarget(caller, site, receiver); } }
@Override public IMethod getCalleeTarget(CGNode caller, CallSiteReference site, IClass receiver) { ClassLoaderReference loader = (site.isStatic() || receiver==null)? site.getDeclaredTarget().getDeclaringClass().getClassLoader(): receiver.getClassLoader().getReference(); TypeReference functionTypeRef = TypeReference.findOrCreate(loader, AstTypeReference.functionTypeName); IClass declarer = site.isStatic()? cha.lookupClass(site.getDeclaredTarget().getDeclaringClass()): receiver; if (declarer == null) { System.err.println(("cannot find declarer for " + site + ", " + receiver + " in " + caller)); } IClass fun = cha.lookupClass(functionTypeRef); if (fun == null) { System.err.println(("cannot find function " + functionTypeRef + " for " + site + ", " + receiver + " in " + caller)); } if (fun != null && declarer != null && cha.isSubclassOf(declarer, fun)) { return declarer.getMethod(AstMethodReference.fnSelector); } else { return base.getCalleeTarget(caller, site, receiver); } }
/** * TODO: enhance this logic using type inference * * @return true if we need to filter the receiver type to account for virtual dispatch */ @SuppressWarnings("unused") private boolean needsFilterForReceiver(SSAAbstractInvokeInstruction instruction, CGNode target) { FilteredPointerKey.TypeFilter f = (FilteredPointerKey.TypeFilter) target.getContext().get(ContextKey.PARAMETERS[0]); if (f != null) { // the context selects a particular concrete type for the receiver. // we need to filter, unless the declared receiver type implies the // concrete type (TODO: need to implement this optimization) return true; } // don't need to filter for invokestatic if (instruction.getCallSite().isStatic() || instruction.getCallSite().isSpecial()) { return false; } MethodReference declaredTarget = instruction.getDeclaredTarget(); IMethod resolvedTarget = getClassHierarchy().resolveMethod(declaredTarget); if (resolvedTarget == null) { // there's some problem that will be flagged as a warning return true; } return true; }
/** * TODO: enhance this logic using type inference * * @return true if we need to filter the receiver type to account for virtual dispatch */ @SuppressWarnings("unused") private boolean needsFilterForReceiver(SSAAbstractInvokeInstruction instruction, CGNode target) { FilteredPointerKey.TypeFilter f = (FilteredPointerKey.TypeFilter) target.getContext().get(ContextKey.PARAMETERS[0]); if (f != null) { // the context selects a particular concrete type for the receiver. // we need to filter, unless the declared receiver type implies the // concrete type (TODO: need to implement this optimization) return true; } // don't need to filter for invokestatic if (instruction.getCallSite().isStatic() || instruction.getCallSite().isSpecial()) { return false; } MethodReference declaredTarget = instruction.getDeclaredTarget(); IMethod resolvedTarget = getClassHierarchy().resolveMethod(declaredTarget); if (resolvedTarget == null) { // there's some problem that will be flagged as a warning return true; } return true; }
if (site.isStatic()) { summary.setStatic(true);
if (site.isStatic()) { summary.setStatic(true);