One addition:

Everywhere Japhar references private_data or privateInfo fields to get
pointers in Class and Thread in java.lang, change it so that it uses native
state instead.  Reflection should really be using
ToReflectedField/FromReflectedField rather than directly accessing fields,
so we should be OK on that.

Also I think there may be a place in libruntime (maybe
interploop.c:initialize_system_threads()?) that references
Thread.PrivateInfo, too.  Gotta change that one.

--John Keiser

> -----Original Message-----
> From: John Keiser [mailto:[EMAIL PROTECTED]]
> Sent: Sunday, November 08, 1998 6:40 PM
> To: Classpath; Japhar
> Subject: List of changes for Classpath+Japhar
>
>
> Why don't we talk about specifics for this integration?  I have
> distilled my
> patch and our recent discussions and made a list of changes required to
> Classpath and Japhar so that Japhar can be binary compatible with both
> Classpath and JDK.  Note that I have given in; I am going to go change the
> String fields.  I will also make sure offset exists and is set to 0.  I
> found one other change I can make to Classpath to minimize runtime
> differences between Japhar with Classpath and JDK (adding a private
> constructor to Thread).
>
> This is partially in response to your request for a patch,
> Petter.  We have
> and you have integrated so much in a different way, that the old patch is
> all but useless.  The information in this email is complete as
> far as I know
> it; i.e. japhar-patch.tgz is made obsolete by it.
>
> Key:
> N marks changes dependent on the new native state stuff that
> reduce the need
> for private fields.
> ! marks something that actually runs differently when JDK is
> loaded vs. when
> Classpath is loaded.  I have minimized these as much as possible.  Only
> libnative and one ThreadGroup thing are different at runtime.
>
> (1) Japhar:Makefiles, configure files - Need to make sure FOR_CLASSPATH is
> defined for all files that need it when compiling for Classpath, and needs
> to control which native libs are built.  If you want to deprecate
> FOR_CLASSPATH and make it binary compatible, using an if() instead, be my
> guest.
>
>
> (2) Japhar:lib/libnative - add cp.java.lang, cp.java.lang.reflect, or find
> another way to differentiate Classpath native methods and Japhar native
> methods.  Japhar may change the classes that hook to these native methods,
> as much as you want.  They are classes in Classpath CVS vm/reference.
> Bottom line: make sure no native methods from Japhar's JDK implementation
> collide with Classpath's native libs (not cp.java.lang, the ones in
> Classpath CVS native/java.lang).
>
>     For purposes of this document, we'll use separate libraries with
> different names, and call the Classpath ones cplang and cpreflect.  We'll
> leave the JDK lib names alone.
>
>
> (3)! Japhar:startup - set a flag depending on whether we're using
> Classpath
> or not
>
>      How you implement this is up to you.  Auto-discovery would
> be nice.  If
> you want us to provide a ClasspathVersion class so that you can tell it's
> us, that'd be just fine.
>
> (4)! Japhar:dynamic_loading.c - only load Classpath libs when Classpath is
> used, and load all JDK when JDK is used.
>
>     #include "global_flags.h" (at the top of the file; this is so that you
> get the using_classpath variable)
>
>     DLL_loadSystemLibraries() {
>        if(using_classpath) {
>           native_handle = DLL_find("cplang");
>           if(!native_handle)
>              return 0;
>
>           native_handle = DLL_find("cpreflect");
>           if(!native_handle)
>              return 0;
>
>        } else {
>           INSERT THE LIBRARY LOADING YOU CURRENTLY DO HERE
>        }
>        return 1;
>     }
>
>
> (5)N Japhar:jnirefl.c - {To/From}Reflected{Field/Method} - change to use
> native state pointers (both JDK and Classpath).
>
>    struct ReflectNativeField {
>       ClazzFile * declaringClass;
>       jint slot;
>    }
>
>    struct ReflectNativeMethod {
>       ClazzFile * declaringClass;
>       jint slot;
>    }
>
>    ToReflectedMethod() is guaranteed to always be called to
> create a Method
> or Constructor.  Likewise, ToReflectedField() and Field.  This will avoid
> segfaults.
>    Just instantiate one of the structs in ToReflectedXXX() and attach it
> using NSA_SetNativeState().
>    Then, in FromReflectedXXX(), use NSA_GetNativeState() and resolve the
> jfieldID with declaringClass->{fields|methods}[slot].
>
>
> (6) Japhar:jnistr.c - Change nothing.  It should all work fine.
> (Actually,
> remove the "offset" change you made this weekend.)
>
>
> (7) Japhar:exceptions.c - call getMessage() instead of using
> detailMessage.
> Completed.
>
>
> (8) Classpath:String - Change str -> value, len -> count, make sure offset
> is always set right.
>
>
> (9)N Japhar:interploop.c - initialize_class_class() - Initialize the Class
> class without adding any funky fields (actually investigate the
> possibility
> of not *having* to initialize Class--with native state, I think it's
> actually possible).
>
>
> (10)! Japhar:interploop.c - initialize_system_threads() - Do not
> create the
> system thread group if Classpath is being used, instead grabbing it from
> "ThreadGroup.root".
>
>     Everything that has to do with system_thread_group must be if()'d out
> using if(using_classpath) and replaced with this on the Classpath side:
>       initialize_class(env, jclass_to_clazzfile(env, ThreadGroup)); // XXX
> this shouldn't be necessary, but GetStaticObjectField() isn't initializing
> the class before grabbing the system thread group, even though
> according to
> spec it should.
>       field = (*env)->GetStaticFieldID(env, ThreadGroup, "root",
> "Ljava/lang/ThreadGroup;");
>       system_thread_group = (*env)->GetStaticObjectField(env, ThreadGroup,
> field);
>
>
> (11) Classpath:Thread - add private constructor Thread(ThreadGroup;String)
>
>
> (12)N Japhar:objects.c - use native state pointers for
> clazzfile_to_jclass()
> and jclass_to_clazzfile().  This is why you might be able to avoid
> initialize_class_class() altogether.
>
>     See jnirefl.c changes.
>
>
> (13) Classpath:? - load the VM-independent native libs ourselves using
> System.loadLibrary().  No known chicken-egg problems with this.
>
>
> --John Keiser
>
>

Reply via email to