code: public Element simulate(final List<Element> arguments, final List<Instruction> instructions, final MethodIdentifier identifier) {
          // prevent infinite loops on analysing recursion
          if (EXECUTED_PATH_METHODS.contains(identifier))
              return new Element();
  
          lock.lock();
          EXECUTED_PATH_METHODS.add(identifier);
          try {
  
              injectArguments(arguments, identifier);
  
              return simulateInternal(instructions);
          } finally {
              EXECUTED_PATH_METHODS.remove(identifier);
              lock.unlock();
          }
      }
docs: Simulates the instructions of the method which will be called with the given arguments.
  
  @param arguments    The argument values
  @param instructions The instructions of the method
  @param identifier   The identifier of the method
  @return The return value or {@code null} if return type is void