/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. * * This program and the accompanying materials are made available under * the terms of the Common Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/cpl-v10.html * * $Id: CodeGen.java,v 1.1.1.1 2004/05/09 16:57:49 vlad_r Exp $ */ package com.vladium.jcd.compiler; import com.vladium.jcd.cls.ClassDef; import com.vladium.jcd.cls.constant.CONSTANT_Integer_info; import com.vladium.jcd.opcodes.IOpcodes; import com.vladium.util.ByteArrayOStream; // ---------------------------------------------------------------------------- /** * @author Vlad Roubtsov, (C) 2003 */ public abstract class CodeGen implements IOpcodes { // public: ................................................................ public static void load_local_object_var (final ByteArrayOStream out, final int index) { if (index <= 3) { out.write (_aload_0 + index); // aload_n } else if (index <= 0xFF) { out.write2 (_aload, index); // indexbyte } else { out.write4 (_wide, _aload, index >>> 8, // indexbyte1 index); // indexbyte2 } } public static void store_local_object_var (final ByteArrayOStream out, final int index) { if (index <= 3) { out.write (_astore_0 + index); // astore_n } else if (index <= 0xFF) { out.write2 (_astore, index); // indexbyte } else { out.write4 (_wide, _astore, index >>> 8, // indexbyte1 index); // indexbyte2 } // [stack -1] } public static void push_int_value (final ByteArrayOStream out, final ClassDef cls, final int value) { if ((-1 <= value) && (value <= 5)) { out.write (_iconst_0 + value); } else if ((-128 <= value) && (value <= 127)) { out.write2 (_bipush, value); // byte1 } else if ((-32768 <= value) && (value <= 32767)) { out.write3 (_sipush, value >>> 8, // byte1 value); // byte2 } else // we have to create an Integer constant in the constant pool: { // TODO: check if it's already there final int index = cls.getConstants ().add (new CONSTANT_Integer_info (value)); if (index <= 0xFF) { out.write2 (_ldc, index); // index } else // must use ldc_w { out.write3 (_ldc_w, index >>> 8, // indexbyte1 index); // indexbyte2 } } // [stack +1] } public static void push_constant_index (final ByteArrayOStream out, final int index) { if (index <= 0xFF) { out.write2 (_ldc, index); // indexbyte } else { out.write3 (_ldc_w, index >>> 8, // indexbyte1 index); // indexbyte2 } // [stack +1] } // protected: ............................................................. // package: ............................................................... // private: ............................................................... private CodeGen () {} // prevent subclassing } // end of class // ----------------------------------------------------------------------------