blob: 4e8e88462439330ca6aa6876f051bc72373fec0a [file] [log] [blame]
//===---- IsolateSharedLoader.cpp - Shared loader for isolates ------------===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "IsolateSharedLoader.h"
#include "JavaAllocator.h"
#include "JavaClass.h"
#include "JnjvmClassLoader.h"
#include "JnjvmModule.h"
#include "JnjvmModuleProvider.h"
#include "LockedMap.h"
using namespace jnjvm;
JnjvmSharedLoader* JnjvmSharedLoader::sharedLoader;
JnjvmSharedLoader* JnjvmSharedLoader::createSharedLoader() {
JnjvmSharedLoader* JCL = gc_new(JnjvmSharedLoader)();
JCL->TheModule = new JnjvmModule("Bootstrap JnJVM");
JCL->TheModuleProvider = new JnjvmModuleProvider(JCL->TheModule);
JCL->allocator = new JavaAllocator();
JCL->hashUTF8 = new UTF8Map(JCL->allocator, 0);
JCL->classes = allocator_new(allocator, ClassMap)();
JCL->nameClasses = new SharedClassNameMap();
JCL->byteClasses = allocator_new(allocator, SharedClassByteMap)();
JCL->javaTypes = new TypeMap();
JCL->javaSignatures = new SignMap();
return JCL;
}
Class* JnjvmSharedLoader::constructSharedClass(const UTF8* name,
ArrayUInt8* bytes) {
byteClasses->lock->lock();
SharedClassByteMap::iterator End = byteClasses->map.end();
SharedClassByteMap::iterator I = byteClasses->map.find(bytes);
Class* res = 0;
if (I == End) {
res = new Class(this, name, bytes);
byteClasses->map.insert(std::make_pair(bytes, res));
} else {
res = ((Class*)(I->second));
}
byteClasses->lock->unlock();
return res;
}
ClassArray* JnjvmSharedLoader::constructSharedClassArray(const UTF8* name) {
nameClasses->lock->lock();
SharedClassNameMap::iterator End = nameClasses->map.end();
SharedClassNameMap::iterator I = nameClasses->map.find(name);
ClassArray* res = 0;
if (I == End) {
res = new ClassArray(this, name);
nameClasses->map.insert(std::make_pair(name, res));
} else {
res = ((ClassArray*)(I->second));
}
nameClasses->lock->unlock();
return res;
}
ClassPrimitive*
JnjvmSharedLoader::constructSharedClassPrimitive(const UTF8* name, uint32 nb) {
nameClasses->lock->lock();
SharedClassNameMap::iterator End = nameClasses->map.end();
SharedClassNameMap::iterator I = nameClasses->map.find(name);
ClassPrimitive* res = 0;
if (I == End) {
res = new ClassPrimitive(this, name, nb);
nameClasses->map.insert(std::make_pair(name, res));
} else {
res = ((ClassPrimitive*)(I->second));
}
nameClasses->lock->unlock();
return res;
}