Class JavaParsingVarHandleQueueGenerator

  • All Implemented Interfaces:
    com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>, JCToolsGenerator
    Direct Known Subclasses:
    JavaParsingVarHandleArrayQueueGenerator, JavaParsingVarHandleLinkedQueueGenerator

    public abstract class JavaParsingVarHandleQueueGenerator
    extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.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.

    • Method Summary

      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      protected java.lang.String capitalise​(java.lang.String s)  
      protected com.github.javaparser.ast.type.ClassOrInterfaceType classType​(java.lang.String className)  
      void cleanupComments​(com.github.javaparser.ast.CompilationUnit cu)  
      protected com.github.javaparser.ast.body.InitializerDeclaration createVarHandleStaticInitializer​(java.lang.String className, java.util.List<java.lang.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​(java.lang.String className, java.lang.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​(java.lang.String fieldName, java.lang.String valueName)
      Generates something like field = newValue
      protected java.lang.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, java.lang.String wanted)  
      protected boolean isRefArray​(com.github.javaparser.ast.type.Type in, java.lang.String refClassName)  
      protected boolean isRefType​(com.github.javaparser.ast.type.Type in, java.lang.String className)  
      protected com.github.javaparser.ast.expr.MethodCallExpr methodCallExpr​(java.lang.String owner, java.lang.String method, com.github.javaparser.ast.expr.Expression... args)  
      void organiseImports​(com.github.javaparser.ast.CompilationUnit cu)  
      protected java.lang.String outputPackage()  
      (package private) boolean patchVarHandleAccessorMethod​(java.lang.String variableName, com.github.javaparser.ast.body.MethodDeclaration method, java.lang.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, java.lang.String name)  
      protected java.lang.String queueClassNamePrefix()  
      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​(java.lang.String fieldName)
      Generates something like return field
      (package private) com.github.javaparser.ast.ImportDeclaration staticImportDeclaration​(java.lang.String name)  
      java.lang.String translateQueueName​(java.lang.String qName)  
      protected com.github.javaparser.ast.stmt.BlockStmt varHandleCompareAndSet​(java.lang.String varHandleFieldName, java.lang.String expectedValueName, java.lang.String newValueName)
      Generates something like return VH_PRODUCER_INDEX.compareAndSet(this, expectedValue, newValue)
      (package private) abstract java.lang.String varHandleFieldName​(java.lang.String fieldName)  
      protected com.github.javaparser.ast.stmt.BlockStmt varHandleGetVolatile​(java.lang.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​(java.lang.String varHandleFieldName, java.lang.String newValueName)
      Generates something like VH_PRODUCER_INDEX.setRelease(this, newValue)
      void visit​(com.github.javaparser.ast.body.Parameter n, java.lang.Void arg)  
      void visit​(com.github.javaparser.ast.body.VariableDeclarator n, java.lang.Void arg)  
      void visit​(com.github.javaparser.ast.PackageDeclaration n, java.lang.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
    • Field Detail

      • GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS

        protected static final java.lang.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:
        Constant Field Values
      • GEN_DIRECTIVE_METHOD_IGNORE

        protected static final java.lang.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:
        Constant Field Values
      • sourceFileName

        protected final java.lang.String sourceFileName
      • hasVarHandleFields

        protected boolean hasVarHandleFields
    • Constructor Detail

      • JavaParsingVarHandleQueueGenerator

        JavaParsingVarHandleQueueGenerator​(java.lang.String sourceFileName)
    • Method Detail

      • outputPackage

        protected java.lang.String outputPackage()
      • queueClassNamePrefix

        protected java.lang.String queueClassNamePrefix()
      • processSpecialNodeTypes

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

        abstract java.lang.String varHandleFieldName​(java.lang.String fieldName)
      • visit

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

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

        public void visit​(com.github.javaparser.ast.body.VariableDeclarator n,
                          java.lang.Void arg)
        Specified by:
        visit in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
        Overrides:
        visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.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,
                                           java.lang.String wanted)
      • removeStaticFieldsAndInitialisers

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

        boolean patchVarHandleAccessorMethod​(java.lang.String variableName,
                                             com.github.javaparser.ast.body.MethodDeclaration method,
                                             java.lang.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 java.lang.String capitalise​(java.lang.String s)
      • varHandleSetRelease

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

        protected com.github.javaparser.ast.stmt.BlockStmt varHandleGetVolatile​(java.lang.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​(java.lang.String varHandleFieldName,
                                                                                  java.lang.String expectedValueName,
                                                                                  java.lang.String newValueName)
        Generates something like return VH_PRODUCER_INDEX.compareAndSet(this, expectedValue, newValue)
      • methodCallExpr

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

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

        protected com.github.javaparser.ast.body.FieldDeclaration declareVarHandle​(java.lang.String className,
                                                                                   java.lang.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​(java.lang.String className,
                                                                                                         java.util.List<java.lang.String> variableNames)
        Creates a static initializer block for VarHandle initialization Overloaded version that accepts variable names as strings and assumes long type
      • getFieldClassType

        protected java.lang.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​(java.lang.String fieldName)
        Generates something like return field
      • isRefArray

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

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

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

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