public void InferTypes() { V_0 = (new GreedyTypeInferer(this.context, this.offsetToExpression)).InferTypes(); V_1 = new ClassHierarchyBuilder(this.offsetToExpression, this.context.get_MethodContext().get_ControlFlowGraph().get_OffsetToInstruction(), this.context); this.inferenceGraph = V_1.BuildHierarchy(V_0); this.MergeConnectedComponents(); this.RemoveTransitiveEdges(); this.ProcessSingleConstraints(); V_2 = null; V_4 = this.inferenceGraph.GetEnumerator(); try { while (V_4.MoveNext()) { V_5 = V_4.get_Current(); if (!V_5.get_IsHardNode() || !String.op_Equality(V_5.get_NodeType().get_FullName(), "System.Object")) { continue; } V_2 = V_5; goto Label0; } } finally { if (V_4 != null) { V_4.Dispose(); } } Label0: V_3 = new List <ClassHierarchyNode>(); V_3.Add(V_2); V_4 = this.inferenceGraph.GetEnumerator(); try { while (V_4.MoveNext()) { V_6 = V_4.get_Current(); if (V_6.get_IsHardNode()) { continue; } V_3.Add(V_6); } } finally { if (V_4 != null) { V_4.Dispose(); } } this.MergeNodes(V_3); this.InferIntegerTypes(V_0); this.AddCasts(); return; }
/// <summary> /// The entry point of the class. After this method ends, all variables will be typed. /// </summary> public void InferTypes() { ///This method realises the first step of the 3-stage algorithm described in <see cref="Efficient Inference of Static Types for Java Bytecode.pdf" />. ///All variables that are left without type after it are given type "System.Object" and casts are introduced as needed. GreedyTypeInferer gti = new GreedyTypeInferer(context, offsetToExpression); var resolvedVariables = gti.InferTypes(); ClassHierarchyBuilder chb = new ClassHierarchyBuilder(offsetToExpression, context.MethodContext.ControlFlowGraph.OffsetToInstruction, context); this.inferenceGraph = chb.BuildHierarchy(resolvedVariables); MergeConnectedComponents(); RemoveTransitiveEdges(); ProcessSingleConstraints(); ClassHierarchyNode objectNode = null; foreach (ClassHierarchyNode node in inferenceGraph) { if (node.IsHardNode && node.NodeType.FullName == "System.Object") { objectNode = node; break; } } List <ClassHierarchyNode> allSoftNodes = new List <ClassHierarchyNode>(); allSoftNodes.Add(objectNode); foreach (ClassHierarchyNode node in inferenceGraph) { if (!node.IsHardNode) { allSoftNodes.Add(node); } } MergeNodes(allSoftNodes); InferIntegerTypes(resolvedVariables); this.AddCasts(); }
/// <summary> /// The entry point of the class. After this method ends, all variables will be typed. /// </summary> public void InferTypes() { ///This method realises the first step of the 3-stage algorithm described in <see cref="Efficient Inference of Static Types for Java Bytecode.pdf" />. ///All variables that are left without type after it are given type "System.Object" and casts are introduced as needed. GreedyTypeInferer gti = new GreedyTypeInferer(context, offsetToExpression); var resolvedVariables = gti.InferTypes(); ClassHierarchyBuilder chb = new ClassHierarchyBuilder(offsetToExpression, context.MethodContext.ControlFlowGraph.OffsetToInstruction, context); this.inferenceGraph = chb.BuildHierarchy(resolvedVariables); MergeConnectedComponents(); RemoveTransitiveEdges(); ProcessSingleConstraints(); ClassHierarchyNode objectNode = null; foreach (ClassHierarchyNode node in inferenceGraph) { if (node.IsHardNode && node.NodeType.FullName == "System.Object") { objectNode = node; break; } } List<ClassHierarchyNode> allSoftNodes = new List<ClassHierarchyNode>(); allSoftNodes.Add(objectNode); foreach (ClassHierarchyNode node in inferenceGraph) { if (!node.IsHardNode) { allSoftNodes.Add(node); } } MergeNodes(allSoftNodes); InferIntegerTypes(resolvedVariables); this.AddCasts(); }