--- /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;
+ }
+ }
+}