blob: e2288dae98609e576fa638857a9fff1632c22c49 [file] [log] [blame]
//===- ClasspathVMClassLoader.cpp - GNU classpath java/lang/VMClassLoader -===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "types.h"
#include "Classpath.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaThread.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "Reader.h"
using namespace j3;
extern "C" {
JNIEXPORT JavaObject* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jchar byteId) {
JavaObject* res = 0;
llvm_gcroot(res, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
UserClassPrimitive* prim =
UserClassPrimitive::byteIdToPrimitive(byteId, vm->upcalls);
if (!prim) {
fprintf(stderr, "unknown byte primitive %c", byteId);
abort();
}
res = prim->getClassDelegatee(vm);
END_NATIVE_EXCEPTION
return res;
}
JNIEXPORT JavaObject* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* loader,
JavaString* name) {
JavaObject* res = 0;
llvm_gcroot(loader, 0);
llvm_gcroot(name, 0);
llvm_gcroot(res, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
JnjvmClassLoader* JCL =
JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
UserCommonClass* cl = JCL->lookupClassFromJavaString(name);
if (cl) res = cl->getClassDelegatee(vm);
END_NATIVE_EXCEPTION
return res;
return 0;
}
JNIEXPORT JavaObject* JNICALL Java_java_lang_VMClassLoader_loadClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaString* str,
jboolean doResolve) {
JavaObject* res = 0;
llvm_gcroot(res, 0);
llvm_gcroot(str, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
JnjvmClassLoader* JCL = vm->bootstrapLoader;
UserCommonClass* cl = JCL->loadClassFromJavaString(str, doResolve, false);
if (cl != 0) res = cl->getClassDelegatee(vm);
END_NATIVE_EXCEPTION
return res;
}
JNIEXPORT JavaObject* JNICALL Java_java_lang_VMClassLoader_defineClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* loader,
JavaString* str,
ArrayUInt8* bytes,
jint off,
jint len,
JavaObject* pd) {
JavaObject* res = 0;
llvm_gcroot(loader, 0);
llvm_gcroot(str, 0);
llvm_gcroot(bytes, 0);
llvm_gcroot(pd, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
// Before creating a class, do a check on the bytes.
Reader reader(&bytes);
uint32 magic = reader.readU4();
if (magic != Jnjvm::Magic) {
JavaThread::get()->getJVM()->classFormatError("bad magic number");
}
JnjvmClassLoader* JCL =
JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
const UTF8* name = str->javaToInternal(JCL->hashUTF8);
UserCommonClass* cl = JCL->lookupClass(name);
if (!cl) {
UserClass* cl = JCL->constructClass(name, bytes);
cl->resolveClass();
res = cl->getClassDelegatee(vm, pd);
} else {
JavaObject* obj = vm->CreateLinkageError("duplicate class definition");
JavaThread::get()->throwException(obj);
}
END_NATIVE_EXCEPTION
return res;
}
JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
JavaObject* Cl) {
llvm_gcroot(Cl, 0);
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(Cl);
Jnjvm* vm = JavaThread::get()->getJVM();
UserCommonClass::resolvedImplClass(vm, Cl, false);
END_NATIVE_EXCEPTION
}
#define NUM_BOOT_PACKAGES 168
static const char* bootPackages[NUM_BOOT_PACKAGES] = {
"java.applet",
"java.awt",
"java.awt.color",
"java.awt.datatransfer",
"java.awt.dnd",
"java.awt.dnd.peer",
"java.awt.event",
"java.awt.font",
"java.awt.geom",
"java.awt.im",
"java.awt.im.spi",
"java.awt.image",
"java.awt.image.renderable",
"java.awt.peer",
"java.awt.print",
"java.beans",
"java.beans.beancontext",
"java.io",
"java.lang",
"java.lang.annotation",
"java.lang.instrument",
"java.lang.management",
"java.lang.ref",
"java.lang.reflect",
"java.math",
"java.net",
"java.nio",
"java.nio.channels",
"java.nio.channels.spi",
"java.nio.charset",
"java.nio.charset.spi",
"java.rmi",
"java.rmi.activation",
"java.rmi.dgc",
"java.rmi.registry",
"java.rmi.server",
"java.security",
"java.security.acl",
"java.security.cert",
"java.security.interfaces",
"java.security.spec",
"java.sql",
"java.text",
"java.util",
"java.util.concurrent",
"java.util.concurrent.atomic",
"java.util.concurrent.locks",
"java.util.jar",
"java.util.logging",
"java.util.prefs",
"java.util.regex",
"java.util.zip",
"javax.accessibility",
"javax.activity",
"javax.crypto",
"javax.crypto.interfaces",
"javax.crypto.spec",
"javax.imageio",
"javax.imageio.event",
"javax.imageio.metadata",
"javax.imageio.plugins.bmp",
"javax.imageio.plugins.jpeg",
"javax.imageio.spi",
"javax.imageio.stream",
"javax.management",
"javax.management.loading",
"javax.management.modelmbean",
"javax.management.monitor",
"javax.management.openmbean",
"javax.management.relation",
"javax.management.remote",
"javax.management.remote.rmi",
"javax.management.timer",
"javax.naming",
"javax.naming.directory",
"javax.naming.event",
"javax.naming.ldap",
"javax.naming.spi",
"javax.net",
"javax.net.ssl",
"javax.print",
"javax.print.attribute",
"javax.print.attribute.standard",
"javax.print.event",
"javax.rmi",
"javax.rmi.CORBA",
"javax.rmi.ssl",
"javax.security.auth",
"javax.security.auth.callback",
"javax.security.auth.kerberos",
"javax.security.auth.login",
"javax.security.auth.spi",
"javax.security.auth.x500",
"javax.security.cert",
"javax.security.sasl",
"javax.sound.midi",
"javax.sound.midi.spi",
"javax.sound.sampled",
"javax.sound.sampled.spi",
"javax.sql",
"javax.sql.rowset",
"javax.sql.rowset.serial",
"javax.sql.rowset.spi",
"javax.swing",
"javax.swing.border",
"javax.swing.colorchooser",
"javax.swing.event",
"javax.swing.filechooser",
"javax.swing.plaf",
"javax.swing.plaf.basic",
"javax.swing.plaf.metal",
"javax.swing.plaf.multi",
"javax.swing.plaf.synth",
"javax.swing.table",
"javax.swing.text",
"javax.swing.text.html",
"javax.swing.text.html.parser",
"javax.swing.text.rtf",
"javax.swing.tree",
"javax.swing.undo",
"javax.transaction",
"javax.transaction.xa",
"javax.xml",
"javax.xml.datatype",
"javax.xml.namespace",
"javax.xml.parsers",
"javax.xml.transform",
"javax.xml.transform.dom",
"javax.xml.transform.sax",
"javax.xml.transform.stream",
"javax.xml.validation",
"javax.xml.xpath",
"org.ietf.jgss",
"org.omg.CORBA",
"org.omg.CORBA_2_3",
"org.omg.CORBA_2_3.portable",
"org.omg.CORBA.DynAnyPackage",
"org.omg.CORBA.ORBPackage",
"org.omg.CORBA.portable",
"org.omg.CORBA.TypeCodePackage",
"org.omg.CosNaming",
"org.omg.CosNaming.NamingContextExtPackage",
"org.omg.CosNaming.NamingContextPackage",
"org.omg.Dynamic",
"org.omg.DynamicAny",
"org.omg.DynamicAny.DynAnyFactoryPackage",
"org.omg.DynamicAny.DynAnyPackage",
"org.omg.IOP",
"org.omg.IOP.CodecFactoryPackage",
"org.omg.IOP.CodecPackage",
"org.omg.Messaging",
"org.omg.PortableInterceptor",
"org.omg.PortableInterceptor.ORBInitInfoPackage",
"org.omg.PortableServer",
"org.omg.PortableServer.CurrentPackage",
"org.omg.PortableServer.POAManagerPackage",
"org.omg.PortableServer.POAPackage",
"org.omg.PortableServer.portable",
"org.omg.PortableServer.ServantLocatorPackage",
"org.omg.SendingContext",
"org.omg.stub.java.rmi",
"org.w3c.dom",
"org.w3c.dom.bootstrap",
"org.w3c.dom.events",
"org.w3c.dom.ls",
"org.xml.sax",
"org.xml.sax.ext",
"org.xml.sax.helpers"
};
extern "C" ArrayObject* nativeGetBootPackages() {
ArrayObject* obj = 0;
llvm_gcroot(obj, 0);
BEGIN_NATIVE_EXCEPTION(0)
Jnjvm* vm = JavaThread::get()->getJVM();
obj = (ArrayObject*)vm->upcalls->ArrayOfString->doNew(NUM_BOOT_PACKAGES, vm);
for (uint32 i = 0; i < NUM_BOOT_PACKAGES; ++i) {
obj->elements[i] = vm->asciizToStr(bootPackages[i]);
}
END_NATIVE_EXCEPTION
return obj;
}
}