// Copyright (c) Corporation for National Research Initiatives
package org.python.compiler;
import java.util.*;
import java.io.*;
class Method {
int access, name, type;
Attribute[] atts;
public Method(int name, int type, int access, Attribute[] atts) {
this.name = name;
this.type = type;
this.access = access;
this.atts = atts;
}
public void write(DataOutputStream stream) throws IOException {
stream.writeShort(access);
stream.writeShort(name);
stream.writeShort(type);
ClassFile.writeAttributes(stream, atts);
}
}
public class ClassFile {
ConstantPool pool;
int access;
public String name;
String superclass;
int[] interfaces;
Vector methods;
Vector fields;
Vector attributes;
public final static int PUBLIC = 0x1;
public final static int PRIVATE = 0x2;
public final static int PROTECTED = 0x4;
public final static int STATIC = 0x8;
public final static int FINAL = 0x10;
public final static int SYNCHRONIZED = 0x20;
public final static int NATIVE = 0x100;
public final static int ABSTRACT = 0x400;
public static String fixName(String n) {
if (n.indexOf('.') == -1)
return n;
char[] c = n.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == '.')
c[i] = '/';
}
return new String(c);
}
public ClassFile(String name) {
this(name, "java/lang/Object", SYNCHRONIZED | PUBLIC);
}
public ClassFile(String name, String superclass, int access) {
this.name = fixName(name);
this.superclass = fixName(superclass);
this.interfaces = new int[0];
this.access = access;
pool = new ConstantPool();
methods = new Vector();
fields = new Vector();
attributes = new Vector();
}
public void addInterface(String name) throws IOException {
int[] new_interfaces = new int[interfaces.length + 1];
System.arraycopy(interfaces, 0, new_interfaces, 0, interfaces.length);
new_interfaces[interfaces.length] = pool.Class(name);
interfaces = new_interfaces;
}
public Code addMethod(String name, String type, int access) throws IOException {
Code code = new Code(type, pool, (access & STATIC) == STATIC);
Method m = new Method(pool.UTF8(name), pool.UTF8(type), access, new Attribute[] { code });
methods.addElement(m);
return code;
}
public void addField(String name, String type, int access) throws IOException {
Method m = new Method(pool.UTF8(name), pool.UTF8(type), access, new Attribute[0]);
fields.addElement(m);
}
public static void writeAttributes(DataOutputStream stream, Attribute[] atts) throws IOException {
stream.writeShort(atts.length);
for (int i = 0; i < atts.length; i++) {
atts[i].write(stream);
}
}
public void writeMethods(DataOutputStream stream, Vector methods) throws IOException {
stream.writeShort(methods.size());
for (int i = 0; i < methods.size(); i++) {
Method m = (Method) methods.elementAt(i);
m.write(stream);
}
}
public void addAttribute(Attribute attr) throws IOException {
attributes.addElement(attr);
}
public void write(DataOutputStream stream) throws IOException {
//Write Header
int thisclass = pool.Class(name);
int superclass = pool.Class(this.superclass);
stream.writeInt(0xcafebabe);
stream.writeShort(0x3);
stream.writeShort(0x2d);
pool.write(stream);
stream.writeShort(access);
stream.writeShort(thisclass);
stream.writeShort(superclass);
//write out interfaces
stream.writeShort(interfaces.length);
for (int i = 0; i < interfaces.length; i++)
stream.writeShort(interfaces[i]);
writeMethods(stream, fields);
writeMethods(stream, methods);
//write out class attributes
int n = attributes.size();
stream.writeShort(n);
for (int i = 0; i < n; i++) {
((Attribute) attributes.elementAt(i)).write(stream);
}
}
public void write(OutputStream stream) throws IOException {
write(new DataOutputStream(stream));
}
}