Anpassungen fuer jvmdisassembler

This commit is contained in:
Martin Plümicke 2014-03-24 15:32:13 +01:00
parent 9990892e5b
commit 157c83d9a4
4 changed files with 46 additions and 96 deletions

View File

@ -6,5 +6,6 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="lib/log4j-1.2.12.jar"/>
<classpathentry kind="lib" path="lib/junit-4.0.jar"/>
<classpathentry kind="lib" path="/Users/pl/workspaceV3_3_2/de.ba.horb.typeinference.plugin.updateSite/plugins/org.apache.log4j_1.2.15.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -1,15 +1,16 @@
//key_vector funktioniert nicht PL 14-03-21
//muss angeschaut werden
// ino.module.ClassFile.8531.package
package mycompiler.mybytecode;
// ino.end
// ino.module.ClassFile.8531.import
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Array;
import java.util.Vector;
import mycompiler.myclass.ParameterList;
import mycompiler.myclass.UsedId;
import mycompiler.MyCompiler;
@ -19,7 +20,6 @@ import mycompiler.mystatement.Assign;
import mycompiler.mystatement.Block;
import mycompiler.mytype.Type;
import mycompiler.SourceFile;
import org.apache.log4j.Logger;
// ino.end
@ -38,7 +38,6 @@ public class ClassFile
// ino.end
// ino.class.ClassFile.21492.body
{
//Beschreibung des Classfiles: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4
public boolean hamaAload0 = false; //hama: f<EFBFBD>gt in Konstruktor und set Methode ein aload_0 ein wird f<EFBFBD>r StoreSomethingParmCon ben<EFBFBD>tigt
// ino.attribute.codegenlog.21495.decldescription type=line
@ -55,10 +54,10 @@ public class ClassFile
private static int magic = 0xcafebabe;
// ino.end
// ino.attribute.minor_version.21501.declaration
private static short minor_version = 0;
public static short minor_version = 0;
// ino.end
// ino.attribute.major_version.21504.declaration
private static short major_version = 0x31;
public static short major_version = 0x31;
// ino.end
// ino.attribute.constant_pool.21507.declaration
@ -92,7 +91,7 @@ public class ClassFile
private Vector<Assign> class_block = new Vector<Assign>();
// ino.end
// ino.attribute.class_name.21537.declaration
private String class_name = new String();
private String class_name = new String("OUTPUT");//DEFAULTWERT PL 14-03-21 eingefuegt
// ino.end
// ino.attribute.super_class_name.21540.declaration
private String super_class_name = new String();
@ -638,6 +637,11 @@ public class ClassFile
// ino.method.set_attributes.21624.body
{ this.attributes = t; }
// ino.end
public void set_class_name(String cn) {
this.class_name = cn;
}
// ino.method.set_constructor_founded.21627.definition
public void set_constructor_founded(boolean t)
// ino.end
@ -729,7 +733,8 @@ public class ClassFile
codegenlog.info("Generieren der Klasse: " + class_name);
// Datei vorbereiten
File file = new File(MyCompiler.getAPI().getOutputDir()
//File file = new File(MyCompiler.getAPI().getOutputDir()
File file = new File ("/Users/pl/forschung/PIZZA+/JVM_Generics/Testfiles/"
+ class_name + ".class");
FileOutputStream f = new FileOutputStream(file);
@ -799,7 +804,7 @@ public class ClassFile
// ino.end
// ino.method.writeInt.21669.definition
public void writeInt(OutputStream f, int i)
public void writeInt(FileOutputStream f, int i)
throws IOException
// ino.end
// ino.method.writeInt.21669.body
@ -812,7 +817,7 @@ public class ClassFile
// ino.end
// ino.method.writeShort.21672.definition
public void writeShort(OutputStream f, short i)
public void writeShort(FileOutputStream f, short i)
throws IOException
// ino.end
// ino.method.writeShort.21672.body
@ -823,7 +828,7 @@ public class ClassFile
// ino.end
// ino.method.writeByte.21675.definition
public void writeByte(OutputStream f, byte i)
public void writeByte(FileOutputStream f, byte i)
throws IOException
// ino.end
// ino.method.writeByte.21675.body
@ -833,7 +838,7 @@ public class ClassFile
// ino.end
// ino.method.writeByteArray.21678.definition
public void writeByteArray(OutputStream f, byte[] b)
public void writeByteArray(FileOutputStream f, byte[] b)
throws IOException
// ino.end
// ino.method.writeByteArray.21678.body
@ -842,77 +847,5 @@ public class ClassFile
}
// ino.end
public byte[] getBytecode() {
ByteArrayOutputStream f = new ByteArrayOutputStream();
try {
// Schreiben der Header-Infos
writeInt(f, magic);
writeShort(f, minor_version);
writeShort(f, major_version);
codegenlog.debug("Header: magic=" + Integer.toHexString(magic));
codegenlog.debug("Header: minor_version=" + minor_version);
codegenlog.debug("Header: major_version=" + major_version);
codegenlog.info("Verarbeite Konstanten-Pool: " + (constant_pool.size()+1));
// Constant-Pool verarbeiten
writeShort(f, (short)(constant_pool.size() + 1));
for(int i = 0; i < constant_pool.size(); i++)
{
codegenlog.debug((i+1) +". " +
constant_pool.elementAt(i).toString());
constant_pool.elementAt(i).codegen(this, f);
}
// Informationen ueber die Klasse selbst verarbeiten
writeShort(f, access_flags);
writeShort(f, this_class);
writeShort(f, super_class);
codegenlog.debug("Klasseninfos: access_flags=" + access_flags);
codegenlog.debug("Klasseninfos: this_class=" + this_class);
codegenlog.debug("Klasseninfos: super_class=" + super_class);
// Interfaces verarbeiten
codegenlog.info("Verarbeite Interfaces: " + interfaces.size());
writeShort(f, (short)interfaces.size());
for (int i=0; i<interfaces.size(); i++) {
writeShort(f, interfaces.elementAt(i));
}
// Felder verarbeiten
codegenlog.info("Verarbeite Fields: " + fields.size());
writeShort(f, (short)fields.size());
for(int i = 0; i < fields.size(); i++)
{
fields.elementAt(i).codegen(this, f);
}
// Methodenvektor
codegenlog.info("Verarbeite Methodenliste: " + methods.size());
writeShort(f, (short)methods.size());
for(int i = 0; i < methods.size(); i++)
{
codegenlog.debug("Verarbeite Methode " + (i+1));
methods.elementAt(i).codegen(this, f);
}
// Attribut-Vektor
codegenlog.info("Verarbeite Attribute: " + attributes.size());
writeShort(f, (short)attributes.size());
for(int i = 0; i < attributes.size(); i++)
{
attributes.elementAt(i).codegen(this, f);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JVMCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return f.toByteArray();
}
}
// ino.end

View File

@ -1,3 +1,8 @@
//PL 14-03-21: calculate_max_stack() duerfte nicht stimmen
//vorübergehend max_stack und set_max_stack eingeführt
//in codegen "short max_stack = calculate_max_stack();" auskommentiert
//muss wieder einkommentiert werden
// ino.module.CodeAttribute.8532.package
package mycompiler.mybytecode;
// ino.end
@ -5,10 +10,8 @@ package mycompiler.mybytecode;
// ino.module.CodeAttribute.8532.import
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Array;
import java.util.Vector;
import mycompiler.myexception.JVMCodeException;
import mycompiler.mytype.Type;
// ino.end
@ -34,6 +37,12 @@ public class CodeAttribute extends Attribute
private Vector<Type> local_type_vector = new Vector<Type>();
// ino.end
short max_stack;
public CodeAttribute() {
super();
}
// ino.method.CodeAttribute.21700.definition
public CodeAttribute(String class_name, short acc_flags)
// ino.end
@ -204,9 +213,11 @@ public class CodeAttribute extends Attribute
// ino.end
// ino.method.get_attributes_length.21748.body
{
int ret = 12;
int ret = 8;//2(max_stack)+2(max_locals)+4(code_length)
ret += code_vector.size();
ret += 2; //exception table length
ret += (exception_tables.size() * 8);
ret += 2; //Attribute_count
for (int i = 0; i < attributes.size(); i++)
ret += attributes.elementAt(i)
.get_attributes_length();
@ -232,15 +243,20 @@ public class CodeAttribute extends Attribute
}
// ino.end
public void set_max_stack(short ms) {
max_stack = ms;
}
// ino.method.codegen.21757.definition
@Override
public void codegen(ClassFile classfile, OutputStream f)
public void codegen(ClassFile classfile, FileOutputStream f)
throws JVMCodeException, IOException
// ino.end
// ino.method.codegen.21757.body
{
int attributes_length = this.get_attributes_length();
short max_stack = calculate_max_stack();
//PL 14-03-21: muss wieder einkommentiert werden
//short max_stack = calculate_max_stack();
classfile.writeShort(f, get_attribute_name_index());
classfile.writeInt(f, attributes_length);
classfile.writeShort(f, max_stack);
@ -281,6 +297,7 @@ public class CodeAttribute extends Attribute
// ino.end
// ino.method.calculate_max_stack.21760.definition
//PL 14-03-21: Diese Methode duerfte nicht stimmen
private short calculate_max_stack()
throws JVMCodeException
// ino.end

View File

@ -5,9 +5,7 @@ package mycompiler.mybytecode;
// ino.module.SignatureInfo.8550.import
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Vector;
import mycompiler.myclass.ParameterList;
import mycompiler.myclass.UsedId;
import mycompiler.myexception.JVMCodeException;
@ -15,7 +13,6 @@ import mycompiler.mytype.BoundedGenericTypeVar;
import mycompiler.mytype.GenericTypeVar;
import mycompiler.mytype.RefType;
import mycompiler.mytype.Type;
import org.apache.log4j.Logger;
// ino.end
@ -46,6 +43,9 @@ public class SignatureInfo extends Attribute
// ino.end
public SignatureInfo(short sid) {
signatureID = sid;
}
// ino.method.SignatureInfo.22978.defdescription type=javadoc
/**
* Konstruktor fuer die Signatur einer Klasse bzw. eines Interfaces.
@ -178,8 +178,7 @@ public class SignatureInfo extends Attribute
// ino.end
// ino.method.codegen.22987.definition
@Override
public void codegen(ClassFile classfile, OutputStream f)
public void codegen(ClassFile classfile, FileOutputStream f)
throws JVMCodeException, IOException
// ino.end
// ino.method.codegen.22987.body