155 lines
5.6 KiB
Java
155 lines
5.6 KiB
Java
// Simply try
|
|
// to access as much of
|
|
// the API as possible.
|
|
|
|
import jas.*;
|
|
|
|
import java.io.*;
|
|
import sun.tools.java.RuntimeConstants;
|
|
|
|
public class all implements RuntimeConstants
|
|
{
|
|
public static void main(String argv[])
|
|
throws Exception
|
|
{
|
|
ClassEnv c = new ClassEnv();
|
|
|
|
// Adding CP Items directly
|
|
|
|
c.addCPItem(new AsciiCP("fubar"));
|
|
c.addCPItem(new ClassCP("java/lang/Number"));
|
|
c.addCPItem(new DoubleCP(2.0));
|
|
c.addCPItem(new FieldCP("java/lang/System",
|
|
"out",
|
|
"Ljava/io/PrintStream;"));
|
|
c.addCPItem(new FloatCP((float)(2.0)));
|
|
c.addCPItem(new IntegerCP(2));
|
|
c.addCPItem(new InterfaceCP("java/lang/Runnable",
|
|
"run",
|
|
"()V"));
|
|
c.addCPItem(new LongCP(2));
|
|
c.addCPItem(new MethodCP("java/lang/Thread",
|
|
"run",
|
|
"()V"));
|
|
|
|
c.addCPItem(new NameTypeCP("sdfsdf", "Ljava/lang/Object;"));
|
|
c.addCPItem(new StringCP("sdf"));
|
|
|
|
|
|
// Add fields, creating variables
|
|
c.addField(new Var((short) ACC_PUBLIC,
|
|
new AsciiCP("someIntvar"),
|
|
new AsciiCP("I"),
|
|
null));
|
|
c.addField(new Var((short)(ACC_PUBLIC|ACC_STATIC|ACC_FINAL),
|
|
new AsciiCP("finalInt"),
|
|
new AsciiCP("I"),
|
|
new ConstAttr(new IntegerCP(10))));
|
|
|
|
// Check if I can add interfaces
|
|
c.addInterface(new ClassCP("java/lang/Runnable"));
|
|
|
|
c.setClass(new ClassCP("regress"));
|
|
c.setSuperClass(new ClassCP("java/lang/Object"));
|
|
c.setClassAccess((short) ACC_PUBLIC);
|
|
|
|
// Creating code.
|
|
|
|
CodeAttr code = new CodeAttr();
|
|
// add instructions of various
|
|
// operand types.
|
|
|
|
// No operands
|
|
code.addInsn(new Insn(opc_return));
|
|
// one arg operands
|
|
code.addInsn(new Insn(opc_astore, 5));
|
|
// one arg arguments with wide operand
|
|
code.addInsn(new Insn(opc_dstore, 256));
|
|
code.addInsn(new Insn(opc_istore, 2576));
|
|
|
|
// Add a label
|
|
code.addInsn(new Label("First label"));
|
|
// refer back to it
|
|
code.addInsn(new Insn(opc_jsr,
|
|
new Label("First label")));
|
|
// add another label
|
|
code.addInsn(new Label("second_label"));
|
|
// insn with CP argument
|
|
code.addInsn(new Insn(opc_ldc_w, new StringCP("sdfsdf")));
|
|
|
|
// the "special" instructions
|
|
code.addInsn(new IincInsn(2, -2));
|
|
// wider version check
|
|
code.addInsn(new IincInsn(1234, 2));
|
|
code.addInsn(new IincInsn(3, -200));
|
|
code.addInsn(new InvokeinterfaceInsn(new ClassCP("java/lang/Number"), 1));
|
|
code.addInsn(new MultiarrayInsn(new ClassCP("java/lang/Double"), 3));
|
|
Label woo[] = new Label[3];
|
|
woo[0] = new Label("First label");
|
|
woo[1] = new Label("second_label");
|
|
woo[2] = new Label("second_label");
|
|
code.addInsn(new TableswitchInsn(0, 2, woo[0], woo));
|
|
|
|
int m[] = new int[3];
|
|
m[0] = 11;
|
|
m[1] = 15;
|
|
m[2] = -1;
|
|
code.addInsn(new LookupswitchInsn(woo[0], m, woo));
|
|
|
|
|
|
// make a catchtable
|
|
Catchtable ctb = new Catchtable();
|
|
// add a couple of entries
|
|
ctb.addEntry(new Label("First label"),
|
|
new Label("second_label"),
|
|
new Label("second_label"),
|
|
new ClassCP("java/lang/Exception"));
|
|
ctb.addEntry(new Label("First label"),
|
|
new Label("second_label"),
|
|
new Label("second_label"),
|
|
new ClassCP("java/lang/Error"));
|
|
code.setCatchtable(ctb);
|
|
code.setStackSize((short)100);
|
|
code.setVarSize((short)500);
|
|
// Add some line table info
|
|
LineTableAttr ln = new LineTableAttr();
|
|
ln.addEntry(woo[0], 234);
|
|
ln.addEntry(woo[1], 245);
|
|
ln.addEntry(woo[2], 22);
|
|
code.setLineTable(ln);
|
|
// Add a generic attr to a method
|
|
String foo = "sldkfj sdlfkj";
|
|
byte dat[] = new byte[foo.length()];
|
|
foo.getBytes(0, dat.length, dat, 0);
|
|
code.addGenericAttr(new GenericAttr("strangeAttr", dat));
|
|
|
|
// Also adding local varinfo
|
|
LocalVarTableAttr lv = new LocalVarTableAttr();
|
|
lv.addEntry(new LocalVarEntry(woo[0], woo[2], "fakevar", "I", 22));
|
|
lv.addEntry(new LocalVarEntry(woo[1], woo[1], "morefa", "()V", 10));
|
|
code.setLocalVarTable(lv);
|
|
|
|
// check out add method, also
|
|
// adding a throws exception for
|
|
// good measure
|
|
ExceptAttr ex = new ExceptAttr();
|
|
ex.addException(new ClassCP("java/io/IOException"));
|
|
ex.addException(new ClassCP("java/lang/Error"));
|
|
c.addMethod((short) ACC_PUBLIC,
|
|
"fubarmethod",
|
|
"()V",
|
|
code,
|
|
ex);
|
|
|
|
|
|
|
|
|
|
// Add a source file attribute
|
|
c.setSource(new SourceAttr("all.java"));
|
|
// Add some more generic attribute
|
|
c.addGenericAttr(new GenericAttr("blahAttr", dat));
|
|
c.write(new DataOutputStream(new FileOutputStream("regress.class")));
|
|
}
|
|
}
|
|
|
|
|