| package aQute.bnd.osgi; |
| |
| public class OpCodes { |
| final static short nop = 0x00; // [No change] |
| // performs |
| // no |
| // operation |
| final static short aconst_null = 0x01; // ? null pushes a |
| // null |
| // reference onto the stack |
| final static short iconst_m1 = 0x02; // ? -1 loads the |
| // int |
| // value -1 |
| // onto the stack |
| final static short iconst_0 = 0x03; // ? 0 loads the int |
| // value 0 |
| // onto the stack |
| final static short iconst_1 = 0x04; // ? 1 loads the int |
| // value 1 |
| // onto the stack |
| final static short iconst_2 = 0x05; // ? 2 loads the int |
| // value 2 |
| // onto the stack |
| final static short iconst_3 = 0x06; // ? 3 loads the int |
| // value 3 |
| // onto the stack |
| final static short iconst_4 = 0x07; // ? 4 loads the int |
| // value 4 |
| // onto the stack |
| final static short iconst_5 = 0x08; // ? 5 loads the int |
| // value 5 |
| // onto the stack |
| final static short lconst_0 = 0x09; // ? 0L pushes the |
| // long |
| // 0 onto |
| // the stack |
| final static short bipush = 0x10; // byte ? value |
| // pushes a |
| // byte |
| // onto the stack as an integer |
| // value |
| final static short sipush = 0x11; // byte1, byte2 ? |
| // value |
| // pushes a |
| // signed integer (byte1 << 8 + |
| // byte2) onto the stack |
| final static short ldc = 0x12; // index ? value |
| // pushes |
| // a |
| // constant #index from a |
| // constant pool (String, int, |
| // float or class type) onto the |
| // stack |
| final static short ldc_w = 0x13; // indexbyte1, |
| // indexbyte2 ? |
| // value pushes a constant |
| // #index from a constant pool |
| // (String, int, float or class |
| // type) onto the stack (wide |
| // index is constructed as |
| // indexbyte1 << 8 + indexbyte2) |
| final static short ldc2_w = 0x14; // indexbyte1, |
| // indexbyte2 ? |
| // value pushes a constant |
| // #index from a constant pool |
| // (double or long) onto the |
| // stack (wide index is |
| // constructed as indexbyte1 << |
| // 8 + indexbyte2) |
| final static short iload = 0x15; // index ? value |
| // loads |
| // an int |
| // value from a variable #index |
| final static short lload = 0x16; // index ? value |
| // load a |
| // long |
| // value from a local variable |
| // #index |
| final static short fload = 0x17; // index ? value |
| // loads a |
| // float |
| // value from a local variable |
| // #index |
| final static short dload = 0x18; // index ? value |
| // loads a |
| // double |
| // value from a local variable |
| // #index |
| final static short aload = 0x19; // index ? objectref |
| // loads a |
| // reference onto the stack from |
| // a local variable #index |
| final static short lload_2 = 0x20; // ? value load a |
| // long |
| // value |
| // from a local variable 2 |
| final static short lload_3 = 0x21; // ? value load a |
| // long |
| // value |
| // from a local variable 3 |
| final static short fload_0 = 0x22; // ? value loads a |
| // float |
| // value |
| // from local variable 0 |
| final static short fload_1 = 0x23; // ? value loads a |
| // float |
| // value |
| // from local variable 1 |
| final static short fload_2 = 0x24; // ? value loads a |
| // float |
| // value |
| // from local variable 2 |
| final static short fload_3 = 0x25; // ? value loads a |
| // float |
| // value |
| // from local variable 3 |
| final static short dload_0 = 0x26; // ? value loads a |
| // double from |
| // local variable 0 |
| final static short dload_1 = 0x27; // ? value loads a |
| // double from |
| // local variable 1 |
| final static short dload_2 = 0x28; // ? value loads a |
| // double from |
| // local variable 2 |
| final static short dload_3 = 0x29; // ? value loads a |
| // double from |
| // local variable 3 |
| final static short faload = 0x30; // arrayref, index ? |
| // value loads |
| // a float from an array |
| final static short daload = 0x31; // arrayref, index ? |
| // value loads |
| // a double from an array |
| final static short aaload = 0x32; // arrayref, index ? |
| // value loads |
| // onto the stack a reference |
| // from an array |
| final static short baload = 0x33; // arrayref, index ? |
| // value loads |
| // a byte or Boolean value from |
| // an array |
| final static short caload = 0x34; // arrayref, index ? |
| // value loads |
| // a char from an array |
| final static short saload = 0x35; // arrayref, index ? |
| // value load |
| // short from array |
| final static short istore = 0x36; // index value ? |
| // store |
| // int value |
| // into variable #index |
| final static short lstore = 0x37; // index value ? |
| // store a |
| // long |
| // value in a local variable |
| // #index |
| final static short fstore = 0x38; // index value ? |
| // stores |
| // a float |
| // value into a local variable |
| // #index |
| final static short dstore = 0x39; // index value ? |
| // stores |
| // a double |
| // value into a local variable |
| // #index |
| final static short lstore_1 = 0x40; // value ? store a |
| // long |
| // value in |
| // a local variable 1 |
| final static short lstore_2 = 0x41; // value ? store a |
| // long |
| // value in |
| // a local variable 2 |
| final static short lstore_3 = 0x42; // value ? store a |
| // long |
| // value in |
| // a local variable 3 |
| final static short fstore_0 = 0x43; // value ? stores a |
| // float value |
| // into local variable 0 |
| final static short fstore_1 = 0x44; // value ? stores a |
| // float value |
| // into local variable 1 |
| final static short fstore_2 = 0x45; // value ? stores a |
| // float value |
| // into local variable 2 |
| final static short fstore_3 = 0x46; // value ? stores a |
| // float value |
| // into local variable 3 |
| final static short dstore_0 = 0x47; // value ? stores a |
| // double into |
| // local variable 0 |
| final static short dstore_1 = 0x48; // value ? stores a |
| // double into |
| // local variable 1 |
| final static short dstore_2 = 0x49; // value ? stores a |
| // double into |
| // local variable 2 |
| final static short lastore = 0x50; // arrayref, index, |
| // value ? |
| // store a long to an array |
| final static short fastore = 0x51; // arreyref, index, |
| // value ? |
| // stores a float in an array |
| final static short dastore = 0x52; // arrayref, index, |
| // value ? |
| // stores a double into an array |
| final static short aastore = 0x53; // arrayref, index, |
| // value ? |
| // stores into a reference to an |
| // array |
| final static short bastore = 0x54; // arrayref, index, |
| // value ? |
| // stores a byte or Boolean |
| // value into an array |
| final static short castore = 0x55; // arrayref, index, |
| // value ? |
| // stores a char into an array |
| final static short sastore = 0x56; // arrayref, index, |
| // value ? |
| // store short to array |
| final static short pop = 0x57; // value ? discards |
| // the |
| // top |
| // value on the stack |
| final static short pop2 = 0x58; // {value2, value1} |
| // ? |
| // discards |
| // the top two values on the |
| // stack (or one value, if it is |
| // a double or long) |
| final static short dup = 0x59; // value ? value, |
| // value |
| // duplicates the value on top |
| // of the stack |
| final static short iadd = 0x60; // value1, value2 ? |
| // result adds |
| // two ints together |
| final static short ladd = 0x61; // value1, value2 ? |
| // result add |
| // two longs |
| final static short fadd = 0x62; // value1, value2 ? |
| // result adds |
| // two floats |
| final static short dadd = 0x63; // value1, value2 ? |
| // result adds |
| // two doubles |
| final static short isub = 0x64; // value1, value2 ? |
| // result int |
| // subtract |
| final static short lsub = 0x65; // value1, value2 ? |
| // result |
| // subtract two longs |
| final static short fsub = 0x66; // value1, value2 ? |
| // result |
| // subtracts two floats |
| final static short dsub = 0x67; // value1, value2 ? |
| // result |
| // subtracts a double from |
| // another |
| final static short imul = 0x68; // value1, value2 ? |
| // result |
| // multiply two integers |
| final static short lmul = 0x69; // value1, value2 ? |
| // result |
| // multiplies two longs |
| final static short irem = 0x70; // value1, value2 ? |
| // result |
| // logical int remainder |
| final static short lrem = 0x71; // value1, value2 ? |
| // result |
| // remainder of division of two |
| // longs |
| final static short frem = 0x72; // value1, value2 ? |
| // result gets |
| // the remainder from a division |
| // between two floats |
| final static short drem = 0x73; // value1, value2 ? |
| // result gets |
| // the remainder from a division |
| // between two doubles |
| final static short ineg = 0x74; // value ? result |
| // negate |
| // int |
| final static short lneg = 0x75; // value ? result |
| // negates a long |
| final static short fneg = 0x76; // value ? result |
| // negates a |
| // float |
| final static short dneg = 0x77; // value ? result |
| // negates a |
| // double |
| final static short ishl = 0x78; // value1, value2 ? |
| // result int |
| // shift left |
| final static short lshl = 0x79; // value1, value2 ? |
| // result |
| // bitwise shift left of a long |
| // value1 by value2 positions |
| final static short ior = 0x80; // value1, value2 ? |
| // result |
| // logical int or |
| final static short lor = 0x81; // value1, value2 ? |
| // result |
| // bitwise or of two longs |
| final static short ixor = 0x82; // value1, value2 ? |
| // result int |
| // xor |
| final static short lxor = 0x83; // value1, value2 ? |
| // result |
| // bitwise exclusive or of two |
| // longs |
| final static short iinc = 0x84; // index, const [No |
| // change] |
| // increment local variable |
| // #index by signed byte const |
| final static short i2l = 0x85; // value ? result |
| // converts an |
| // int into a long |
| final static short i2f = 0x86; // value ? result |
| // converts an |
| // int into a float |
| final static short i2d = 0x87; // value ? result |
| // converts an |
| // int into a double |
| final static short l2i = 0x88; // value ? result |
| // converts a |
| // long to an int |
| final static short l2f = 0x89; // value ? result |
| // converts a |
| // long to a float |
| final static short d2f = 0x90; // value ? result |
| // converts a |
| // double to a float |
| final static short i2b = 0x91; // value ? result |
| // converts an |
| // int into a byte |
| final static short i2c = 0x92; // value ? result |
| // converts an |
| // int into a character |
| final static short i2s = 0x93; // value ? result |
| // converts an |
| // int into a short |
| final static short lcmp = 0x94; // value1, value2 ? |
| // result |
| // compares two longs values |
| final static short fcmpl = 0x95; // value1, value2 ? |
| // result |
| // compares two floats |
| final static short fcmpg = 0x96; // value1, value2 ? |
| // result |
| // compares two floats |
| final static short dcmpl = 0x97; // value1, value2 ? |
| // result |
| // compares two doubles |
| final static short dcmpg = 0x98; // value1, value2 ? |
| // result |
| // compares two doubles |
| final static short ifeq = 0x99; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is 0, branch |
| // to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short lconst_1 = 0x0a; // ? 1L pushes the |
| // long |
| // 1 onto |
| // the stack |
| final static short fconst_0 = 0x0b; // ? 0.0f pushes |
| // 0.0f on |
| // the |
| // stack |
| final static short fconst_1 = 0x0c; // ? 1.0f pushes |
| // 1.0f on |
| // the |
| // stack |
| final static short fconst_2 = 0x0d; // ? 2.0f pushes |
| // 2.0f on |
| // the |
| // stack |
| final static short dconst_0 = 0x0e; // ? 0.0 pushes the |
| // constant 0.0 |
| // onto the stack |
| final static short dconst_1 = 0x0f; // ? 1.0 pushes the |
| // constant 1.0 |
| // onto the stack |
| final static short iload_0 = 0x1a; // ? value loads an |
| // int |
| // value |
| // from variable 0 |
| final static short iload_1 = 0x1b; // ? value loads an |
| // int |
| // value |
| // from variable 1 |
| final static short iload_2 = 0x1c; // ? value loads an |
| // int |
| // value |
| // from variable 2 |
| final static short iload_3 = 0x1d; // ? value loads an |
| // int |
| // value |
| // from variable 3 |
| final static short lload_0 = 0x1e; // ? value load a |
| // long |
| // value |
| // from a local variable 0 |
| final static short lload_1 = 0x1f; // ? value load a |
| // long |
| // value |
| // from a local variable 1 |
| final static short aload_0 = 0x2a; // ? objectref loads |
| // a |
| // reference |
| // onto the stack from local |
| // variable 0 |
| final static short aload_1 = 0x2b; // ? objectref loads |
| // a |
| // reference |
| // onto the stack from local |
| // variable 1 |
| final static short aload_2 = 0x2c; // ? objectref loads |
| // a |
| // reference |
| // onto the stack from local |
| // variable 2 |
| final static short aload_3 = 0x2d; // ? objectref loads |
| // a |
| // reference |
| // onto the stack from local |
| // variable 3 |
| final static short iaload = 0x2e; // arrayref, index ? |
| // value loads |
| // an int from an array |
| final static short laload = 0x2f; // arrayref, index ? |
| // value load |
| // a long from an array |
| final static short astore = 0x3a; // index objectref ? |
| // stores a |
| // reference into a local |
| // variable #index |
| final static short istore_0 = 0x3b; // value ? store int |
| // value into |
| // variable 0 |
| final static short istore_1 = 0x3c; // value ? store int |
| // value into |
| // variable 1 |
| final static short istore_2 = 0x3d; // value ? store int |
| // value into |
| // variable 2 |
| final static short istore_3 = 0x3e; // value ? store int |
| // value into |
| // variable 3 |
| final static short lstore_0 = 0x3f; // value ? store a |
| // long |
| // value in |
| // a local variable 0 |
| final static short dstore_3 = 0x4a; // value ? stores a |
| // double into |
| // local variable 3 |
| final static short astore_0 = 0x4b; // objectref ? |
| // stores a |
| // reference into local variable |
| // 0 |
| final static short astore_1 = 0x4c; // objectref ? |
| // stores a |
| // reference into local variable |
| // 1 |
| final static short astore_2 = 0x4d; // objectref ? |
| // stores a |
| // reference into local variable |
| // 2 |
| final static short astore_3 = 0x4e; // objectref ? |
| // stores a |
| // reference into local variable |
| // 3 |
| final static short iastore = 0x4f; // arrayref, index, |
| // value ? |
| // stores an int into an array |
| final static short dup_x1 = 0x5a; // value2, value1 ? |
| // value1, |
| // value2, value1 inserts a copy |
| // of the top value into the |
| // stack two values from the top |
| final static short dup_x2 = 0x5b; // value3, value2, |
| // value1 ? |
| // value1, value3, value2, |
| // value1 inserts a copy of the |
| // top value into the stack two |
| // (if value2 is double or long |
| // it takes up the entry of |
| // value3, too) or three values |
| // (if value2 is neither double |
| // nor long) from the top |
| final static short dup2 = 0x5c; // {value2, value1} |
| // ? |
| // {value2, |
| // value1}, {value2, value1} |
| // duplicate top two stack words |
| // (two values, if value1 is not |
| // double nor long; a single |
| // value, if value1 is double or |
| // long) |
| final static short dup2_x1 = 0x5d; // value3, {value2, |
| // value1} ? |
| // {value2, value1}, value3, |
| // {value2, value1} duplicate |
| // two words and insert beneath |
| // third word (see explanation |
| // above) |
| final static short dup2_x2 = 0x5e; // {value4, value3}, |
| // {value2, |
| // value1} ? {value2, value1}, |
| // {value4, value3}, {value2, |
| // value1} duplicate two words |
| // and insert beneath fourth |
| // word |
| final static short swap = 0x5f; // value2, value1 ? |
| // value1, |
| // value2 swaps two top words on |
| // the stack (note that value1 |
| // and value2 must not be double |
| // or long) |
| final static short fmul = 0x6a; // value1, value2 ? |
| // result |
| // multiplies two floats |
| final static short dmul = 0x6b; // value1, value2 ? |
| // result |
| // multiplies two doubles |
| final static short idiv = 0x6c; // value1, value2 ? |
| // result |
| // divides two integers |
| final static short ldiv = 0x6d; // value1, value2 ? |
| // result |
| // divide two longs |
| final static short fdiv = 0x6e; // value1, value2 ? |
| // result |
| // divides two floats |
| final static short ddiv = 0x6f; // value1, value2 ? |
| // result |
| // divides two doubles |
| final static short ishr = 0x7a; // value1, value2 ? |
| // result int |
| // shift right |
| final static short lshr = 0x7b; // value1, value2 ? |
| // result |
| // bitwise shift right of a long |
| // value1 by value2 positions |
| final static short iushr = 0x7c; // value1, value2 ? |
| // result int |
| // shift right |
| final static short lushr = 0x7d; // value1, value2 ? |
| // result |
| // bitwise shift right of a long |
| // value1 by value2 positions, |
| // unsigned |
| final static short iand = 0x7e; // value1, value2 ? |
| // result |
| // performs a logical and on two |
| // integers |
| final static short land = 0x7f; // value1, value2 ? |
| // result |
| // bitwise and of two longs |
| final static short l2d = 0x8a; // value ? result |
| // converts a |
| // long to a double |
| final static short f2i = 0x8b; // value ? result |
| // converts a |
| // float to an int |
| final static short f2l = 0x8c; // value ? result |
| // converts a |
| // float to a long |
| final static short f2d = 0x8d; // value ? result |
| // converts a |
| // float to a double |
| final static short d2i = 0x8e; // value ? result |
| // converts a |
| // double to an int |
| final static short d2l = 0x8f; // value ? result |
| // converts a |
| // double to a long |
| final static short ifne = 0x9a; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is not 0, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short iflt = 0x9b; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is less than |
| // 0, branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short ifge = 0x9c; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is greater |
| // than or equal to 0, branch to |
| // instruction at branchoffset |
| // (signed short constructed |
| // from unsigned bytes |
| // branchbyte1 << 8 + |
| // branchbyte2) |
| final static short ifgt = 0x9d; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is greater |
| // than 0, branch to instruction |
| // at branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short ifle = 0x9e; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is less than |
| // or equal to 0, branch to |
| // instruction at branchoffset |
| // (signed short constructed |
| // from unsigned bytes |
| // branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_icmpeq = 0x9f; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if ints are |
| // equal, branch to instruction |
| // at branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_icmpne = 0xa0; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if ints are |
| // not equal, branch to |
| // instruction at branchoffset |
| // (signed short constructed |
| // from unsigned bytes |
| // branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_icmplt = 0xa1; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if value1 is |
| // less than value2, branch to |
| // instruction at branchoffset |
| // (signed short constructed |
| // from unsigned bytes |
| // branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_icmpge = 0xa2; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if value1 is |
| // greater than or equal to |
| // value2, branch to instruction |
| // at branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_icmpgt = 0xa3; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if value1 is |
| // greater than value2, branch |
| // to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_icmple = 0xa4; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if value1 is |
| // less than or equal to value2, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_acmpeq = 0xa5; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if |
| // references are equal, branch |
| // to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short if_acmpne = 0xa6; // branchbyte1, |
| // branchbyte2 |
| // value1, value2 ? if |
| // references are not equal, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short goto_ = 0xa7; // branchbyte1, |
| // branchbyte2 [no |
| // change] goes to another |
| // instruction at branchoffset |
| // (signed short constructed |
| // from unsigned bytes |
| // branchbyte1 << 8 + |
| // branchbyte2) |
| final static short jsr = 0xa8; // branchbyte1, |
| // branchbyte2 ? |
| // address jump to subroutine at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) and place the |
| // return address on the stack |
| final static short ret = 0xa9; // index [No change] |
| // continue |
| // execution from address taken |
| // from a local variable #index |
| // (the asymmetry with jsr is |
| // intentional) |
| final static short tableswitch = 0xaa; // [0-3 bytes |
| // padding], |
| // defaultbyte1, defaultbyte2, |
| // defaultbyte3, defaultbyte4, |
| // lowbyte1, lowbyte2, lowbyte3, |
| // lowbyte4, highbyte1, |
| // highbyte2, highbyte3, |
| // highbyte4, jump offsets... |
| // index ? continue execution |
| // from an address in the table |
| // at offset index |
| final static short lookupswitch = 0xab; // <0-3 bytes |
| // padding>, |
| // defaultbyte1, defaultbyte2, |
| // defaultbyte3, defaultbyte4, |
| // npairs1, npairs2, npairs3, |
| // npairs4, match-offset |
| // pairs... key ? a target |
| // address is looked up from a |
| // table using a key and |
| // execution continues from the |
| // instruction at that address |
| final static short ireturn = 0xac; // value ? [empty] |
| // returns an |
| // integer from a method |
| final static short lreturn = 0xad; // value ? [empty] |
| // returns a |
| // long value |
| final static short freturn = 0xae; // value ? [empty] |
| // returns a |
| // float |
| final static short dreturn = 0xaf; // value ? [empty] |
| // returns a |
| // double from a method |
| final static short areturn = 0xb0; // objectref ? |
| // [empty] |
| // returns a |
| // reference from a method |
| final static short return_ = 0xb1; // ? [empty] return |
| // void |
| // from |
| // method |
| final static short getstatic = 0xb2; // index1, index2 ? |
| // value gets a |
| // static field value of a |
| // class, where the field is |
| // identified by field reference |
| // in the constant pool index |
| // (index1 << 8 + index2) |
| final static short putstatic = 0xb3; // indexbyte1, |
| // indexbyte2 value |
| // ? set static field to value |
| // in a class, where the field |
| // is identified by a field |
| // reference index in constant |
| // pool (indexbyte1 << 8 + |
| // indexbyte2) |
| final static short getfield = 0xb4; // index1, index2 |
| // objectref ? |
| // value gets a field value of |
| // an object objectref, where |
| // the field is identified by |
| // field reference in the |
| // constant pool index (index1 |
| // << 8 + index2) |
| final static short putfield = 0xb5; // indexbyte1, |
| // indexbyte2 |
| // objectref, value ? set field |
| // to value in an object |
| // objectref, where the field is |
| // identified by a field |
| // reference index in constant |
| // pool (indexbyte1 << 8 + |
| // indexbyte2) |
| final static short invokevirtual = 0xb6; // indexbyte1, |
| // indexbyte2 |
| // objectref, [arg1, arg2, ...] |
| // ? invoke virtual method on |
| // object objectref, where the |
| // method is identified by |
| // method reference index in |
| // constant pool (indexbyte1 << |
| // 8 + indexbyte2) |
| final static short invokespecial = 0xb7; // indexbyte1, |
| // indexbyte2 |
| // objectref, [arg1, arg2, ...] |
| // ? invoke instance method on |
| // object objectref, where the |
| // method is identified by |
| // method reference index in |
| // constant pool (indexbyte1 << |
| // 8 + indexbyte2) |
| final static short invokestatic = 0xb8; // indexbyte1, |
| // indexbyte2 [arg1, |
| // arg2, ...] ? invoke a static |
| // method, where the method is |
| // identified by method |
| // reference index in constant |
| // pool (indexbyte1 << 8 + |
| // indexbyte2) |
| final static short invokeinterface = 0xb9; // indexbyte1, |
| // indexbyte2, |
| // count, 0 objectref, [arg1, |
| // arg2, ...] ? invokes an |
| // interface method on object |
| // objectref, where the |
| // interface method is |
| // identified by method |
| // reference index in constant |
| // pool (indexbyte1 << 8 + |
| // indexbyte2) |
| final static short xxxunusedxxx = 0xba; // this opcode is |
| // reserved "for |
| // historical reasons" |
| final static short new_ = 0xbb; // indexbyte1, |
| // indexbyte2 ? |
| // objectref creates new object |
| // of type identified by class |
| // reference in constant pool |
| // index (indexbyte1 << 8 + |
| // indexbyte2) |
| final static short newarray = 0xbc; // atype count ? |
| // arrayref |
| // creates new array with count |
| // elements of primitive type |
| // identified by atype |
| final static short anewarray = 0xbd; // indexbyte1, |
| // indexbyte2 count |
| // ? arrayref creates a new |
| // array of references of length |
| // count and component type |
| // identified by the class |
| // reference index (indexbyte1 |
| // << 8 + indexbyte2) in the |
| // constant pool |
| final static short arraylength = 0xbe; // arrayref ? length |
| // gets the |
| // length of an array |
| final static short athrow = 0xbf; // objectref ? |
| // [empty], |
| // objectref throws an error or |
| // exception (notice that the |
| // rest of the stack is cleared, |
| // leaving only a reference to |
| // the Throwable) |
| final static short checkcast = 0xc0; // indexbyte1, |
| // indexbyte2 |
| // objectref ? objectref checks |
| // whether an objectref is of a |
| // certain type, the class |
| // reference of which is in the |
| // constant pool at index |
| // (indexbyte1 << 8 + |
| // indexbyte2) |
| final static short instanceof_ = 0xc1; // indexbyte1, |
| // indexbyte2 |
| // objectref ? result determines |
| // if an object objectref is of |
| // a given type, identified by |
| // class reference index in |
| // constant pool (indexbyte1 << |
| // 8 + indexbyte2) |
| final static short monitorenter = 0xc2; // objectref ? enter |
| // monitor for |
| // object ("grab the lock" - |
| // start of synchronized() |
| // section) |
| final static short monitorexit = 0xc3; // objectref ? exit |
| // monitor for |
| // object ("release the lock" - |
| // end of synchronized() |
| // section) |
| final static short wide = 0xc4; // opcode, |
| // indexbyte1, |
| // indexbyte2 |
| final static short multianewarray = 0xc5; // indexbyte1, |
| // indexbyte2, |
| // dimensions count1, |
| // [count2,...] ? arrayref |
| // create a new array of |
| // dimensions dimensions with |
| // elements of type identified |
| // by class reference in |
| // constant pool index |
| // (indexbyte1 << 8 + |
| // indexbyte2); the sizes of |
| // each dimension is identified |
| // by count1, [count2, etc] |
| final static short ifnull = 0xc6; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is null, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short ifnonnull = 0xc7; // branchbyte1, |
| // branchbyte2 |
| // value ? if value is not null, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned |
| // bytes branchbyte1 << 8 + |
| // branchbyte2) |
| final static short goto_w = 0xc8; // branchbyte1, |
| // branchbyte2, |
| // branchbyte3, branchbyte4 [no |
| // change] goes to another |
| // instruction at branchoffset |
| // (signed int constructed from |
| // unsigned bytes branchbyte1 << |
| // 24 + branchbyte2 << 16 + |
| // branchbyte3 << 8 + |
| // branchbyte4) |
| final static short jsr_w = 0xc9; // branchbyte1, |
| // branchbyte2, |
| // branchbyte3, branchbyte4 ? |
| // address jump to subroutine at |
| // branchoffset (signed int |
| // constructed from unsigned |
| // bytes branchbyte1 << 24 + |
| // branchbyte2 << 16 + |
| // branchbyte3 << 8 + |
| // branchbyte4) and place the |
| // return address on the stack |
| final static short breakpoint = 0xca; // reserved for |
| // breakpoints in |
| // Java debuggers; should not |
| // appear in any class file |
| final static short impdep1 = 0xfe; // reserved for |
| // implementation-dependent |
| // operations within debuggers; |
| // should not appear in any |
| // class file |
| final static short impdep2 = 0xff; // reserved for |
| // implementation-dependent |
| // operations within debuggers; |
| // should not appear in any |
| // class file |
| |
| final static byte OFFSETS[] = new byte[256]; |
| |
| static { |
| OFFSETS[bipush] = 1; // byte ? value pushes a byte onto the |
| // stack as an integer value |
| OFFSETS[sipush] = 2; // byte1, byte2 ? value pushes a signed |
| // integer (byte1 << 8 + byte2) onto the |
| // stack |
| OFFSETS[ldc] = 1; // index ? value pushes a constant |
| // #index from a constant pool (String, |
| // int, float or class type) onto the |
| // stack |
| OFFSETS[ldc_w] = 2; // indexbyte1, indexbyte2 ? value pushes |
| // a constant #index from a constant |
| // pool (String, int, float or class |
| // type) onto the stack (wide index is |
| // constructed as indexbyte1 << 8 + |
| // indexbyte2) |
| OFFSETS[ldc2_w] = 2; // indexbyte1, indexbyte2 ? value pushes |
| // a constant #index from a constant |
| // pool (double or long) onto the stack |
| // (wide index is constructed as |
| // indexbyte1 << 8 + indexbyte2) |
| OFFSETS[iload] = 1; // index ? value loads an int value from |
| // a variable #index |
| OFFSETS[lload] = 1; // index ? value load a long value from |
| // a local variable #index |
| OFFSETS[fload] = 1; // index ? value loads a float value |
| // from a local variable #index |
| OFFSETS[dload] = 1; // index ? value loads a double value |
| // from a local variable #index |
| OFFSETS[aload] = 1; // index ? objectref loads a reference |
| // onto the stack from a local variable |
| // #index |
| OFFSETS[istore] = 1; // index value ? store int value into |
| // variable #index |
| OFFSETS[lstore] = 1; // index value ? store a long value in a |
| // local variable #index |
| OFFSETS[fstore] = 1; // index value ? stores a float value |
| // into a local variable #index |
| OFFSETS[dstore] = 1; // index value ? stores a double value |
| // into a local variable #index |
| OFFSETS[iinc] = 2; // index, const [No change] increment |
| // local variable #index by signed byte |
| // const |
| OFFSETS[ifeq] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is 0, branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[astore] = 1; // index objectref ? stores a reference |
| // into a local variable #index |
| OFFSETS[ifne] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is not 0, branch to instruction |
| // at branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[iflt] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is less than 0, branch to |
| // instruction at branchoffset (signed |
| // short constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[ifge] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is greater than or equal to 0, |
| // branch to instruction at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) |
| OFFSETS[ifgt] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is greater than 0, branch to |
| // instruction at branchoffset (signed |
| // short constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[ifle] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is less than or equal to 0, |
| // branch to instruction at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) |
| OFFSETS[if_icmpeq] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if ints are equal, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[if_icmpne] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if ints are not equal, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[if_icmplt] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if value1 is less than |
| // value2, branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[if_icmpge] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if value1 is greater |
| // than or equal to value2, branch |
| // to instruction at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) |
| OFFSETS[if_icmpgt] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if value1 is greater |
| // than value2, branch to |
| // instruction at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) |
| OFFSETS[if_icmple] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if value1 is less than |
| // or equal to value2, branch to |
| // instruction at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) |
| OFFSETS[if_acmpeq] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if references are equal, |
| // branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[if_acmpne] = 2; // branchbyte1, branchbyte2 value1, |
| // value2 ? if references are not |
| // equal, branch to instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[goto_] = 2; // branchbyte1, branchbyte2 [no change] |
| // goes to another instruction at |
| // branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[jsr] = 2; // branchbyte1, branchbyte2 ? address |
| // jump to subroutine at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) and place the return |
| // address on the stack |
| OFFSETS[ret] = 1; // index [No change] continue execution |
| // from address taken from a local |
| // variable #index (the asymmetry with |
| // jsr is intentional) |
| OFFSETS[tableswitch] = -1; // [0-3 bytes padding], |
| // defaultbyte1, defaultbyte2, |
| // defaultbyte3, defaultbyte4, |
| // lowbyte1, lowbyte2, lowbyte3, |
| // lowbyte4, highbyte1, |
| // highbyte2, highbyte3, |
| // highbyte4, jump offsets... |
| // index ? continue execution |
| // from an address in the table |
| // at offset index |
| OFFSETS[lookupswitch] = -1; // <0-3 bytes padding>, |
| // defaultbyte1, defaultbyte2, |
| // defaultbyte3, defaultbyte4, |
| // npairs1, npairs2, npairs3, |
| // npairs4, match-offset |
| // pairs... key ? a target |
| // address is looked up from a |
| // table using a key and |
| // execution continues from the |
| // instruction at that address |
| OFFSETS[getstatic] = 2; // index1, index2 ? value gets a |
| // static field value of a class, |
| // where the field is identified by |
| // field reference in the constant |
| // pool index (index1 << 8 + index2) |
| OFFSETS[putstatic] = 2; // indexbyte1, indexbyte2 value ? |
| // set static field to value in a |
| // class, where the field is |
| // identified by a field reference |
| // index in constant pool |
| // (indexbyte1 << 8 + indexbyte2) |
| OFFSETS[getfield] = 2; // index1, index2 objectref ? value |
| // gets a field value of an object |
| // objectref, where the field is |
| // identified by field reference in |
| // the constant pool index (index1 |
| // << 8 + index2) |
| OFFSETS[putfield] = 2; // indexbyte1, indexbyte2 objectref, |
| // value ? set field to value in an |
| // object objectref, where the field |
| // is identified by a field |
| // reference index in constant pool |
| // (indexbyte1 << 8 + indexbyte2) |
| OFFSETS[invokevirtual] = 2; // indexbyte1, indexbyte2 |
| // objectref, [arg1, arg2, ...] |
| // ? invoke virtual method on |
| // object objectref, where the |
| // method is identified by |
| // method reference index in |
| // constant pool (indexbyte1 << |
| // 8 + indexbyte2) |
| OFFSETS[invokespecial] = 2; // indexbyte1, indexbyte2 |
| // objectref, [arg1, arg2, ...] |
| // ? invoke instance method on |
| // object objectref, where the |
| // method is identified by |
| // method reference index in |
| // constant pool (indexbyte1 << |
| // 8 + indexbyte2) |
| OFFSETS[invokestatic] = 2; // indexbyte1, indexbyte2 [arg1, |
| // arg2, ...] ? invoke a static |
| // method, where the method is |
| // identified by method |
| // reference index in constant |
| // pool (indexbyte1 << 8 + |
| // indexbyte2) |
| OFFSETS[invokeinterface] = 2; // indexbyte1, indexbyte2, |
| // count, 0 objectref, |
| // [arg1, arg2, ...] ? |
| // invokes an interface |
| // method on object |
| // objectref, where the |
| // interface method is |
| // identified by method |
| // reference index in |
| // constant pool (indexbyte1 |
| // << 8 + indexbyte2) |
| OFFSETS[new_] = 2; // indexbyte1, indexbyte2 ? objectref |
| // creates new object of type identified |
| // by class reference in constant pool |
| // index (indexbyte1 << 8 + indexbyte2) |
| OFFSETS[newarray] = 1; // atype count ? arrayref creates |
| // new array with count elements of |
| // primitive type identified by |
| // atype |
| OFFSETS[anewarray] = 2; // indexbyte1, indexbyte2 count ? |
| // arrayref creates a new array of |
| // references of length count and |
| // component type identified by the |
| // class reference index (indexbyte1 |
| // << 8 + indexbyte2) in the |
| // constant pool |
| OFFSETS[checkcast] = 2; // indexbyte1, indexbyte2 objectref |
| // ? objectref checks whether an |
| // objectref is of a certain type, |
| // the class reference of which is |
| // in the constant pool at index |
| // (indexbyte1 << 8 + indexbyte2) |
| OFFSETS[instanceof_] = 2; // indexbyte1, indexbyte2 objectref |
| // ? result determines if an object |
| // objectref is of a given type, |
| // identified by class reference |
| // index in constant pool |
| // (indexbyte1 << 8 + indexbyte2) |
| OFFSETS[wide] = 3; // opcode, indexbyte1, indexbyte2 |
| OFFSETS[multianewarray] = 3; // indexbyte1, indexbyte2, |
| // dimensions count1, |
| // [count2,...] ? arrayref |
| // create a new array of |
| // dimensions dimensions with |
| // elements of type identified |
| // by class reference in |
| // constant pool index |
| // (indexbyte1 << 8 + |
| // indexbyte2); the sizes of |
| // each dimension is identified |
| // by count1, [count2, etc] |
| OFFSETS[ifnull] = 2; // branchbyte1, branchbyte2 value ? if |
| // value is null, branch to instruction |
| // at branchoffset (signed short |
| // constructed from unsigned bytes |
| // branchbyte1 << 8 + branchbyte2) |
| OFFSETS[ifnonnull] = 2; // branchbyte1, branchbyte2 value ? |
| // if value is not null, branch to |
| // instruction at branchoffset |
| // (signed short constructed from |
| // unsigned bytes branchbyte1 << 8 + |
| // branchbyte2) |
| OFFSETS[goto_w] = 4; // branchbyte1, branchbyte2, |
| // branchbyte3, branchbyte4 [no change] |
| // goes to another instruction at |
| // branchoffset (signed int constructed |
| // from unsigned bytes branchbyte1 << 24 |
| // + branchbyte2 << 16 + branchbyte3 << |
| // 8 + branchbyte4) |
| OFFSETS[jsr_w] = 4; // branchbyte1, branchbyte2, |
| // branchbyte3, branchbyte4 ? address |
| // jump to subroutine at branchoffset |
| // (signed int constructed from unsigned |
| // bytes branchbyte1 << 24 + branchbyte2 |
| // << 16 + branchbyte3 << 8 + |
| // branchbyte4) and place the return |
| // address on the stack |
| } |
| |
| } |