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. |