[vmkit-commits] [vmkit] r198296 - Build java.lang.reflect.Field
Gael Thomas
gael.thomas at lip6.fr
Thu Jan 2 02:50:54 PST 2014
Author: gthomas
Date: Thu Jan 2 04:50:54 2014
New Revision: 198296
URL: http://llvm.org/viewvc/llvm-project?rev=198296&view=rev
Log:
Build java.lang.reflect.Field
Modified:
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3field.cc
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 2 04:50:54 2014
@@ -86,6 +86,7 @@ namespace j3 {
J3Class* fieldClass;
J3Field* fieldClassClass;
J3Field* fieldClassSlot;
+ J3Field* fieldClassAccess;
J3Method* fieldClassInit;
llvm::Type* typeJNIEnvPtr;
@@ -126,6 +127,8 @@ namespace j3 {
static void classFormatError(J3Class* cl, const wchar_t* reason, ...) __attribute__((noreturn));
static void noSuchMethodError(const wchar_t* msg,
J3Class* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn));
+ static void noSuchFieldError(const wchar_t* msg,
+ J3Class* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn));
static void linkageError(J3Method* method) __attribute__((noreturn));
static void nullPointerException() __attribute__((noreturn));
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan 2 04:50:54 2014
@@ -163,6 +163,8 @@ namespace j3 {
J3Method* findMethod(const vmkit::Name* name, const vmkit::Name* sign);
J3Field* findField(const vmkit::Name* name, const J3Type* type);
+
+ virtual J3ObjectHandle* extractAttribute(J3Attribute* attr) = 0;
};
class J3StaticLayout : public J3Layout {
@@ -173,6 +175,7 @@ namespace j3 {
J3Class* cl() { return _cl; }
virtual bool isStaticLayout() { return 1; }
+ J3ObjectHandle* extractAttribute(J3Attribute* attr);
};
class J3Class : public J3Layout {
@@ -245,8 +248,8 @@ namespace j3 {
J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1);
J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1);
- J3Field* findVirtualField(const vmkit::Name* name, const J3Type* type, bool error=1);
- J3Field* findStaticField(const vmkit::Name* name, const J3Type* type, bool error=1);
+ J3Field* findVirtualField(const vmkit::Name* name, J3Type* type, bool error=1);
+ J3Field* findStaticField(const vmkit::Name* name, J3Type* type, bool error=1);
};
class J3ArrayClass : public J3ObjectType {
Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 04:50:54 2014
@@ -53,12 +53,15 @@ jstring JNICALL JVM_InternString(JNIEnv*
enterJVM();
J3* vm = J3Thread::get()->vm();
+
J3ObjectHandle* value = str->getObject(vm->stringClassValue);
uint32_t length = value->arrayLength();
- wchar_t copy[length];
+ wchar_t copy[length+1];
for(uint32_t i=0; i<length; i++)
- copy[i] = value->getCharAt(length);
+ copy[i] = value->getCharAt(i);
+
+ copy[length] = 0;
res = vm->nameToString(vm->names()->get(copy));
@@ -420,12 +423,15 @@ jobjectArray JNICALL JVM_GetClassDeclare
size_t cur = 0;
for(uint32_t i=0; i<cl->nbFields(); i++)
if(!publicOnly || J3Cst::isPublic(cl->fields()[i].access()))
- res->setObjectAt(i, cl->fields()[i].javaField());
+ res->setObjectAt(cur++, cl->fields()[i].javaField());
+ for(uint32_t i=0; i<cl->staticLayout()->nbFields(); i++)
+ if(!publicOnly || J3Cst::isPublic(cl->staticLayout()->fields()[i].access()))
+ res->setObjectAt(cur++, cl->staticLayout()->fields()[i].javaField());
} else
res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0);
leaveJVM();
-
+
return res;
}
Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Thu Jan 2 04:50:54 2014
@@ -3,6 +3,7 @@
#include "j3/j3thread.h"
#include "j3/j3class.h"
#include "j3/j3classloader.h"
+#include "j3/j3field.h"
#include "j3/j3.h"
#include "llvm/IR/DataLayout.h"
@@ -34,4 +35,19 @@ extern "C" {
JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv* env, jobject unsafe) {
return J3Thread::get()->vm()->objectClass->getSizeInBits()>>3;
}
+
+ /// objectFieldOffset - Pointer offset of the specified field
+ ///
+ JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv* env, jobject unsafe, jobject field) {
+ J3* vm = J3Thread::get()->vm();
+ J3Class* cl = J3Class::nativeClass(field->getObject(vm->fieldClassClass))->asClass();
+ uint32_t slot = field->getInteger(vm->fieldClassSlot);
+ uint32_t access = field->getInteger(vm->fieldClassAccess);
+ J3Field* fields = J3Cst::isStatic(access) ? cl->staticLayout()->fields() : cl->fields();
+ return fields[slot].offset();
+ }
}
+
+
+
+
Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 04:50:54 2014
@@ -130,6 +130,8 @@ void J3::run() {
names()->get(L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V"));
fieldClassClass = z_field(0, fieldClass, L"clazz", classClass);
fieldClassSlot = z_field(0, fieldClass, L"slot", typeInteger);
+ fieldClassAccess = z_field(0, fieldClass, L"modifiers", typeInteger);
+
#if 0
J3Field* fieldClassSlot;
J3Method* fieldClassInit;
@@ -194,6 +196,10 @@ void J3::noSuchMethodError(const wchar_t
internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), sign->cStr());
}
+void J3::noSuchFieldError(const wchar_t* msg, J3Class* cl, const vmkit::Name* name, J3Type* type) {
+ internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), type->name()->cStr());
+}
+
void J3::classFormatError(J3Class* cl, const wchar_t* reason, ...) {
wchar_t buf[65536];
va_list va;
@@ -224,7 +230,8 @@ void J3::vinternalError(const wchar_t* m
vswprintf(buf, 65536, msg, va);
fprintf(stderr, "Internal error: %ls\n", buf);
printStackTrace();
- exit(1);
+ // exit(1);
+ abort();
}
void J3::printStackTrace() {
Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 04:50:54 2014
@@ -249,6 +249,10 @@ J3StaticLayout::J3StaticLayout(J3ClassLo
_cl = cl;
}
+J3ObjectHandle* J3StaticLayout::extractAttribute(J3Attribute* attr) {
+ return cl()->extractAttribute(attr);
+}
+
J3Layout::J3Layout(J3ClassLoader* loader, const vmkit::Name* name) : J3ObjectType(loader, name) {
}
@@ -304,9 +308,9 @@ J3Method* J3Class::findVirtualMethod(con
resolve();
J3Class* cur = this;
- J3Method* res;
+
while(1) {
- res = cur->findMethod(name, sign);
+ J3Method* res = cur->findMethod(name, sign);
if(res)
return res;
@@ -326,9 +330,9 @@ J3Method* J3Class::findStaticMethod(cons
resolve();
J3Class* cur = this;
- J3Method* res;
+
while(1) {
- res = cur->staticLayout()->findMethod(name, sign);
+ J3Method* res = cur->staticLayout()->findMethod(name, sign);
if(res)
return res;
@@ -341,23 +345,30 @@ J3Method* J3Class::findStaticMethod(cons
}
cur = cur->super();
}
-
- return res;
}
-J3Field* J3Class::findVirtualField(const vmkit::Name* name, const J3Type* type, bool error) {
- //loader()->vm()->log(L"Lookup: %ls %ls in %ls", methName->cStr(), methSign->cStr(), name()->cStr());
+J3Field* J3Class::findVirtualField(const vmkit::Name* name, J3Type* type, bool error) {
+ //loader()->vm()->log(L"Lookup: %ls %ls in %ls", type->name()->cStr(), name->cStr(), J3Class::name()->cStr());
resolve();
+ J3Class* cur = this;
- J3Field* res = findField(name, type);
+ while(1) {
+ J3Field* res = cur->findField(name, type);
- if(!res)
- J3::internalError(L"implement me");
+ if(res)
+ return res;
- return res;
+ if(cur == cur->super()) {
+ if(error)
+ J3::noSuchFieldError(L"no such field", this, name, type);
+ else
+ return 0;
+ }
+ cur = cur->super();
+ }
}
-J3Field* J3Class::findStaticField(const vmkit::Name* fname, const J3Type* ftype, bool error) {
+J3Field* J3Class::findStaticField(const vmkit::Name* fname, J3Type* ftype, bool error) {
//fprintf(stderr, "Lookup static field %ls %ls::%ls\n", ftype->name()->cStr(), name()->cStr(), fname->cStr());
resolve();
@@ -630,16 +641,11 @@ void J3Class::readClassBytes(J3Field* hi
void J3Class::fillFields(J3Field** fields, size_t n) {
for(size_t i=0; i<n; i++) {
J3Field* cur = fields[i];
- J3Layout* layout;
+ J3Layout* layout = J3Cst::isStatic(fields[i]->access()) ? (J3Layout*)staticLayout() : this;
- if(J3Cst::isStatic(fields[i]->access())) {
- //fprintf(stderr, " adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr());
- layout = staticLayout();
- } else {
- layout = this;
- }
+ //fprintf(stderr, " adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr());
cur->_offset = layout->structSize();
- cur->_slot = i;
+ cur->_slot = layout->_nbFields;
layout->_structSize += 1 << fields[i]->type()->logSize();
layout->fields()[layout->_nbFields++] = *fields[i];
@@ -750,7 +756,7 @@ J3Field* J3Class::fieldAt(uint16_t idx,
check(ntIdx, J3Cst::CONSTANT_NameAndType);
const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16);
- const J3Type* type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff));
+ J3Type* type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff));
res = J3Cst::isStatic(access) ? cl->findStaticField(name, type) : cl->findVirtualField(name, type);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Thu Jan 2 04:50:54 2014
@@ -25,11 +25,11 @@ J3ObjectHandle* J3Field::javaField() {
access(), /* access */
slot(), /* slot */
vm->nameToString(type()->name()), /* signature */
- layout()
- ->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */
+ layout()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */
J3Thread::get()->restore(prev);
}
+
layout()->unlock();
}
return _javaField;
More information about the vmkit-commits
mailing list