Top Description Inners Fields Constructors Methods
org.lwjgl.util.mapped

public Class MappedObjectTransformer

extends Object
Class Inheritance
Imports
org.lwjgl.BufferUtils, .LWJGLUtil, .MemoryUtil, org.objectweb.asm.*, org.objectweb.asm.tree.*, org.objectweb.asm.tree.analysis.*, .Frame, org.objectweb.asm.util.TraceClassVisitor, java.io.PrintWriter, .StringWriter, java.lang.reflect.Field, .Modifier, java.nio.Buffer, .ByteBuffer, java.util.HashMap, .Map

This class implements the bytecode transformation that mapped object go through. Mapped object classes need to first be registered with the transformer, see register(Class).

The transformer supports some debugging tools, enabled through JVM system properties:
org.lwjgl.util.mapped.PrintTiming=true, prints timing information for the transformation step.
org.lwjgl.util.mapped.PrintActivity=true, prints activity information.
org.lwjgl.util.mapped.PrintBytecode=true, prints the transformed bytecode.
org.lwjgl.util.Debug must also be set to true for the above to work.

Author
Riven

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
private static class
private static class

Field Summary

Modifier and TypeField and Description
pack-priv static final String
pack-priv static final String
pack-priv static final String
pack-priv static final Map<String, MappedObjectTransformer.MappedSubtypeInfo>
pack-priv static final Map<Integer, String>
pack-priv static boolean
pack-priv static final String
pack-priv static final String
pack-priv static final String
pack-priv static final String
pack-priv static final String
pack-priv static final String
pack-priv static final String
pack-priv static final Map<Integer, String>
pack-priv static final String
pack-priv static final String
pack-priv static final String

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
private static void
checkInsnAfterIsArray(final AbstractInsnNode instruction, final int opcode)

private static InsnList
private static InsnList
generateByteBufferInstructions(final FieldInsnNode fieldInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedSubtype, final long fieldOffset)

private static InsnList
private static InsnList
private static InsnList
private static InsnList
private static InsnList
generateMapInstructions(final MappedObjectTransformer.MappedSubtypeInfo mappedType, final String className, final boolean mapDirectMethod, final boolean mallocMethod)

private static InsnList
private static InsnList
private static InsnList
private static InsnList
private static InsnList
private static void
getClassEnums(final Class<T> clazz, final Map<Integer, String> map, final String... prefixFilters)

pack-priv static AbstractInsnNode
getIntNode(final int value)

private static ClassAdapter
getMethodGenAdapter(final String className, final ClassVisitor cv)

pack-priv static String
pack-priv static String
getterName(final String fieldName)

pack-priv static String
private static void
printBytecode(byte[] bytecode)

public static void
register(Class<? extends MappedObject>
the mapped object class.
type
)

Registers a class as a mapped object.

private static MappedObjectTransformer.FieldInfo
registerField(final boolean autoGenerateOffsets, final String className, long advancingOffset, final Field field)

pack-priv static int
replace(final InsnList instructions, final int i, final AbstractInsnNode location, final InsnList list)

Replace an instruction with a list of instructions.

pack-priv static String
setterName(final String fieldName)

private static void
pack-priv static int
transformArrayAccess(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame> frameMap, final VarInsnNode loadInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedSubtype, final int var)

pack-priv static InsnList
pack-priv static byte[]
transformMappedAPI(final String className, byte[] bytecode)

pack-priv static byte[]
transformMappedObject(byte[] bytecode)

Removes final from methods that will be overriden by subclasses.

pack-priv static int
transformMethodCall(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame> frameMap, final MethodInsnNode methodInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedType, final Map<Integer, MappedObjectTransformer.MappedSubtypeInfo> arrayVars)

pack-priv static void
visitIntNode(final MethodVisitor mv, final int value)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

