//===--- JavaConstantPool.h - Java constant pool definition ---------------===//
//
//                            The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef JNJVM_JAVA_CONSTANT_POOL_H
#define JNJVM_JAVA_CONSTANT_POOL_H

#include "vmkit/Allocator.h"
#include "types.h"

#include "UTF8.h"

namespace j3 {

class Class;
class CommonClass;
class JavaField;
class JavaMethod;
class JavaString;
class Reader;
class Signdef;
class Typedef;

/// JavaConstantPool - This class represents a Java constant pool, a place where
/// a Java class makes external references such as classes and methods and
/// stores constants such as integers or UTF8s.
class JavaConstantPool : public vmkit::PermanentObject {
public:
  
  /// classDef - The owning class of this constant pool.
  ///
  Class*  classDef;
  
  /// ctpSize - The number of entries in the constant pool.
  ///
  uint32 ctpSize;

  /// ctpType - The types of the constant pool entries.
  ///
  uint8*  ctpType;

  /// ctpDef - The values of the constant pool entries: may be constants or
  /// references to other entries.
  ///
  sint32* ctpDef;
  
  /// ctpRes - Objects resolved dynamically, e.g. UTF8s, classes, methods,
  /// fields, string pointers.
  ///
  void**  ctpRes;
  
  /// operator new - Redefine the operator to allocate the arrays of a
  /// constant pool inline.
  void* operator new(size_t sz, vmkit::BumpPtrAllocator& allocator,
                     uint32 ctpSize);

  /// CtpReaderClass - Reads a class entry.
  static uint32 CtpReaderClass(JavaConstantPool* ctp, Reader& reader,
                               uint32 index);
  
  /// CtpReaderInteger - Reads an integer entry.
  static uint32 CtpReaderInteger(JavaConstantPool* ctp, Reader& reader,
                                 uint32 index);
  
  /// CtpReaderFloat - Reads a float entry.
  static uint32 CtpReaderFloat(JavaConstantPool* ctp, Reader& reader,
                               uint32 index);
  
  /// CtpReaderClass - Reads an UTF8 entry.
  static uint32 CtpReaderUTF8(JavaConstantPool* ctp, Reader& reader,
                              uint32 index);
  
  /// CtpReaderNameAndType - Reads a name/signature entry.
  static uint32 CtpReaderNameAndType(JavaConstantPool* ctp, Reader& reader,
                                     uint32 index);
  
  /// CtpReaderFieldref - Reads a field entry.
  static uint32 CtpReaderFieldref(JavaConstantPool* ctp, Reader& reader,
                                  uint32 index);
  
  /// CtpReaderString - Reads a string entry.
  static uint32 CtpReaderString(JavaConstantPool* ctp, Reader& reader,
                                uint32 index);
  
  /// CtpReaderMethodref - Reads a method entry.
  static uint32 CtpReaderMethodref(JavaConstantPool* ctp, Reader& reader,
                                   uint32 index);
  
  /// CtpReaderInterfaceMethodref - Reads a method of an interface entry.
  static uint32 CtpReaderInterfaceMethodref(JavaConstantPool* ctp,
                                            Reader& reader,
                                            uint32 index);
   
  /// CtpReaderLong - Reads a long entry.
  static uint32 CtpReaderLong(JavaConstantPool* ctp, Reader& reader,
                              uint32 index);
  
  /// CtpReaderClass - Reads a double entry.
  static uint32 CtpReaderDouble(JavaConstantPool* ctp, Reader& reader,
                                uint32 index);

  static const uint32 ConstantUTF8;
  static const uint32 ConstantInteger;
  static const uint32 ConstantFloat;
  static const uint32 ConstantLong;
  static const uint32 ConstantDouble;
  static const uint32 ConstantClass;
  static const uint32 ConstantString;
  static const uint32 ConstantFieldref;
  static const uint32 ConstantMethodref;
  static const uint32 ConstantInterfaceMethodref;
  static const uint32 ConstantNameAndType;

  typedef uint32 (*ctpReader)(JavaConstantPool*, Reader&, uint32);

  /// funcsReader - Array of CtpReader* functions.
  ///
  static ctpReader funcsReader[16];

  /// isAStaticCall - Is the name/type at the given entry a reference to a
  /// static method?
  bool isAStaticCall(uint32 index) {
    return (ctpType[index] & 0x80) != 0;    
  }
  
  /// markAsStaticCall - Set the name/type entry as a reference to a static
  /// method.
  void markAsStaticCall(uint32 index) {
    ctpType[index] |= 0x80;
  }

