blob: 65a5f595860e3a03925984b9645a27fad5adf25f [file] [log] [blame]
//===--- JavaString.h - Internal correspondance with Java Strings ---------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef JNJVM_JAVA_STRING_H
#define JNJVM_JAVA_STRING_H
#include "types.h"
#include "JavaObject.h"
#include "UTF8.h"
namespace j3 {
class ArrayUInt16;
class Jnjvm;
class JavaString : public JavaObject {
private:
const ArrayUInt16* value;
public:
#ifndef USE_OPENJDK
// Classpath fields
sint32 count;
sint32 cachedHashCode;
sint32 offset;
#else
// OpenJDK fields
sint32 offset;
sint32 count;
sint32 cachedHashCode;
#endif
static void setValue(JavaString* self, const ArrayUInt16* array) {
llvm_gcroot(self, 0);
llvm_gcroot(array, 0);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)self, (gc**)&(self->value), (gc*)array);
}
static const ArrayUInt16* getValue(const JavaString* self) {
llvm_gcroot(self, 0);
return self->value;
}
static JavaString* create(const ArrayUInt16 * array, Jnjvm* vm);
/// internalToJava - Creates a copy of the UTF8 at its given offset and size
/// with all its '.' replaced by '/'. The JVM bytecode reference classes in
/// packages with the '.' as the separating character. The JVM language uses
/// the '/' character. Returns a Java String.
///
static JavaString* internalToJava(const UTF8* utf8, Jnjvm* vm);
static char* strToAsciiz(const JavaString* self);
static char* strToAsciiz(const JavaString* self, vmkit::ThreadAllocator* allocator);
static const ArrayUInt16* strToArray(JavaString* self, Jnjvm* vm);
/// javaToInternal - Replaces all '/' into '.'.
static const UTF8* javaToInternal(const JavaString* self, UTF8Map* map);
};
} // end namespace j3
#endif