blob: c561f4e858723d0df2be8e76920b70c62d14041c [file] [log] [blame]
/* 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
// ----------------------------------------------------------------------------