blob: 37bafd10564df1088055541bb5d0b0478f6c8288 [file] [log] [blame]
//===------ ClasspathVMObject.cpp - GNU classpath java/lang/VMObject ------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "types.h"
#include "Classpath.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaThread.h"
#include "Jnjvm.h"
using namespace j3;
extern "C" {
JNIEXPORT JavaObject* JNICALL Java_java_lang_VMObject_clone(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* src) {
JavaObject* res = 0;
llvm_gcroot(res, 0);
llvm_gcroot(src, 0);
BEGIN_NATIVE_EXCEPTION(0)
UserCommonClass* cl = src->getClass();
size_t size = 0;
if (cl->isArray()) {
UserClassArray* array = cl->asArrayClass();
UserCommonClass* base = array->baseClass();
uint32 logSize = base->isPrimitive() ?
base->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2);
size = sizeof(JavaObject) + sizeof(ssize_t) +
(((JavaArray*)src)->size << logSize);
} else {
assert(cl->isClass() && "Not a class!");
size = cl->asClass()->getVirtualSize();
}
res = (JavaObject*)gc::operator new(size, src->getVirtualTable());
memcpy((void*)((uintptr_t)res + 2 * sizeof(void*)),
(void*)((uintptr_t)src + 2 * sizeof(void*)),
size - 2 * sizeof(void*));
END_NATIVE_EXCEPTION
return res;
}
JNIEXPORT JavaObject* JNICALL Java_java_lang_VMObject_getClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj) {
JavaObject* res = 0;
llvm_gcroot(res, 0);
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
res = obj->getClass()->getClassDelegatee(vm);
END_NATIVE_EXCEPTION
return res;
}
JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj) {
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
obj->notifyAll();
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_lang_VMObject_wait(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj, jlong ms, jint ns) {
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
uint32 sec = (uint32) (ms / 1000);
uint32 usec = (ns / 1000) + 1000 * (ms % 1000);
if (ns && !usec) usec = 1;
if (sec || usec) {
struct timeval t;
t.tv_sec = sec;
t.tv_usec = usec;
obj->timedWait(t);
} else {
obj->wait();
}
END_NATIVE_EXCEPTION
}
JNIEXPORT void JNICALL Java_java_lang_VMObject_notify(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* obj) {
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
obj->notify();
END_NATIVE_EXCEPTION
}
}