Class JavaParsingVarHandleQueueGenerator

java.lang.Object
com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
org.jctools.queues.varhandle.JavaParsingVarHandleQueueGenerator
All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<Void>, JCToolsGenerator
Direct Known Subclasses:
JavaParsingVarHandleArrayQueueGenerator, JavaParsingVarHandleLinkedQueueGenerator

public abstract class JavaParsingVarHandleQueueGenerator extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void> implements JCToolsGenerator
Base class of the VarHandle queue generators. These generators work by parsing a Java source file using JavaParser, and replacing idioms that use Unsafe to instead use VarHandle, e.g.VarHandle. They are coupled directly to the structure of the expected input Java source file and are used as a utility to maintain unsafe non-portable optimized code along side safe portable code for uses on JDK 9+.

These generators are coupled with the structure and naming of fields, variables and methods and are not suitable for general purpose use.

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected static final String
    When set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes.
    protected static final String
    When set on a method using a single line comment, the method is not patched by the generator.
    protected boolean
     
    protected final String
     
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    protected String
     
    protected com.github.javaparser.ast.type.ClassOrInterfaceType
    classType(String className)
     
    void
    cleanupComments(com.github.javaparser.ast.CompilationUnit cu)
     
    protected com.github.javaparser.ast.body.InitializerDeclaration
    createVarHandleStaticInitializer(String className, List<String> variableNames)
    Creates a static initializer block for VarHandle initialization Overloaded version that accepts variable names as strings and assumes long type
    protected com.github.javaparser.ast.body.FieldDeclaration
    declareVarHandle(String className, String variableName)
    Generates something like private static final VarHandle VH_PRODUCER_INDEX; and initializer block with: static { try { VH_PRODUCER_INDEX = MethodHandles.lookup().findVarHandle(ClassName.class, "producerIndex", long.class); } catch (Exception e) { throw new ExceptionInInitializerError(e); } }
    protected com.github.javaparser.ast.stmt.BlockStmt
    fieldAssignment(String fieldName, String valueName)
    Generates something like field = newValue
    protected String
    getFieldClassType(com.github.javaparser.ast.type.Type fieldType)
    Determines the class type for VarHandle initialization based on field type
    protected boolean
    isCommentPresent(com.github.javaparser.ast.Node node, String wanted)
     
    protected boolean
    isRefArray(com.github.javaparser.ast.type.Type in, String refClassName)
     
    protected boolean
    isRefType(com.github.javaparser.ast.type.Type in, String className)
     
    protected com.github.javaparser.ast.expr.MethodCallExpr
    methodCallExpr(String owner, String method, com.github.javaparser.ast.expr.Expression... args)
     
    void
    organiseImports(com.github.javaparser.ast.CompilationUnit cu)
     
    protected String
     
    (package private) boolean
    patchVarHandleAccessorMethod(String variableName, com.github.javaparser.ast.body.MethodDeclaration method, String methodNameSuffix, boolean isFieldVolatile)
     
    private void
    processSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node)
     
    private void
    processSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node)
     
    (package private) abstract void
    processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?,com.github.javaparser.ast.type.Type> node, String name)
     
    protected String
     
    protected void
    removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)
     
    protected void
    replaceParentClassesForVarHandle(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
    Searches all extended or implemented super classes or interfaces for special classes that differ with the VarHandle version and replaces them with the appropriate class.
    protected com.github.javaparser.ast.stmt.BlockStmt
    returnField(String fieldName)
    Generates something like return field
    (package private) com.github.javaparser.ast.ImportDeclaration
     
     
    protected com.github.javaparser.ast.stmt.BlockStmt
    varHandleCompareAndSet(String varHandleFieldName, String expectedValueName, String newValueName)
    Generates something like return VH_PRODUCER_INDEX.compareAndSet(this, expectedValue, newValue)
    (package private) abstract String
     
    protected com.github.javaparser.ast.stmt.BlockStmt
    varHandleGetVolatile(String varHandleFieldName, com.github.javaparser.ast.type.Type returnType)
    Generates something like return (long) VH_PRODUCER_INDEX.getVolatile(this)
    protected com.github.javaparser.ast.stmt.BlockStmt
    varHandleSetRelease(String varHandleFieldName, String newValueName)
    Generates something like VH_PRODUCER_INDEX.setRelease(this, newValue)
    void
    visit(com.github.javaparser.ast.body.Parameter n, Void arg)
     
    void
    visit(com.github.javaparser.ast.body.VariableDeclarator n, Void arg)
     
    void
    visit(com.github.javaparser.ast.PackageDeclaration n, Void arg)
     

    Methods inherited from class com.github.javaparser.ast.visitor.VoidVisitorAdapter

    visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.jctools.queues.util.JCToolsGenerator

    visit
  • Field Details

    • GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS

      protected static final String GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS
      When set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes. These fields are candidates to be patched by the generator. Other classes the fields remain unadjusted.
      See Also:
    • GEN_DIRECTIVE_METHOD_IGNORE

      protected static final String GEN_DIRECTIVE_METHOD_IGNORE
      When set on a method using a single line comment, the method is not patched by the generator.
      See Also:
    • sourceFileName

      protected final String sourceFileName
    • hasVarHandleFields

      protected boolean hasVarHandleFields
  • Constructor Details

    • JavaParsingVarHandleQueueGenerator

      JavaParsingVarHandleQueueGenerator(String sourceFileName)
  • Method Details

    • outputPackage

      protected String outputPackage()
    • queueClassNamePrefix

      protected String queueClassNamePrefix()
    • processSpecialNodeTypes

      abstract void processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?,com.github.javaparser.ast.type.Type> node, String name)
    • varHandleFieldName

      abstract String varHandleFieldName(String fieldName)
    • visit

      public void visit(com.github.javaparser.ast.PackageDeclaration n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • visit

      public void visit(com.github.javaparser.ast.body.Parameter n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • visit

      public void visit(com.github.javaparser.ast.body.VariableDeclarator n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • processSpecialNodeTypes

      private void processSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node)
    • processSpecialNodeTypes

      private void processSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node)
    • isCommentPresent

      protected boolean isCommentPresent(com.github.javaparser.ast.Node node, String wanted)
    • removeStaticFieldsAndInitialisers

      protected void removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)
    • translateQueueName

      public String translateQueueName(String qName)
      Specified by:
      translateQueueName in interface JCToolsGenerator
    • patchVarHandleAccessorMethod

      boolean patchVarHandleAccessorMethod(String variableName, com.github.javaparser.ast.body.MethodDeclaration method, String methodNameSuffix, boolean isFieldVolatile)
    • replaceParentClassesForVarHandle

      protected void replaceParentClassesForVarHandle(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
      Searches all extended or implemented super classes or interfaces for special classes that differ with the VarHandle version and replaces them with the appropriate class.
    • cleanupComments

      public void cleanupComments(com.github.javaparser.ast.CompilationUnit cu)
      Specified by:
      cleanupComments in interface JCToolsGenerator
    • organiseImports

      public void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
      Specified by:
      organiseImports in interface JCToolsGenerator
    • capitalise

      protected String capitalise(String s)
    • varHandleSetRelease

      protected com.github.javaparser.ast.stmt.BlockStmt varHandleSetRelease(String varHandleFieldName, String newValueName)
      Generates something like VH_PRODUCER_INDEX.setRelease(this, newValue)
    • varHandleGetVolatile

      protected com.github.javaparser.ast.stmt.BlockStmt varHandleGetVolatile(String varHandleFieldName, com.github.javaparser.ast.type.Type returnType)
      Generates something like return (long) VH_PRODUCER_INDEX.getVolatile(this)
    • varHandleCompareAndSet

      protected com.github.javaparser.ast.stmt.BlockStmt varHandleCompareAndSet(String varHandleFieldName, String expectedValueName, String newValueName)
      Generates something like return VH_PRODUCER_INDEX.compareAndSet(this, expectedValue, newValue)
    • methodCallExpr

      protected com.github.javaparser.ast.expr.MethodCallExpr methodCallExpr(String owner, String method, com.github.javaparser.ast.expr.Expression... args)
    • fieldAssignment

      protected com.github.javaparser.ast.stmt.BlockStmt fieldAssignment(String fieldName, String valueName)
      Generates something like field = newValue
    • declareVarHandle

      protected com.github.javaparser.ast.body.FieldDeclaration declareVarHandle(String className, String variableName)
      Generates something like private static final VarHandle VH_PRODUCER_INDEX; and initializer block with: static { try { VH_PRODUCER_INDEX = MethodHandles.lookup().findVarHandle(ClassName.class, "producerIndex", long.class); } catch (Exception e) { throw new ExceptionInInitializerError(e); } }
    • createVarHandleStaticInitializer

      protected com.github.javaparser.ast.body.InitializerDeclaration createVarHandleStaticInitializer(String className, List<String> variableNames)
      Creates a static initializer block for VarHandle initialization Overloaded version that accepts variable names as strings and assumes long type
    • getFieldClassType

      protected String getFieldClassType(com.github.javaparser.ast.type.Type fieldType)
      Determines the class type for VarHandle initialization based on field type
    • returnField

      protected com.github.javaparser.ast.stmt.BlockStmt returnField(String fieldName)
      Generates something like return field
    • isRefArray

      protected boolean isRefArray(com.github.javaparser.ast.type.Type in, String refClassName)
    • isRefType

      protected boolean isRefType(com.github.javaparser.ast.type.Type in, String className)
    • staticImportDeclaration

      com.github.javaparser.ast.ImportDeclaration staticImportDeclaration(String name)
    • classType

      protected com.github.javaparser.ast.type.ClassOrInterfaceType classType(String className)