11#define J_CLASS_BEGIN {}
17#define ACC_PUBLIC 0x0001
21#define ACC_PRIVATE 0x0002
25#define ACC_PROTECTED 0x0004
29#define ACC_STATIC 0x0008
32#define ACC_FINAL 0x0010
35#define ACC_SUPER 0x0020
39#define ACC_SYNCHRONIZED 0x0020
43#define ACC_NATIVE 0x0100
47#define ACC_INTERFACE 0x0200
50#define ACC_ABSTRACT 0x0400
53#define ACC_STRICT 0x0800
59#define u1(v) (uint8_t)(v)
66 (uint8_t)(((v) >> 8) & 0xFF), \
67 (uint8_t)((v) & 0xFF) \
75 (uint8_t)((v) >> 24), \
76 (uint8_t)(((v) >> 16) & 0xFF), \
77 (uint8_t)(((v) >> 8) & 0xFF), \
78 (uint8_t)((v) & 0xFF) \
82#define BUFFER_SIZE 65536
95 fprintf(stderr,
"Buffer overflow\n");
148 fprintf(stderr,
"Patch position out of range\n");
162 fprintf(stderr,
"Patch position out of range\n");
213 uint16_t len = (uint16_t)strlen(
string);
215 for (uint16_t i = 0; i < len; i++) {
250 emit_u4((uint32_t)(value >> 32));
251 emit_u4((uint32_t)(value & 0xFFFFFFFF));
262 emit_u4((uint32_t)(value >> 32));
263 emit_u4((uint32_t)(value & 0xFFFFFFFF));
491void field_info(uint16_t access_flags, uint16_t name_index, uint16_t descriptor_index) {
547void method_info(uint16_t access_flags, uint16_t name_index, uint16_t descriptor_index) {
624void exception_entry(uint16_t start_pc, uint16_t end_pc, uint16_t handler_pc, uint16_t catch_type) {
683 }
else if (index < 0x100) {
713 }
else if (index < 0x100) {
740 if (byte_val >= -1 && byte_val <= 5) {
823 }
else if (index < 0x100) {
857 }
else if (index < 0x100) {
966 }
else if (index < 0x100) {
1000 }
else if (index < 0x100) {
1030 if (offset >= (int32_t)0xFFFF8000 && offset < 0x8000) {
1031 int16_t word_offset = (int16_t)offset;
1033 emit_u2((uint16_t)word_offset);
1035 int32_t dword_offset = offset;
1037 emit_u4((uint32_t)dword_offset);
1235void iinc(uint16_t index, int16_t constant_val) {
1237 if (index < 0x100 && constant_val < 0x80 && constant_val >= -0x80) {
1240 emit_u1((uint8_t)constant_val);
1245 emit_u2((uint16_t)constant_val);
1253 }
else if (index < 0x100) {
1341 }
else if (index < 0x100) {
1369 if (offset >= (int32_t)0xFFFF8000 && offset < 0x8000) {
1370 int16_t word_offset = (int16_t)offset;
1372 emit_u2((uint16_t)word_offset);
1374 int32_t dword_offset = offset;
1376 emit_u4((uint32_t)dword_offset);
1439 if (index < 0x100) {
1469 }
else if (index < 0x100) {
1520 }
else if (index < 0x100) {
1603 if (index < 0x100) {
void invokevirtual(uint16_t index)
Definition jclass.c:1306
void isub()
Definition jclass.c:1351
void if_icmpne(size_t branch_target)
Definition jclass.c:1157
void i2s()
Definition jclass.c:1073
void ishr()
Definition jclass.c:1332
void constant_class(uint16_t name_index)
Creates a constant class reference.
Definition jclass.c:272
void dconst_0()
Definition jclass.c:804
@ T_LONG
Definition jclass.c:657
@ T_BYTE
Definition jclass.c:654
@ T_DOUBLE
Definition jclass.c:653
@ T_INT
Definition jclass.c:656
@ T_BOOLEAN
Definition jclass.c:650
@ T_SHORT
Definition jclass.c:655
@ T_FLOAT
Definition jclass.c:652
@ T_CHAR
Definition jclass.c:651
void iushr()
Definition jclass.c:1356
void swap()
Definition jclass.c:1634
void baload()
Definition jclass.c:728
void fields_end()
Marks the end of the fields section.
Definition jclass.c:513
void ldc(uint16_t index)
Definition jclass.c:1437
void if_acmpeq(size_t branch_target)
Definition jclass.c:1138
void ineg()
Definition jclass.c:1268
void iastore()
Definition jclass.c:1093
void lastore()
Definition jclass.c:1417
void if_icmpge(size_t branch_target)
Definition jclass.c:1169
void fmul()
Definition jclass.c:976
void ldc2_w(uint16_t index)
Definition jclass.c:1454
void lmul()
Definition jclass.c:1479
void methods_end()
Marks the end of the methods section.
Definition jclass.c:569
void interfaces_start()
Marks the start of the list of interfaces the class is using.
Definition jclass.c:371
void l2f()
Definition jclass.c:1392
void frem()
Definition jclass.c:986
void invokeinterface(uint16_t index, uint8_t count)
Definition jclass.c:1287
void ior()
Definition jclass.c:1312
static uint16_t exception_counter
Definition jclass.c:610
void pop_inst()
Definition jclass.c:1579
void ldc_w(uint16_t index)
Definition jclass.c:1448
void dup2()
Definition jclass.c:887
void attribute_end()
Marks the end of an attribute.
Definition jclass.c:446
void end_method_info()
Ends the current methods attributes section and the method itself.
Definition jclass.c:560
void j_drem()
Definition jclass.c:843
static uint16_t interfaces_counter
Keeps track of how many interfaces there are.
Definition jclass.c:365
void if_acmpne(size_t branch_target)
Definition jclass.c:1145
void imul()
Definition jclass.c:1263
void freturn()
Definition jclass.c:991
void bytecode_end()
Marks the end of a bytecode section.
Definition jclass.c:598
void d2f()
Definition jclass.c:764
void jsr_w_inst(size_t branch_target)
Definition jclass.c:1380
void iflt(size_t branch_target)
Definition jclass.c:1199
void exceptions_start()
Marks the start of an exceptions section.
Definition jclass.c:616
void f2d()
Definition jclass.c:902
static uint16_t attributes_counter
Tracks how many attributes there are.
Definition jclass.c:412
void fcmpg()
Definition jclass.c:932
void iconst_5()
Definition jclass.c:1128
void f2l()
Definition jclass.c:912
void monitorexit()
Definition jclass.c:1550
void iand()
Definition jclass.c:1088
static uint16_t fields_counter
Counts the amount of fields in the class.
Definition jclass.c:471
void checkcast(uint16_t class_index)
Definition jclass.c:758
void sipush(uint16_t value)
Definition jclass.c:1628
void lreturn()
Definition jclass.c:1501
void fdiv()
Definition jclass.c:957
void instanceof(uint16_t index)
Definition jclass.c:1273
void constant_interfacemethodref(uint16_t class_index, uint16_t name_and_type_index)
Builds a reference to a method from an interface.
Definition jclass.c:321
void monitorenter()
Definition jclass.c:1545
void ireturn()
Definition jclass.c:1322
void land()
Definition jclass.c:1412
void iconst_m1()
Definition jclass.c:1098
void arraylength()
Definition jclass.c:704
void interface_entry(uint16_t interface_val)
Adds a new interface to the list.
Definition jclass.c:383
void lconst_0()
Definition jclass.c:1427
void fstore(uint16_t index)
Definition jclass.c:996
void f2i()
Definition jclass.c:907
void jsr_inst(size_t branch_target)
Definition jclass.c:1366
void d2i()
Definition jclass.c:769
void l2d()
Definition jclass.c:1387
void invokespecial(uint16_t index)
Definition jclass.c:1294
void new_inst(uint16_t index)
Definition jclass.c:1562
void lconst_1()
Definition jclass.c:1432
static void emit_u2(uint16_t v)
Takes a uint16_t and splits it into 2 bytes (0x1024 -> { 0x10, 0x24 }), which it then writes into the...
Definition jclass.c:115
size_t attribute_start_offset
Definition jclass.c:425
void istore(uint16_t index)
Definition jclass.c:1337
void ifnonnull(size_t branch_target)
Definition jclass.c:1223
void dreturn()
Definition jclass.c:848
void attributes_end()
Marks the start of the attributes section.
Definition jclass.c:457
void lshr()
Definition jclass.c:1511
void constant_pool_end()
Marks the end of the constant pool.
Definition jclass.c:345
static void patch_u2(size_t pos, uint16_t v)
Places 2 bytes in the given position in the buffer (0x1024 -> (0x10 -> pos) & (0x24 -> pos + 1))
Definition jclass.c:146
void getfield(uint16_t index)
Definition jclass.c:1015
void return_inst()
Definition jclass.c:1613
static size_t interfaces_count_offset
Do not modify.
Definition jclass.c:360
void fastore()
Definition jclass.c:927
void l2i()
Definition jclass.c:1397
void i2c()
Definition jclass.c:1053
void putstatic(uint16_t index)
Definition jclass.c:1595
void d2l()
Definition jclass.c:774
void bytecode_start()
Marks the start of a bytecode section.
Definition jclass.c:585
static void emit_u4(uint32_t v)
Splits a uint32_t into 4 bytes (0x12345678 -> { 0x12, 0x34, 0x56, 0x78 }) and writes them into the bu...
Definition jclass.c:125
void ixor()
Definition jclass.c:1361
void lload(uint16_t index)
Definition jclass.c:1465
void dstore(uint16_t index)
Definition jclass.c:853
#define BUFFER_SIZE
The size of the buffer for bytecode, may be overidden if needed.
Definition jclass.c:82
static size_t methods_count_offset
Definition jclass.c:522
void daload()
Definition jclass.c:784
void constant_fieldref(uint16_t class_index, uint16_t name_and_type_index)
Builds a reference to a field.
Definition jclass.c:295
static size_t current_offset()
Returns the current buffer position that will be emitted to.
Definition jclass.c:136
static void emit_class_header()
Definition jclass.c:1660
void j_ldiv()
Definition jclass.c:1460
void fields_start()
Marks the start of the fields section.
Definition jclass.c:477
void lshl()
Definition jclass.c:1506
void dadd()
Definition jclass.c:779
static size_t fields_count_offset
Definition jclass.c:466
void dup2_x1()
Definition jclass.c:892
static size_t bytecode_offset
Definition jclass.c:579
void dconst_1()
Definition jclass.c:809
void ifnull(size_t branch_target)
Definition jclass.c:1229
static size_t outputIndex
Current index of the output buffer.
Definition jclass.c:87
void dup()
Definition jclass.c:872
void impdep1()
Definition jclass.c:1646
void fconst_0()
Definition jclass.c:942
void attribute_start(uint16_t attribute_name_index)
Marks the start of a new attribute.
Definition jclass.c:432
void breakpoint()
Definition jclass.c:1641
void invokedynamic(uint16_t index)
Definition jclass.c:1279
void putfield(uint16_t index)
Definition jclass.c:1589
void constant_methodref(uint16_t class_index, uint16_t name_and_type_index)
Builds a reference to a method.
Definition jclass.c:308
static size_t attributes_count_offset
Do not modify.
Definition jclass.c:407
void dmul()
Definition jclass.c:833
void fadd()
Definition jclass.c:917
void dcmpg()
Definition jclass.c:794
void iaload()
Definition jclass.c:1083
void iconst_4()
Definition jclass.c:1123
static size_t cp_count_offset
Do not modify.
Definition jclass.c:180
void ifge(size_t branch_target)
Definition jclass.c:1205
void bastore()
Definition jclass.c:733
void constant_double(uint64_t value)
Creates a constant double.
Definition jclass.c:260
void method_info(uint16_t access_flags, uint16_t name_index, uint16_t descriptor_index)
Creates a new method and begins it's attributes section.
Definition jclass.c:547
void if_icmpgt(size_t branch_target)
Definition jclass.c:1175
void exception_entry(uint16_t start_pc, uint16_t end_pc, uint16_t handler_pc, uint16_t catch_type)
Definition jclass.c:624
void fneg()
Definition jclass.c:981
void iload(uint16_t index)
Definition jclass.c:1249
void castore()
Definition jclass.c:753
void constant_long(uint64_t value)
Creates a constant long.
Definition jclass.c:248
void bipush(int8_t byte_val)
Definition jclass.c:738
void i2b()
Definition jclass.c:1048
void astore(uint16_t index)
Definition jclass.c:709
void i2d()
Definition jclass.c:1058
static uint8_t outputBuffer[BUFFER_SIZE]
Output buffer where the JVM bytecode is stored.
Definition jclass.c:85
void ladd()
Definition jclass.c:1402
static void emit_class_footer(uint16_t this_class, uint8_t this_class_flags, uint16_t super_class)
Definition jclass.c:1669
void nop()
Definition jclass.c:1574
void pop2()
Definition jclass.c:1584
void ifne(size_t branch_target)
Definition jclass.c:1193
void fload(uint16_t index)
Definition jclass.c:962
void fconst_2()
Definition jclass.c:952
void lushr()
Definition jclass.c:1535
void goto_inst(size_t branch_target)
Definition jclass.c:1027
void constant_integer(uint32_t value)
Creates a constant integer.
Definition jclass.c:226
void iconst_3()
Definition jclass.c:1118
void attributes_start()
Marks the start of the list of attributes the class has.
Definition jclass.c:418
void saload()
Definition jclass.c:1618
void lneg()
Definition jclass.c:1484
void lsub()
Definition jclass.c:1530
void dcmpl()
Definition jclass.c:799
void i2f()
Definition jclass.c:1063
void laload()
Definition jclass.c:1407
void aload(uint16_t index)
Definition jclass.c:679
void constant_float(uint32_t value)
Creates a constant float.
Definition jclass.c:237
void i2l()
Definition jclass.c:1068
void fconst_1()
Definition jclass.c:947
void dup_x1()
Definition jclass.c:877
void areturn()
Definition jclass.c:699
void exceptions_end()
Marks the end of a bytecode section.
Definition jclass.c:636
void idiv()
Definition jclass.c:1133
void faload()
Definition jclass.c:922
void aconst_null()
Definition jclass.c:674
void ifeq(size_t branch_target)
Definition jclass.c:1187
static void emit_byte(uint8_t b)
Helper function. Do not use unless you know what you're doing.
Definition jclass.c:93
void multianewarray(uint16_t index, uint8_t dimensions)
Definition jclass.c:1555
void dneg()
Definition jclass.c:838
static void patch_u4(size_t pos, uint32_t v)
Places 4 bytes in the given position in the buffer (0x12345678 -> (0x12 -> pos) & (0x34 -> pos + 1) &...
Definition jclass.c:160
void constant_nameandtype(uint16_t name_index, uint16_t descriptor_index)
Builds a name and type.
Definition jclass.c:334
void code_attribute_start(uint16_t name_index, uint16_t max_stack, uint16_t max_locals)
Definition jclass.c:1678
void fsub()
Definition jclass.c:1010
void newarray(uint8_t atype)
Definition jclass.c:1568
void constant_utf8(const char *string)
Converts a char* to a constant UTF-8 string.
Definition jclass.c:211
void lcmp()
Definition jclass.c:1422
void dup2_x2()
Definition jclass.c:897
void caload()
Definition jclass.c:748
void invokestatic(uint16_t index)
Definition jclass.c:1300
void ishl()
Definition jclass.c:1327
void ret_inst(uint16_t index)
Definition jclass.c:1601
void sastore()
Definition jclass.c:1623
void ddiv()
Definition jclass.c:814
void dastore()
Definition jclass.c:789
void lor()
Definition jclass.c:1491
void if_icmpeq(size_t branch_target)
Definition jclass.c:1151
void end_field_info()
Ends the current fields attributes section and the field itself.
Definition jclass.c:504
static uint16_t constant_pool_counter
Keeps track of the size of the constant pool.
Definition jclass.c:185
void lxor()
Definition jclass.c:1540
void iconst_1()
Definition jclass.c:1108
void anewarray(uint16_t class_index)
Definition jclass.c:693
void iconst_2()
Definition jclass.c:1113
void irem()
Definition jclass.c:1317
void ifle(size_t branch_target)
Definition jclass.c:1217
void iadd()
Definition jclass.c:1078
void impdep2()
Definition jclass.c:1651
void if_icmplt(size_t branch_target)
Definition jclass.c:1163
static size_t bytecode_length_offset
Definition jclass.c:578
void goto_w_inst(size_t branch_target)
Definition jclass.c:1041
void constant_string(uint16_t string_index)
Creates a constant string from a constant UTF-8.
Definition jclass.c:283
void iconst_0()
Definition jclass.c:1103
void field_info(uint16_t access_flags, uint16_t name_index, uint16_t descriptor_index)
Creates a new field and begins it's attributes section.
Definition jclass.c:491
static size_t exception_table_length_offset
Definition jclass.c:609
static void emit_u1(uint8_t v)
Writes a byte to the buffer.
Definition jclass.c:106
void aaload()
Definition jclass.c:664
static uint16_t methods_counter
Counts the amount of methods in the class.
Definition jclass.c:527
void methods_start()
Marks the start of the methods section.
Definition jclass.c:533
void dsub()
Definition jclass.c:867
void if_icmple(size_t branch_target)
Definition jclass.c:1181
void code_attribute_end()
Definition jclass.c:1685
static void increment_cp_counter()
Helper function. Do not use unless you know what you are doing.
Definition jclass.c:202
void getstatic(uint16_t index)
Definition jclass.c:1021
void aastore()
Definition jclass.c:669
void iinc(uint16_t index, int16_t constant_val)
Definition jclass.c:1235
void dload(uint16_t index)
Definition jclass.c:819
void ifgt(size_t branch_target)
Definition jclass.c:1211
void constant_pool_start()
Begins the constant pool.
Definition jclass.c:191
void athrow()
Definition jclass.c:723
void dup_x2()
Definition jclass.c:882
void lstore(uint16_t index)
Definition jclass.c:1516
void interfaces_end()
Marks the end of the list of interfaces.
Definition jclass.c:394
void fcmpl()
Definition jclass.c:937
void impdep2_dup()
Definition jclass.c:1655
void lrem()
Definition jclass.c:1496