blob: ae95c1aa8ab242ee4a3f574138be0195e895b1ce [file] [log] [blame]
//===-- ClasspathReflect.h - Internal representation of core system classes --//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef JNJVM_CLASSPATH_REFLECT_H
#define JNJVM_CLASSPATH_REFLECT_H
#include "VmkitGC.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaThread.h"
#include "JavaString.h"
#include "Jnjvm.h"
#include "JavaUpcalls.h"
extern "C" j3::JavaObject* internalFillInStackTrace(j3::JavaObject*);
namespace j3 {
/*
* TODO Implement this class for openJDK annotations
*/
class JavaObjectVMThread : public JavaObject {
private:
JavaThread* vmdata;
};
class JavaObjectClass : public JavaObject {
private:
JavaObject* cachedConstructor;
JavaObject* newInstanceCallerCache;
JavaString* name;
JavaObject* declaredFields;
JavaObject* publicFields;
JavaObject* declaredMethods;
JavaObject* publicMethods;
JavaObject* declaredConstructors;
JavaObject* publicConstructors;
JavaObject* declaredPublicFields;
JavaObject* declaredPublicMethods;
uint32_t classRedefinedCount;
uint32_t lastRedefinedCount;
JavaObject* genericInfo;
JavaObject* enumConstants;
JavaObject* enumConstantDictionary;
JavaObject* annotations;
JavaObject* declaredAnnotations;
JavaObject* annotationType;
// Extra fields added by VM
UserCommonClass * internalClass;
JavaObject * pd;
public:
/*
* TODO implement annotations in openJDK
*/
static bool isAnonymousClass(JavaObjectClass* Cl);
static JavaObject* getEnclosingClass(JavaObjectClass* Cl);
/*****************************************/
static UserCommonClass* getClass(JavaObjectClass* cl) {
llvm_gcroot(cl, 0);
return cl->internalClass;
}
static void setClass(JavaObjectClass* cl, UserCommonClass* vmdata) {
llvm_gcroot(cl, 0);
cl->internalClass = vmdata;
}
static void setProtectionDomain(JavaObjectClass* cl, JavaObject* pd) {
llvm_gcroot(cl, 0);
llvm_gcroot(pd, 0);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)cl, (gc**)&(cl->pd), (gc*)pd);
}
static JavaObject* getProtectionDomain(JavaObjectClass* cl) {
llvm_gcroot(cl, 0);
return cl->pd;
}
static void staticTracer(JavaObjectClass* obj, word_t closure) {
llvm_gcroot(obj, 0);
vmkit::Collector::markAndTrace(obj, &obj->cachedConstructor, closure);
vmkit::Collector::markAndTrace(obj, &obj->newInstanceCallerCache, closure);
vmkit::Collector::markAndTrace(obj, &obj->name, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredFields, closure);
vmkit::Collector::markAndTrace(obj, &obj->publicFields, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredMethods, closure);
vmkit::Collector::markAndTrace(obj, &obj->publicMethods, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredConstructors, closure);
vmkit::Collector::markAndTrace(obj, &obj->publicConstructors, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredPublicFields, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredPublicMethods, closure);
vmkit::Collector::markAndTrace(obj, &obj->genericInfo, closure);
vmkit::Collector::markAndTrace(obj, &obj->enumConstants, closure);
vmkit::Collector::markAndTrace(obj, &obj->enumConstantDictionary, closure);
vmkit::Collector::markAndTrace(obj, &obj->annotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredAnnotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->annotationType, closure);
UserCommonClass * cl = getClass(obj);
if (cl) {
JavaObject** Obj = cl->classLoader->getJavaClassLoaderPtr();
if (*Obj) vmkit::Collector::markAndTraceRoot(obj, Obj, closure);
}
}
static ArrayObject* getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly);
static ArrayObject* getDeclaredConstructors(JavaObjectClass* Cl, bool publicOnly);
static ArrayObject* getDeclaredFields(JavaObjectClass* Cl, bool publicOnly);
static ArrayObject* getDeclaredMethods(JavaObjectClass* Cl, bool publicOnly);
static ArrayObject* getInterfaces(JavaObjectClass* Cl);
static JavaObject* getDeclaringClass(JavaObjectClass* Cl);
static int getModifiers(JavaObjectClass* Cl);
static JavaString** getSignature(Class* cl);
static ArraySInt8* getAnnotations(Class* cl);
};
class JavaObjectField : public JavaObject {
private:
// AccessibleObject fields
uint8 override;
// Field fields
JavaObjectClass * clazz;
uint32_t slot;
JavaObject* name;
JavaObject* type;
uint32_t modifiers;
JavaString* signature;
JavaObject* genericInfo;
JavaObject* annotations;
JavaObject* fieldAccessor;
JavaObject* overrideFieldAccessor;
JavaObject* root;
JavaObject* securityCheckCache;
JavaObject* securityCheckTargetClassCache;
JavaObject* declaredAnnotations;
public:
static void staticTracer(JavaObjectField* obj, word_t closure) {
llvm_gcroot(obj, 0);
vmkit::Collector::markAndTrace(obj, &obj->clazz, closure);
vmkit::Collector::markAndTrace(obj, &obj->name, closure);
vmkit::Collector::markAndTrace(obj, &obj->type, closure);
vmkit::Collector::markAndTrace(obj, &obj->signature, closure);
vmkit::Collector::markAndTrace(obj, &obj->genericInfo, closure);
vmkit::Collector::markAndTrace(obj, &obj->annotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->fieldAccessor, closure);
vmkit::Collector::markAndTrace(obj, &obj->overrideFieldAccessor, closure);
vmkit::Collector::markAndTrace(obj, &obj->root, closure);
vmkit::Collector::markAndTrace(obj, &obj->securityCheckCache, closure);
vmkit::Collector::markAndTrace(obj, &obj->securityCheckTargetClassCache, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredAnnotations, closure);
}
static JavaField* getInternalField(JavaObjectField* self) {
llvm_gcroot(self, 0);
UserCommonClass* cls = JavaObjectClass::getClass(self->clazz);
return &(cls->asClass()->virtualFields[self->slot]);
}
static UserClass* getClass(JavaObjectField* self) {
llvm_gcroot(self, 0);
UserCommonClass* cls = JavaObjectClass::getClass(self->clazz);
return cls->asClass();
}
static JavaObjectField* createFromInternalField(JavaField* field, int i);
static JavaString** getSignature(JavaField* field);
static ArraySInt8* getAnnotations(JavaField* field);
};
class JavaObjectMethod : public JavaObject {
private:
// AccessibleObject fields
uint8 override;
// Method fields
JavaObjectClass* clazz;
uint32 slot;
JavaObject* name;
JavaObject* returnType;
JavaObject* parameterTypes;
JavaObject* exceptionTypes;
uint32_t modifiers;
JavaString* Signature;
JavaObject* genericInfo;
JavaObject* annotations;
JavaObject* parameterAnnotations;
JavaObject* annotationDefault;
JavaObject* methodAccessor;
JavaObject* root;
JavaObject* securityCheckCache;
JavaObject* securityCheckTargetClassCache;
JavaObject* declaredAnnotations;
public:
static void staticTracer(JavaObjectMethod* obj, word_t closure) {
llvm_gcroot(obj, 0);
vmkit::Collector::markAndTrace(obj, &obj->clazz, closure);
vmkit::Collector::markAndTrace(obj, &obj->name, closure);
vmkit::Collector::markAndTrace(obj, &obj->returnType, closure);
vmkit::Collector::markAndTrace(obj, &obj->parameterTypes, closure);
vmkit::Collector::markAndTrace(obj, &obj->exceptionTypes, closure);
vmkit::Collector::markAndTrace(obj, &obj->Signature, closure);
vmkit::Collector::markAndTrace(obj, &obj->genericInfo, closure);
vmkit::Collector::markAndTrace(obj, &obj->annotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->parameterAnnotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->annotationDefault, closure);
vmkit::Collector::markAndTrace(obj, &obj->methodAccessor, closure);
vmkit::Collector::markAndTrace(obj, &obj->root, closure);
vmkit::Collector::markAndTrace(obj, &obj->securityCheckCache, closure);
vmkit::Collector::markAndTrace(obj, &obj->securityCheckTargetClassCache, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredAnnotations, closure);
}
static JavaMethod* getInternalMethod(JavaObjectMethod* self);
static UserClass* getClass(JavaObjectMethod* self) {
llvm_gcroot(self, 0);
UserCommonClass* cls = JavaObjectClass::getClass(self->clazz);
return cls->asClass();
}
static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);
static JavaString** getSignature(JavaMethod* meth);
static ArraySInt8* getAnnotations(JavaMethod* meth);
static ArraySInt8* getParamAnnotations(JavaMethod* meth);
static ArraySInt8* getAnnotationDefault(JavaMethod* meth);
};
class JavaObjectConstructor : public JavaObject {
private:
// AccessibleObject fields
uint8 override;
// Constructor fields
JavaObjectClass* clazz;
uint32 slot;
JavaObject* parameterTypes;
JavaObject* exceptionTypes;
uint32_t modifiers;
JavaString* signature;
JavaObject* genericInfo;
JavaObject* annotations;
JavaObject* parameterAnnotations;
JavaObject* securityCheckCache;
JavaObject* constructorAccessor;
JavaObject* root;
JavaObject* declaredAnnotations;
public:
static void staticTracer(JavaObjectConstructor* obj, word_t closure) {
llvm_gcroot(obj, 0);
vmkit::Collector::markAndTrace(obj, &obj->clazz, closure);
vmkit::Collector::markAndTrace(obj, &obj->parameterTypes, closure);
vmkit::Collector::markAndTrace(obj, &obj->exceptionTypes, closure);
vmkit::Collector::markAndTrace(obj, &obj->signature, closure);
vmkit::Collector::markAndTrace(obj, &obj->genericInfo, closure);
vmkit::Collector::markAndTrace(obj, &obj->annotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->parameterAnnotations, closure);
vmkit::Collector::markAndTrace(obj, &obj->securityCheckCache, closure);
vmkit::Collector::markAndTrace(obj, &obj->constructorAccessor, closure);
vmkit::Collector::markAndTrace(obj, &obj->root, closure);
vmkit::Collector::markAndTrace(obj, &obj->declaredAnnotations, closure);
}
static JavaMethod* getInternalMethod(JavaObjectConstructor* self);
static UserClass* getClass(JavaObjectConstructor* self) {
llvm_gcroot(self, 0);
UserCommonClass* cls = JavaObjectClass::getClass(self->clazz);
return cls->asClass();
}
static JavaObjectConstructor* createFromInternalConstructor(JavaMethod* cons, int i);
static JavaString** getSignature(JavaMethod* cons);
static ArraySInt8* getAnnotations(JavaMethod* cons);
static ArraySInt8* getParamAnnotations(JavaMethod* cons);
};
class JavaObjectThrowable : public JavaObject {
private:
JavaObject* backtrace;
JavaObject* detailedMessage;
JavaObject* cause;
JavaObject* stackTrace;
public:
static void setDetailedMessage(JavaObjectThrowable* self, JavaObject* obj) {
llvm_gcroot(self, 0);
llvm_gcroot(obj, 0);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)self, (gc**)&(self->detailedMessage), (gc*)obj);
}
static void fillInStackTrace(JavaObjectThrowable* self) {
JavaObject* stackTrace = NULL;
llvm_gcroot(self, 0);
llvm_gcroot(stackTrace, 0);
stackTrace = internalFillInStackTrace(self);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)self, (gc**)&(self->backtrace), (gc*)stackTrace);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)self, (gc**)&(self->cause), (gc*)self);
self->stackTrace = NULL;
}
static int getStackTraceDepth(JavaObjectThrowable * self);
static int getStackTraceBase(JavaObjectThrowable * self);
};
class JavaObjectReference : public JavaObject {
private:
JavaObject* referent;
JavaObject* queue;
JavaObject* next;
JavaObject* discovered;
public:
static void init(JavaObjectReference* self, JavaObject* r, JavaObject* q) {
llvm_gcroot(self, 0);
llvm_gcroot(r, 0);
llvm_gcroot(q, 0);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)self, (gc**)&(self->referent), (gc*)r);
if (!q) {
JavaField * field = JavaThread::get()->getJVM()->upcalls->NullRefQueue;
q = field->getStaticObjectField();
}
assert(q);
vmkit::Collector::objectReferenceWriteBarrier(
(gc*)self, (gc**)&(self->queue), (gc*)q);
}
static JavaObject** getReferentPtr(JavaObjectReference* self) {
llvm_gcroot(self, 0);
return &(self->referent);
}
static void setReferent(JavaObjectReference* self, JavaObject* r) {
llvm_gcroot(self, 0);
llvm_gcroot(r, 0);
// No write barrier: this is only called by the GC.
self->referent = r;
}
};
}
#endif