ALIGN_METHOD_NAMEback to summary
pack-priv static final String ALIGN_METHOD_NAME
CACHE_LINE_PAD_JVMback to summary
pack-priv static final String CACHE_LINE_PAD_JVM
CAPACITY_METHOD_NAMEback to summary
pack-priv static final String CAPACITY_METHOD_NAME
className_to_subtypeback to summary
pack-priv static final Map<String, MappedObjectTransformer.MappedSubtypeInfo> className_to_subtype
INSNTYPE_TO_NAMEback to summary
pack-priv static final Map<Integer, String> INSNTYPE_TO_NAME
is_currently_computing_framesback to summary
pack-priv static boolean is_currently_computing_frames
MAPPED_HELPER_JVMback to summary
pack-priv static final String MAPPED_HELPER_JVM
MAPPED_OBJECT_JVMback to summary
pack-priv static final String MAPPED_OBJECT_JVM
MAPPED_SET2_JVMback to summary
pack-priv static final String MAPPED_SET2_JVM
MAPPED_SET3_JVMback to summary
pack-priv static final String MAPPED_SET3_JVM
MAPPED_SET4_JVMback to summary
pack-priv static final String MAPPED_SET4_JVM
MAPPEDSET_PREFIXback to summary
pack-priv static final String MAPPEDSET_PREFIX
NEXT_METHOD_NAMEback to summary
pack-priv static final String NEXT_METHOD_NAME
OPCODE_TO_NAMEback to summary
pack-priv static final Map<Integer, String> OPCODE_TO_NAME
SIZEOF_METHOD_NAMEback to summary
pack-priv static final String SIZEOF_METHOD_NAME
VIEW_CONSTRUCTOR_NAMEback to summary
pack-priv static final String VIEW_CONSTRUCTOR_NAME
VIEWADDRESS_METHOD_NAMEback to summary
pack-priv static final String VIEWADDRESS_METHOD_NAME

Constructor Detail

MappedObjectTransformerback to summary
public MappedObjectTransformer()

Method Detail

checkInsnAfterIsArrayback to summary
private static void checkInsnAfterIsArray(final AbstractInsnNode instruction, final int opcode)
generateAddressInstructionsback to summary
private static InsnList generateAddressInstructions(final FieldInsnNode fieldInsn)
generateByteBufferInstructionsback to summary
private static InsnList generateByteBufferInstructions(final FieldInsnNode fieldInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedSubtype, final long fieldOffset)
generateCopyRangeInstructionsback to summary
private static InsnList generateCopyRangeInstructions(final MappedObjectTransformer.MappedSubtypeInfo mappedType)
generateCopyToInstructionsback to summary
private static InsnList generateCopyToInstructions(final MappedObjectTransformer.MappedSubtypeInfo mappedType)
generateDupInstructionsback to summary
private static InsnList generateDupInstructions(final MethodInsnNode methodInsn)
generateFieldInstructionsback to summary
private static InsnList generateFieldInstructions(final FieldInsnNode fieldInsn, final MappedObjectTransformer.FieldInfo field)
generateMapInstructionsback to summary
private static InsnList generateMapInstructions(final MappedObjectTransformer.MappedSubtypeInfo mappedType, final String className, final boolean mapDirectMethod, final boolean mallocMethod)
generateRunViewConstructorInstructionsback to summary
private static InsnList generateRunViewConstructorInstructions(final MethodInsnNode methodInsn)
generateSetViewInstructionsback to summary
private static InsnList generateSetViewInstructions(final FieldInsnNode fieldInsn)
generateSIZEOFInstructionsback to summary
private static InsnList generateSIZEOFInstructions(final FieldInsnNode fieldInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedSubtype)
generateSliceInstructionsback to summary
private static InsnList generateSliceInstructions(final MethodInsnNode methodInsn)
generateViewInstructionsback to summary
private static InsnList generateViewInstructions(final FieldInsnNode fieldInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedSubtype)
getClassEnumsback to summary
private static void getClassEnums(final Class<T> clazz, final Map<Integer, String> map, final String... prefixFilters)
getIntNodeback to summary
pack-priv static AbstractInsnNode getIntNode(final int value)
getMethodGenAdapterback to summary
private static ClassAdapter getMethodGenAdapter(final String className, final ClassVisitor cv)
getOpcodeNameback to summary
pack-priv static String getOpcodeName(final AbstractInsnNode insn)
getterNameback to summary
pack-priv static String getterName(final String fieldName)
jvmClassNameback to summary
pack-priv static String jvmClassName(Class<?> type)
printBytecodeback to summary
private static void printBytecode(byte[] bytecode)
registerback to summary
public static void register(Class<? extends MappedObject> type)

Registers a class as a mapped object. The class must extend org.lwjgl.util.mapped.MappedObject and be annotated with org.lwjgl.util.mapped.MappedField.

