|
From: <riv...@us...> - 2011-07-12 18:31:02
|
Revision: 3576
http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3576&view=rev
Author: riven-lwjgl
Date: 2011-07-12 18:30:56 +0000 (Tue, 12 Jul 2011)
Log Message:
-----------
First attempt at manual computation of stack frames
Modified Paths:
--------------
trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
Modified: trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java 2011-07-12 17:49:58 UTC (rev 3575)
+++ trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java 2011-07-12 18:30:56 UTC (rev 3576)
@@ -138,7 +138,7 @@
private static final String view_constructor_method = "_construct_view_";
static byte[] transformFieldAccess(final String className, byte[] bytecode) {
- int flags = ClassWriter.COMPUTE_FRAMES;
+ int flags = 0;//ClassWriter.COMPUTE_FRAMES;
ClassWriter writer = new ClassWriter(flags);
@@ -224,6 +224,14 @@
super.visitTypeInsn(opcode, typeName);
}
+
+ private int requireExtraStack = 0;
+
+ @Override
+ public void visitMaxs(int maxStack, int maxLocals)
+ {
+ super.visitMaxs(maxStack+this.requireExtraStack, maxLocals);
+ }
@Override
public void visitMethodInsn(int opcode, String className, String methodName, String signature) {
@@ -241,7 +249,7 @@
if ( (isMapDirectMethod || isMapBufferMethod) || isMallocMethod ) {
if ( isMallocMethod ) {
- // stack: count
+ // stack: count
pushInt(super.mv, mappedType.sizeof);
// stack: sizeof, count
super.visitInsn(IMUL);
@@ -271,6 +279,7 @@
// stack: int, int, buffer, new, new
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), "setup", "(L" + jvmClassName(MappedObject.class) + ";Ljava/nio/ByteBuffer;II)V");
// stack: new
+ this.requireExtraStack = 5;
return;
}
@@ -284,6 +293,7 @@
// stack: new, this
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), "dup", "(L" + jvmClassName(MappedObject.class) + ";L" + jvmClassName(MappedObject.class) + ";)L" + jvmClassName(MappedObject.class) + ";");
// stack: new
+ this.requireExtraStack = 3;
return;
}
@@ -297,6 +307,7 @@
// stack: new, this
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), "slice", "(L" + jvmClassName(MappedObject.class) + ";L" + jvmClassName(MappedObject.class) + ";)L" + jvmClassName(MappedObject.class) + ";");
// stack: new
+ this.requireExtraStack = 3;
return;
}
@@ -308,6 +319,7 @@
// stack: this, this
super.visitMethodInsn(INVOKEVIRTUAL, className, view_constructor_method, "()V");
// stack: this
+ this.requireExtraStack = 2;
return;
}
@@ -319,6 +331,7 @@
// stack: sizeof, target, this
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), "copy", "(L" + jvmClassName(MappedObject.class) + ";L" + jvmClassName(MappedObject.class) + ";I)V");
// stack: -
+ this.requireExtraStack = 3;
return;
}
@@ -330,6 +343,7 @@
// stack: bytes, target, this
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), "copy", "(L" + jvmClassName(MappedObject.class) + ";L" + jvmClassName(MappedObject.class) + ";I)V");
// stack: -
+ this.requireExtraStack = 4;
return;
}
}
@@ -458,30 +472,50 @@
if ( opcode == GETFIELD ) {
Long fieldLength = mappedSubtype.fieldToLength.get(fieldName);
+ // stack: ref
super.visitFieldInsn(GETFIELD, mappedSubtype.className, "viewAddress", "J");
+ // stack: long
super.visitLdcInsn(fieldOffset);
+ // stack: long, long
super.visitInsn(LADD);
+ // stack: long
super.visitLdcInsn(fieldLength);
+ // stack: long, long
super.visitInsn(L2I);
+ // stack: int, long
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), "newBuffer", "(JI)L" + jvmClassName(ByteBuffer.class) + ";");
-
+ // stack: buffer
+ this.requireExtraStack = 4;
return;
}
}
if ( opcode == PUTFIELD ) {
+ // stack: value, ref
super.visitInsn(SWAP);
+ // stack: ref, value
super.visitFieldInsn(GETFIELD, mappedSubtype.className, "viewAddress", "J");
+ // stack: long, value
super.visitLdcInsn(fieldOffset);
+ // stack: long, long, value
super.visitInsn(LADD);
+ // stack: long, value
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), typeName.toLowerCase() + "put", "(" + typeName + "J)V");
+ // stack -
+ this.requireExtraStack = 4+(int)(mappedSubtype.fieldToLength.get(fieldName).longValue()>>2);
return;
}
if ( opcode == GETFIELD ) {
+ // stack: ref
super.visitFieldInsn(GETFIELD, mappedSubtype.className, "viewAddress", "J");
+ // stack: long
super.visitLdcInsn(fieldOffset);
+ // stack: long, long
super.visitInsn(LADD);
+ // stack: long
super.visitMethodInsn(INVOKESTATIC, jvmClassName(MappedHelper.class), typeName.toLowerCase() + "get", "(J)" + typeName);
+ // stack: value
+ this.requireExtraStack = 4;
return;
}
@@ -511,7 +545,7 @@
else if ( value >= Short.MIN_VALUE && value <= Short.MAX_VALUE )
mv.visitIntInsn(SIPUSH, value);
else
- mv.visitLdcInsn(value);
+ mv.visitLdcInsn(Integer.valueOf(value));
}
private static String jvmClassName(Class<?> type) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <sp...@us...> - 2011-07-14 23:11:47
|
Revision: 3588
http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3588&view=rev
Author: spasi
Date: 2011-07-14 23:11:41 +0000 (Thu, 14 Jul 2011)
Log Message:
-----------
Fixed manual merge error.
Modified Paths:
--------------
trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
Modified: trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java
===================================================================
--- trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java 2011-07-14 16:54:25 UTC (rev 3587)
+++ trunk/LWJGL/src/java/org/lwjgl/util/mapped/MappedObjectTransformer.java 2011-07-14 23:11:41 UTC (rev 3588)
@@ -184,7 +184,7 @@
}
}
- return new MappedInstanceMethodAdapter(access, className, name, desc, super.visitMethod(access, name, desc, signature, exceptions));
+ return new MappedInstanceMethodAdapter(className, name, desc, super.visitMethod(access, name, desc, signature, exceptions));
}
@Override
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|