public JSTypeInference(IR ir, IClassHierarchy cha) { super(ir, new PointType(cha.lookupClass(JavaScriptTypes.Boolean)), true); }
public JSTypeInference(IR ir, IClassHierarchy cha) { super(ir, new PointType(cha.lookupClass(JavaScriptTypes.Boolean)), true); }
/** * If the {@link CallSiteReference} invokes a method we understand and c is a type constant, return a {@link JavaTypeContext} * representing the type named by s, if we can resolve it in the {@link IClassHierarchy}. */ @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver != null && receiver.length > 0 && mayUnderstand(callee, receiver[0])) { return new JavaTypeContext(new PointType(getTypeConstant(receiver[0]))); } return null; }
/** * If the {@link CallSiteReference} invokes a method we understand and c is a type constant, return a {@link JavaTypeContext} * representing the type named by s, if we can resolve it in the {@link IClassHierarchy}. */ @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (receiver != null && receiver.length > 0 && mayUnderstand(callee, receiver[0])) { return new JavaTypeContext(new PointType(getTypeConstant(receiver[0]))); } return null; }
public TypeAbstraction getTypeForNewInstance(int bcIndex, IClassHierarchy cha) { if (cha == null) { throw new IllegalArgumentException("null cha"); } Set<TypeReference> S = map.get(Integer.valueOf(bcIndex)); if (S == null) { return null; } else { PointType[] p = new PointType[S.size()]; Iterator<TypeReference> it = S.iterator(); for (int i = 0; i < p.length; i++) { TypeReference T = it.next(); IClass klass = cha.lookupClass(T); assert klass != null : "null type for " + T; p[i] = new PointType(klass); } return new SetType(p); } }
public TypeAbstraction getTypeForNewInstance(int bcIndex, IClassHierarchy cha) { if (cha == null) { throw new IllegalArgumentException("null cha"); } Set<TypeReference> S = map.get(Integer.valueOf(bcIndex)); if (S == null) { return null; } else { PointType[] p = new PointType[S.size()]; Iterator<TypeReference> it = S.iterator(); for (int i = 0; i < p.length; i++) { TypeReference T = it.next(); IClass klass = cha.lookupClass(T); assert klass != null : "null type for " + T; p[i] = new PointType(klass); } return new SetType(p); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(GET_CLASS)) { return new JavaTypeContext(new PointType(receiver[0].getConcreteType())); } return null; }
@Override public void visitNew(SSANewInstruction instruction) { TypeReference type = instruction.getConcreteType(); IClass klass = cha.lookupClass(type); if (klass == null) { // a type that cannot be loaded. // be pessimistic result = new DeclaredTypeOperator(BOTTOM); } else { result = new DeclaredTypeOperator(new PointType(klass)); } }
@Override public void visitNew(SSANewInstruction instruction) { TypeReference type = instruction.getConcreteType(); IClass klass = cha.lookupClass(type); if (klass == null) { // a type that cannot be loaded. // be pessimistic result = new DeclaredTypeOperator(BOTTOM); } else { result = new DeclaredTypeOperator(new PointType(klass)); } }
@Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(GET_CLASS)) { return new JavaTypeContext(new PointType(receiver[0].getConcreteType())); } return null; }
@Override public TypeAbstraction getConstantType(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { return new PointType(cha.lookupClass(JavaScriptTypes.String)); } else if (st.isBooleanConstant(valueNumber)) { return new PointType(cha.lookupClass(JavaScriptTypes.Boolean)); } else if (st.isNullConstant(valueNumber)) { return new PointType(cha.lookupClass(JavaScriptTypes.Null)); } else { return new PointType(cha.lookupClass(JavaScriptTypes.Number)); } } }
@Override public TypeAbstraction getConstantType(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { return new PointType(cha.lookupClass(JavaScriptTypes.String)); } else if (st.isBooleanConstant(valueNumber)) { return new PointType(cha.lookupClass(JavaScriptTypes.Boolean)); } else if (st.isNullConstant(valueNumber)) { return new PointType(cha.lookupClass(JavaScriptTypes.Null)); } else { return new PointType(cha.lookupClass(JavaScriptTypes.Number)); } } }
@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); } }
/** * If receiver is a {@link ConstantKey} whose value is an {@link IClass}, return a {@link JavaTypeContext} * representing the type of the IClass. (This corresponds to the case where we know the exact type that will be * allocated by the {@code Class.newInstance()} call.) Otherwise, return {@code null}. */ @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(ClassNewInstanceContextInterpreter.CLASS_NEW_INSTANCE_REF) && isTypeConstant(receiver[0])) { IClass c = (IClass) ((ConstantKey) receiver[0]).getValue(); if (!c.isAbstract() && !c.isInterface()) { return new JavaTypeContext(new PointType(c)); } } return null; }
/** * If receiver is a {@link ConstantKey} whose value is an {@link IClass}, return a {@link JavaTypeContext} * representing the type of the IClass. (This corresponds to the case where we know the exact type that will be * allocated by the {@code Class.newInstance()} call.) Otherwise, return {@code null}. */ @Override public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) { if (callee.getReference().equals(ClassNewInstanceContextInterpreter.CLASS_NEW_INSTANCE_REF) && isTypeConstant(receiver[0])) { IClass c = (IClass) ((ConstantKey) receiver[0]).getValue(); if (!c.isAbstract() && !c.isInterface()) { return new JavaTypeContext(new PointType(c)); } } return null; }
public TypeAbstraction getConstantType(int valueNumber) { if (ir.getSymbolTable().isStringConstant(valueNumber)) { return new PointType(cha.lookupClass(language.getStringType())); } else { return getConstantPrimitiveType(valueNumber); } }
@Override public IVariable makeVariable(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { IClass klass = cha.lookupClass(TypeReference.JavaLangString); TypeAbstraction stringTypeAbs = new PointType(klass); return new TypeVariable(stringTypeAbs); } else { return super.makeVariable(valueNumber); } }
public TypeAbstraction getConstantType(int valueNumber) { if (ir.getSymbolTable().isStringConstant(valueNumber)) { return new PointType(cha.lookupClass(language.getStringType())); } else { return getConstantPrimitiveType(valueNumber); } }
@Override public IVariable makeVariable(int valueNumber) { SymbolTable st = ir.getSymbolTable(); if (st.isStringConstant(valueNumber)) { IClass klass = cha.lookupClass(TypeReference.JavaLangString); TypeAbstraction stringTypeAbs = new PointType(klass); return new TypeVariable(stringTypeAbs); } else { return super.makeVariable(valueNumber); } }