Parameters
type:Class<? extends MappedObject>

the mapped object class.

registerFieldback to summary
private static MappedObjectTransformer.FieldInfo registerField(final boolean autoGenerateOffsets, final String className, long advancingOffset, final Field field)
replaceback to summary
pack-priv static int replace(final InsnList instructions, final int i, final AbstractInsnNode location, final InsnList list)

Replace an instruction with a list of instructions.

setterNameback to summary
pack-priv static String setterName(final String fieldName)
throwAccessErrorOnReadOnlyFieldback to summary
private static void throwAccessErrorOnReadOnlyField(String className, String fieldName)
transformArrayAccessback to summary
pack-priv static int transformArrayAccess(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame> frameMap, final VarInsnNode loadInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedSubtype, final int var)
transformFieldAccessback to summary
pack-priv static InsnList transformFieldAccess(final FieldInsnNode fieldInsn)
transformMappedAPIback to summary
pack-priv static byte[] transformMappedAPI(final String className, byte[] bytecode)
transformMappedObjectback to summary
pack-priv static byte[] transformMappedObject(byte[] bytecode)

Removes final from methods that will be overriden by subclasses.

transformMethodCallback to summary
pack-priv static int transformMethodCall(final InsnList instructions, int i, final Map<AbstractInsnNode, Frame> frameMap, final MethodInsnNode methodInsn, final MappedObjectTransformer.MappedSubtypeInfo mappedType, final Map<Integer, MappedObjectTransformer.MappedSubtypeInfo> arrayVars)
visitIntNodeback to summary
pack-priv static void visitIntNode(final MethodVisitor mv, final int value)
org.lwjgl.util.mapped back to summary

private Class MappedObjectTransformer.FieldInfo

extends Object
Class Inheritance

Field Summary

Modifier and TypeField and Description
pack-priv final boolean
pack-priv final boolean
pack-priv final long
pack-priv final long
pack-priv final long
pack-priv final Type

Constructor Summary

AccessConstructor and Description
pack-priv
FieldInfo(final long offset, final long length, final long lengthPadded, final Type type, final boolean isVolatile, final boolean isPointer)

Method Summary

Modifier and TypeMethod and Description
pack-priv String
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

isPointerback to summary
pack-priv final boolean isPointer
isVolatileback to summary
pack-priv final boolean isVolatile
lengthback to summary
pack-priv final long length
lengthPaddedback to summary
pack-priv final long lengthPadded
offsetback to summary
pack-priv final long offset
typeback to summary
pack-priv final Type type

Constructor Detail

FieldInfoback to summary
pack-priv FieldInfo(final long offset, final long length, final long lengthPadded, final Type type, final boolean isVolatile, final boolean isPointer)

Method Detail

getAccessTypeback to summary
pack-priv String getAccessType()
org.lwjgl.util.mapped back to summary

private Class MappedObjectTransformer.MappedSubtypeInfo

extends Object
Class Inheritance
  • java.lang.Object
  • org.lwjgl.util.mapped.MappedObjectTransformer.MappedSubtypeInfo

Field Summary

Modifier and TypeField and Description
pack-priv final int
pack-priv final boolean
pack-priv final String
pack-priv final Map<String, MappedObjectTransformer.FieldInfo>
pack-priv final int
pack-priv final int
pack-priv final int

Constructor Summary

AccessConstructor and Description
pack-priv
MappedSubtypeInfo(String className, Map<String, MappedObjectTransformer.FieldInfo> fields, int sizeof, int align, int padding, final boolean cacheLinePadded)

Method Summary

Modifier and TypeMethod and Description
private static int
getPoT(int value)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

alignback to summary
pack-priv final int align
cacheLinePaddedback to summary
pack-priv final boolean cacheLinePadded
classNameback to summary
pack-priv final String className
fieldsback to summary
pack-priv final Map<String, MappedObjectTransformer.FieldInfo> fields
paddingback to summary
pack-priv final int padding
sizeofback to summary
pack-priv final int sizeof
sizeof_shiftback to summary
pack-priv final int sizeof_shift

Constructor Detail

MappedSubtypeInfoback to summary
pack-priv MappedSubtypeInfo(String className, Map<String, MappedObjectTransformer.FieldInfo> fields, int sizeof, int align, int padding, final boolean cacheLinePadded)

