From bc3c3dad55ad0cf3cc02eb6874733aa23c690bed Mon Sep 17 00:00:00 2001 From: patrickroemer Date: Thu, 25 Oct 2007 13:22:01 +0000 Subject: [PATCH] Fix JDK5 class constant handling in ldc Maintain major/minor class file version from original file --- changes.txt | 9 ++++++ .../cs/bloat/context/BloatingClassLoader.java | 4 +++ src/EDU/purdue/cs/bloat/editor/CodeArray.java | 29 ++++++++++++------- src/EDU/purdue/cs/bloat/file/ClassFile.java | 12 +++++--- .../purdue/cs/bloat/file/ClassFileLoader.java | 2 +- 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/changes.txt b/changes.txt index f9b4ec0..8bdce30 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,12 @@ +2007-10-25 + +- ClassFileLoader#loadClassFromRessource(): String#replaceAll() -> String#replace() +- Added BloatingClassLoader#getEditorContext() +- CodeArray#visit_ldc: fix for JDK5 class literal constant references +- ClassFile: maintain original major/minor class format version information + +--- + - FlowGraph#addHandlerEdges: added visited parameter to keep track of blocks already visited to break 'infinite loop' in compiler-generated 'self-handling' exception handlers since JDK 1.4 diff --git a/src/EDU/purdue/cs/bloat/context/BloatingClassLoader.java b/src/EDU/purdue/cs/bloat/context/BloatingClassLoader.java index a18c64f..194a003 100644 --- a/src/EDU/purdue/cs/bloat/context/BloatingClassLoader.java +++ b/src/EDU/purdue/cs/bloat/context/BloatingClassLoader.java @@ -99,6 +99,10 @@ public abstract class BloatingClassLoader extends URLClassLoader { return this.loader; } + protected EditorContext getEditorContext() { + return context; + } + /** * This method is invoked as a class is being loaded. */ diff --git a/src/EDU/purdue/cs/bloat/editor/CodeArray.java b/src/EDU/purdue/cs/bloat/editor/CodeArray.java index c0706bb..eda4bf6 100644 --- a/src/EDU/purdue/cs/bloat/editor/CodeArray.java +++ b/src/EDU/purdue/cs/bloat/editor/CodeArray.java @@ -853,22 +853,29 @@ public class CodeArray implements InstructionVisitor, Opcode { } stackHeight += 2; - } else if (operand instanceof String) { - final int index = constants.addConstant(Constant.STRING, operand); + int index = constants.addConstant(Constant.STRING, operand); + createLDC(index); + } else if (operand instanceof Type) { + // JDK5+ class literal + int index = constants.addConstant(Constant.CLASS, operand); + createLDC(index); + } else { + throw new RuntimeException(); + } + } - if (index < 256) { - addOpcode(Opcode.opc_ldc); - addByte(index); - } else { - addOpcode(Opcode.opc_ldc_w); - addShort(index); - } + private void createLDC(int index) { - stackHeight++; + if (index < 256) { + addOpcode(Opcode.opc_ldc); + addByte(index); } else { - throw new RuntimeException(); + addOpcode(Opcode.opc_ldc_w); + addShort(index); } + + stackHeight++; } /* diff --git a/src/EDU/purdue/cs/bloat/file/ClassFile.java b/src/EDU/purdue/cs/bloat/file/ClassFile.java index 3b8c0b2..b4edf80 100644 --- a/src/EDU/purdue/cs/bloat/file/ClassFile.java +++ b/src/EDU/purdue/cs/bloat/file/ClassFile.java @@ -60,6 +60,10 @@ public class ClassFile implements ClassInfo { private File file; // (.class) File in which this class resides + private int major = 45; + + private int minor = 3; + /** * Constructor. This constructor parses the class file from the input * stream. @@ -407,8 +411,8 @@ public class ClassFile implements ClassInfo { */ private void writeHeader(final DataOutputStream out) throws IOException { out.writeInt(0xCAFEBABE); - out.writeShort(3); - out.writeShort(45); + out.writeShort(major); + out.writeShort(minor); } /** @@ -650,8 +654,8 @@ public class ClassFile implements ClassInfo { throw new ClassFormatError("Bad magic number."); } - in.readUnsignedShort(); // major - in.readUnsignedShort(); // minor + this.major = in.readUnsignedShort(); // major + this.minor = in.readUnsignedShort(); // minor } /** diff --git a/src/EDU/purdue/cs/bloat/file/ClassFileLoader.java b/src/EDU/purdue/cs/bloat/file/ClassFileLoader.java index dadb1c2..ba4301d 100644 --- a/src/EDU/purdue/cs/bloat/file/ClassFileLoader.java +++ b/src/EDU/purdue/cs/bloat/file/ClassFileLoader.java @@ -210,7 +210,7 @@ public class ClassFileLoader implements ClassInfoLoader { * @return the ClassInfo */ private ClassInfo loadClassFromRessource(String name){ - name = name.replaceAll("/","."); + name = name.replace('/','.'); try { Class clazz = _classSource.loadClass(name); int i = name.lastIndexOf('.');