X-Git-Url: http://git.megacz.com/?p=org.ibex.classgen.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FClassGen.java;h=ddbf8a13697f0b72fd4dd1a788fbd4e67929b4d3;hp=1ae97412ec6da7b154aa20a8190deac0fbfe8e2d;hb=161a72a3b197b7f1c84954475aac89a7b191745d;hpb=fb8a2dfe2f45b27710921562df968b86f2faceee
diff --git a/src/org/ibex/classgen/ClassGen.java b/src/org/ibex/classgen/ClassGen.java
index 1ae9741..ddbf8a1 100644
--- a/src/org/ibex/classgen/ClassGen.java
+++ b/src/org/ibex/classgen/ClassGen.java
@@ -3,49 +3,94 @@ package org.ibex.classgen;
import java.util.*;
import java.io.*;
+/** Class generation object representing the whole classfile */
public class ClassGen implements CGConst {
- private Type.Object thisType;
- private Type.Object superType;
- int flags;
- private String sourceFile;
+ private final Type.Object thisType;
+ private final Type.Object superType;
+ private final Type.Object[] interfaces;
+ final int flags;
- private Vector interfaces = new Vector();
- private Vector fields = new Vector();
- private Vector methods = new Vector();
+ private String sourceFile;
+ private final Vector fields = new Vector();
+ private final Vector methods = new Vector();
final CPGen cp;
private final AttrGen attributes;
+ /** @see #ClassGen(Type.Object,Type.Object,int) */
public ClassGen(String name, String superName, int flags) {
this(new Type.Object(name),new Type.Object(superName),flags);
}
-
+
+ /** @see #ClassGen(Type.Object,Type.Object,int,Type.Object[]) */
public ClassGen(Type.Object thisType,Type.Object superType, int flags) {
+ this(thisType,superType,flags,null);
+ }
+
+ /** Creates a new ClassGen object
+ @param thisType The type of the class to generate
+ @param superType The superclass of the generated class (commonly Type.OBJECT)
+ @param flags The access flags for this class (ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_INTERFACE, and ACC_ABSTRACT)
+ */
+ public ClassGen(Type.Object thisType,Type.Object superType, int flags, Type.Object[] interfaces) {
if((flags & ~(ACC_PUBLIC|ACC_FINAL|ACC_SUPER|ACC_INTERFACE|ACC_ABSTRACT)) != 0)
throw new IllegalArgumentException("invalid flags");
this.thisType = thisType;
this.superType = superType;
+ this.interfaces = interfaces;
this.flags = flags;
cp = new CPGen();
attributes = new AttrGen(cp);
}
+ /** Adds a new method to this class
+ @param name The name of the method (not the signature, just the name)
+ @param ret The return type of the method
+ @param args The arguments to the method
+ @param flags The flags for the method
+ (ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT)
+ @return A new MethodGen object for the method
+ @exception IllegalArgumentException if illegal flags are specified
+ @see MethodGen
+ @see CGConst
+ */
public final MethodGen addMethod(String name, Type ret, Type[] args, int flags) {
MethodGen mg = new MethodGen(this,name,ret,args,flags);
methods.addElement(mg);
return mg;
}
+ /** Adds a new field to this class
+ @param name The name of the filed (not the signature, just the name)
+ @param type The type of the field
+ @param flags The flags for the field
+ (ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT)
+ @return A new FieldGen object for the method
+ @exception IllegalArgumentException if illegal flags are specified
+ @see FieldGen
+ @see CGConst
+ */
public final FieldGen addField(String name, Type type, int flags) {
FieldGen fg = new FieldGen(this,name,type,flags);
fields.addElement(fg);
return fg;
}
+ /** Sets the source value of the SourceFile attribute of this class
+ @param sourceFile The string to be uses as the SourceFile of this class
+ */
public void setSourceFile(String sourceFile) { this.sourceFile = sourceFile; }
- public void dump(String s) throws IOException { dump(new File(s)); }
+ /** Writes the classfile data to the file specifed
+ @see ClassGen#dump(OutputStream)
+ */
+ public void dump(String file) throws IOException { dump(new File(file)); }
+
+ /** Writes the classfile data to the file specified
+ If f is a directory directory components under it are created for the package the class is in (like javac's -d option)
+ @see ClassGen#dump(OutputStream)
+ */
public void dump(File f) throws IOException {
if(f.isDirectory()) {
String[] a = thisType.components();
@@ -58,7 +103,13 @@ public class ClassGen implements CGConst {
}
dump(new FileOutputStream(f));
}
-
+
+ /** Writes the classfile data to the outputstream specified
+ @param os The stream to write the class to
+ @exception IOException if an IOException occures while writing the class data
+ @exception IllegalStateException if the data for a method is in an inconsistent state (required arguments missing, etc)
+ @exception Exn if the classfile could not be written for any other reason (constant pool full, etc)
+ */
public void dump(OutputStream os) throws IOException {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(os));
_dump(dos);
@@ -66,13 +117,14 @@ public class ClassGen implements CGConst {
}
private void _dump(DataOutput o) throws IOException {
+ cp.optimize();
+ cp.stable();
+
cp.add(thisType);
cp.add(superType);
- for(int i=0;i