Search in sources :

Example 16 with ClassInfo

use of com.jopdesign.common.ClassInfo in project jop by jop-devel.

the class DFATool method classForField.

public ClassInfo classForField(String className, String fieldName) {
    ClassInfo cls = getAppInfo().getClassInfo(className);
    if (cls == null) {
        logger.info("Unknown class as potential receiver of field access" + className);
        return null;
    }
    // TODO maybe we *do* want to check access here...
    FieldInfo field = cls.getFieldInfoInherited(fieldName, false);
    return field != null ? field.getClassInfo() : null;
}
Also used : FieldInfo(com.jopdesign.common.FieldInfo) ClassInfo(com.jopdesign.common.ClassInfo)

Example 17 with ClassInfo

use of com.jopdesign.common.ClassInfo in project jop by jop-devel.

the class DFATool method createPrologue.

private MethodInfo createPrologue() {
    // find ordering for class initializers
    ClinitOrder c = new ClinitOrder();
    appInfo.iterate(c);
    List<ClassInfo> order = c.findOrder();
    MethodInfo mainClass = appInfo.getMainMethod();
    // create prologue
    return buildPrologue(mainClass, statements, flow, order);
}
Also used : MethodInfo(com.jopdesign.common.MethodInfo) ClinitOrder(com.jopdesign.common.tools.ClinitOrder) ClassInfo(com.jopdesign.common.ClassInfo)

Example 18 with ClassInfo

use of com.jopdesign.common.ClassInfo in project jop by jop-devel.

the class DFATool method buildPrologue.

private MethodInfo buildPrologue(MethodInfo mainMethod, List<InstructionHandle> statements, Flow flow, List<ClassInfo> clinits) {
    // we use a prologue sequence for startup
    InstructionList prologue = new InstructionList();
    ConstantPoolGen prologueCP = mainMethod.getConstantPoolGen();
    Instruction instr;
    int idx;
    // add magic initializers to prologue sequence
    if (!analyzeBootMethod) {
        instr = new ICONST(0);
        prologue.append(instr);
        instr = new ICONST(0);
        prologue.append(instr);
        idx = prologueCP.addMethodref("com.jopdesign.sys.GC", "init", "(II)V");
        instr = new INVOKESTATIC(idx);
        prologue.append(instr);
    }
    // add class initializers
    for (ClassInfo clinit : clinits) {
        MemberID cSig = appInfo.getClinitSignature(clinit.getClassName());
        idx = prologueCP.addMethodref(cSig.getClassName(), cSig.getMemberName(), cSig.getDescriptor().toString());
        instr = new INVOKESTATIC(idx);
        prologue.append(instr);
    }
    if (analyzeBootMethod) {
        // Let's just analyze the full boot method, so that the callgraph-builder is happy.
        // Doing this after clinit, so that we have DFA infos on fields in JVMHelp.init()
        idx = prologueCP.addMethodref("com.jopdesign.sys.Startup", "boot", "()V");
        instr = new INVOKESTATIC(idx);
        prologue.append(instr);
    }
    // add main method
    instr = new ACONST_NULL();
    prologue.append(instr);
    idx = prologueCP.addMethodref(mainMethod.getClassName(), mainMethod.getShortName(), mainMethod.getDescriptor().toString());
    instr = new INVOKESTATIC(idx);
    prologue.append(instr);
    //      // invoke startMission() to ensure analysis of threads
    //      idx = prologueCP.addMethodref("joprt.RtThread", "startMission", "()V");
    //      instr = new INVOKESTATIC(idx);
    //      prologue.append(instr);
    instr = new NOP();
    prologue.append(instr);
    prologue.setPositions(true);
    // add prologue to program structure
    for (Iterator l = prologue.iterator(); l.hasNext(); ) {
        InstructionHandle handle = (InstructionHandle) l.next();
        statements.add(handle);
        if (handle.getInstruction() instanceof GOTO) {
            GOTO g = (GOTO) handle.getInstruction();
            flow.addEdge(new FlowEdge(handle, g.getTarget(), FlowEdge.NORMAL_EDGE));
        } else if (handle.getNext() != null) {
            flow.addEdge(new FlowEdge(handle, handle.getNext(), FlowEdge.NORMAL_EDGE));
        }
    }
    MemberID pSig = new MemberID(prologueName, Descriptor.parse(prologueSig));
    MethodInfo mi = mainMethod.getClassInfo().createMethod(pSig, null, prologue);
    mi.setAccessType(AccessType.ACC_PRIVATE);
    return mi;
}
Also used : FlowEdge(com.jopdesign.dfa.framework.FlowEdge) INVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC) GOTO(org.apache.bcel.generic.GOTO) InstructionList(org.apache.bcel.generic.InstructionList) Instruction(org.apache.bcel.generic.Instruction) BranchInstruction(org.apache.bcel.generic.BranchInstruction) ReturnInstruction(org.apache.bcel.generic.ReturnInstruction) NOP(org.apache.bcel.generic.NOP) InstructionHandle(org.apache.bcel.generic.InstructionHandle) ConstantPoolGen(org.apache.bcel.generic.ConstantPoolGen) MemberID(com.jopdesign.common.type.MemberID) Iterator(java.util.Iterator) MethodInfo(com.jopdesign.common.MethodInfo) ACONST_NULL(org.apache.bcel.generic.ACONST_NULL) ICONST(org.apache.bcel.generic.ICONST) ClassInfo(com.jopdesign.common.ClassInfo)

