| // DefineClass.inc |
| |
| UserClass* defineClass(JnjvmClassLoader * JCL, const UTF8* className, |
| const char* buf, size_t bufLen) { |
| JavaObject* excp = 0; |
| llvm_gcroot(excp, 0); |
| |
| Jnjvm* vm = JavaThread::get()->getJVM(); |
| ClassBytes * classBytes = new (JCL->allocator, bufLen) ClassBytes(bufLen); |
| memcpy(classBytes->elements, buf, bufLen); |
| Reader reader(classBytes); |
| |
| // Before creating a class, do a check on the bytes. |
| uint32 magic = reader.readU4(); |
| if (magic != Jnjvm::Magic) { |
| JavaThread::get()->getJVM()->classFormatError("bad magic number"); |
| UNREACHABLE(); |
| } |
| |
| // Also check that we don't already have a class for this name |
| if (JCL->lookupClass(className)) { |
| excp = vm->CreateLinkageError("duplicate class definition"); |
| JavaThread::get()->throwException(excp); |
| UNREACHABLE(); |
| } |
| |
| // Construct the class |
| UserClass* cl = JCL->constructClass(className, classBytes); |
| cl->resolveClass(); |
| return cl; |
| } |