Package org.jctools.queues.varhandle
Class JavaParsingVarHandleQueueGenerator
- java.lang.Object
-
- com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
- org.jctools.queues.varhandle.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 usingJavaParser, and replacing idioms that useUnsafeto 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 java.lang.StringGEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORSWhen set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes.protected static java.lang.StringGEN_DIRECTIVE_METHOD_IGNOREWhen set on a method using a single line comment, the method is not patched by the generator.protected booleanhasVarHandleFieldsprotected java.lang.StringsourceFileName
-
Constructor Summary
Constructors Constructor Description JavaParsingVarHandleQueueGenerator(java.lang.String sourceFileName)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected java.lang.Stringcapitalise(java.lang.String s)protected com.github.javaparser.ast.type.ClassOrInterfaceTypeclassType(java.lang.String className)voidcleanupComments(com.github.javaparser.ast.CompilationUnit cu)protected com.github.javaparser.ast.body.InitializerDeclarationcreateVarHandleStaticInitializer(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 typeprotected com.github.javaparser.ast.body.FieldDeclarationdeclareVarHandle(java.lang.String className, java.lang.String variableName)Generates something likeprivate 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.BlockStmtfieldAssignment(java.lang.String fieldName, java.lang.String valueName)Generates something likefield = newValueprotected java.lang.StringgetFieldClassType(com.github.javaparser.ast.type.Type fieldType)Determines the class type for VarHandle initialization based on field typeprotected booleanisCommentPresent(com.github.javaparser.ast.Node node, java.lang.String wanted)protected booleanisRefArray(com.github.javaparser.ast.type.Type in, java.lang.String refClassName)protected booleanisRefType(com.github.javaparser.ast.type.Type in, java.lang.String className)protected com.github.javaparser.ast.expr.MethodCallExprmethodCallExpr(java.lang.String owner, java.lang.String method, com.github.javaparser.ast.expr.Expression... args)voidorganiseImports(com.github.javaparser.ast.CompilationUnit cu)protected java.lang.StringoutputPackage()(package private) booleanpatchVarHandleAccessorMethod(java.lang.String variableName, com.github.javaparser.ast.body.MethodDeclaration method, java.lang.String methodNameSuffix, boolean isFieldVolatile)private voidprocessSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node)private voidprocessSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node)(package private) abstract voidprocessSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?,com.github.javaparser.ast.type.Type> node, java.lang.String name)protected java.lang.StringqueueClassNamePrefix()protected voidremoveStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)protected voidreplaceParentClassesForVarHandle(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.BlockStmtreturnField(java.lang.String fieldName)Generates something likereturn field(package private) com.github.javaparser.ast.ImportDeclarationstaticImportDeclaration(java.lang.String name)java.lang.StringtranslateQueueName(java.lang.String qName)protected com.github.javaparser.ast.stmt.BlockStmtvarHandleCompareAndSet(java.lang.String varHandleFieldName, java.lang.String expectedValueName, java.lang.String newValueName)Generates something likereturn VH_PRODUCER_INDEX.compareAndSet(this, expectedValue, newValue)(package private) abstract java.lang.StringvarHandleFieldName(java.lang.String fieldName)protected com.github.javaparser.ast.stmt.BlockStmtvarHandleGetVolatile(java.lang.String varHandleFieldName, com.github.javaparser.ast.type.Type returnType)Generates something likereturn (long) VH_PRODUCER_INDEX.getVolatile(this)protected com.github.javaparser.ast.stmt.BlockStmtvarHandleSetRelease(java.lang.String varHandleFieldName, java.lang.String newValueName)Generates something likeVH_PRODUCER_INDEX.setRelease(this, newValue)voidvisit(com.github.javaparser.ast.body.Parameter n, java.lang.Void arg)voidvisit(com.github.javaparser.ast.body.VariableDeclarator n, java.lang.Void arg)voidvisit(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
-
Methods inherited from interface org.jctools.queues.util.JCToolsGenerator
visit
-
-
-
-
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
-
-
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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.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)
-
translateQueueName
public java.lang.String translateQueueName(java.lang.String qName)
- Specified by:
translateQueueNamein interfaceJCToolsGenerator
-
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:
cleanupCommentsin interfaceJCToolsGenerator
-
organiseImports
public void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
- Specified by:
organiseImportsin interfaceJCToolsGenerator
-
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 likeVH_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 likereturn (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 likereturn 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 likefield = newValue
-
declareVarHandle
protected com.github.javaparser.ast.body.FieldDeclaration declareVarHandle(java.lang.String className, java.lang.String variableName)Generates something likeprivate 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 likereturn 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)
-
-