| //===----------------- JavaArray.h - Java arrays --------------------------===// |
| // |
| // JnJVM |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the internal representation of Java arrays. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef JNJVM_JAVA_ARRAY_H |
| #define JNJVM_JAVA_ARRAY_H |
| |
| #include "mvm/PrintBuffer.h" |
| |
| #include "types.h" |
| |
| #include "JavaObject.h" |
| |
| namespace jnjvm { |
| |
| class ClassArray; |
| class CommonClass; |
| class JavaAllocator; |
| class JavaObject; |
| class Jnjvm; |
| |
| /// TJavaArray - Template class to be instantiated by real arrays. All arrays |
| /// have a constant size and an array of element. When JnJVM allocates an |
| /// instantiation of this class, it allocates with the actual size of this |
| /// array. Hence instantiation of TJavaArrays have a layout of |
| /// {JavaObject, size, [0 * T]}. |
| template <class T> |
| class TJavaArray : public JavaObject { |
| public: |
| /// size - The (constant) size of the array. |
| sint32 size; |
| |
| /// elements - Elements of this array. The size here is different than the |
| /// actual size of the Java array. This is to facilitate Java array accesses |
| /// in JnJVM code. The size should be set to zero, but this is invalid C99. |
| T elements[1]; |
| }; |
| |
| /// JavaArray - This class is just a placeholder for constants and for the |
| /// virtual table of arrays of primitive types (e.g. double, int). |
| class JavaArray : public TJavaArray<void*> { |
| public: |
| |
| /// VT - The virtual table of Java arrays of primitive types (e.g. int, |
| /// double). |
| static VirtualTable *VT; |
| |
| /// MaxArraySize - The maximum size a Java array can have. Allocating an |
| /// array with a bigger size than MaxArraySize raises an out of memory |
| /// error. |
| static const sint32 MaxArraySize; |
| |
| /// JVM representation of Java arrays of primitive types. |
| static const unsigned int T_BOOLEAN; |
| static const unsigned int T_CHAR; |
| static const unsigned int T_FLOAT; |
| static const unsigned int T_DOUBLE; |
| static const unsigned int T_BYTE; |
| static const unsigned int T_SHORT; |
| static const unsigned int T_INT; |
| static const unsigned int T_LONG; |
| |
| /// tracer - The trace method of Java arrays of primitive types. Since their |
| /// class lives throughout the lifetime of the application, there is no need |
| /// to trace them. Therefore this trace function does nothing. |
| virtual void TRACER; |
| |
| }; |
| |
| /// Instantiation of the TJavaArray class for Java arrays of primitive types. |
| #define ARRAYCLASS(name, elmt) \ |
| class name : public TJavaArray<elmt> { \ |
| } |
| |
| ARRAYCLASS(ArrayUInt8, uint8); |
| ARRAYCLASS(ArraySInt8, sint8); |
| ARRAYCLASS(ArrayUInt16, uint16); |
| ARRAYCLASS(ArraySInt16, sint16); |
| ARRAYCLASS(ArrayUInt32, uint32); |
| ARRAYCLASS(ArraySInt32, sint32); |
| ARRAYCLASS(ArrayLong, sint64); |
| ARRAYCLASS(ArrayFloat, float); |
| ARRAYCLASS(ArrayDouble, double); |
| |
| #undef ARRAYCLASS |
| |
| /// ArrayObject - Instantiation of the TJavaArray class for arrays of objects. |
| /// Arrays of objects are different than arrays of primitive types because |
| /// they have to trace all objects in the array. |
| class ArrayObject : public TJavaArray<JavaObject*> { |
| public: |
| /// VT - The virtual table of arrays of objects. |
| static VirtualTable *VT; |
| |
| /// tracer - The tracer method of Java arrays of objects. This method will |
| /// trace all objects in the array. |
| virtual void TRACER; |
| }; |
| |
| |
| /// UTF8 - The UTF8 class is basically the ArrayUInt16 class (arrays of elements |
| /// of type uint16) with helper functions for manipulating UTF8. Each JVM |
| /// instance hashes UTF8. UTF8 are not allocated by the application's garbage |
| /// collector, but resides in permanent memory (e.g malloc). |
| class UTF8 : public ArrayUInt16 { |
| public: |
| |
| /// acons - Allocates an UTF8 in permanent memory. The class argument must be |
| /// JavaArray::ofChar. |
| static const UTF8* acons(sint32 n, UserClassArray* cl, |
| JavaAllocator* allocator); |
| |
| /// internalToJava - Creates a copy of the UTF8 at its given offset and size |
| /// woth all its '.' replaced by '/'. The JVM bytecode reference classes in |
| /// packages with the '.' as the separating character. The JVM language uses |
| /// the '/' character. |
| const UTF8* internalToJava(UTF8Map* map, unsigned int start, |
| unsigned int len) const; |
| |
| /// javaToInternal - Replaces all '/' into '.'. |
| const UTF8* javaToInternal(UTF8Map* map, unsigned int start, |
| unsigned int len) const; |
| |
| /// checkedJavaToInternal - Replaces all '/' into '.'. Returns null if the |
| /// UTF8 contains a '/', as Java does not allow things like |
| /// Class.forName("java/lang/Object") |
| const UTF8* checkedJavaToInternal(UTF8Map* map, unsigned int start, |
| unsigned int len) const; |
| |
| /// UTF8ToAsciiz - Allocates a C string with the contents of this UTF8. |
| char* UTF8ToAsciiz() const; |
| |
| char* printString() const { |
| return UTF8ToAsciiz(); |
| } |
| |
| /// extract - Creates an UTF8 by extracting the contents at the given size |
| /// of this. |
| const UTF8* extract(UTF8Map* map, uint32 start, uint32 len) const; |
| |
| /// equals - Returns whether two UTF8s are equals. When the JnJVM executes |
| /// in single mode, equality is just a pointer comparison. When executing |
| /// in multiple mode, we compare the contents of the UTF8s. |
| #ifndef MULTIPLE_VM |
| bool equals(const UTF8* other) const { |
| return this == other; |
| } |
| |
| bool lessThan(const UTF8* other) const { |
| return this < other; |
| } |
| #else |
| bool equals(const UTF8* other) const { |
| if (size != other->size) return false; |
| else return !memcmp(elements, other->elements, size * sizeof(uint16)); |
| } |
| |
| bool lessThan(const UTF8* other) const { |
| if (size < other->size) return true; |
| else if (size > other->size) return false; |
| else return memcmp((const char*)elements, (const char*)other->elements, |
| size * sizeof(uint16)) < 0; |
| } |
| #endif |
| |
| /// print - Prints the UTF8 for debugging purposes. |
| virtual void print(mvm::PrintBuffer* buf) const; |
| |
| /// operator new - Redefines the new operator of this class to allocate |
| /// its objects in permanent memory, not with the garbage collector. |
| void* operator new(size_t sz, sint32 size); |
| |
| /// operator delete - Redefines the delete operator to remove the object |
| /// from permanent memory. |
| void operator delete(void* obj); |
| }; |
| |
| } // end namespace jnjvm |
| |
| #endif |