Method Detail

getPoTback to summary
private static int getPoT(int value)
org.lwjgl.util.mapped back to summary

private Class MappedObjectTransformer.TransformationAdapter

extends ClassAdapter
Class Inheritance

Field Summary

Modifier and TypeField and Description
pack-priv final String
pack-priv boolean
Inherited from org.objectweb.asm.ClassAdapter:
cv

Constructor Summary

AccessConstructor and Description
pack-priv
TransformationAdapter(final ClassVisitor cv, final String className)

Method Summary

Modifier and TypeMethod and Description
public FieldVisitor
visitField(final int
the field's access flags (see Opcodes). This parameter also indicates if the field is synthetic and/or deprecated.
access
,
final String
the field's name.
name
,
final String
the field's descriptor (see Type).
desc
,
final String
the field's signature. May be null if the field's type does not use generic types.
signature
,
final Object
the field's initial value. This parameter, which may be null if the field does not have an initial value, must be an Integer, a Float, a Long, a Double or a String (for int, float, long or String fields respectively). This parameter is only used for static fields. Its value is ignored for non static fields, which must be initialized through bytecode instructions in constructors or methods.
value
)

Overrides org.objectweb.asm.ClassAdapter.visitField.

Implements org.objectweb.asm.ClassVisitor.visitField.

Visits a field of the class.
public MethodVisitor
visitMethod(final int
the method's access flags (see Opcodes). This parameter also indicates if the method is synthetic and/or deprecated.
access
,
String
the method's name.
name
,
final String
the method's descriptor (see Type).
desc
,
final String
the method's signature. May be null if the method parameters, return type and exceptions do not use generic types.
signature
,
final String[]
the internal names of the method's exception classes (see getInternalName). May be null.
exceptions
)

Overrides org.objectweb.asm.ClassAdapter.visitMethod.

Implements org.objectweb.asm.ClassVisitor.visitMethod.

Visits a method of the class.
Inherited from org.objectweb.asm.ClassAdapter:
visitvisitAnnotationvisitAttributevisitEndvisitInnerClassvisitOuterClassvisitSource

Field Detail

classNameback to summary
pack-priv final String className
transformedback to summary
pack-priv boolean transformed

Constructor Detail

TransformationAdapterback to summary
pack-priv TransformationAdapter(final ClassVisitor cv, final String className)

Method Detail

visitFieldback to summary
public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value)

Overrides org.objectweb.asm.ClassAdapter.visitField.

Implements org.objectweb.asm.ClassVisitor.visitField.

Doc from org.objectweb.asm.ClassVisitor.visitField.

Visits a field of the class.

Parameters
access:int

the field's access flags (see Opcodes). This parameter also indicates if the field is synthetic and/or deprecated.

name:String

the field's name.

desc:String

the field's descriptor (see Type).

signature:String

the field's signature. May be null if the field's type does not use generic types.

value:Object

the field's initial value. This parameter, which may be null if the field does not have an initial value, must be an Integer, a Float, a Long, a Double or a String (for int, float, long or String fields respectively). This parameter is only used for static fields. Its value is ignored for non static fields, which must be initialized through bytecode instructions in constructors or methods.

Returns:FieldVisitor

a visitor to visit field annotations and attributes, or null if this class visitor is not interested in visiting these annotations and attributes.

Annotations
@Override
visitMethodback to summary
public MethodVisitor visitMethod(final int access, String name, final String desc, final String signature, final String[] exceptions)

Overrides org.objectweb.asm.ClassAdapter.visitMethod.

Implements org.objectweb.asm.ClassVisitor.visitMethod.

Doc from org.objectweb.asm.ClassVisitor.visitMethod.

Visits a method of the class. This method must return a new MethodVisitor instance (or null) each time it is called, i.e., it should not return a previously returned visitor.

Parameters
access:int

the method's access flags (see Opcodes). This parameter also indicates if the method is synthetic and/or deprecated.

name:String

the method's name.

desc:String

the method's descriptor (see Type).

signature:String

the method's signature. May be null if the method parameters, return type and exceptions do not use generic types.

exceptions:String[]

the internal names of the method's exception classes (see getInternalName). May be null.

Returns:MethodVisitor

an object to visit the byte code of the method, or null if this class visitor is not interested in visiting the code of this method.

Annotations
@Override