Fwd: Kaffe runs(!) under VC++
Michael Gesundheit
mikeg at rocketmail.com
Fri Oct 31 20:09:45 PST 1997
Sorry, my mailer under MS Explorer just sent my mail
after I hit TAB.
Here it is again:
I just got kaffe to spit HelloWorld! for the first
time under VC++ 5.0. I would not call it running yet
before it will pass the entire test package but this is
a start and more important if anybody out there would
like to help it will be great.
The main bug was, and here I'm looking for
explanation help, the following:
First, the bug manifest itself deep down in Java code
when trying to do the print of HelloWorld the VM
crashed. It crashed when Java stack slot had a field
pointer to the "out" field of the FileDescriptor
class which was 0. Why? here is the bug:
javah uses a stack_item union to pass parameters in
the stubs it generates. The union:
typedef union {
jint i;
jlong l;
jfloat f;
jdouble d;
jref p;
}stack_item;
In System.c where the some of the stubs are you can
find:
java_lang_System_setOut0(_P_[0].p){}
This is an attempt to pass a jref (void *) as a
parameter. The value which was passed is 0 even though
the pointer is there !!.
I don't have a clear explanation but I know the
following:
I added a local
void *vp = _P_[0].p;
and passed vp as a parameter. This works fine. Now the
parameter is passed as expected.
I did the same to all the functions in this file and
kaffe runs!!
I did expirimented a little with union on Solaris and
PC and found the following:
In PC when I write to any of the union elements the
value appears in all of them in the least significant
4 bytes. (I wrote a pointer).
On a sparc system if I wrote to a long long the value
appear in the UPPER 4 bytes!!. All the union elements
which were no longer then 4 bytes showed 0 (ZERO)!!!
If I wrote to a 4 bytes element then all the elements
showed the value.
Now, remember that Java code has no connection to the
C compiler which compile the C code. If Java puts the
value in the upper part of the 8 bytes then, VC++
at least does not find it. It takes the value in the
lower 4 bytes.
This does not explain how is the GNU compiler find the
correct value on Solaris. Whats interesting is that on
Solaris if I wrote to the long long and then moved it
to a void * the data was fine. But so is VC++. It
must be different when the value is put on the stack
as a passed parameter. I can see it happend. The
compiler gets a byte location, like _P_[0].p in our
case and takes 4 bytes as the function prototype
indicates (void *).
If you have a better explanation I'll be happy to hear.
--Michael
_____________________________________________________________________
Sent by RocketMail. Get your free e-mail at http://www.rocketmail.com
More information about the kaffe
mailing list