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
FieldsModifier and TypeFieldDescriptionprotected static final StringWhen set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes.protected static final StringWhen set on a method using a single line comment, the method is not patched by the generator.protected booleanprotected final String -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected Stringcapitalise(String s) protected com.github.javaparser.ast.type.ClassOrInterfaceTypevoidcleanupComments(com.github.javaparser.ast.CompilationUnit cu) protected com.github.javaparser.ast.body.InitializerDeclarationcreateVarHandleStaticInitializer(String className, List<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(String className, 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(String fieldName, String valueName) Generates something likefield = newValueprotected 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, String wanted) protected booleanisRefArray(com.github.javaparser.ast.type.Type in, String refClassName) protected booleanprotected com.github.javaparser.ast.expr.MethodCallExprmethodCallExpr(String owner, String method, com.github.javaparser.ast.expr.Expression... args) voidorganiseImports(com.github.javaparser.ast.CompilationUnit cu) protected String(package private) booleanpatchVarHandleAccessorMethod(String variableName, com.github.javaparser.ast.body.MethodDeclaration method, 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, String name) protected Stringprotected 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(String fieldName) Generates something likereturn field(package private) com.github.javaparser.ast.ImportDeclarationtranslateQueueName(String qName) protected com.github.javaparser.ast.stmt.BlockStmtvarHandleCompareAndSet(String varHandleFieldName, String expectedValueName, String newValueName) Generates something likereturn VH_PRODUCER_INDEX.compareAndSet(this, expectedValue, newValue)(package private) abstract StringvarHandleFieldName(String fieldName) protected com.github.javaparser.ast.stmt.BlockStmtvarHandleGetVolatile(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(String varHandleFieldName, String newValueName) Generates something likeVH_PRODUCER_INDEX.setRelease(this, newValue)voidvoidvoidMethods 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, visitMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface JCToolsGenerator
visit
-
Field Details
-
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
When set on a method using a single line comment, the method is not patched by the generator.- See Also:
-
sourceFileName
-
hasVarHandleFields
protected boolean hasVarHandleFields
-
-
Constructor Details
-
JavaParsingVarHandleQueueGenerator
JavaParsingVarHandleQueueGenerator(String sourceFileName)
-
-
Method Details
-
outputPackage
-
queueClassNamePrefix
-
processSpecialNodeTypes
abstract void processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?, com.github.javaparser.ast.type.Type> node, String name) -
varHandleFieldName
-
visit
-
visit
-
visit
-
processSpecialNodeTypes
private void processSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node) -
processSpecialNodeTypes
private void processSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node) -
isCommentPresent
-
removeStaticFieldsAndInitialisers
protected void removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node) -
translateQueueName
- Specified by:
translateQueueNamein interfaceJCToolsGenerator
-
patchVarHandleAccessorMethod
-
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
-
varHandleSetRelease
-
varHandleGetVolatile
protected com.github.javaparser.ast.stmt.BlockStmt varHandleGetVolatile(String varHandleFieldName, com.github.javaparser.ast.type.Type returnType) Generates something likereturn (long) VH_PRODUCER_INDEX.getVolatile(this) -
varHandleCompareAndSet
-
methodCallExpr
-
fieldAssignment
-
declareVarHandle
protected com.github.javaparser.ast.body.FieldDeclaration declareVarHandle(String className, 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
-
getFieldClassType
Determines the class type for VarHandle initialization based on field type -
returnField
Generates something likereturn field -
isRefArray
-
isRefType
-
staticImportDeclaration
-
classType
-