Example 19 with ClassInfo

use of com.jopdesign.common.ClassInfo in project jop by jop-devel.

the class TypeGraph method getJoinNodes.

/** Compute the set of join nodes<br/>
     *
     *  See <quote>Vitek, J., Horspool, R. N., and Krall, A. 1997. Efficient type inclusion tests.
     *             SIGPLAN Not. 32, 10 (Oct. 1997), 142-157.</quote>
     * @return a map from types to join nodes
     */
public Set<ClassInfo> getJoinNodes() {
    Set<ClassInfo> joinNodes = new HashSet<ClassInfo>();
    Set<ClassInfo> miNodes = new HashSet<ClassInfo>();
    for (ClassInfo v : bottomUpTraversal()) {
        boolean hasJoinSub = false;
        for (DefaultEdge descEdge : outgoingEdgesOf(v)) {
            if (miNodes.contains(getEdgeTarget(descEdge))) {
                hasJoinSub = true;
            }
        }
        boolean isMiNode = hasJoinSub;
        if (inDegreeOf(v) > 1 && !hasJoinSub) {
            joinNodes.add(v);
            isMiNode = true;
        }
        if (isMiNode) {
            miNodes.add(v);
        }
    }
    return joinNodes;
}
Also used : DefaultEdge(org.jgrapht.graph.DefaultEdge) HashSet(java.util.HashSet) ClassInfo(com.jopdesign.common.ClassInfo)

Example 20 with ClassInfo

use of com.jopdesign.common.ClassInfo in project jop by jop-devel.

the class TypeGraph method build.

private void build(AppInfo ai, ClassInfo rootNode) {
    this.rootNode = rootNode;
    Collection<ClassInfo> classes = ai.getClassInfos();
    for (ClassInfo ci : classes) {
        this.addVertex(ci);
        if (ci.getSuperClassInfo() != null) {
            if (ci.isInterface() && !ci.getSuperClassInfo().isInterface()) {
            // Interface extends java.lang.Object, ignored
            } else {
                this.addVertex(ci.getSuperClassInfo());
                this.addEdge(ci.getSuperClassInfo(), ci);
            }
        }
        /* interface edges */
        for (String ifaceClass : ci.getInterfaceNames()) {
            ClassInfo iface = ai.getClassInfo(ifaceClass);
            assert iface != null : ("TypeGraph.build: Interface " + ifaceClass + " not found");
            this.addVertex(iface);
            this.addEdge(iface, ci);
        }
    }
}
Also used : ClassInfo(com.jopdesign.common.ClassInfo)

Aggregations

ClassInfo (com.jopdesign.common.ClassInfo)49 MethodInfo (com.jopdesign.common.MethodInfo)19 DefaultEdge (org.jgrapht.graph.DefaultEdge)8 AppInfo (com.jopdesign.common.AppInfo)7 HashMap (java.util.HashMap)7 InstructionHandle (org.apache.bcel.generic.InstructionHandle)7 HashSet (java.util.HashSet)6 Set (java.util.Set)6 IOException (java.io.IOException)5 LinkedList (java.util.LinkedList)5 FieldInfo (com.jopdesign.common.FieldInfo)4 JavaClassFormatError (com.jopdesign.common.misc.JavaClassFormatError)4 MemberID (com.jopdesign.common.type.MemberID)4 BitSet (java.util.BitSet)3 AppSetup (com.jopdesign.common.AppSetup)2 MethodCode (com.jopdesign.common.MethodCode)2 BasicBlock (com.jopdesign.common.code.BasicBlock)2 CallString (com.jopdesign.common.code.CallString)2 CFGNode (com.jopdesign.common.code.ControlFlowGraph.CFGNode)2 ExecutionContext (com.jopdesign.common.code.ExecutionContext)2