blob: 6dc8d7ae0bf9f1dd03047cbd48e3e0ff51451599 [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 "JavaJIT.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaThread.h"
#include "JavaTypes.h"
#include "Jnjvm.h"
#include "LockedMap.h"
#include "Reader.h"
#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(Attribut);
INIT(CommonClass);
INIT(Class);
INIT(ClassArray);
INIT(JavaMethod);
INIT(JavaField);
INIT(JavaCtpInfo);
INIT(Exception);
INIT(JavaJIT);
INIT(JavaCond);
INIT(LockObj);
INIT(JavaObject);
INIT(JavaThread);
INIT(AssessorDesc);
INIT(Typedef);
INIT(Signdef);
INIT(ThreadSystem);
INIT(Jnjvm);
INIT(Reader);
INIT(ZipFile);
INIT(ZipArchive);
INIT(UTF8Map);
INIT(ClassMap);
INIT(FieldMap);
INIT(MethodMap);
INIT(ZipFileMap);
INIT(StringMap);
INIT(TypeMap);
INIT(StaticInstanceMap);
INIT(FunctionMap);
INIT(FunctionDefMap);
INIT(JavaIsolate);
INIT(JavaString);
INIT(Opinfo);
INIT(CacheNode);
INIT(Enveloppe);
INIT(DelegateeMap);
#undef INIT
void JavaArray::tracer(size_t sz) {
JavaObject::tracer(sz);
}
void ArrayObject::tracer(size_t sz) {
JavaObject::tracer(sz);
for (sint32 i = 0; i < size; i++) {
elements[i]->markAndTrace();
}
}
#define ARRAYTRACER(name) \
void name::tracer(size_t sz) { \
JavaObject::tracer(sz); \
}
ARRAYTRACER(ArrayUInt8);
ARRAYTRACER(ArraySInt8);
ARRAYTRACER(ArrayUInt16);
ARRAYTRACER(ArraySInt16);
ARRAYTRACER(ArrayUInt32);
ARRAYTRACER(ArraySInt32);
ARRAYTRACER(ArrayLong);
ARRAYTRACER(ArrayFloat);
ARRAYTRACER(ArrayDouble);
#undef ARRAYTRACER
void Attribut::tracer(size_t sz) {
name->markAndTrace();
}
#define TRACE_VECTOR(type,name) { \
for (std::vector<type>::iterator i = name.begin(), e = name.end(); \
i!= e; ++i) { \
(*i)->markAndTrace(); }}
void CommonClass::tracer(size_t sz) {
name->markAndTrace();
super->markAndTrace();
superUTF8->markAndTrace();
TRACE_VECTOR(const UTF8*, interfacesUTF8);
TRACE_VECTOR(Class*, interfaces);
//lockVar->markAndTrace();
//condVar->markAndTrace();
TRACE_VECTOR(JavaMethod*, virtualMethods);
TRACE_VECTOR(JavaMethod*, staticMethods);
TRACE_VECTOR(JavaField*, virtualFields);
TRACE_VECTOR(JavaField*, staticFields);
classLoader->markAndTrace();
#ifdef SINGLE_VM
delegatee->markAndTrace();
#endif
TRACE_VECTOR(CommonClass*, display);
isolate->markAndTrace();
}
void Class::tracer(size_t sz) {
CommonClass::tracer(sz);
bytes->markAndTrace();
_staticInstance->markAndTrace();
virtualInstance->markAndTrace();
ctpInfo->markAndTrace();
TRACE_VECTOR(Attribut*, attributs);
TRACE_VECTOR(Class*, innerClasses);
outerClass->markAndTrace();
codeStaticTracer->markAndTrace();
codeVirtualTracer->markAndTrace();
}
void ClassArray::tracer(size_t sz) {
CommonClass::tracer(sz);
_baseClass->markAndTrace();
_funcs->markAndTrace();
}
void JavaMethod::tracer(size_t sz) {
signature->markAndTrace();
TRACE_VECTOR(Attribut*, attributs);
TRACE_VECTOR(Enveloppe*, caches);
classDef->markAndTrace();
name->markAndTrace();
type->markAndTrace();
code->markAndTrace();
}
void JavaField::tracer(size_t sz) {
name->markAndTrace();
signature->markAndTrace();
type->markAndTrace();
TRACE_VECTOR(Attribut*, attributs);
classDef->markAndTrace();
}
void JavaCtpInfo::tracer(size_t sz) {
classDef->markAndTrace();
// Everything is hashed in the constant pool,
// do not trace them here
}
void Exception::tracer(size_t sz) {
catchClass->markAndTrace();
}
void Opinfo::tracer(size_t sz) {
}
void JavaJIT::tracer(size_t sz) {
compilingClass->markAndTrace();
compilingMethod->markAndTrace();
TRACE_VECTOR(Exception*, exceptions);
// Do not trace opinfos: they are allocated in stack
}
void JavaCond::tracer(size_t sz) {
TRACE_VECTOR(JavaThread*, threads);
}
void LockObj::tracer(size_t sz) {
//lock->markAndTrace();
varcond->markAndTrace();
}
void JavaObject::tracer(size_t sz) {
classOf->markAndTrace();
lockObj->markAndTrace();
}
void JavaThread::tracer(size_t sz) {
javaThread->markAndTrace();
isolate->markAndTrace();
//lock->markAndTrace();
//varcond->markAndTrace();
pendingException->markAndTrace();
}
void AssessorDesc::tracer(size_t sz) {
classType->markAndTrace();
}
void Typedef::tracer(size_t sz) {
keyName->markAndTrace();
pseudoAssocClassName->markAndTrace();
funcs->markAndTrace();
isolate->markAndTrace();
}
void Signdef::tracer(size_t sz) {
Typedef::tracer(sz);
TRACE_VECTOR(Typedef*, args);
ret->markAndTrace();
_staticCallBuf->markAndTrace();
_virtualCallBuf->markAndTrace();
_staticCallAP->markAndTrace();
_virtualCallAP->markAndTrace();
}
void ThreadSystem::tracer(size_t sz) {
//nonDaemonLock->markAndTrace();
//nonDaemonVar->markAndTrace();
}
void Jnjvm::tracer(size_t sz) {
appClassLoader->markAndTrace();
hashUTF8->markAndTrace();
hashStr->markAndTrace();
bootstrapClasses->markAndTrace();
loadedMethods->markAndTrace();
loadedFields->markAndTrace();
javaTypes->markAndTrace();
TRACE_VECTOR(JavaObject*, globalRefs);
//globalRefsLock->markAndTrace();
functions->markAndTrace();
#ifndef SINGLE_VM
statics->markAndTrace();
delegatees->markAndTrace();
#endif
//protectModule->markAndTrace();
}
void Reader::tracer(size_t sz) {
bytes->markAndTrace();
}
void ZipFile::tracer(size_t sz) {
}
void ZipArchive::tracer(size_t sz) {
reader->markAndTrace();
filetable->markAndTrace();
}
void JavaIsolate::tracer(size_t sz) {
Jnjvm::tracer(sz);
threadSystem->markAndTrace();
bootstrapThread->markAndTrace();
}
void JavaString::tracer(size_t sz) {
}
void CacheNode::tracer(size_t sz) {
((mvm::Object*)methPtr)->markAndTrace();
lastCible->markAndTrace();
next->markAndTrace();
enveloppe->markAndTrace();
}
void Enveloppe::tracer(size_t sz) {
firstCache->markAndTrace();
ctpInfo->markAndTrace();
//cacheLock->markAndTrace();
}