1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. 2 * 3 * This program and the accompanying materials are made available under 4 * the terms of the Common Public License v1.0 which accompanies this distribution, 5 * and is available at http://www.eclipse.org/legal/cpl-v10.html 6 * 7 * $Id: CodeGen.java,v 1.1.1.1 2004/05/09 16:57:49 vlad_r Exp $ 8 */ 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 // ---------------------------------------------------------------------------- 17 /** 18 * @author Vlad Roubtsov, (C) 2003 19 */ 20 public 21 abstract class CodeGen implements IOpcodes 22 { 23 // public: ................................................................ 24 25 load_local_object_var(final ByteArrayOStream out, final int index)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); // aload_n 31 } 32 else if (index <= 0xFF) 33 { 34 out.write2 (_aload, 35 index); // indexbyte 36 } 37 else 38 { 39 out.write4 (_wide, 40 _aload, 41 index >>> 8, // indexbyte1 42 index); // indexbyte2 43 } 44 } 45 store_local_object_var(final ByteArrayOStream out, final int index)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); // astore_n 51 } 52 else if (index <= 0xFF) 53 { 54 out.write2 (_astore, 55 index); // indexbyte 56 } 57 else 58 { 59 out.write4 (_wide, 60 _astore, 61 index >>> 8, // indexbyte1 62 index); // indexbyte2 63 } 64 65 // [stack -1] 66 } 67 push_int_value(final ByteArrayOStream out, final ClassDef cls, final int value)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); // byte1 78 } 79 else if ((-32768 <= value) && (value <= 32767)) 80 { 81 out.write3 (_sipush, 82 value >>> 8, // byte1 83 value); // byte2 84 } 85 else // we have to create an Integer constant in the constant pool: 86 { 87 // TODO: check if it's already there 88 final int index = cls.getConstants ().add (new CONSTANT_Integer_info (value)); 89 90 if (index <= 0xFF) 91 { 92 out.write2 (_ldc, 93 index); // index 94 } 95 else // must use ldc_w 96 { 97 out.write3 (_ldc_w, 98 index >>> 8, // indexbyte1 99 index); // indexbyte2 100 } 101 } 102 103 // [stack +1] 104 } 105 push_constant_index(final ByteArrayOStream out, final int index)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); // indexbyte 112 } 113 else 114 { 115 out.write3 (_ldc_w, 116 index >>> 8, // indexbyte1 117 index); // indexbyte2 118 } 119 120 // [stack +1] 121 } 122 123 // protected: ............................................................. 124 125 // package: ............................................................... 126 127 // private: ............................................................... 128 129 CodeGen()130 private CodeGen () {} // prevent subclassing 131 132 } // end of class 133 // ---------------------------------------------------------------------------- 134