hotspot/test/compiler/compilercontrol/share/scenario/DirectiveWriter.java
changeset 33452 04815c29859c
child 34226 db9dea22fbfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/DirectiveWriter.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.JSONFile;
+import compiler.compilercontrol.share.method.MethodDescriptor;
+
+/**
+ * Simple directive file writer.
+ */
+public class DirectiveWriter implements AutoCloseable {
+    private final JSONFile jsonFile;
+
+    /**
+     * Builds directive file for the given name
+     *
+     * @param fileName name the file to be created
+     */
+    public DirectiveWriter(String fileName) {
+        jsonFile = new JSONFile(fileName);
+    }
+
+    /**
+     * Emits match block with a given methods
+     *
+     * @param methods methods used for the match
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter match(String... methods) {
+        if (jsonFile.getElement() == null) {
+            write(JSONFile.Element.ARRAY);
+        }
+        write(JSONFile.Element.OBJECT);
+        write(JSONFile.Element.PAIR, "match");
+        writeMethods(methods);
+        return this;
+    }
+
+    /**
+     * Emits match block with a given methods
+     *
+     * @param methodDescriptors method descriptors used for the match
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter match(MethodDescriptor... methodDescriptors) {
+        String[] methods = new String[methodDescriptors.length];
+        for (int i = 0; i < methodDescriptors.length; i++) {
+            methods[i] = methodDescriptors[i].getString();
+        }
+        match(methods);
+        return this;
+    }
+
+    /**
+     * Emits inline block with a given methods to be inlined or not.
+     * Each method should be prepended with + or - to show if it should be
+     * inlined or not.
+     *
+     * @param methods methods used for the inline
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter inline(String... methods) {
+        write(JSONFile.Element.PAIR, "inline");
+        writeMethods(methods);
+        return this;
+    }
+
+    private void writeMethods(String[] methods) {
+        if (methods.length == 0) {
+            throw new IllegalArgumentException("ERROR: empty methods array");
+        }
+        if (methods.length > 1) {
+            write(JSONFile.Element.ARRAY);
+            for (String method : methods) {
+                write(JSONFile.Element.VALUE, "\"" + method + "\"");
+            }
+            end(); // ends array
+        } else {
+            write(JSONFile.Element.VALUE, "\"" + methods[0] + "\"");
+        }
+    }
+
+    /**
+     * Emits compiler blocks that makes current match to be excluded or not
+     * from compilation with specified compiler
+     *
+     * @param compiler compiler to be excluded or null, for all
+     * @param exclude  shows if compiler should be disabled for this match
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter excludeCompile(Scenario.Compiler compiler,
+                                          boolean exclude) {
+        if (compiler != null) {
+            emitCompiler(compiler);
+            option(Option.EXCLUDE, exclude);
+            end();
+        } else {
+            for (Scenario.Compiler comp : Scenario.Compiler.values()) {
+                emitCompiler(comp);
+                option(Option.EXCLUDE, exclude);
+                end(); // end compiler block
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Emits compiler directive block
+     *
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter emitCompiler(Scenario.Compiler compiler) {
+        write(JSONFile.Element.PAIR, compiler.name);
+        write(JSONFile.Element.OBJECT);
+        return this;
+    }
+
+    @Override
+    public void close() {
+        jsonFile.close();
+    }
+
+    /**
+     * Ends current object element. It could be either a
+     * c1 or c2 block, or a whole match block
+     *
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter end() {
+        jsonFile.end();
+        return this;
+    }
+
+    public DirectiveWriter write(JSONFile.Element element, String... value) {
+        jsonFile.write(element, value);
+        return this;
+    }
+
+    /**
+     * Emits directive option with a given value
+     *
+     * @param option directive to be set
+     * @param value value of the directive
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter option(Option option, Object value) {
+        write(JSONFile.Element.PAIR, option.string);
+        write(JSONFile.Element.VALUE, String.valueOf(value));
+        return this;
+    }
+
+    /**
+     * Directive option list
+     */
+    public enum Option {
+        PRINT_ASSEMBLY("PrintAssembly"),
+        LOG("Log"),
+        EXCLUDE("Exclude");
+
+        public final String string;
+
+        private Option(String directive) {
+            this.string = directive;
+        }
+    }
+}