jclass
 
Loading...
Searching...
No Matches
jclass.c
Go to the documentation of this file.
1/*
2 This code was created by hydrophobis on GitHub and is liscenced under GPL v3.0
3 Please leave this comment in the library if you intend on using it in any context
4*/
5#include <stdio.h>
6#include <stdint.h>
7#include <stdlib.h>
8#include <string.h>
9
11#define J_CLASS_BEGIN {}
12
14#define J_CLASS_END {}
15
17#define ACC_PUBLIC 0x0001
18
21#define ACC_PRIVATE 0x0002
22
25#define ACC_PROTECTED 0x0004
26
29#define ACC_STATIC 0x0008
30
32#define ACC_FINAL 0x0010
33
35#define ACC_SUPER 0x0020
36
39#define ACC_SYNCHRONIZED 0x0020
40
43#define ACC_NATIVE 0x0100
44
47#define ACC_INTERFACE 0x0200
48
50#define ACC_ABSTRACT 0x0400
51
53#define ACC_STRICT 0x0800
54
59#define u1(v) (uint8_t)(v)
60
65#define u2(v) { \
66 (uint8_t)(((v) >> 8) & 0xFF), \
67 (uint8_t)((v) & 0xFF) \
68}
69
74#define u4(v) { \
75 (uint8_t)((v) >> 24), \
76 (uint8_t)(((v) >> 16) & 0xFF), \
77 (uint8_t)(((v) >> 8) & 0xFF), \
78 (uint8_t)((v) & 0xFF) \
79}
80
82#define BUFFER_SIZE 65536
83
85static uint8_t outputBuffer[BUFFER_SIZE];
87static size_t outputIndex = 0;
88
93static void emit_byte(uint8_t b) {
94 if (outputIndex >= BUFFER_SIZE) {
95 fprintf(stderr, "Buffer overflow\n");
96 exit(1);
97 }
99}
100
106static void emit_u1(uint8_t v) {
107 emit_byte(v);
108}
109
115static void emit_u2(uint16_t v) {
116 emit_byte((v >> 8) & 0xFF);
117 emit_byte(v & 0xFF);
118}
119
125static void emit_u4(uint32_t v) {
126 emit_byte((v >> 24) & 0xFF);
127 emit_byte((v >> 16) & 0xFF);
128 emit_byte((v >> 8) & 0xFF);
129 emit_byte(v & 0xFF);
130}
131
136static size_t current_offset() {
137 return outputIndex;
138}
139
146static void patch_u2(size_t pos, uint16_t v) {
147 if (pos + 1 >= BUFFER_SIZE) {
148 fprintf(stderr, "Patch position out of range\n");
149 exit(1);
150 }
151 outputBuffer[pos] = (v >> 8) & 0xFF;
152 outputBuffer[pos + 1] = v & 0xFF;
153}
154
160static void patch_u4(size_t pos, uint32_t v) {
161 if (pos + 3 >= BUFFER_SIZE) {
162 fprintf(stderr, "Patch position out of range\n");
163 exit(1);
164 }
165 outputBuffer[pos] = (v >> 24) & 0xFF;
166 outputBuffer[pos + 1] = (v >> 16) & 0xFF;
167 outputBuffer[pos + 2] = (v >> 8) & 0xFF;
168 outputBuffer[pos + 3] = v & 0xFF;
169}
170
171// ------------------------
172// constant_pool macros
173// ------------------------
174
175// Global variables for constant pool state
180static size_t cp_count_offset = 0;
185static uint16_t constant_pool_counter = 0;
186
192 // u2 constant_pool_count
194 emit_u2(0); // placeholder for constant_pool_count
196}
197
202static void increment_cp_counter() {
204}
205
211void constant_utf8(const char *string) {
212 emit_u1(1); // u1 1 (tag)
213 uint16_t len = (uint16_t)strlen(string);
214 emit_u2(len); // u2 length
215 for (uint16_t i = 0; i < len; i++) { // ..data: db string
216 emit_u1((uint8_t)string[i]);
217 }
219}
220
226void constant_integer(uint32_t value) {
227 emit_u1(3); // u1 3 (tag)
228 emit_u4(value); // u4 value
230}
231
237void constant_float(uint32_t value) {
238 emit_u1(4); // u1 4 (tag)
239 emit_u4(value); // u4 value
241}
242
248void constant_long(uint64_t value) {
249 emit_u1(5); // u1 5 (tag)
250 emit_u4((uint32_t)(value >> 32)); // u4 high part
251 emit_u4((uint32_t)(value & 0xFFFFFFFF)); // u4 low part
253}
254
260void constant_double(uint64_t value) {
261 emit_u1(6); // u1 6 (tag)
262 emit_u4((uint32_t)(value >> 32)); // u4 high part
263 emit_u4((uint32_t)(value & 0xFFFFFFFF)); // u4 low part
265}
266
272void constant_class(uint16_t name_index) {
273 emit_u1(7); // u1 7 (tag)
274 emit_u2(name_index); // u2 name_index
276}
277
283void constant_string(uint16_t string_index) {
284 emit_u1(8); // u1 8 (tag)
285 emit_u2(string_index); // u2 string_index
287}
288
295void constant_fieldref(uint16_t class_index, uint16_t name_and_type_index) {
296 emit_u1(9); // u1 9 (tag)
297 emit_u2(class_index); // u2 class_index
298 emit_u2(name_and_type_index); // u2 name_and_type_index
300}
301
308void constant_methodref(uint16_t class_index, uint16_t name_and_type_index) {
309 emit_u1(10); // u1 10 (tag)
310 emit_u2(class_index); // u2 class_index
311 emit_u2(name_and_type_index); // u2 name_and_type_index
313}
314
321void constant_interfacemethodref(uint16_t class_index, uint16_t name_and_type_index) {
322 emit_u1(11); // u1 11 (tag)
323 emit_u2(class_index); // u2 class_index
324 emit_u2(name_and_type_index); // u2 name_and_type_index
326}
327
334void constant_nameandtype(uint16_t name_index, uint16_t descriptor_index) {
335 emit_u1(12); // u1 12 (tag)
336 emit_u2(name_index); // u2 name_index
337 emit_u2(descriptor_index); // u2 descriptor_index
339}
340
346 // constant_pool_count = constant_pool_counter
348 // restruc directives are not applicable in C (purge and re-structure are no-ops)
349}
350
351// ------------------------
352// interfaces macros
353// ------------------------
354
355// macro interfaces {
360static size_t interfaces_count_offset = 0;
365static uint16_t interfaces_counter = 0;
366
372 // u2 interfaces_count
374 emit_u2(0); // placeholder for interfaces_count
376}
377
383void interface_entry(uint16_t interface_val) {
384 // interfaces_counter = interfaces_counter + 1
386 // u2 interface
387 emit_u2(interface_val);
388}
389
396 // purge interface (no-op)
397}
398
399// ------------------------
400// attributes macros
401// ------------------------
402
407static size_t attributes_count_offset = 0;
412static uint16_t attributes_counter = 0;
413
419 // u2 attributes_count
421 emit_u2(0); // placeholder for attributes_count
423}
424
425size_t attribute_start_offset = 0; // used to hold starting offset of attribute
426
432void attribute_start(uint16_t attribute_name_index) {
434 // u2 attribute_name_index
435 emit_u2(attribute_name_index);
436 // local start: record current offset for attribute_length calculation
438 // u4 attribute_length placeholder
439 emit_u4(0);
440}
441
447 size_t end_offset = current_offset();
448 uint32_t length = (uint32_t)(end_offset - attribute_start_offset - 4);
450 // restore coordinate values (no-op)
451}
452
459 // restore attributes_count, attributes_counter and purge attribute (all no-ops in C)
460}
461
462// ------------------------
463// fields macros
464// ------------------------
465
466static size_t fields_count_offset = 0;
471static uint16_t fields_counter = 0;
472
478 // u2 fields_count
480 emit_u2(0); // placeholder for fields_count
481 fields_counter = 0;
482}
483
491void field_info(uint16_t access_flags, uint16_t name_index, uint16_t descriptor_index) {
493 emit_u2(access_flags);
494 emit_u2(name_index);
495 emit_u2(descriptor_index);
496 // attributes for field
498}
499
505 // end_attributes for field
507}
508
515 // purge field_info, end_field_info (no-op)
516}
517
518// ------------------------
519// methods macros
520// ------------------------
521
522static size_t methods_count_offset = 0;
527static uint16_t methods_counter = 0;
528
534 // u2 methods_count
536 emit_u2(0); // placeholder for methods_count
537 methods_counter = 0;
538}
539
547void method_info(uint16_t access_flags, uint16_t name_index, uint16_t descriptor_index) {
549 emit_u2(access_flags);
550 emit_u2(name_index);
551 emit_u2(descriptor_index);
552 // attributes for method
554}
555
561 // end_attributes for method
563}
564
571 // purge method_info, end_method_info (no-op)
572}
573
574// ------------------------
575// bytecode macros
576// ------------------------
577
578static size_t bytecode_length_offset = 0;
579static size_t bytecode_offset = 0;
580
586 // local length; bytecode_length equ length
588 // u4 bytecode_length placeholder
589 emit_u4(0);
591 // org 0 is ignored in C
592}
593
599 size_t end_offset = current_offset();
600 uint32_t length = (uint32_t)(end_offset - bytecode_offset);
602 // org bytecode_offset+bytecode_length, restore bytecode_length are ignored
603}
604
605// ------------------------
606// exceptions macros
607// ------------------------
608
610static uint16_t exception_counter = 0;
611
617 // local length; exception_table_length equ length
619 // u2 exception_table_length placeholder
620 emit_u2(0);
622}
623
624void exception_entry(uint16_t start_pc, uint16_t end_pc, uint16_t handler_pc, uint16_t catch_type) {
626 emit_u2(start_pc);
627 emit_u2(end_pc);
628 emit_u2(handler_pc);
629 emit_u2(catch_type);
630}
631
638 // restore exception_table_length (no-op)
639}
640
641// ------------------------
642// BYTECODE constants
643// ------------------------
644
649enum {
656 T_INT = 10,
657 T_LONG = 11
659
660// ------------------------
661// Bytecode instruction macros as functions
662// ------------------------
663
664void aaload() {
665 // macro aaload { db 0x32 }
666 emit_u1(0x32);
667}
668
669void aastore() {
670 // macro aastore { db 0x53 }
671 emit_u1(0x53);
672}
673
675 // macro aconst_null { db 0x01 }
676 emit_u1(0x01);
677}
678
679void aload(uint16_t index) {
680 // macro aload index { if index>=0 & index<=3 ... }
681 if (index <= 3) {
682 emit_u1(0x2a + index);
683 } else if (index < 0x100) {
684 emit_u1(0x19);
685 emit_u1((uint8_t)index);
686 } else {
687 emit_u1(0xc4);
688 emit_u1(0x19);
689 emit_u2(index);
690 }
691}
692
693void anewarray(uint16_t class_index) {
694 // macro anewarray class { db 0xbd,(class) shr 8,(class) and 0FFh }
695 emit_u1(0xbd);
696 emit_u2(class_index);
697}
698
699void areturn() {
700 // macro areturn { db 0xb0 }
701 emit_u1(0xb0);
702}
703
705 // macro arraylength { db 0xbe }
706 emit_u1(0xbe);
707}
708
709void astore(uint16_t index) {
710 // macro astore index { if index>=0 & index<=3 ... }
711 if (index <= 3) {
712 emit_u1(0x4b + index);
713 } else if (index < 0x100) {
714 emit_u1(0x3a);
715 emit_u1((uint8_t)index);
716 } else {
717 emit_u1(0xc4);
718 emit_u1(0x3a);
719 emit_u2(index);
720 }
721}
722
723void athrow() {
724 // macro athrow { db 0xbf }
725 emit_u1(0xbf);
726}
727
728void baload() {
729 // macro baload { db 0x33 }
730 emit_u1(0x33);
731}
732
733void bastore() {
734 // macro bastore { db 0x54 }
735 emit_u1(0x54);
736}
737
738void bipush(int8_t byte_val) {
739 // macro bipush byte { if byte>-1 & byte<=5 ... }
740 if (byte_val >= -1 && byte_val <= 5) {
741 emit_u1(0x03 + byte_val);
742 } else {
743 emit_u1(0x10);
744 emit_u1((uint8_t)byte_val);
745 }
746}
747
748void caload() {
749 // macro caload { db 0x34 }
750 emit_u1(0x34);
751}
752
753void castore() {
754 // macro castore { db 0x55 }
755 emit_u1(0x55);
756}
757
758void checkcast(uint16_t class_index) {
759 // macro checkcast class { db 0xc0,(class) shr 8,(class) and 0FFh }
760 emit_u1(0xc0);
761 emit_u2(class_index);
762}
763
764void d2f() {
765 // macro d2f { db 0x90 }
766 emit_u1(0x90);
767}
768
769void d2i() {
770 // macro d2i { db 0x8e }
771 emit_u1(0x8e);
772}
773
774void d2l() {
775 // macro d2l { db 0x8f }
776 emit_u1(0x8f);
777}
778
779void dadd() {
780 // macro dadd { db 0x63 }
781 emit_u1(0x63);
782}
783
784void daload() {
785 // macro daload { db 0x31 }
786 emit_u1(0x31);
787}
788
789void dastore() {
790 // macro dastore { db 0x52 }
791 emit_u1(0x52);
792}
793
794void dcmpg() {
795 // macro dcmpg { db 0x98 }
796 emit_u1(0x98);
797}
798
799void dcmpl() {
800 // macro dcmpl { db 0x97 }
801 emit_u1(0x97);
802}
803
804void dconst_0() {
805 // macro dconst_0 { db 0x0e }
806 emit_u1(0x0e);
807}
808
809void dconst_1() {
810 // macro dconst_1 { db 0x0f }
811 emit_u1(0x0f);
812}
813
814void ddiv() {
815 // macro ddiv { db 0x6f }
816 emit_u1(0x6f);
817}
818
819void dload(uint16_t index) {
820 // macro dload index { if index>=0 & index<=3 ... }
821 if (index <= 3) {
822 emit_u1(0x26 + index);
823 } else if (index < 0x100) {
824 emit_u1(0x18);
825 emit_u1((uint8_t)index);
826 } else {
827 emit_u1(0xc4);
828 emit_u1(0x18);
829 emit_u2(index);
830 }
831}
832
833void dmul() {
834 // macro dmul { db 0x6b }
835 emit_u1(0x6b);
836}
837
838void dneg() {
839 // macro dneg { db 0x77 }
840 emit_u1(0x77);
841}
842
843void j_drem() {
844 // macro drem { db 0x73 }
845 emit_u1(0x73);
846}
847
848void dreturn() {
849 // macro dreturn { db 0xaf }
850 emit_u1(0xaf);
851}
852
853void dstore(uint16_t index) {
854 // macro dstore index { if index>=0 & index<=3 ... }
855 if (index <= 3) {
856 emit_u1(0x47 + index);
857 } else if (index < 0x100) {
858 emit_u1(0x39);
859 emit_u1((uint8_t)index);
860 } else {
861 emit_u1(0xc4);
862 emit_u1(0x39);
863 emit_u2(index);
864 }
865}
866
867void dsub() {
868 // macro dsub { db 0x67 }
869 emit_u1(0x67);
870}
871
872void dup() {
873 // macro dup { db 0x59 }
874 emit_u1(0x59);
875}
876
877void dup_x1() {
878 // macro dup_x1 { db 0x5a }
879 emit_u1(0x5a);
880}
881
882void dup_x2() {
883 // macro dup_x2 { db 0x5b }
884 emit_u1(0x5b);
885}
886
887void dup2() {
888 // macro dup2 { db 0x5c }
889 emit_u1(0x5c);
890}
891
892void dup2_x1() {
893 // macro dup2_x1 { db 0x5d }
894 emit_u1(0x5d);
895}
896
897void dup2_x2() {
898 // macro dup2_x2 { db 0x5e }
899 emit_u1(0x5e);
900}
901
902void f2d() {
903 // macro f2d { db 0x8d }
904 emit_u1(0x8d);
905}
906
907void f2i() {
908 // macro f2i { db 0x8b }
909 emit_u1(0x8b);
910}
911
912void f2l() {
913 // macro f2l { db 0x8c }
914 emit_u1(0x8c);
915}
916
917void fadd() {
918 // macro fadd { db 0x62 }
919 emit_u1(0x62);
920}
921
922void faload() {
923 // macro faload { db 0x30 }
924 emit_u1(0x30);
925}
926
927void fastore() {
928 // macro fastore { db 0x51 }
929 emit_u1(0x51);
930}
931
932void fcmpg() {
933 // macro fcmpg { db 0x96 }
934 emit_u1(0x96);
935}
936
937void fcmpl() {
938 // macro fcmpl { db 0x95 }
939 emit_u1(0x95);
940}
941
942void fconst_0() {
943 // macro fconst_0 { db 0x0b }
944 emit_u1(0x0b);
945}
946
947void fconst_1() {
948 // macro fconst_1 { db 0x0c }
949 emit_u1(0x0c);
950}
951
952void fconst_2() {
953 // macro fconst_2 { db 0x0d }
954 emit_u1(0x0d);
955}
956
957void fdiv() {
958 // macro fdiv { db 0x6e }
959 emit_u1(0x6e);
960}
961
962void fload(uint16_t index) {
963 // macro fload index { if index>=0 & index<=3 ... }
964 if (index <= 3) {
965 emit_u1(0x22 + index);
966 } else if (index < 0x100) {
967 emit_u1(0x17);
968 emit_u1((uint8_t)index);
969 } else {
970 emit_u1(0xc4);
971 emit_u1(0x17);
972 emit_u2(index);
973 }
974}
975
976void fmul() {
977 // macro fmul { db 0x6a }
978 emit_u1(0x6a);
979}
980
981void fneg() {
982 // macro fneg { db 0x76 }
983 emit_u1(0x76);
984}
985
986void frem() {
987 // macro frem { db 0x72 }
988 emit_u1(0x72);
989}
990
991void freturn() {
992 // macro freturn { db 0xae }
993 emit_u1(0xae);
994}
995
996void fstore(uint16_t index) {
997 // macro fstore index { if index>=0 & index<=3 ... }
998 if (index <= 3) {
999 emit_u1(0x43 + index);
1000 } else if (index < 0x100) {
1001 emit_u1(0x38);
1002 emit_u1((uint8_t)index);
1003 } else {
1004 emit_u1(0xc4);
1005 emit_u1(0x38);
1006 emit_u2(index);
1007 }
1008}
1009
1010void fsub() {
1011 // macro fsub { db 0x66 }
1012 emit_u1(0x66);
1013}
1014
1015void getfield(uint16_t index) {
1016 // macro getfield index { db 0xb4,(index) shr 8,(index) and 0FFh }
1017 emit_u1(0xb4);
1018 emit_u2(index);
1019}
1020
1021void getstatic(uint16_t index) {
1022 // macro getstatic index { db 0xb2,(index) shr 8,(index) and 0FFh }
1023 emit_u1(0xb2);
1024 emit_u2(index);
1025}
1026
1027void goto_inst(size_t branch_target) {
1028 // macro goto branch { if branch-$>=-8000h & branch-$<8000h ... }
1029 int32_t offset = (int32_t)(branch_target - current_offset());
1030 if (offset >= (int32_t)0xFFFF8000 && offset < 0x8000) {
1031 int16_t word_offset = (int16_t)offset;
1032 emit_u1(0xa7);
1033 emit_u2((uint16_t)word_offset);
1034 } else {
1035 int32_t dword_offset = offset;
1036 emit_u1(0xc8);
1037 emit_u4((uint32_t)dword_offset);
1038 }
1039}
1040
1041void goto_w_inst(size_t branch_target) {
1042 // macro goto_w branch { offset = dword branch-$; db 0xc8, ... }
1043 int32_t offset = (int32_t)(branch_target - current_offset());
1044 emit_u1(0xc8);
1045 emit_u4((uint32_t)offset);
1046}
1047
1048void i2b() {
1049 // macro i2b { db 0x91 }
1050 emit_u1(0x91);
1051}
1052
1053void i2c() {
1054 // macro i2c { db 0x92 }
1055 emit_u1(0x92);
1056}
1057
1058void i2d() {
1059 // macro i2d { db 0x87 }
1060 emit_u1(0x87);
1061}
1062
1063void i2f() {
1064 // macro i2f { db 0x86 }
1065 emit_u1(0x86);
1066}
1067
1068void i2l() {
1069 // macro i2l { db 0x85 }
1070 emit_u1(0x85);
1071}
1072
1073void i2s() {
1074 // macro i2s { db 0x93 }
1075 emit_u1(0x93);
1076}
1077
1078void iadd() {
1079 // macro iadd { db 0x60 }
1080 emit_u1(0x60);
1081}
1082
1083void iaload() {
1084 // macro iaload { db 0x2e }
1085 emit_u1(0x2e);
1086}
1087
1088void iand() {
1089 // macro iand { db 0x7e }
1090 emit_u1(0x7e);
1091}
1092
1093void iastore() {
1094 // macro iastore { db 0x4f }
1095 emit_u1(0x4f);
1096}
1097
1099 // macro iconst_m1 { db 0x02 }
1100 emit_u1(0x02);
1101}
1102
1103void iconst_0() {
1104 // macro iconst_0 { db 0x03 }
1105 emit_u1(0x03);
1106}
1107
1108void iconst_1() {
1109 // macro iconst_1 { db 0x04 }
1110 emit_u1(0x04);
1111}
1112
1113void iconst_2() {
1114 // macro iconst_2 { db 0x05 }
1115 emit_u1(0x05);
1116}
1117
1118void iconst_3() {
1119 // macro iconst_3 { db 0x06 }
1120 emit_u1(0x06);
1121}
1122
1123void iconst_4() {
1124 // macro iconst_4 { db 0x07 }
1125 emit_u1(0x07);
1126}
1127
1128void iconst_5() {
1129 // macro iconst_5 { db 0x08 }
1130 emit_u1(0x08);
1131}
1132
1133void idiv() {
1134 // macro idiv { db 0x6c }
1135 emit_u1(0x6c);
1136}
1137
1138void if_acmpeq(size_t branch_target) {
1139 // macro if_acmpeq branch { offset = word branch-$; db 0xa5, ... }
1140 int16_t offset = (int16_t)(branch_target - current_offset());
1141 emit_u1(0xa5);
1142 emit_u2((uint16_t)offset);
1143}
1144
1145void if_acmpne(size_t branch_target) {
1146 int16_t offset = (int16_t)(branch_target - current_offset());
1147 emit_u1(0xa6);
1148 emit_u2((uint16_t)offset);
1149}
1150
1151void if_icmpeq(size_t branch_target) {
1152 int16_t offset = (int16_t)(branch_target - current_offset());
1153 emit_u1(0x9f);
1154 emit_u2((uint16_t)offset);
1155}
1156
1157void if_icmpne(size_t branch_target) {
1158 int16_t offset = (int16_t)(branch_target - current_offset());
1159 emit_u1(0xa0);
1160 emit_u2((uint16_t)offset);
1161}
1162
1163void if_icmplt(size_t branch_target) {
1164 int16_t offset = (int16_t)(branch_target - current_offset());
1165 emit_u1(0xa1);
1166 emit_u2((uint16_t)offset);
1167}
1168
1169void if_icmpge(size_t branch_target) {
1170 int16_t offset = (int16_t)(branch_target - current_offset());
1171 emit_u1(0xa2);
1172 emit_u2((uint16_t)offset);
1173}
1174
1175void if_icmpgt(size_t branch_target) {
1176 int16_t offset = (int16_t)(branch_target - current_offset());
1177 emit_u1(0xa3);
1178 emit_u2((uint16_t)offset);
1179}
1180
1181void if_icmple(size_t branch_target) {
1182 int16_t offset = (int16_t)(branch_target - current_offset());
1183 emit_u1(0xa4);
1184 emit_u2((uint16_t)offset);
1185}
1186
1187void ifeq(size_t branch_target) {
1188 int16_t offset = (int16_t)(branch_target - current_offset());
1189 emit_u1(0x99);
1190 emit_u2((uint16_t)offset);
1191}
1192
1193void ifne(size_t branch_target) {
1194 int16_t offset = (int16_t)(branch_target - current_offset());
1195 emit_u1(0x9a);
1196 emit_u2((uint16_t)offset);
1197}
1198
1199void iflt(size_t branch_target) {
1200 int16_t offset = (int16_t)(branch_target - current_offset());
1201 emit_u1(0x9b);
1202 emit_u2((uint16_t)offset);
1203}
1204
1205void ifge(size_t branch_target) {
1206 int16_t offset = (int16_t)(branch_target - current_offset());
1207 emit_u1(0x9c);
1208 emit_u2((uint16_t)offset);
1209}
1210
1211void ifgt(size_t branch_target) {
1212 int16_t offset = (int16_t)(branch_target - current_offset());
1213 emit_u1(0x9d);
1214 emit_u2((uint16_t)offset);
1215}
1216
1217void ifle(size_t branch_target) {
1218 int16_t offset = (int16_t)(branch_target - current_offset());
1219 emit_u1(0x9e);
1220 emit_u2((uint16_t)offset);
1221}
1222
1223void ifnonnull(size_t branch_target) {
1224 int16_t offset = (int16_t)(branch_target - current_offset());
1225 emit_u1(0xc7);
1226 emit_u2((uint16_t)offset);
1227}
1228
1229void ifnull(size_t branch_target) {
1230 int16_t offset = (int16_t)(branch_target - current_offset());
1231 emit_u1(0xc6);
1232 emit_u2((uint16_t)offset);
1233}
1234
1235void iinc(uint16_t index, int16_t constant_val) {
1236 // macro iinc index, const { if index < 100h & const < 80h & const >= -80h ... }
1237 if (index < 0x100 && constant_val < 0x80 && constant_val >= -0x80) {
1238 emit_u1(0x84);
1239 emit_u1((uint8_t)index);
1240 emit_u1((uint8_t)constant_val);
1241 } else {
1242 emit_u1(0xc4);
1243 emit_u1(0x84);
1244 emit_u2(index);
1245 emit_u2((uint16_t)constant_val);
1246 }
1247}
1248
1249void iload(uint16_t index) {
1250 // macro iload index { if index>=0 & index<=3 ... }
1251 if (index <= 3) {
1252 emit_u1(0x1a + index);
1253 } else if (index < 0x100) {
1254 emit_u1(0x15);
1255 emit_u1((uint8_t)index);
1256 } else {
1257 emit_u1(0xc4);
1258 emit_u1(0x15);
1259 emit_u2(index);
1260 }
1261}
1262
1263void imul() {
1264 // macro imul { db 0x68 }
1265 emit_u1(0x68);
1266}
1267
1268void ineg() {
1269 // macro ineg { db 0x74 }
1270 emit_u1(0x74);
1271}
1272
1273void instanceof(uint16_t index) {
1274 // macro instanceof index { db 0xc1,(index) shr 8,(index) and 0FFh }
1275 emit_u1(0xc1);
1276 emit_u2(index);
1277}
1278
1279void invokedynamic(uint16_t index) {
1280 // macro invokedynamic index { db 0xba,(index) shr 8,(index) and 0FFh,0,0 }
1281 emit_u1(0xba);
1282 emit_u2(index);
1283 emit_u1(0x00);
1284 emit_u1(0x00);
1285}
1286
1287void invokeinterface(uint16_t index, uint8_t count) {
1288 // macro invokeinterface index,count { db 0xb9,(index) shr 8,(index) and 0FFh,count }
1289 emit_u1(0xb9);
1290 emit_u2(index);
1291 emit_u1(count);
1292}
1293
1294void invokespecial(uint16_t index) {
1295 // macro invokespecial index { db 0xb7,(index) shr 8,(index) and 0FFh }
1296 emit_u1(0xb7);
1297 emit_u2(index);
1298}
1299
1300void invokestatic(uint16_t index) {
1301 // macro invokestatic index { db 0xb8,(index) shr 8,(index) and 0FFh }
1302 emit_u1(0xb8);
1303 emit_u2(index);
1304}
1305
1306void invokevirtual(uint16_t index) {
1307 // macro invokevirtual index { db 0xb6,(index) shr 8,(index) and 0FFh }
1308 emit_u1(0xb6);
1309 emit_u2(index);
1310}
1311
1312void ior() {
1313 // macro ior { db 0x80 }
1314 emit_u1(0x80);
1315}
1316
1317void irem() {
1318 // macro irem { db 0x70 }
1319 emit_u1(0x70);
1320}
1321
1322void ireturn() {
1323 // macro ireturn { db 0xac }
1324 emit_u1(0xac);
1325}
1326
1327void ishl() {
1328 // macro ishl { db 0x78 }
1329 emit_u1(0x78);
1330}
1331
1332void ishr() {
1333 // macro ishr { db 0x7a }
1334 emit_u1(0x7a);
1335}
1336
1337void istore(uint16_t index) {
1338 // macro istore index { if index>=0 & index<=3 ... }
1339 if (index <= 3) {
1340 emit_u1(0x3b + index);
1341 } else if (index < 0x100) {
1342 emit_u1(0x36);
1343 emit_u1((uint8_t)index);
1344 } else {
1345 emit_u1(0xc4);
1346 emit_u1(0x36);
1347 emit_u2(index);
1348 }
1349}
1350
1351void isub() {
1352 // macro isub { db 0x64 }
1353 emit_u1(0x64);
1354}
1355
1356void iushr() {
1357 // macro iushr { db 0x7c }
1358 emit_u1(0x7c);
1359}
1360
1361void ixor() {
1362 // macro ixor { db 0x82 }
1363 emit_u1(0x82);
1364}
1365
1366void jsr_inst(size_t branch_target) {
1367 // macro jsr branch { if branch-$>=-8000h & branch-$<8000h ... }
1368 int32_t offset = (int32_t)(branch_target - current_offset());
1369 if (offset >= (int32_t)0xFFFF8000 && offset < 0x8000) {
1370 int16_t word_offset = (int16_t)offset;
1371 emit_u1(0xa8);
1372 emit_u2((uint16_t)word_offset);
1373 } else {
1374 int32_t dword_offset = offset;
1375 emit_u1(0xc9);
1376 emit_u4((uint32_t)dword_offset);
1377 }
1378}
1379
1380void jsr_w_inst(size_t branch_target) {
1381 // macro jsr_w branch { offset = dword branch-$; db 0xc9, ... }
1382 int32_t offset = (int32_t)(branch_target - current_offset());
1383 emit_u1(0xc9);
1384 emit_u4((uint32_t)offset);
1385}
1386
1387void l2d() {
1388 // macro l2d { db 0x8a }
1389 emit_u1(0x8a);
1390}
1391
1392void l2f() {
1393 // macro l2f { db 0x89 }
1394 emit_u1(0x89);
1395}
1396
1397void l2i() {
1398 // macro l2i { db 0x88 }
1399 emit_u1(0x88);
1400}
1401
1402void ladd() {
1403 // macro ladd { db 0x61 }
1404 emit_u1(0x61);
1405}
1406
1407void laload() {
1408 // macro laload { db 0x2f }
1409 emit_u1(0x2f);
1410}
1411
1412void land() {
1413 // macro land { db 0x7f }
1414 emit_u1(0x7f);
1415}
1416
1417void lastore() {
1418 // macro lastore { db 0x50 }
1419 emit_u1(0x50);
1420}
1421
1422void lcmp() {
1423 // macro lcmp { db 0x94 }
1424 emit_u1(0x94);
1425}
1426
1427void lconst_0() {
1428 // macro lconst_0 { db 0x09 }
1429 emit_u1(0x09);
1430}
1431
1432void lconst_1() {
1433 // macro lconst_1 { db 0x0a }
1434 emit_u1(0x0a);
1435}
1436
1437void ldc(uint16_t index) {
1438 // macro ldc index { if index<100h ... }
1439 if (index < 0x100) {
1440 emit_u1(0x12);
1441 emit_u1((uint8_t)index);
1442 } else {
1443 emit_u1(0x13);
1444 emit_u2(index);
1445 }
1446}
1447
1448void ldc_w(uint16_t index) {
1449 // macro ldc_w index { db 0x13,(index) shr 8,(index) and 0FFh }
1450 emit_u1(0x13);
1451 emit_u2(index);
1452}
1453
1454void ldc2_w(uint16_t index) {
1455 // macro ldc2_w index { db 0x14,(index) shr 8,(index) and 0FFh }
1456 emit_u1(0x14);
1457 emit_u2(index);
1458}
1459
1460void j_ldiv() {
1461 // macro ldiv { db 0x6d }
1462 emit_u1(0x6d);
1463}
1464
1465void lload(uint16_t index) {
1466 // macro lload index { if index>=0 & index<=3 ... }
1467 if (index <= 3) {
1468 emit_u1(0x1e + index);
1469 } else if (index < 0x100) {
1470 emit_u1(0x16);
1471 emit_u1((uint8_t)index);
1472 } else {
1473 emit_u1(0xc4);
1474 emit_u1(0x16);
1475 emit_u2(index);
1476 }
1477}
1478
1479void lmul() {
1480 // macro lmul { db 0x69 }
1481 emit_u1(0x69);
1482}
1483
1484void lneg() {
1485 // macro lneg { db 0x75 }
1486 emit_u1(0x75);
1487}
1488
1489// macro lookupswitch is commented out
1490
1491void lor() {
1492 // macro lor { db 0x81 }
1493 emit_u1(0x81);
1494}
1495
1496void lrem() {
1497 // macro lrem { db 0x71 }
1498 emit_u1(0x71);
1499}
1500
1501void lreturn() {
1502 // macro lreturn { db 0xad }
1503 emit_u1(0xad);
1504}
1505
1506void lshl() {
1507 // macro lshl { db 0x79 }
1508 emit_u1(0x79);
1509}
1510
1511void lshr() {
1512 // macro lshr { db 0x7b }
1513 emit_u1(0x7b);
1514}
1515
1516void lstore(uint16_t index) {
1517 // macro lstore index { if index>=0 & index<=3 ... }
1518 if (index <= 3) {
1519 emit_u1(0x3f + index);
1520 } else if (index < 0x100) {
1521 emit_u1(0x37);
1522 emit_u1((uint8_t)index);
1523 } else {
1524 emit_u1(0xc4);
1525 emit_u1(0x37);
1526 emit_u2(index);
1527 }
1528}
1529
1530void lsub() {
1531 // macro lsub { db 0x65 }
1532 emit_u1(0x65);
1533}
1534
1535void lushr() {
1536 // macro lushr { db 0x7d }
1537 emit_u1(0x7d);
1538}
1539
1540void lxor() {
1541 // macro lxor { db 0x83 }
1542 emit_u1(0x83);
1543}
1544
1546 // macro monitorenter { db 0xc2 }
1547 emit_u1(0xc2);
1548}
1549
1551 // macro monitorexit { db 0xc3 }
1552 emit_u1(0xc3);
1553}
1554
1555void multianewarray(uint16_t index, uint8_t dimensions) {
1556 // macro multianewarray index,dimensions { db 0xc5,(index) shr 8,(index) and 0FFh,dimensions }
1557 emit_u1(0xc5);
1558 emit_u2(index);
1559 emit_u1(dimensions);
1560}
1561
1562void new_inst(uint16_t index) {
1563 // macro new index { db 0xbb,(index) shr 8,(index) and 0FFh }
1564 emit_u1(0xbb);
1565 emit_u2(index);
1566}
1567
1568void newarray(uint8_t atype) {
1569 // macro newarray atype { db 0xbc,atype }
1570 emit_u1(0xbc);
1571 emit_u1(atype);
1572}
1573
1574void nop() {
1575 // macro nop { db 0x00 }
1576 emit_u1(0x00);
1577}
1578
1579void pop_inst() {
1580 // macro pop { db 0x57 }
1581 emit_u1(0x57);
1582}
1583
1584void pop2() {
1585 // macro pop2 { db 0x58 }
1586 emit_u1(0x58);
1587}
1588
1589void putfield(uint16_t index) {
1590 // macro putfield index { db 0xb5,(index) shr 8,(index) and 0FFh }
1591 emit_u1(0xb5);
1592 emit_u2(index);
1593}
1594
1595void putstatic(uint16_t index) {
1596 // macro putstatic index { db 0xb3,(index) shr 8,(index) and 0FFh }
1597 emit_u1(0xb3);
1598 emit_u2(index);
1599}
1600
1601void ret_inst(uint16_t index) {
1602 // macro ret index { if index<100h ... }
1603 if (index < 0x100) {
1604 emit_u1(0xa9);
1605 emit_u1((uint8_t)index);
1606 } else {
1607 emit_u1(0xc4);
1608 emit_u1(0xa9);
1609 emit_u2(index);
1610 }
1611}
1612
1614 // macro return { db 0xb1 }
1615 emit_u1(0xb1);
1616}
1617
1618void saload() {
1619 // macro saload { db 0x35 }
1620 emit_u1(0x35);
1621}
1622
1623void sastore() {
1624 // macro sastore { db 0x56 }
1625 emit_u1(0x56);
1626}
1627
1628void sipush(uint16_t value) {
1629 // macro sipush short { db 0x11,(short) shr 8,(short) and 0FFh }
1630 emit_u1(0x11);
1631 emit_u2(value);
1632}
1633
1634void swap() {
1635 // macro swap { db 0x5f }
1636 emit_u1(0x5f);
1637}
1638
1639// macro tableswitch is commented out
1640
1642 // macro breakpoint { db 0xca }
1643 emit_u1(0xca);
1644}
1645
1646void impdep1() {
1647 // macro impdep1 { db 0xfe }
1648 emit_u1(0xfe);
1649}
1650
1651void impdep2() {
1652 // macro impdep2 { db 0xff }
1653 emit_u1(0xff);
1654}
1656 // duplicate definition as in original code
1657 emit_u1(0xff);
1658}
1659
1660static void emit_class_header() {
1661 // Magic number
1662 emit_u4(0xCAFEBABE);
1663
1664 // Version: Java 8
1665 emit_u2(0); // minor_version
1666 emit_u2(52); // major_version
1667}
1668
1669static void emit_class_footer(uint16_t this_class, uint8_t this_class_flags, uint16_t super_class) {
1670 emit_u2(this_class_flags);
1671
1672 // Class references
1673 emit_u2(this_class); // this_class
1674 emit_u2(super_class); // super_class
1675}
1676
1677// Enhanced Code attribute handling
1678void code_attribute_start(uint16_t name_index, uint16_t max_stack, uint16_t max_locals) {
1679 attribute_start(name_index);
1680 emit_u2(max_stack);
1681 emit_u2(max_locals);
1682 bytecode_start(); // Starts code emission
1683}
1684
1686 bytecode_end(); // Patches code length
1687 // Add exception table (empty) and attributes (none)
1688 emit_u2(0); // exception_table_length
1689 emit_u2(0); // attributes_count
1690 attribute_end();
1691}
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