[vmkit-commits] [PATCH] Add support for extra VM-only fields, use this to add fields to j.l.Class in OpenJDK
Will Dietz
wdietz2 at illinois.edu
Mon Oct 31 15:53:10 PDT 2011
On Mon, Oct 31, 2011 at 4:34 PM, Nicolas Geoffray
<nicolas.geoffray at gmail.com> wrote:
> Thanks Will for the simplified patch! It almost looks good, with the
> exception of the forgotten write barrier. Feel free to commit once that is
> fixed.
>
> On Mon, Oct 31, 2011 at 9:44 PM, Will Dietz <wdietz2 at illinois.edu> wrote:
>>
>> On Fri, Oct 28, 2011 at 5:31 PM, Nicolas Geoffray
>> <nicolas.geoffray at gmail.com> wrote:
>> > Hi Will!
>> > I think this patch could work, but I would definitely try a more
>> > 'localized'
>> > approach before doing it this way.
>> > I think that in the bootstrap process of OpenJDK, you should update the
>> > Class::virtualSize field for java.lang.Class to include these two new
>> > fields, and that would be it. No need to extend the JavaField array (the
>> > Java side of things does not have to know we added new fields).
>> > Of course, you need to make sure no java.lang.Class objects are
>> > allocated
>> > *before* you change the size.
>> > Thanks, and let me know if that worked!
>> > Nicolas
>>
>> I was playing nice with the JavaFields not so that anything from Java
>> could see the fields (I actually intentionally tried to hide them from
>> Java code), but so that the created LLVM types (LLVMInfo) for
>> java.lang.Class matched up. Not knowing better, that seemed like
>> something to ensure was correct.
>>
>> However, what you suggested is much simpler and seems to work equally
>> well, thanks for the good suggestion.
>>
>> Updated patch inlined below :)
>>
>> ~Will
>>
>> From f57fed146de2962a5e3c1306515ab9374862647e Mon Sep 17 00:00:00 2001
>> From: Will Dietz <w at wdtz.org>
>> Date: Mon, 31 Oct 2011 15:23:24 -0500
>> Subject: [PATCH] Add extra fields to JavaObjectClass to hold CommonClass
>> and
>> protection domain.
>>
>> ---
>> lib/J3/ClassLib/OpenJDK/ClasspathReflect.h | 13 +++++++------
>> lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp | 2 ++
>> 2 files changed, 9 insertions(+), 6 deletions(-)
>>
>> diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
>> b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
>> index 75d35a7..4075a5f 100644
>> --- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
>> +++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
>> @@ -38,30 +38,31 @@ private:
>> JavaObject* annotations;
>> JavaObject* declaredAnnotations;
>> JavaObject* annotationType;
>> + // Extra fields added by VM
>> + UserCommonClass * internalClass;
>> + JavaObject * pd;
>>
>> public:
>>
>> static UserCommonClass* getClass(JavaObjectClass* cl) {
>> llvm_gcroot(cl, 0);
>> - UNIMPLEMENTED();
>> - return NULL;
>> + return cl->internalClass;
>> }
>>
>> static void setClass(JavaObjectClass* cl, UserCommonClass* vmdata) {
>> llvm_gcroot(cl, 0);
>> - UNIMPLEMENTED();
>> + cl->internalClass = vmdata;
>> }
>>
>> static void setProtectionDomain(JavaObjectClass* cl, JavaObject* pd) {
>> llvm_gcroot(cl, 0);
>> llvm_gcroot(pd, 0);
>> - UNIMPLEMENTED();
>> + cl->pd = pd;
>
> This should be a write barrier.
Okay, will do.
>
>>
>> }
>>
>> static JavaObject* getProtectionDomain(JavaObjectClass* cl) {
>> llvm_gcroot(cl, 0);
>> - UNIMPLEMENTED();
>> - return NULL;
>> + return cl->pd;
>> }
>>
>> static void staticTracer(JavaObjectClass* obj, word_t closure) {
>> diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
>> b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
>> index a4a48c8..476b6e3 100644
>> --- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
>> +++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
>> @@ -468,6 +468,8 @@ void
>> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>>
>> newClass =
>> UPCALL_CLASS(loader, "java/lang/Class");
>> + // Add space for extra fields, see ClasspathReflect.h
>> + newClass->virtualSize += 2*sizeof(void*);
>
> Did you actually make sure no java.lang.Class objects were created before
> executing that line? I'm not sure how you could ensure that with an assert.
> But you could just trace allocations (printf in Class::doNew) manually and
> see if it holds today.
Yeah I couldn't assert it, and already tested what you said (printf
tracing in doNew() and abort() at place in code where I fiddle with
virtualSize) and things seem good.
Will commit in a bit, and thanks!
~Will
More information about the vmkit-commits
mailing list