public VarVersionsProcessor(StructMethod mt, MethodDescriptor md) { method = mt; typeProcessor = new VarTypeProcessor(mt, md); }
private boolean processVarTypes(DirectGraph graph) { return graph.iterateExprents(exprent -> checkTypeExprent(exprent) ? 0 : 1); }
private static void eliminateNonJavaTypes(VarTypeProcessor typeProcessor) { Map<VarVersionPair, VarType> mapExprentMaxTypes = typeProcessor.getMapExprentMaxTypes(); Map<VarVersionPair, VarType> mapExprentMinTypes = typeProcessor.getMapExprentMinTypes(); for (VarVersionPair paar : new ArrayList<>(mapExprentMinTypes.keySet())) { VarType type = mapExprentMinTypes.get(paar); VarType maxType = mapExprentMaxTypes.get(paar); if (type.type == CodeConstants.TYPE_BYTECHAR || type.type == CodeConstants.TYPE_SHORTCHAR) { if (maxType != null && maxType.type == CodeConstants.TYPE_CHAR) { type = VarType.VARTYPE_CHAR; } else { type = type.type == CodeConstants.TYPE_BYTECHAR ? VarType.VARTYPE_BYTE : VarType.VARTYPE_SHORT; } mapExprentMinTypes.put(paar, type); //} else if(type.type == CodeConstants.TYPE_CHAR && (maxType == null || maxType.type == CodeConstants.TYPE_INT)) { // when possible, lift char to int // mapExprentMinTypes.put(paar, VarType.VARTYPE_INT); } else if (type.type == CodeConstants.TYPE_NULL) { mapExprentMinTypes.put(paar, VarType.VARTYPE_OBJECT); } } }
public void calculateVarTypes(RootStatement root, DirectGraph graph) { setInitVars(root); resetExprentTypes(graph); //noinspection StatementWithEmptyBody while (!processVarTypes(graph)) ; }
private static void simpleMerge(VarTypeProcessor typeProcessor, DirectGraph graph, StructMethod mt) { Map<VarVersionPair, VarType> mapExprentMaxTypes = typeProcessor.getMapExprentMaxTypes(); Map<VarVersionPair, VarType> mapExprentMinTypes = typeProcessor.getMapExprentMinTypes(); typeProcessor.getMapFinalVars().put(firstPair, VarTypeProcessor.VAR_NON_FINAL);
private boolean checkTypeExprent(Exprent exprent) { for (Exprent expr : exprent.getAllExprents()) { if (!checkTypeExprent(expr)) { return false; } } if (exprent.type == Exprent.EXPRENT_CONST) { ConstExprent constExpr = (ConstExprent)exprent; if (constExpr.getConstType().typeFamily <= CodeConstants.TYPE_FAMILY_INTEGER) { // boolean or integer VarVersionPair pair = new VarVersionPair(constExpr.id, -1); if (!mapExprentMinTypes.containsKey(pair)) { mapExprentMinTypes.put(pair, constExpr.getConstType()); } } } CheckTypesResult result = exprent.checkExprTypeBounds(); boolean res = true; if (result != null) { for (CheckTypesResult.ExprentTypePair entry : result.getLstMaxTypeExprents()) { if (entry.type.typeFamily != CodeConstants.TYPE_FAMILY_OBJECT) { changeExprentType(entry.exprent, entry.type, 1); } } for (CheckTypesResult.ExprentTypePair entry : result.getLstMinTypeExprents()) { res &= changeExprentType(entry.exprent, entry.type, 0); } } return res; }
public int getVarFinal(VarVersionPair pair) { Integer fin = typeProcessor.getMapFinalVars().get(pair); return fin == null ? VarTypeProcessor.VAR_FINAL : fin; }
public void setVarVersions(RootStatement root, VarVersionsProcessor previousVersionsProcessor) { SSAConstructorSparseEx ssa = new SSAConstructorSparseEx(); ssa.splitVariables(root, method); FlattenStatementsHelper flattenHelper = new FlattenStatementsHelper(); DirectGraph graph = flattenHelper.buildDirectGraph(root); mergePhiVersions(ssa, graph); typeProcessor.calculateVarTypes(root, graph); simpleMerge(typeProcessor, graph, method); // FIXME: advanced merging eliminateNonJavaTypes(typeProcessor); setNewVarIndices(typeProcessor, graph, previousVersionsProcessor); }
public VarType getVarType(VarVersionPair pair) { return typeProcessor.getVarType(pair); }
return changeExprentType(((AssignmentExprent)exprent).getRight(), newType, minMax); switch (func.getFuncType()) { case FunctionExprent.FUNCTION_IIF: // FIXME: res = changeExprentType(func.getLstOperands().get(1), newType, minMax) & changeExprentType(func.getLstOperands().get(2), newType, minMax); break; case FunctionExprent.FUNCTION_AND: case FunctionExprent.FUNCTION_OR: case FunctionExprent.FUNCTION_XOR: res = changeExprentType(func.getLstOperands().get(0), newType, minMax) & changeExprentType(func.getLstOperands().get(1), newType, minMax); break;
private void setNewVarIndices(VarTypeProcessor typeProcessor, DirectGraph graph, VarVersionsProcessor previousVersionsProcessor) { final Map<VarVersionPair, VarType> mapExprentMaxTypes = typeProcessor.getMapExprentMaxTypes(); Map<VarVersionPair, VarType> mapExprentMinTypes = typeProcessor.getMapExprentMinTypes(); Map<VarVersionPair, Integer> mapFinalVars = typeProcessor.getMapFinalVars();
public void calculateVarTypes(RootStatement root, DirectGraph graph) { setInitVars(root); resetExprentTypes(graph); //noinspection StatementWithEmptyBody while (!processVarTypes(graph)) ; }
private boolean checkTypeExprent(Exprent exprent) { for (Exprent expr : exprent.getAllExprents()) { if (!checkTypeExprent(expr)) { return false; } } if (exprent.type == Exprent.EXPRENT_CONST) { ConstExprent constExpr = (ConstExprent)exprent; if (constExpr.getConstType().typeFamily <= CodeConstants.TYPE_FAMILY_INTEGER) { // boolean or integer VarVersionPair pair = new VarVersionPair(constExpr.id, -1); if (!mapExprentMinTypes.containsKey(pair)) { mapExprentMinTypes.put(pair, constExpr.getConstType()); } } } CheckTypesResult result = exprent.checkExprTypeBounds(); boolean res = true; if (result != null) { for (CheckTypesResult.ExprentTypePair entry : result.getLstMaxTypeExprents()) { if (entry.type.typeFamily != CodeConstants.TYPE_FAMILY_OBJECT) { changeExprentType(entry.exprent, entry.type, 1); } } for (CheckTypesResult.ExprentTypePair entry : result.getLstMinTypeExprents()) { res &= changeExprentType(entry.exprent, entry.type, 0); } } return res; }
public void setVarFinal(VarVersionPair pair, int finalType) { typeProcessor.getMapFinalVars().put(pair, finalType); }
public void setVarVersions(RootStatement root, VarVersionsProcessor previousVersionsProcessor) { SSAConstructorSparseEx ssa = new SSAConstructorSparseEx(); ssa.splitVariables(root, method); FlattenStatementsHelper flattenHelper = new FlattenStatementsHelper(); DirectGraph graph = flattenHelper.buildDirectGraph(root); mergePhiVersions(ssa, graph); typeProcessor.calculateVarTypes(root, graph); simpleMerge(typeProcessor, graph, method); // FIXME: advanced merging eliminateNonJavaTypes(typeProcessor); setNewVarIndices(typeProcessor, graph, previousVersionsProcessor); }
public VarType getVarType(VarVersionPair pair) { return typeProcessor == null ? null : typeProcessor.getVarType(pair); }
return changeExprentType(((AssignmentExprent)exprent).getRight(), newType, minMax); switch (func.getFuncType()) { case FunctionExprent.FUNCTION_IIF: // FIXME: res = changeExprentType(func.getLstOperands().get(1), newType, minMax) & changeExprentType(func.getLstOperands().get(2), newType, minMax); break; case FunctionExprent.FUNCTION_AND: case FunctionExprent.FUNCTION_OR: case FunctionExprent.FUNCTION_XOR: res = changeExprentType(func.getLstOperands().get(0), newType, minMax) & changeExprentType(func.getLstOperands().get(1), newType, minMax); break;
private void setNewVarIndices(VarTypeProcessor typeProcessor, DirectGraph graph, VarVersionsProcessor previousVersionsProcessor) { final Map<VarVersionPair, VarType> mapExprentMaxTypes = typeProcessor.getMapExprentMaxTypes(); Map<VarVersionPair, VarType> mapExprentMinTypes = typeProcessor.getMapExprentMinTypes(); Map<VarVersionPair, Integer> mapFinalVars = typeProcessor.getMapFinalVars();
private static void eliminateNonJavaTypes(VarTypeProcessor typeProcessor) { Map<VarVersionPair, VarType> mapExprentMaxTypes = typeProcessor.getMapExprentMaxTypes(); Map<VarVersionPair, VarType> mapExprentMinTypes = typeProcessor.getMapExprentMinTypes(); for (VarVersionPair paar : new ArrayList<>(mapExprentMinTypes.keySet())) { VarType type = mapExprentMinTypes.get(paar); VarType maxType = mapExprentMaxTypes.get(paar); if (type.type == CodeConstants.TYPE_BYTECHAR || type.type == CodeConstants.TYPE_SHORTCHAR) { if (maxType != null && maxType.type == CodeConstants.TYPE_CHAR) { type = VarType.VARTYPE_CHAR; } else { type = type.type == CodeConstants.TYPE_BYTECHAR ? VarType.VARTYPE_BYTE : VarType.VARTYPE_SHORT; } mapExprentMinTypes.put(paar, type); //} else if(type.type == CodeConstants.TYPE_CHAR && (maxType == null || maxType.type == CodeConstants.TYPE_INT)) { // when possible, lift char to int // mapExprentMinTypes.put(paar, VarType.VARTYPE_INT); } else if (type.type == CodeConstants.TYPE_NULL) { mapExprentMinTypes.put(paar, VarType.VARTYPE_OBJECT); } } }
public void setVarFinal(VarVersionPair pair, int finalType) { typeProcessor.getMapFinalVars().put(pair, finalType); }