09:50
Appears this class unit code will work out nicely for its purpose.
10:30
Now I just need to verify classes before they are used, which should not be much of a problem at all. Generally the verification process will load other classes and make sure that stuff such as circular extends and such are not done. Other things would also be done also.
11:17
I could actually use JavaDoc for every single class and package.
15:31
Private method invocations use invokespecial
because private methods are not
inherited.
18:34
The can access check can likely go into ClassPath
or similar. It needs
every single class to be visible for the most part before access checks can
be performed and such however. Well, generally the access check would be given
two accessible objects. So this code can just go into the accessible object
however static
in interface
s is not supported. So there could just be an
accessibility checker and such.
18:45
Personally, I wish fossil had a grep of sorts, however if I go back into the
past far enough I should be able to find a canAccess
variant. It should be
in the lookup actually.
18:49
It cannot go into the class interface, it has to be in ClassPath
. There is
a need to lookup classes for protected and such to determine if something is
an instance.
20:10
Thinking about the kernel for the test interpreter. Does the kernel run outside of the interpreter or does it run inside of it?
20:18
The interpreter remains on the outside. I also had a previous idea about having
a deterministic interpreter. The deterministic interpreter could record and
replay execution sessions. The interpreter would basically operate in lock-step
with processes. The maximum number of JIPS would be maxJIPS * numThreads.
Or there could just be a single area where code is executed and such. Access
that goes outside of the interpreter into the host kernel would have to get
recorded results, so this means that the kernel cannot generally do anything
fancy with objects being executed (such as changing a local variable value).
This means that all calls that go into the kernel (via the magic interfaces)
would have given and returned values as such. Supporting such a thing would
then require that the kernel use a different means and such for representing
threads which do not use the host system based threads. Basically, to the
running system a Thread
would map to this KernelThread
. On a JVM host
the KernelThread
would have Thread
internally, but for certain systems
say perhaps the NES the KernelThread
will be specially formed for the given
system.
20:24
So to the Kernel
there would be no Thread
at all used anywhere except
potentially used in the implementation. This means I will need a
KernelThreadManager
although the kernel could do it itself for example in a
kind of createThread
for a process or similar. It would have to be figured
out. Then this would mean that the currentThread
call would have to determine
the actual current thread being used using implementation specific means. So
since KernelProcess
is final
, this means the Kernel
gets all of the stuff
needed for threads. Then with this, my potential delemma for handling threads
and such is solved.
20:53
With this, I have to actually change how the sockets and the kernel processes
work. With everything purely in an interpreter, locks on Objects are useless
and do not really do anything at all. The sockets and such will have to be
split off into userspace sockets in __squirreljme
and such. The sockets when
it comes to the kernel however would need to handle client side sockets. So
the kernel socket code must be split away and such partially to handle these
cases. Otherwise with the deterministic interpreter, there would need to be
a complex interpretation setup to handle lock in the kernel itself. However,
in the end this would be better because this means that user-space processes
would not share Objects that the kernel has (even though they could be
garbage collected together, sort of). A separation of objects in general
would be more secure and can handle static
things better. So really, an
interpreter like the one I would have put into the Java SE kernel would not
work at all. Then with the kernel interfaces for user space usage in
__squirreljme
the packets sent between processes can somewhat be recorded
depending on the situation. The one issue I will run into however is, well
actually it is not an issue. I was going to say that running the kernel might
not be possible because code running on a host JVM could use __squirreljme
classes, but if that was the case then that means the JVM and the interpreter
to run is running on SquirrelJME itself.
21:46
And right now the light reflecting off Jupiter shines through my window. I do wonder though how long I will see the planet for.