/** * This function is used to re-run the analyser, and re-create the rows corresponding the its * results. */ private void refreshReviewTable() { reviewPanel.removeAll(); rows.clear(); GridBagLayout gbl = new GridBagLayout(); reviewPanel.setLayout(gbl); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridy = 0; try { Map<String, Long> sums = analyser.processLogFile(config.getLogFilename(), fromDate.getDate(), toDate.getDate()); for (Entry<String, Long> entry : sums.entrySet()) { String project = entry.getKey(); double hours = 1.0 * entry.getValue() / (1000 * 3600); addRow(gbl, gbc, project, hours); } for (String project : main.getProjectsTree().getTopLevelProjects()) if (!rows.containsKey(project)) addRow(gbl, gbc, project, 0); gbc.insets = new Insets(10, 0, 0, 0); addLeftLabel(gbl, gbc, "TOTAL"); gbc.gridx = 1; gbc.weightx = 1; totalLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 3)); gbl.setConstraints(totalLabel, gbc); reviewPanel.add(totalLabel); gbc.weightx = 0; addRightLabel(gbl, gbc); } catch (IOException e) { e.printStackTrace(); } recomputeTotal(); pack(); }
public ThrowsTagImpl(String text, ClassDocImpl contextClass, MemberDocImpl contextMember) { super(text); char[] textarr = text.toCharArray(); int i = 0; for (; i < textarr.length; ++i) { if (!Parser.isWhitespace(textarr[i])) break; } for (; i < textarr.length; ++i) { if (Parser.isWhitespace(textarr[i])) { this.exceptionName = new String(textarr, 0, i).trim(); this.exceptionComment = new String(textarr, i, textarr.length - i).trim(); break; } } if (null != exceptionName) { if (contextClass == null) { this.exception = Main.getRootDoc().classNamed(exceptionName); } else { this.exception = contextClass.findClass(exceptionName); } if (exception != null) this.exceptionName = exception.qualifiedName(); else { if (text.trim().startsWith("<")) { Main.getRootDoc() .printWarning( "Expected exception name but got '" + text + "' in class " + contextClass.getClassName()); } } } else { Main.getRootDoc() .printWarning( "@throws tag in comment for " + contextClass.qualifiedName() + "." + contextMember.name() + " doesn't specify an exception."); } if (this.exceptionComment != null) { setBody(this.exceptionComment, contextClass, contextMember); } }
/** * The only constructor of the review dialog, which initialises the dates, sets the outer layout, * runs the analyser, creates rows for the results, and displays the window. * * @param main A link to the parent component. * @param config A link to the configuration object. */ ReviewDialog(Main main, Config config) { super(main, "Review & Save"); this.main = main; this.config = config; // layout date components GridBagLayout gbl = new GridBagLayout(); setLayout(gbl); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(0, 0, 5, 0); gbc.ipadx = 10; gbc.gridx = 0; gbc.gridy = 0; gbl.setConstraints(yearLabel, gbc); gbc.gridx = 1; gbl.setConstraints(yearCB, gbc); gbc.gridx = 0; gbc.gridy = 1; gbl.setConstraints(weekLabel, gbc); gbc.gridx = 1; gbl.setConstraints(weekCB, gbc); gbc.gridx = 0; gbc.gridy = 2; gbl.setConstraints(fromLabel, gbc); gbc.weightx = 1; gbc.gridx = 1; gbl.setConstraints(fromDate, gbc); gbc.insets = new Insets(0, 0, 0, 0); gbc.weightx = 0; gbc.gridx = 0; gbc.gridy = 3; gbl.setConstraints(toLabel, gbc); gbc.weightx = 1; gbc.gridx = 1; gbl.setConstraints(toDate, gbc); gbc.gridx = 0; gbc.gridy = 4; gbc.gridwidth = 2; gbc.insets = new Insets(10, 5, 10, 5); gbc.weighty = 1; JScrollPane scrollReviewPanel = new JScrollPane(reviewPanel); gbl.setConstraints(scrollReviewPanel, gbc); gbc.insets = new Insets(0, 0, 0, 0); gbc.gridy = 5; gbc.weighty = 0; gbl.setConstraints(saveToFileButton, gbc); gbc.gridy = 6; gbl.setConstraints(copyToClipboardButton, gbc); add(yearLabel); add(yearCB); add(weekLabel); add(weekCB); add(fromLabel); add(fromDate); add(toLabel); add(toDate); add(scrollReviewPanel); add(saveToFileButton); add(copyToClipboardButton); // layout results updateYearWeekDates(); setVisible(true); setLocation(main.getLocation()); }
/** * Performs the actual editing of a class. Does a whole mess of stuff including reading in the * classfile, building data structures to represent the class file, converting the CFG for each * method in the class into SSA form, perform some anlayses and optimizations on the method, and * finally committing it back to the class file. Phew. */ private static void editClass(final String className) { ClassFile classFile; // Holds info about a class (implements // ClassInfo) // Get information about the class className try { classFile = (ClassFile) Main.context.loadClass(className); } catch (final ClassNotFoundException ex) { System.err.println("** Couldn't find class: " + ex.getMessage()); return; } if (!Main.FORCE) { // Check to see if the file is up-to-date (i.e. has been // recompiled since it was last optimized). If so, do nothing // because the FORCE flag is false. final File source = classFile.file(); final File target = classFile.outputFile(); if ((source != null) && (target != null) && source.exists() && target.exists() && (source.lastModified() < target.lastModified())) { if (Main.VERBOSE) { System.out.println(classFile.name() + " is up to date"); } return; } } if (Main.DEBUG) { // Print the contents of the class file to System.out classFile.print(System.out); } final ClassEditor c = Main.context.editClass(classFile); boolean skip = false; final String name = c.type().className(); final String qual = c.type().qualifier() + "/*"; // Edit only classes explicitly mentioned. if (Main.ONLY.size() > 0) { skip = true; // Only edit classes we explicitly don't name. for (int i = 0; i < Main.ONLY.size(); i++) { final String pkg = (String) Main.ONLY.get(i); if (name.equals(pkg) || qual.equals(pkg)) { skip = false; break; } } } // Don't edit classes we explicitly skip. if (!skip) { for (int i = 0; i < Main.SKIP.size(); i++) { final String pkg = (String) Main.SKIP.get(i); if (name.equals(pkg) || qual.equals(pkg)) { skip = true; break; } } } if (skip) { if (Main.VERBOSE) { System.out.println("Skipping " + c.type().className()); } // We're done with this class file, decrement its reference count Main.context.release(classFile); return; } // Touch the output file first. That is, create the file, but make // it empty, just to make sure we can create it. try { final File f = classFile.outputFile(); if (f.exists()) { f.delete(); } final File dir = new File(f.getParent()); dir.mkdirs(); if (!dir.exists()) { throw new RuntimeException("Couldn't create directory: " + dir); } final DataOutputStream out = new DataOutputStream(new FileOutputStream(f)); new PrintStream(out).println(); out.close(); } catch (final IOException e) { e.printStackTrace(); System.exit(1); } if (Main.VERBOSE) { System.out.println("Optimizing " + c.type().className()); } // Finally, we can start playing with the methods... final MethodInfo[] methods = c.methods(); final int numMethods = methods.length + 1; ; int whichMethod = 0; for (int j = 0; j < methods.length; j++) { final MethodEditor m; try { m = Main.context.editMethod(methods[j]); } catch (final ClassFormatException ex) { System.err.println(ex.getMessage()); continue; } if (Main.TRACE) { whichMethod++; System.out.println( "Optimizing " + name + "." + m.name() + " (method " + whichMethod + " of " + numMethods + ")"); } if (Main.METHOD != null) { // A method name has been specified on the command line using // -only-method. boolean pass = true; String t = m.name() + m.type(); if (t.equals(Main.METHOD)) { pass = false; } t = m.name(); if (t.equals(Main.METHOD)) { pass = false; } if (pass) { // This isn't the method we're looking for. // Decrement its reference count. Main.context.release(methods[j]); continue; } } if (Main.DEBUG) { m.print(System.out); } if (m.isNative() || m.isAbstract()) { // We can't edit native or abstract methods Main.context.release(methods[j]); continue; } Main.bloatMethod(m, Main.context); } if (Main.ANNO) { String s = "Optimized with: EDU.purdue.cs.bloat.optimize.Main"; for (int i = 0; i < Main.ARGS.length; i++) { if ((Main.ARGS[i].indexOf(' ') >= 0) || (Main.ARGS[i].indexOf('\t') >= 0) || (Main.ARGS[i].indexOf('\r') >= 0) || (Main.ARGS[i].indexOf('\n') >= 0)) { s += " '" + Main.ARGS[i] + "'"; } else { s += " " + Main.ARGS[i]; } } System.out.println(s); // c.constants().addConstant(Constant.UTF8, s); } Main.context.commit(classFile); Main.context.release(classFile); if (Main.TRACE) { System.out.println(Main.context.toString()); } }
/** * Parses the command line. The user must specify at least one class to optimize and the directory * in which to place the optimized class files. The methods of the specified classes are then * optimized according to the command line options. * * @see ClassEditor * @see ClassFileLoader * @see ClassFile * @see MethodEditor * @see MethodInfo * @see CompactArrayInitializer * @see FlowGraph */ public static void main(final String[] args) { try { Main.loader = new ClassFileLoader(); List classes = new ArrayList(args.length); // The classes to // optimize boolean gotdir = false; // Has an output directory been specified? Main.ARGS = args; for (int i = 0; i < args.length; i++) { if (args[i].equals("-v") || args[i].equals("-verbose")) { Main.VERBOSE = true; Main.loader.setVerbose(true); } else if (args[i].equals("-debug")) { Main.DEBUG = true; Main.loader.setVerbose(true); ClassFileLoader.DEBUG = true; CompactArrayInitializer.DEBUG = true; ClassEditor.DEBUG = true; FlowGraph.DEBUG = true; DominatorTree.DEBUG = true; Tree.DEBUG = true; CodeGenerator.DEBUG = true; Liveness.DEBUG = true; SSA.DEBUG = true; SSAGraph.DEBUG = true; PersistentCheckElimination.DEBUG = true; ValueNumbering.DEBUG = true; ValueFolding.DEBUG = true; ClassHierarchy.DEBUG = true; TypeInference.DEBUG = true; SSAPRE.DEBUG = true; StackPRE.DEBUG = true; ExprPropagation.DEBUG = true; DeadCodeElimination.DEBUG = true; CodeGenerator.DB_OPT_STACK = true; } else if (args[i].equals("-trace")) { Main.TRACE = true; } else if (args[i].equals("-db")) { if (++i >= args.length) { System.err.println("** No debugging option specified"); Main.usage(); } if (args[i].equals("bc")) { CodeArray.DEBUG = true; } else if (args[i].equals("cfg")) { FlowGraph.DEBUG = true; } else if (args[i].equals("ssa")) { SSA.DEBUG = true; SSAGraph.DEBUG = true; } else if (args[i].equals("graphs")) { FlowGraph.DB_GRAPHS = true; } else if (args[i].startsWith("-")) { i--; } else { System.err.println("** Unknown debugging option: " + args[i]); Main.usage(); } } else if (args[i].equals("-debugvf")) { ValueFolding.DUMP = true; } else if (args[i].equals("-debugbc")) { BloatContext.DEBUG = true; } else if (args[i].equals("-help")) { Main.usage(); } else if (args[i].equals("-noanno")) { Main.ANNO = false; } else if (args[i].equals("-anno")) { Main.ANNO = true; } else if (args[i].equals("-print-flow-graph")) { FlowGraph.PRINT_GRAPH = true; } else if (args[i].equals("-preserve-debug")) { MethodEditor.PRESERVE_DEBUG = true; } else if (args[i].equals("-nouse-stack-vars")) { Tree.USE_STACK = false; } else if (args[i].equals("-use-stack-vars")) { Tree.USE_STACK = true; } else if (args[i].equals("-unique-handlers")) { MethodEditor.UNIQUE_HANDLERS = true; } else if (args[i].equals("-nocompact-array-init")) { Main.COMPACT_ARRAY_INIT = false; } else if (args[i].equals("-compact-array-init")) { Main.COMPACT_ARRAY_INIT = true; } else if (args[i].equals("-nostack-alloc")) { Main.STACK_ALLOC = false; } else if (args[i].equals("-stack-alloc")) { Main.STACK_ALLOC = true; } else if (args[i].equals("-no-verify")) { Main.VERIFY = false; } else if (args[i].equals("-peel-loops")) { if (++i >= args.length) { Main.usage(); } final String n = args[i]; if (n.equals("all")) { FlowGraph.PEEL_LOOPS_LEVEL = FlowGraph.PEEL_ALL_LOOPS; } else { try { FlowGraph.PEEL_LOOPS_LEVEL = Integer.parseInt(n); if (FlowGraph.PEEL_LOOPS_LEVEL < 0) { Main.usage(); } } catch (final NumberFormatException ex) { Main.usage(); } } } else if (args[i].equals("-color")) { Liveness.UNIQUE = false; } else if (args[i].equals("-nocolor")) { Liveness.UNIQUE = true; } else if (args[i].equals("-only-method")) { if (++i >= args.length) { Main.usage(); } Main.METHOD = args[i]; } else if (args[i].equals("-classpath")) { if (++i >= args.length) { Main.usage(); } final String classpath = args[i]; Main.loader.setClassPath(classpath); } else if (args[i].equals("-classpath/p")) { if (++i >= args.length) { Main.usage(); } final String classpath = args[i]; Main.loader.prependClassPath(classpath); } else if (args[i].equals("-skip")) { if (++i >= args.length) { Main.usage(); } String pkg = args[i]; // Account for class file name on command line if (pkg.endsWith(".class")) { pkg = pkg.substring(0, pkg.lastIndexOf('.')); } Main.SKIP.add(pkg.replace('.', '/')); } else if (args[i].equals("-only")) { if (++i >= args.length) { Main.usage(); } String pkg = args[i]; // Account for class file name on command line if (pkg.endsWith(".class")) { pkg = pkg.substring(0, pkg.lastIndexOf('.')); } Main.ONLY.add(pkg.replace('.', '/')); } else if (args[i].equals("-nodce")) { Main.DCE = false; } else if (args[i].equals("-noprop")) { Main.PROP = false; } else if (args[i].equals("-noappre")) { SSAPRE.NO_ACCESS_PATHS = true; } else if (args[i].equals("-nopre")) { Main.PRE = false; } else if (args[i].equals("-dce")) { Main.DCE = true; } else if (args[i].equals("-prop")) { Main.PROP = true; } else if (args[i].equals("-appre")) { SSAPRE.NO_ACCESS_PATHS = false; } else if (args[i].equals("-pre")) { Main.PRE = true; } else if (args[i].equals("-closure")) { Main.CLOSURE = true; } else if (args[i].equals("-opt-stack-1")) { Main.OPT_STACK_1 = true; CodeGenerator.OPT_STACK = true; } else if (args[i].equals("-opt-stack-2")) { Main.OPT_STACK_2 = true; MethodEditor.OPT_STACK_2 = true; } else if (args[i].equals("-diva")) { Main.DIVA = true; } else if (args[i].equals("-no-thread")) { SSAPRE.NO_THREAD = true; } else if (args[i].equals("-no-precise")) { SSAPRE.NO_PRECISE = true; } else if (args[i].equals("-relax-loading")) { ClassHierarchy.RELAX = true; } else if (args[i].equals("-f") || args[i].equals("-force")) { Main.FORCE = true; } else if (args[i].startsWith("-")) { System.err.println("No such option: " + args[i]); Main.usage(); } else if (i == args.length - 1) { // Last argument is the name of the output directory final File f = new File(args[i]); if (f.exists() && !f.isDirectory()) { System.err.println("No such directory: " + f.getPath()); System.exit(2); } if (!f.exists()) { f.mkdirs(); } if (!f.exists()) { System.err.println("Couldn't create directory: " + f.getPath()); System.exit(2); } // Tell class loader to put optimized classes in f directory Main.loader.setOutputDir(f); gotdir = true; } else { // The argument must be a class name... classes.add(args[i]); } } if (!gotdir) { System.err.println("No output directory specified"); Main.usage(); } if (classes.size() == 0) { System.err.println("** No classes specified"); Main.usage(); } // Use the CachingBloatingContext Main.context = new CachingBloatContext(Main.loader, classes, Main.CLOSURE); boolean errors = false; final Iterator iter = classes.iterator(); // Now that we've parsed the command line, load the classes into the // class loader while (iter.hasNext()) { final String name = (String) iter.next(); try { Main.context.loadClass(name); } catch (final ClassNotFoundException ex) { System.err.println("Couldn't find class: " + ex.getMessage()); errors = true; } } if (errors) { System.exit(1); } if (!Main.CLOSURE) { final Iterator e = classes.iterator(); // Edit only the classes that were specified on the command line while (e.hasNext()) { final String name = (String) e.next(); Main.editClass(name); } } else { // Edit all the classes in the class file editor and their // superclasses classes = null; if (Main.TRACE) { System.out.println("Computing closure " + Main.dateFormat.format(new Date())); } final Iterator e = Main.context.getHierarchy().classes().iterator(); while (e.hasNext()) { final Type t = (Type) e.next(); if (t.isObject()) { Main.editClass(t.className()); } } } } catch (final ExceptionInInitializerError ex) { ex.printStackTrace(); System.out.println(ex.getException()); } }
public static void main(String[] args) throws Exception { Main solver = new Main(); solver.solve(); solver.end(); }