// java-cpool.h - Constant pool parsing header.  -*- c++ -*-

/* Copyright (C) 1999, 2000  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

#ifndef __JAVA_CPOOL_H__
#define __JAVA_CPOOL_H__

#include <gcj/javaprims.h>

// we rename these, to avoid polluting the name space
#define JV_CONSTANT_Undefined (0L)
#define JV_CONSTANT_Utf8 (1L)
#define JV_CONSTANT_Unicode (2L)
#define JV_CONSTANT_Integer (3L)
#define JV_CONSTANT_Float (4L)
#define JV_CONSTANT_Long (5L)
#define JV_CONSTANT_Double (6L)
#define JV_CONSTANT_Class (7L)
#define JV_CONSTANT_String (8L)
#define JV_CONSTANT_Fieldref (9L)
#define JV_CONSTANT_Methodref (10L)
#define JV_CONSTANT_InterfaceMethodref (11L)
#define JV_CONSTANT_NameAndType (12L)
#define JV_CONSTANT_ResolvedFlag (16L)
#define JV_CONSTANT_ResolvedString (16L | 8L)
#define JV_CONSTANT_ResolvedClass  (16L | 7L)

extern inline void 
_Jv_storeIndexes (_Jv_word *data,
		 _Jv_ushort index0,
		 _Jv_ushort index1)
{
  data->i = (((jint)index0) << 16) | (jint) index1;
}

extern inline void 
_Jv_loadIndexes (const _Jv_word *data,
		 _Jv_ushort& index0,
		 _Jv_ushort& index1)
{
  jint udata = data->i;
      
  _Jv_uint uindex0 = ((udata >> 16) & 0xffff);
  _Jv_uint uindex1 = udata & 0xffff;
      
  index0 = uindex0;
  index1 = uindex1;
}

extern inline void
_Jv_storeFloat (_Jv_word *data, jfloat f)
{
  data->f = f;
}

extern inline jfloat
_Jv_loadFloat (_Jv_word *data)
{
  return data->f;
}

extern inline void
_Jv_storeInt (_Jv_word *data, jint i)
{
  data->i = i;
}

extern inline jint
_Jv_loadInt (_Jv_word *data)
{
  return data->i;
}

extern inline void
_Jv_storeLong (_Jv_word *data, jlong l)
{
#if SIZEOF_VOID_P == 8
  data[0].l = l;
#else
  _Jv_word2 tmp;
  tmp.l = l;
  data[0].ia[0] = tmp.ia[0];
  data[1].ia[0] = tmp.ia[1];
#endif
}

extern inline jlong
_Jv_loadLong (_Jv_word *data)
{
#if SIZEOF_VOID_P == 8
  return data -> l;
#else
  _Jv_word2 tmp;
  tmp.ia[0] = data[0].ia[0];
  tmp.ia[1] = data[1].ia[0];
  return tmp.l;
#endif
}

extern inline void
_Jv_storeDouble (_Jv_word *data, jdouble d)
{
#if SIZEOF_VOID_P == 8
  data[0].d = d;
#else
  _Jv_word2 tmp;
  tmp.d = d;
  data[0].ia[0] = tmp.ia[0];
  data[1].ia[0] = tmp.ia[1];
#endif
}

extern inline jdouble
_Jv_loadDouble (_Jv_word *data)
{
#if SIZEOF_VOID_P == 8
  return data -> d;
#else
  _Jv_word2 tmp;
  tmp.ia[0] = data[0].ia[0];
  tmp.ia[1] = data[1].ia[0];
  return tmp.d;
#endif
}


#endif /* __JAVA_CPOOL_H__ */
