blob: 04b646e9b27983ffe0c748222249c2ec41486b8c [file] [log] [blame]
//===---------- JavaUpcalls.h - Upcalls to Java entities ------------------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef JNJVM_JAVA_UPCALLS_H
#define JNJVM_JAVA_UPCALLS_H
#include "mvm/Allocator.h"
#include "JnjvmConfig.h"
#define UPCALL_CLASS(vm, name) \
vm->loadName(vm->asciizConstructUTF8(name), true, false, NULL)
#define UPCALL_PRIMITIVE_CLASS(loader, name, nb) \
new(loader->allocator, "Primitive class") \
UserClassPrimitive(loader, loader->asciizConstructUTF8(name), nb) \
#define UPCALL_FIELD(vm, cl, name, type, acc) \
UPCALL_CLASS(vm, cl)->lookupFieldDontThrow(vm->asciizConstructUTF8(name), \
vm->asciizConstructUTF8(type), \
isStatic(acc), false, 0)
#define UPCALL_METHOD(vm, cl, name, type, acc) \
UPCALL_CLASS(vm, cl)->lookupMethodDontThrow(vm->asciizConstructUTF8(name), \
vm->asciizConstructUTF8(type), \
isStatic(acc), false, 0)
#define UPCALL_ARRAY_CLASS(loader, name, depth) \
loader->constructArray( \
loader->constructArrayName(depth, loader->asciizConstructUTF8(name)))
#define UPCALL_CLASS_EXCEPTION(loader, name) \
name = UPCALL_CLASS(loader, "java/lang/"#name)
#define UPCALL_REFLECT_CLASS_EXCEPTION(loader, name) \
name = UPCALL_CLASS(loader, "java/lang/reflect/"#name)
#define UPCALL_METHOD_EXCEPTION(loader, name) \
Init##name = name->lookupMethodDontThrow(loader->asciizConstructUTF8("<init>"), \
loader->asciizConstructUTF8("(Ljava/lang/String;)V"), \
false, false, 0);
#define UPCALL_METHOD_WITH_EXCEPTION(loader, name) \
ErrorWithExcp##name = name->lookupMethodDontThrow(loader->asciizConstructUTF8("<init>"), \
loader->asciizConstructUTF8("(Ljava/lang/Throwable;)V"), \
false, false, 0);
namespace j3 {
class Jnjvm;
class JavaField;
class JavaMethod;
class Class;
class ClassArray;
#if defined(__MACH__)
#define SELF_HANDLE RTLD_DEFAULT
#define DYLD_EXTENSION ".dylib"
#else
#define SELF_HANDLE 0
#define DYLD_EXTENSION ".so"
#endif
class Classpath : public mvm::PermanentObject {
public:
Classpath(JnjvmBootstrapLoader* loader, bool dlLoad);
void postInitialiseClasspath(JnjvmClassLoader* loader);
UserClass* newClassLoader;
JavaMethod* getSystemClassLoader;
JavaMethod* setContextClassLoader;
UserClass* newString;
UserClass* newClass;
UserClass* newThrowable;
UserClass* newException;
JavaMethod* initClass;
JavaMethod* initClassWithProtectionDomain;
JavaField* vmdataClass;
JavaMethod* setProperty;
JavaMethod* initString;
JavaMethod* getCallingClassLoader;
JavaMethod* initConstructor;
UserClassArray* constructorArrayClass;
UserClassArray* constructorArrayAnnotation;
UserClass* newConstructor;
JavaField* constructorSlot;
JavaMethod* initMethod;
JavaMethod* initField;
UserClassArray* methodArrayClass;
UserClassArray* fieldArrayClass;
UserClass* newMethod;
UserClass* newField;
JavaField* methodSlot;
JavaField* fieldSlot;
UserClassArray* classArrayClass;
JavaMethod* loadInClassLoader;
JavaMethod* initVMThrowable;
JavaField* vmDataVMThrowable;
UserClass* newVMThrowable;
JavaField* bufferAddress;
JavaField* dataPointer32;
JavaField* dataPointer64;
UserClass* newPointer32;
UserClass* newPointer64;
UserClass* newDirectByteBuffer;
JavaMethod* InitDirectByteBuffer;
JavaField* vmdataClassLoader;
JavaField* boolValue;
JavaField* byteValue;
JavaField* shortValue;
JavaField* charValue;
JavaField* intValue;
JavaField* longValue;
JavaField* floatValue;
JavaField* doubleValue;
UserClass* newStackTraceElement;
UserClassArray* stackTraceArray;
JavaMethod* initStackTraceElement;
UserClass* voidClass;
UserClass* boolClass;
UserClass* byteClass;
UserClass* shortClass;
UserClass* charClass;
UserClass* intClass;
UserClass* floatClass;
UserClass* doubleClass;
UserClass* longClass;
UserClass* vmStackWalker;
UserClass* newThread;
UserClass* newVMThread;
JavaField* assocThread;
JavaField* vmdataVMThread;
JavaMethod* finaliseCreateInitialThread;
JavaMethod* initVMThread;
JavaMethod* runVMThread;
JavaMethod* groupAddThread;
JavaField* threadName;
JavaField* groupName;
JavaMethod* initGroup;
JavaField* priority;
JavaField* daemon;
JavaField* group;
JavaField* running;
UserClass* threadGroup;
JavaField* rootGroup;
JavaField* vmThread;
JavaMethod* uncaughtException;
UserClass* inheritableThreadLocal;
UserClass* InvocationTargetException;
UserClass* ArrayStoreException;
UserClass* ClassCastException;
UserClass* IllegalMonitorStateException;
UserClass* IllegalArgumentException;
UserClass* InterruptedException;
UserClass* IndexOutOfBoundsException;
UserClass* ArrayIndexOutOfBoundsException;
UserClass* NegativeArraySizeException;
UserClass* NullPointerException;
UserClass* SecurityException;
UserClass* ClassFormatError;
UserClass* ClassCircularityError;
UserClass* NoClassDefFoundError;
UserClass* UnsupportedClassVersionError;
UserClass* NoSuchFieldError;
UserClass* NoSuchMethodError;
UserClass* InstantiationError;
UserClass* InstantiationException;
UserClass* IllegalAccessError;
UserClass* IllegalAccessException;
UserClass* VerifyError;
UserClass* ExceptionInInitializerError;
UserClass* LinkageError;
UserClass* AbstractMethodError;
UserClass* UnsatisfiedLinkError;
UserClass* InternalError;
UserClass* OutOfMemoryError;
UserClass* StackOverflowError;
UserClass* UnknownError;
UserClass* ClassNotFoundException;
UserClass* ArithmeticException;
JavaMethod* InitInvocationTargetException;
JavaMethod* InitArrayStoreException;
JavaMethod* InitClassCastException;
JavaMethod* InitIllegalMonitorStateException;
JavaMethod* InitIllegalArgumentException;
JavaMethod* InitInterruptedException;
JavaMethod* InitIndexOutOfBoundsException;
JavaMethod* InitArrayIndexOutOfBoundsException;
JavaMethod* InitNegativeArraySizeException;
JavaMethod* InitNullPointerException;
JavaMethod* InitSecurityException;
JavaMethod* InitClassFormatError;
JavaMethod* InitClassCircularityError;
JavaMethod* InitNoClassDefFoundError;
JavaMethod* InitUnsupportedClassVersionError;
JavaMethod* InitNoSuchFieldError;
JavaMethod* InitNoSuchMethodError;
JavaMethod* InitInstantiationError;
JavaMethod* InitInstantiationException;
JavaMethod* InitIllegalAccessError;
JavaMethod* InitIllegalAccessException;
JavaMethod* InitVerifyError;
JavaMethod* InitExceptionInInitializerError;
JavaMethod* InitLinkageError;
JavaMethod* InitAbstractMethodError;
JavaMethod* InitUnsatisfiedLinkError;
JavaMethod* InitInternalError;
JavaMethod* InitOutOfMemoryError;
JavaMethod* InitStackOverflowError;
JavaMethod* InitUnknownError;
JavaMethod* InitClassNotFoundException;
JavaMethod* InitArithmeticException;
JavaMethod* SystemArraycopy;
JavaMethod* VMSystemArraycopy;
Class* SystemClass;
JavaMethod* IntToString;
JavaMethod* InitObject;
JavaMethod* FinalizeObject;
JavaMethod* ErrorWithExcpNoClassDefFoundError;
JavaMethod* ErrorWithExcpExceptionInInitializerError;
JavaMethod* ErrorWithExcpInvocationTargetException;
UserClassArray* ArrayOfByte;
UserClassArray* ArrayOfChar;
UserClassArray* ArrayOfInt;
UserClassArray* ArrayOfShort;
UserClassArray* ArrayOfBool;
UserClassArray* ArrayOfLong;
UserClassArray* ArrayOfFloat;
UserClassArray* ArrayOfDouble;
UserClassArray* ArrayOfObject;
UserClassArray* ArrayOfString;
UserClassPrimitive* OfByte;
UserClassPrimitive* OfChar;
UserClassPrimitive* OfInt;
UserClassPrimitive* OfShort;
UserClassPrimitive* OfBool;
UserClassPrimitive* OfLong;
UserClassPrimitive* OfFloat;
UserClassPrimitive* OfDouble;
UserClassPrimitive* OfVoid;
UserClass* OfObject;
JavaField* methodClass;
JavaField* fieldClass;
JavaField* constructorClass;
JavaMethod* EnqueueReference;
Class* newReference;
/// upcalls - Upcall classes, fields and methods so that C++ code can call
/// Java code.
///
Classpath* upcalls;
/// InterfacesArray - The interfaces that array classes implement.
///
UserClass** InterfacesArray;
/// SuperArray - The super of array classes.
UserClass* SuperArray;
/// Lists of UTF8s used internaly in VMKit.
const UTF8* NoClassDefFoundErrorName;
const UTF8* initName;
const UTF8* clinitName;
const UTF8* clinitType;
const UTF8* initExceptionSig;
const UTF8* runName;
const UTF8* prelib;
const UTF8* postlib;
const UTF8* mathName;
const UTF8* stackWalkerName;
const UTF8* abs;
const UTF8* sqrt;
const UTF8* sin;
const UTF8* cos;
const UTF8* tan;
const UTF8* asin;
const UTF8* acos;
const UTF8* atan;
const UTF8* atan2;
const UTF8* exp;
const UTF8* log;
const UTF8* pow;
const UTF8* ceil;
const UTF8* floor;
const UTF8* rint;
const UTF8* cbrt;
const UTF8* cosh;
const UTF8* expm1;
const UTF8* hypot;
const UTF8* log10;
const UTF8* log1p;
const UTF8* sinh;
const UTF8* tanh;
const UTF8* finalize;
/// primitiveMap - Map of primitive classes, hashed by id.
std::map<const char, UserClassPrimitive*> primitiveMap;
UserClassPrimitive* getPrimitiveClass(char id) {
return primitiveMap[id];
}
/// arrayTable - Table of array classes.
UserClassArray* arrayTable[8];
UserClassArray* getArrayClass(unsigned id) {
return arrayTable[id - 4];
}
private:
void CreateJavaThread(Jnjvm* vm, JavaThread* myth,
const char* name, JavaObject* Group);
public:
void InitializeThreading(Jnjvm* vm);
void CreateForeignJavaThread(Jnjvm* vm, JavaThread* myth);
};
} // end namespace j3
#endif