blob: 13d1cfc7509130c2fb659a2655a40b15df3b2c68 [file] [log] [blame]
//===--ReferenceQueue.cpp - Implementation of soft/weak/phantom references-===//
//
// The VMKit project
//
// This file is distributed under the University of Pierre et Marie Curie
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "ClasspathReflect.h"
#include "JavaClass.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "JavaReferenceQueue.h"
using namespace j3;
bool enqueueReference(gc* _obj) {
JavaObject* obj = (JavaObject*)_obj;
llvm_gcroot(obj, 0);
llvm_gcroot(_obj, 0);
Jnjvm* vm = JavaThread::get()->getJVM();
JavaMethod* meth = vm->upcalls->EnqueueReference;
UserClass* cl = JavaObject::getClass(obj)->asClass();
return (bool)meth->invokeIntSpecialBuf(vm, cl, obj, 0);
}
void Jnjvm::invokeEnqueueReference(gc* res) {
llvm_gcroot(res, 0);
TRY {
enqueueReference(res);
} IGNORE;
vmkit::Thread::get()->clearException();
}
gc** Jnjvm::getObjectReferentPtr(gc* _obj) {
JavaObjectReference* obj = (JavaObjectReference*)_obj;
llvm_gcroot(obj, 0);
llvm_gcroot(_obj, 0);
return (gc**)JavaObjectReference::getReferentPtr(obj);
}
void Jnjvm::setObjectReferent(gc* _obj, gc* val) {
JavaObjectReference* obj = (JavaObjectReference*)_obj;
JavaObject *_val = (JavaObject*)val;
llvm_gcroot(obj, 0);
llvm_gcroot(_obj, 0);
llvm_gcroot(val, 0);
llvm_gcroot(_val, 0);
JavaObjectReference::setReferent(obj, _val);
}
void Jnjvm::clearObjectReferent(gc* _obj) {
JavaObjectReference* obj = (JavaObjectReference*)_obj;
llvm_gcroot(obj, 0);
llvm_gcroot(_obj, 0);
JavaObjectReference::setReferent(obj, NULL);
}
typedef void (*destructor_t)(void*);
void invokeFinalizer(gc* _obj) {
JavaObject* obj = (JavaObject*)_obj;
llvm_gcroot(obj, 0);
llvm_gcroot(_obj, 0);
Jnjvm* vm = JavaThread::get()->getJVM();
JavaMethod* meth = vm->upcalls->FinalizeObject;
UserClass* cl = JavaObject::getClass(obj)->asClass();
meth->invokeIntVirtualBuf(vm, cl, obj, 0);
}
void invokeFinalize(gc* res) {
llvm_gcroot(res, 0);
TRY {
invokeFinalizer(res);
} IGNORE;
vmkit::Thread::get()->clearException();
}
void Jnjvm::finalizeObject(gc* object) {
JavaObject* res = (JavaObject*)object;
llvm_gcroot(object, 0);
llvm_gcroot(res, 0);
JavaVirtualTable* VT = res->getVirtualTable();
if (VT->operatorDelete) {
destructor_t dest = (destructor_t)VT->destructor;
dest(res);
} else {
invokeFinalize(res);
}
}