Ejemplo n.º 1
0
 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);
   }
 }
Ejemplo n.º 2
0
  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();
      }
    }
  }
Ejemplo n.º 3
0
  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);
    }
  }