blob: 17c555035f0435866b9f3efc2c97235f3af51d2b [file] [log] [blame]
//===--- VirtualTables.cpp - Virtual methods for JnJVM objects ------------===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mvm/Object.h"
#include "JavaArray.h"
#include "JavaCache.h"
#include "JavaClass.h"
#include "JavaConstantPool.h"
#include "JavaIsolate.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaThread.h"
#include "JavaTypes.h"
#include "Jnjvm.h"
#include "LockedMap.h"
#include "Reader.h"
#ifdef SERVICE_VM
#include "ServiceDomain.h"
#endif
#include "Zip.h"
using namespace jnjvm;
#define INIT(X) VirtualTable* X::VT = 0
INIT(JavaArray);
INIT(ArrayUInt8);
INIT(ArraySInt8);
INIT(ArrayUInt16);
INIT(ArraySInt16);
INIT(ArrayUInt32);
INIT(ArraySInt32);
INIT(ArrayLong);
INIT(ArrayFloat);
INIT(ArrayDouble);
INIT(ArrayObject);
INIT(UTF8);
INIT(CommonClass);
INIT(Class);
INIT(ClassArray);
INIT(JavaCond);
INIT(LockObj);
INIT(JavaObject);
INIT(JavaThread);
INIT(Typedef);
INIT(Signdef);
INIT(ThreadSystem);
INIT(Jnjvm);
INIT(Reader);
INIT(ZipFile);
INIT(ZipArchive);
INIT(UTF8Map);
INIT(ClassMap);
INIT(ZipFileMap);
INIT(StringMap);
INIT(TypeMap);
INIT(StaticInstanceMap);
INIT(JavaIsolate);
INIT(JavaString);
INIT(DelegateeMap);
#ifdef SERVICE_VM
INIT(ServiceDomain);
#endif
#undef INIT
void JavaArray::TRACER {
classOf->MARK_AND_TRACE;
lockObj->MARK_AND_TRACE;
}
void ArrayObject::TRACER {
classOf->MARK_AND_TRACE;
lockObj->MARK_AND_TRACE;
for (sint32 i = 0; i < size; i++) {
elements[i]->MARK_AND_TRACE;
}
}
#define ARRAYTRACER(name) \
void name::TRACER { \
lockObj->MARK_AND_TRACE; \
}
ARRAYTRACER(ArrayUInt8);
ARRAYTRACER(ArraySInt8);
ARRAYTRACER(ArrayUInt16);
ARRAYTRACER(ArraySInt16);
ARRAYTRACER(ArrayUInt32);
ARRAYTRACER(ArraySInt32);
ARRAYTRACER(ArrayLong);
ARRAYTRACER(ArrayFloat);
ARRAYTRACER(ArrayDouble);
#undef ARRAYTRACER
#define TRACE_VECTOR(type,alloc,name) { \
for (std::vector<type, alloc<type> >::iterator i = name.begin(), \
e = name.end(); i!= e; ++i) { \
(*i)->MARK_AND_TRACE; }}
void CommonClass::TRACER {
classLoader->MARK_AND_TRACE;
#ifndef MULTIPLE_VM
delegatee->MARK_AND_TRACE;
#endif
for (method_iterator i = staticMethods.begin(), e = staticMethods.end();
i!= e; ++i) {
mvm::Code* c = i->second->code;
if (c) c->MARK_AND_TRACE;
}
for (method_iterator i = virtualMethods.begin(), e = virtualMethods.end();
i!= e; ++i) {
mvm::Code* c = i->second->code;
if (c) c->MARK_AND_TRACE;
}
}
void Class::TRACER {
CommonClass::PARENT_TRACER;
bytes->MARK_AND_TRACE;
#ifndef MULTIPLE_VM
_staticInstance->MARK_AND_TRACE;
#endif
codeStaticTracer->MARK_AND_TRACE;
codeVirtualTracer->MARK_AND_TRACE;
}
void ClassArray::TRACER {
CommonClass::PARENT_TRACER;
}
void JavaCond::TRACER {
// FIXME: do I need this?
TRACE_VECTOR(JavaThread*, std::allocator, threads);
}
void LockObj::TRACER {
varcond->MARK_AND_TRACE;
}
void JavaObject::TRACER {
classOf->MARK_AND_TRACE;
lockObj->MARK_AND_TRACE;
}
#ifdef MULTIPLE_GC
extern "C" void JavaObjectTracer(JavaObject* obj, Collector* GC) {
#else
extern "C" void JavaObjectTracer(JavaObject* obj) {
#endif
obj->classOf->MARK_AND_TRACE;
obj->lockObj->MARK_AND_TRACE;
}
void JavaThread::TRACER {
javaThread->MARK_AND_TRACE;
// FIXME: do I need this?
isolate->MARK_AND_TRACE;
pendingException->MARK_AND_TRACE;
}
void Typedef::TRACER {
}
void Signdef::TRACER {
_staticCallBuf->MARK_AND_TRACE;
_virtualCallBuf->MARK_AND_TRACE;
_staticCallAP->MARK_AND_TRACE;
_virtualCallAP->MARK_AND_TRACE;
}
void ThreadSystem::TRACER {
}
void Jnjvm::TRACER {
appClassLoader->MARK_AND_TRACE;
hashUTF8->MARK_AND_TRACE;
hashStr->MARK_AND_TRACE;
bootstrapClasses->MARK_AND_TRACE;
javaTypes->MARK_AND_TRACE;
TRACE_VECTOR(JavaObject*, gc_allocator, globalRefs);
#ifdef MULTIPLE_VM
statics->MARK_AND_TRACE;
delegatees->MARK_AND_TRACE;
#endif
}
void Reader::TRACER {
bytes->MARK_AND_TRACE;
}
void ZipFile::TRACER {
}
void ZipArchive::TRACER {
reader->MARK_AND_TRACE;
filetable->MARK_AND_TRACE;
}
void JavaIsolate::TRACER {
Jnjvm::PARENT_TRACER;
threadSystem->MARK_AND_TRACE;
bootstrapThread->MARK_AND_TRACE;
}
void JavaString::TRACER {
}
void UTF8Map::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->MARK_AND_TRACE;
}
}
void ClassMap::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->MARK_AND_TRACE;
}
}
void ZipFileMap::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->MARK_AND_TRACE;
}
}
void StringMap::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->MARK_AND_TRACE;
}
}
void TypeMap::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->MARK_AND_TRACE;
}
}
void StaticInstanceMap::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->second->MARK_AND_TRACE;
}
}
void DelegateeMap::TRACER {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
i->second->MARK_AND_TRACE;
}
}
#ifdef SERVICE_VM
void ServiceDomain::TRACER {
JavaIsolate::PARENT_TRACER;
classes->MARK_AND_TRACE;
}
#endif