1 9 package com.vladium.jcd.compiler; 10 11 import com.vladium.jcd.cls.ClassDef; 12 import com.vladium.jcd.cls.constant.CONSTANT_Integer_info; 13 import com.vladium.jcd.opcodes.IOpcodes; 14 import com.vladium.util.ByteArrayOStream; 15 16 20 public 21 abstract class CodeGen implements IOpcodes 22 { 23 25 26 public static void load_local_object_var (final ByteArrayOStream out, final int index) 27 { 28 if (index <= 3) 29 { 30 out.write (_aload_0 + index); } 32 else if (index <= 0xFF) 33 { 34 out.write2 (_aload, 35 index); } 37 else 38 { 39 out.write4 (_wide, 40 _aload, 41 index >>> 8, index); } 44 } 45 46 public static void store_local_object_var (final ByteArrayOStream out, final int index) 47 { 48 if (index <= 3) 49 { 50 out.write (_astore_0 + index); } 52 else if (index <= 0xFF) 53 { 54 out.write2 (_astore, 55 index); } 57 else 58 { 59 out.write4 (_wide, 60 _astore, 61 index >>> 8, index); } 64 65 } 67 68 public static void push_int_value (final ByteArrayOStream out, final ClassDef cls, final int value) 69 { 70 if ((-1 <= value) && (value <= 5)) 71 { 72 out.write (_iconst_0 + value); 73 } 74 else if ((-128 <= value) && (value <= 127)) 75 { 76 out.write2 (_bipush, 77 value); } 79 else if ((-32768 <= value) && (value <= 32767)) 80 { 81 out.write3 (_sipush, 82 value >>> 8, value); } 85 else { 87 final int index = cls.getConstants ().add (new CONSTANT_Integer_info (value)); 89 90 if (index <= 0xFF) 91 { 92 out.write2 (_ldc, 93 index); } 95 else { 97 out.write3 (_ldc_w, 98 index >>> 8, index); } 101 } 102 103 } 105 106 public static void push_constant_index (final ByteArrayOStream out, final int index) 107 { 108 if (index <= 0xFF) 109 { 110 out.write2 (_ldc, 111 index); } 113 else 114 { 115 out.write3 (_ldc_w, 116 index >>> 8, index); } 119 120 } 122 123 125 127 129 130 private CodeGen () {} 132 } | Popular Tags |