public final class SpecializedScanMethod extends SpecializedMethod
In general as there may not be a 1-1 mapping between objects and the specialized methods this class is responsible for performing the mapping.
Specialized methods must have a static 'invoke' method that matches the given signature and return type.
Modifier and Type | Class and Description |
---|---|
private static class |
SpecializedScanMethod.Names
The atoms for the names of the specialized methods
|
Modifier and Type | Field and Description |
---|---|
static boolean |
ENABLED
Use specialized scanning ?
|
private static int |
FALLBACK_PATTERN
Fallback to a slower path that is not specialized
|
private static int |
MAX_SPECIALIZED_OFFSET
Maximum field offset we can deal with
|
private static int |
NULL_PATTERN
Objects with no references or primitive arrays
|
private static int |
PATTERNS
The total number of patterns
|
private static int |
REFARRAY_PATTERN
Reference arrays
|
private static TypeReference |
returnType
The return type of this method: void
|
private static TypeReference[] |
signature
This method's signature: the object to be scanned and the trace to use
|
private static int |
SPECIALIZED_PATTERNS
Number of patterns we will specialize
|
private static Atom |
specializedMethodDescriptor
The generic descriptor for the specialized methods
|
private CompiledMethod[] |
specializedMethods
We keep the specialized methods for key object reference patterns here.
|
private static TypeReference |
specializedScanMethodType
Our type reference
|
private TypeReference[] |
specializedSignature
The specialized signature of the method
|
id
Constructor and Description |
---|
SpecializedScanMethod(int id,
TypeReference specializedTrace) |
compileSpecializedMethod
public static final boolean ENABLED
private static final TypeReference[] signature
private static final TypeReference returnType
private static final TypeReference specializedScanMethodType
private static final int NULL_PATTERN
private static final int SPECIALIZED_PATTERNS
private static final int REFARRAY_PATTERN
private static final int FALLBACK_PATTERN
private static final int PATTERNS
private static final int MAX_SPECIALIZED_OFFSET
private final CompiledMethod[] specializedMethods
private final TypeReference[] specializedSignature
private static final Atom specializedMethodDescriptor
public SpecializedScanMethod(int id, TypeReference specializedTrace)
private static int getPattern(RVMType type)
type
- the type to scanpublic CodeArray specializeMethod(RVMType type)
specializeMethod
in class SpecializedMethod
type
- the type whose specialzed method is to be returnedpublic TypeReference[] getSignature()
getSignature
in class SpecializedMethod
public TypeReference getReturnType()
getReturnType
in class SpecializedMethod
public static void invoke(int id, Object object, TransitiveClosure trace)
This is the method that (may) be hijacked by the compiler to call the specialized method.
It is safe for a compiler to ignore the potential gains and just use this method directly.
id
- The specialized method idobject
- The object to scantrace
- The trace to scanpublic static void fallback(Object object, TransitiveClosure trace)
public static void scalar(Object object, TransitiveClosure trace)
public static void referenceArray(Object object, TransitiveClosure trace)
public static void noReferences(Object object, TransitiveClosure trace)
public static void pattern(int pattern, Object object, TransitiveClosure trace)
private Atom templateMethodName(int pattern)
pattern
- The pattern to look forpublic static void scalarRNNNNN(Object object, TransitiveClosure trace)
public static void scalarNRNNNN(Object object, TransitiveClosure trace)
public static void scalarRRNNNN(Object object, TransitiveClosure trace)
public static void scalarNNRNNN(Object object, TransitiveClosure trace)
public static void scalarRNRNNN(Object object, TransitiveClosure trace)
public static void scalarNRRNNN(Object object, TransitiveClosure trace)
public static void scalarRRRNNN(Object object, TransitiveClosure trace)
public static void scalarNNNRNN(Object object, TransitiveClosure trace)
public static void scalarRNNRNN(Object object, TransitiveClosure trace)
public static void scalarNRNRNN(Object object, TransitiveClosure trace)
public static void scalarRRNRNN(Object object, TransitiveClosure trace)
public static void scalarNNRRNN(Object object, TransitiveClosure trace)
public static void scalarRNRRNN(Object object, TransitiveClosure trace)
public static void scalarNRRRNN(Object object, TransitiveClosure trace)
public static void scalarRRRRNN(Object object, TransitiveClosure trace)
public static void scalarNNNNRN(Object object, TransitiveClosure trace)
public static void scalarRNNNRN(Object object, TransitiveClosure trace)
public static void scalarNRNNRN(Object object, TransitiveClosure trace)
public static void scalarRRNNRN(Object object, TransitiveClosure trace)
public static void scalarNNRNRN(Object object, TransitiveClosure trace)
public static void scalarRNRNRN(Object object, TransitiveClosure trace)
public static void scalarNRRNRN(Object object, TransitiveClosure trace)
public static void scalarRRRNRN(Object object, TransitiveClosure trace)
public static void scalarNNNRRN(Object object, TransitiveClosure trace)
public static void scalarRNNRRN(Object object, TransitiveClosure trace)
public static void scalarNRNRRN(Object object, TransitiveClosure trace)
public static void scalarRRNRRN(Object object, TransitiveClosure trace)
public static void scalarNNRRRN(Object object, TransitiveClosure trace)
public static void scalarRNRRRN(Object object, TransitiveClosure trace)
public static void scalarNRRRRN(Object object, TransitiveClosure trace)
public static void scalarRRRRRN(Object object, TransitiveClosure trace)
public static void scalarNNNNNR(Object object, TransitiveClosure trace)
public static void scalarRNNNNR(Object object, TransitiveClosure trace)
public static void scalarNRNNNR(Object object, TransitiveClosure trace)
public static void scalarRRNNNR(Object object, TransitiveClosure trace)
public static void scalarNNRNNR(Object object, TransitiveClosure trace)
public static void scalarRNRNNR(Object object, TransitiveClosure trace)
public static void scalarNRRNNR(Object object, TransitiveClosure trace)
public static void scalarRRRNNR(Object object, TransitiveClosure trace)
public static void scalarNNNRNR(Object object, TransitiveClosure trace)
public static void scalarRNNRNR(Object object, TransitiveClosure trace)
public static void scalarNRNRNR(Object object, TransitiveClosure trace)
public static void scalarRRNRNR(Object object, TransitiveClosure trace)
public static void scalarNNRRNR(Object object, TransitiveClosure trace)
public static void scalarRNRRNR(Object object, TransitiveClosure trace)
public static void scalarNRRRNR(Object object, TransitiveClosure trace)
public static void scalarRRRRNR(Object object, TransitiveClosure trace)
public static void scalarNNNNRR(Object object, TransitiveClosure trace)
public static void scalarRNNNRR(Object object, TransitiveClosure trace)
public static void scalarNRNNRR(Object object, TransitiveClosure trace)
public static void scalarRRNNRR(Object object, TransitiveClosure trace)
public static void scalarNNRNRR(Object object, TransitiveClosure trace)
public static void scalarRNRNRR(Object object, TransitiveClosure trace)
public static void scalarNRRNRR(Object object, TransitiveClosure trace)
public static void scalarRRRNRR(Object object, TransitiveClosure trace)
public static void scalarNNNRRR(Object object, TransitiveClosure trace)
public static void scalarRNNRRR(Object object, TransitiveClosure trace)
public static void scalarNRNRRR(Object object, TransitiveClosure trace)
public static void scalarRRNRRR(Object object, TransitiveClosure trace)
public static void scalarNNRRRR(Object object, TransitiveClosure trace)
public static void scalarRNRRRR(Object object, TransitiveClosure trace)
public static void scalarNRRRRR(Object object, TransitiveClosure trace)
public static void scalarRRRRRR(Object object, TransitiveClosure trace)