  /// typeAt - Get the constant pool type of the given entry.
  ///
  uint8 typeAt(uint32 index) {
    return ctpType[index] & 0x7F;    
  }
  
  /// UTF8At - Get the UTF8 at the given entry.
  ///
  const UTF8* UTF8At(uint32 entry);
  
  /// UTF8At - Get the UTF8 referenced from this string entry.
  ///
  const UTF8* UTF8AtForString(uint32 entry) {
    return UTF8At(ctpDef[entry]);
  }

  /// FloatAt - Get the float at the given entry.
  ///
  float FloatAt(uint32 entry);

  /// IntegerAt - Get the int at the given entry.
  ///
  sint32 IntegerAt(uint32 entry);

  /// LongAt - Get the long at the given entry.
  ///
  sint64 LongAt(uint32 entry);

  /// DoubleAt - Get the double at the given entry.
  ///
  double DoubleAt(uint32 entry);

  /// isClassLoaded - Is the class at the given entry already loaded?
  ///
  CommonClass* isClassLoaded(uint32 index);

  /// resolveClassName - Get the name of the class referenced and returns
  /// it.
  ///
  const UTF8* resolveClassName(uint32 index);
 
  /// resolveNameAndType - Resolve the name/type at the given index,
  /// and returns the type.
  Typedef* resolveNameAndType(uint32 index);

  /// resolveNameAndSign - Resolve the name/sign at the given index,
  /// and returns the signature.
  Signdef* resolveNameAndSign(uint32 index);

  /// infoOfInterfaceOrVirtualMethod - Get the signature of the method
  /// referenced at the given entry.
  Signdef* infoOfInterfaceOrVirtualMethod(uint32 index, const UTF8*& name);

  /// infoOfStaticOrSpecialMethod - Get the JavaMethod of a non-virtual
  /// method. Return null if not loaded yet.
  ///
  JavaMethod* infoOfStaticOrSpecialMethod(uint32 index, uint32 access,
                                          Signdef* sign);
  
  
  /// nameOfStaticOrSpecialMethod - Get the name and the signature
  /// of a non-virtual method.
  ///
  void nameOfStaticOrSpecialMethod(uint32 index, const UTF8*& cl, 
                                   const UTF8*& name, Signdef*& sign);
  
  /// getClassIndexFromMethod - Get the entry of the class that owns
  /// the referenced method.
  ///
  uint32 getClassIndexFromMethod(uint32 index);

  /// getMethodClassIfLoaded - Returns the class of the given method if
  /// loaded, null if not.
  CommonClass* getMethodClassIfLoaded(uint32 index);
 
  /// infoOfField - Get the Typedef representation of the field referenced
  /// at the given entry. This does not involve any class loading.
  ///
  Typedef* infoOfField(uint32 index);
  
  /// infoOfMethod - Get the signature of the method referenced at the given
  /// entry and try to find the method. This does not involve any class
  /// loading.
  ///
  void infoOfMethod(uint32 index, uint32 access, CommonClass*& cl,
                    JavaMethod*& meth); 
 
  /// lookupField - Lookup the field at the given entry.
  ///
  JavaField* lookupField(uint32 index, bool stat);
  
  /// resolveString - Get the string referenced at the given
  /// index from the UTF8.
  JavaString* resolveString(const UTF8* utf8, uint16 index);
  
  /// resolveMethod - Resolve the class and the signature of the method. May
  /// perform class loading. This function is called just in time, ie when
  /// the method call is actually made and not yet resolved.
  ///
  void resolveMethod(uint32 index, CommonClass*& cl,
                     const UTF8*& utf8, Signdef*& sign);
  
  /// resolveField - Resolve the class and signature of the field. May
  /// perform class loading. This function is called just in time, ie when
  /// the field is accessed and not yet resolved.
  ///
  void resolveField(uint32 index, CommonClass*& cl, const UTF8*& utf8,
                    Typedef*& sign);
  
  /// loadClass - Loads the class and returns it. This is called just in time, 
  /// ie when the class will be used and not yet resolved, and also for
  /// loading exceptions when JITting catch clauses.
  ///
  CommonClass* loadClass(uint32 index, bool resolve = true);

  /// JavaConstantPool - Reads the bytecode of the class to get
  /// the initial types and constants definitions.
  ///
  JavaConstantPool(Class*, Reader& reader, uint32 ctpSize);

  /// ~JavaConstantPool - Delete the constant pool.
  ///
  ~JavaConstantPool() {}
};

} // end namespace j3

#endif
