|
From: <sp...@us...> - 2011-07-23 22:29:03
|
Revision: 3600
http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3600&view=rev
Author: spasi
Date: 2011-07-23 22:28:57 +0000 (Sat, 23 Jul 2011)
Log Message:
-----------
Added support for volatile keyword.
Modified Paths:
--------------
trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedHelper.java
trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
Modified: trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedHelper.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedHelper.java 2011-07-23 22:02:01 UTC (rev 3599)
+++ trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedHelper.java 2011-07-23 22:28:57 UTC (rev 3600)
@@ -149,6 +149,22 @@
return MappedObjectUnsafe.INSTANCE.getByte(mapped.viewAddress + fieldOffset);
}
+ public static void bvput(byte value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putByteVolatile(null, addr, value);
+ }
+
+ public static void bvput(MappedObject mapped, byte value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putByteVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static byte bvget(long addr) {
+ return MappedObjectUnsafe.INSTANCE.getByteVolatile(null, addr);
+ }
+
+ public static byte bvget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getByteVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
// short
public static void sput(short value, long addr) {
@@ -167,6 +183,22 @@
return MappedObjectUnsafe.INSTANCE.getShort(mapped.viewAddress + fieldOffset);
}
+ public static void svput(short value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putShortVolatile(null, addr, value);
+ }
+
+ public static void svput(MappedObject mapped, short value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putShortVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static short svget(long addr) {
+ return MappedObjectUnsafe.INSTANCE.getShortVolatile(null, addr);
+ }
+
+ public static short svget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getShortVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
// char
public static void cput(char value, long addr) {
@@ -185,6 +217,22 @@
return MappedObjectUnsafe.INSTANCE.getChar(mapped.viewAddress + fieldOffset);
}
+ public static void cvput(char value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putCharVolatile(null, addr, value);
+ }
+
+ public static void cvput(MappedObject mapped, char value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putCharVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static char cvget(long addr) {
+ return MappedObjectUnsafe.INSTANCE.getCharVolatile(null, addr);
+ }
+
+ public static char cvget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getCharVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
// int
public static void iput(int value, long addr) {
@@ -203,6 +251,22 @@
return MappedObjectUnsafe.INSTANCE.getInt(mapped.viewAddress + fieldOffset);
}
+ public static void ivput(int value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putIntVolatile(null, addr, value);
+ }
+
+ public static void ivput(MappedObject mapped, int value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putIntVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static int ivget(long address) {
+ return MappedObjectUnsafe.INSTANCE.getIntVolatile(null, address);
+ }
+
+ public static int ivget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getIntVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
// float
public static void fput(float value, long addr) {
@@ -221,6 +285,22 @@
return MappedObjectUnsafe.INSTANCE.getFloat(mapped.viewAddress + fieldOffset);
}
+ public static void fvput(float value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putFloatVolatile(null, addr, value);
+ }
+
+ public static void fvput(MappedObject mapped, float value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putFloatVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static float fvget(long addr) {
+ return MappedObjectUnsafe.INSTANCE.getFloatVolatile(null, addr);
+ }
+
+ public static float fvget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getFloatVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
// long
public static void jput(long value, long addr) {
@@ -239,6 +319,22 @@
return MappedObjectUnsafe.INSTANCE.getLong(mapped.viewAddress + fieldOffset);
}
+ public static void jvput(long value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putLongVolatile(null, addr, value);
+ }
+
+ public static void jvput(MappedObject mapped, long value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putLongVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static long jvget(long addr) {
+ return MappedObjectUnsafe.INSTANCE.getLongVolatile(null, addr);
+ }
+
+ public static long lvget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getLongVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
// address
public static void aput(long value, long addr) {
@@ -275,4 +371,20 @@
return MappedObjectUnsafe.INSTANCE.getDouble(mapped.viewAddress + fieldOffset);
}
+ public static void dvput(double value, long addr) {
+ MappedObjectUnsafe.INSTANCE.putDoubleVolatile(null, addr, value);
+ }
+
+ public static void dvput(MappedObject mapped, double value, int fieldOffset) {
+ MappedObjectUnsafe.INSTANCE.putDoubleVolatile(null, mapped.viewAddress + fieldOffset, value);
+ }
+
+ public static double dvget(long addr) {
+ return MappedObjectUnsafe.INSTANCE.getDoubleVolatile(null, addr);
+ }
+
+ public static double dvget(MappedObject mapped, int fieldOffset) {
+ return MappedObjectUnsafe.INSTANCE.getDoubleVolatile(null, mapped.viewAddress + fieldOffset);
+ }
+
}
\ No newline at end of file
Modified: trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java 2011-07-23 22:02:01 UTC (rev 3599)
+++ trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java 2011-07-23 22:28:57 UTC (rev 3600)
@@ -179,7 +179,11 @@
Pointer pointer = field.getAnnotation(Pointer.class);
if ( pointer != null && field.getType() != long.class )
- throw new ClassFormatError("The @Pointer annotation can only be used on long fields. Field found: " + className + "." + field.getName() + ": " + field.getType());
+ throw new ClassFormatError("The @Pointer annotation can only be used on long fields. @Pointer field found: " + className + "." + field.getName() + ": " + field.getType());
+
+ if ( Modifier.isVolatile(field.getModifiers()) && (pointer != null || field.getType() == ByteBuffer.class) )
+ throw new ClassFormatError("The volatile keyword is not supported for @Pointer or ByteBuffer fields. Volatile field found: " + className + "." + field.getName() + ": " + field.getType());
+
// quick hack
long byteOffset = meta == null ? advancingOffset : meta.byteOffset();
long byteLength;
@@ -209,7 +213,7 @@
if ( PRINT_ACTIVITY )
LWJGLUtil.log(MappedObjectTransformer.class.getSimpleName() + ": " + className + "." + field.getName() + " [type=" + field.getType().getSimpleName() + ", offset=" + byteOffset + "]");
- return new FieldInfo(byteOffset, byteLength, Type.getType(field.getType()), pointer != null);
+ return new FieldInfo(byteOffset, byteLength, Type.getType(field.getType()), Modifier.isVolatile(field.getModifiers()), pointer != null);
}
/** Removes final from methods that will be overriden by subclasses. */
@@ -395,7 +399,7 @@
visitIntNode(mv, (int)field.offset);
mv.visitInsn(I2L);
mv.visitInsn(LADD);
- mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.isPointer ? "a" : field.type.getDescriptor().toLowerCase() + "get", "(J)" + field.type.getDescriptor());
+ mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(J)" + field.type.getDescriptor());
mv.visitInsn(field.type.getOpcode(IRETURN));
mv.visitMaxs(3, 2);
mv.visitEnd();
@@ -430,7 +434,7 @@
visitIntNode(mv, (int)field.offset);
mv.visitInsn(I2L);
mv.visitInsn(LADD);
- mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.isPointer ? "a" : field.type.getDescriptor().toLowerCase() + "put", "(" + field.type.getDescriptor() + "J)V");
+ mv.visitMethodInsn(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(" + field.type.getDescriptor() + "J)V");
mv.visitInsn(RETURN);
mv.visitMaxs(4, 4);
mv.visitEnd();
@@ -933,13 +937,11 @@
private static InsnList generateFieldInstructions(final FieldInsnNode fieldInsn, final FieldInfo field) {
final InsnList list = new InsnList();
- final String dataType = field.isPointer ? "a" : fieldInsn.desc.toLowerCase();
-
if ( fieldInsn.getOpcode() == PUTFIELD ) {
// stack: value, ref
list.add(getIntNode((int)field.offset));
// stack: fieldOffset, value, ref
- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, dataType + "put", "(L" + MAPPED_OBJECT_JVM + ";" + fieldInsn.desc + "I)V"));
+ list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "put", "(L" + MAPPED_OBJECT_JVM + ";" + fieldInsn.desc + "I)V"));
// stack -
return list;
}
@@ -948,7 +950,7 @@
// stack: ref
list.add(getIntNode((int)field.offset));
// stack: fieldOffset, ref
- list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, dataType + "get", "(L" + MAPPED_OBJECT_JVM + ";I)" + fieldInsn.desc));
+ list.add(new MethodInsnNode(INVOKESTATIC, MAPPED_HELPER_JVM, field.getAccessType() + "get", "(L" + MAPPED_OBJECT_JVM + ";I)" + fieldInsn.desc));
// stack: -
return list;
}
@@ -1047,15 +1049,21 @@
final long offset;
final long length;
final Type type;
+ final boolean isVolatile;
final boolean isPointer;
- FieldInfo(final long offset, final long length, final Type type, final boolean isPointer) {
+ FieldInfo(final long offset, final long length, final Type type, final boolean isVolatile, final boolean isPointer) {
this.offset = offset;
this.length = length;
this.type = type;
+ this.isVolatile = isVolatile;
this.isPointer = isPointer;
}
+ String getAccessType() {
+ return isPointer ? "a" : type.getDescriptor().toLowerCase() + (isVolatile ? "v" : "");
+ }
+
}
private static class MappedSubtypeInfo {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|