private void writeInlines(DirectiveWriter dirFile) { List<String> c1Block = new ArrayList<>(); List<String> c2Block = new ArrayList<>(); List<String> allBlock = new ArrayList<>(); for (CompileCommand cc : inlines) { String inlineMethodPattern; switch (cc.command) { case INLINE: inlineMethodPattern = "+" + cc.methodDescriptor.getString(); break; case DONTINLINE: inlineMethodPattern = "-" + cc.methodDescriptor.getString(); break; default: throw new Error("TESTBUG: incorrect command got in " + "the list: " + cc.command); } if (cc.compiler == Scenario.Compiler.C1) { c1Block.add(inlineMethodPattern); } else if (cc.compiler == Scenario.Compiler.C2) { c2Block.add(inlineMethodPattern); } else { allBlock.add(inlineMethodPattern); } } dirFile.emitCompiler(Scenario.Compiler.C1); if (!c1Block.isEmpty()) { dirFile.inline(c1Block); } else { dirFile.option(DirectiveWriter.Option.ENABLE, true); } dirFile.end(); dirFile.emitCompiler(Scenario.Compiler.C2); if (!c2Block.isEmpty()) { dirFile.inline(c2Block); } else { dirFile.option(DirectiveWriter.Option.ENABLE, true); } dirFile.end(); if (!allBlock.isEmpty()) { dirFile.inline(allBlock); } }
private void writeDirectiveFile() { try (DirectiveWriter dirFile = new DirectiveWriter(fileName)) { for (MethodDescriptor matchDescriptor : matchBlocks.keySet()) { // Write match block with all options converted from commands dirFile.match(matchDescriptor); for (CompileCommand compileCommand : matchBlocks.get(matchDescriptor)) { handleCommand(dirFile, compileCommand); } if ("Inlinee.caller()".matches(matchDescriptor.getRegexp()) && !inlines.isEmpty()) { // Got a *.* match block, where inline would be written writeInlines(dirFile); inlines.clear(); } dirFile.end(); // ends match block } /* * Write inline directive in the end to the latest match block * if we didn't do this before * Inlinee caller methods should match this block only */ if (!inlines.isEmpty()) { Pair<Executable, Callable<?>> pair = METHODS.get(0); MethodDescriptor md = MethodGenerator.anyMatchDescriptor(pair.first); CompileCommand cc = new CompileCommand(Command.QUIET, md, null, Scenario.Type.DIRECTIVE); List<CompileCommand> commands = new ArrayList<>(); // Add appropriate "*.*" match block commands.add(cc); matchBlocks.put(md, commands); // Add match block for this descriptor with inlines dirFile.match(md); writeInlines(dirFile); dirFile.end(); } if (!matchBlocks.isEmpty()) { // terminates file dirFile.end(); } } }
private void handleCommand(DirectiveWriter dirFile, CompileCommand cmd) { Command command = cmd.command; switch (command) { case COMPILEONLY: dirFile.excludeCompile(cmd.compiler, false); break; case EXCLUDE: dirFile.excludeCompile(cmd.compiler, true); break; case QUIET: /* there are no appropriate directive for this, just make match be enabled */ case INLINE: case DONTINLINE: /* Inline commands will be written later. Just make this match be enabled */ dirFile.emitCompiler(Scenario.Compiler.C1); dirFile.option(DirectiveWriter.Option.ENABLE, true); dirFile.end(); dirFile.emitCompiler(Scenario.Compiler.C2); dirFile.option(DirectiveWriter.Option.ENABLE, true); dirFile.end(); break; case LOG: dirFile.option(DirectiveWriter.Option.LOG, true); break; case PRINT: dirFile.option(DirectiveWriter.Option.PRINT_ASSEMBLY, true); break; case NONEXISTENT: dirFile.write(JSONFile.Element.PAIR, command.name); dirFile.write(JSONFile.Element.OBJECT); dirFile.write(JSONFile.Element.PAIR, command.name); dirFile.write(JSONFile.Element.VALUE, cmd.methodDescriptor.getString()); dirFile.end(); // ends object break; default: throw new Error("TESTBUG: wrong command: " + command); } }