protected void process(ClassType clazz, Set<ClassMemberSignature> done) { for (CodeSignature cs : clazz.fixturesLookup()) { cs.getAbstractSyntax().translate(done); } for (CodeSignature cs : clazz.getTests()) { cs.getAbstractSyntax().translate(done); } }
/** * Auxiliary method that translates into Kitten bytecode all class members that are referenced * from the given block and the blocks reachable from it. * * @param block the block * @param done the class member signatures already translated * @param blocksDone the blocks that have been already processed */ protected void translateReferenced( Block block, Set<ClassMemberSignature> done, Set<Block> blocksDone) { // if we already processed the block, we return immediately if (!blocksDone.add(block)) return; for (BytecodeList cursor = block.getBytecode(); cursor != null; cursor = cursor.getTail()) { Bytecode h = cursor.getHead(); if (h instanceof GETFIELD) { FieldSignature field = ((GETFIELD) h).getField(); this.process(field.getDefiningClass(), done); done.add(field); } else if (h instanceof PUTFIELD) { FieldSignature field = ((PUTFIELD) h).getField(); this.process(field.getDefiningClass(), done); done.add(field); } else if (h instanceof CALL) for (CodeSignature callee : ((CALL) h).getDynamicTargets()) { this.process(callee.getDefiningClass(), done); callee.getAbstractSyntax().translate(done); } } // we continue with the following blocks for (Block follow : block.getFollows()) translateReferenced(follow, done, blocksDone); }