You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Megha Chauhan <me...@gmail.com> on 2008/04/28 05:40:04 UTC

Re: [drlvm]Help understanding string literal creation--Please Help Me!!

Hi,

I am a little desperate  so posting again. Someone please help me to
understand the code behind String literal creation.
The JVM specification says that it should be done through String.intern.
Gregory also pointed out that String.intern is called during String literal
creation. But this is not happening :( (I have the latest build now)
String.intern is called only when we call the intern method on a String
object and not in the case of String literal creation.
The first java code that is called is VM.intern(). I am trying to figure out
what calls this code? On first look it looks like String.intern() calls
VM.intern() but this is not happening in case of string literal. Although I
think it should becasue JVM specification says so.

I tried to look at the VM helper C++ classes but could not make too much
sense out of those. Is there a document that describes these helper classes?
I am not good with C++ and am not able to make sense of the control flow
between these C++ classes. How Can I debug these and see the control flow? I
just need to initialize one more char array which I have added to the String
object along the lines of the "value" array but till now I haven't found out
the place where this can be done, neither in the Java Code nor in the C++
helper classes.

Someone please help me.
Thanks
Megha



2008/4/25 Megha Chauhan <me...@gmail.com>:

> Hi,
>
> coming back to the thread after a long break.
> I was working with a very old release of harmony(almost 2 yrs old) and I
> think at that time there was no InternMap class. Now I have the latest
> release r629320 and yes it does step in to VM.intern and then into
> VM.InternMap.intern . And I am trying to make changes the the String object
> returned by VM.InternMap.intern method.
> I am trying to assign a value to value_sample char array that I have
> already added to the String Class.
> So before this method returns the interned String Object I add
> key.value_sample=key.toCharArray() .
> But the VM crashes when I do this.
> When I make changes to InternMap class I rebuild working_vm and copy the
> new kernel.jar file to my harmony jdk jre/bin/default folder.
> Do I need to copy the entire bin folder? I mean does kernel.jar depend on
> something else too which must be changed when I change anything in
> kernel.jar?
>
> Any Help would be appreciated.
>
> Thanks
> Megha
>
>
> On Sat, Apr 12, 2008 at 3:36 PM, Gregory Shimansky <gs...@apache.org>
> wrote:
>
> > On 11 апреля 2008 Megha Chauhan wrote:
> > > "I think this translates into ldc bytecode that loads a string from a
> > > constant. This bytecode requires to load a string from class' constant
> > pool
> > > and JIT inserts a call to a VM helper
> > class_get_const_string_intern_addr
> > > (see file C_Interface.cpp in DRLVM sources).
> > > This helper executes Java code for String.intern and returns the
> > reference
> > > to the interned string back to the code generated for "ldc" bytecode.
> > The
> > > String.intern code in class library actually calls VM.intern which
> > calls
> > > InternMap.intern code from VM, but it is still pure Java code."
> > >
> > >  When I try to debug this using eclipse why does the breakpoint at
> > > String.intern() or VM.intern() never get hit? Could it be bceacue the
> > > control goes to the VM helper class C_interface.cpp first and then
> > comes
> > > back to the Java Code? I am trying to find a way to understand the
> > control
> > > flow here by basic debugging.
> > > Thanks a lot for helping me with this.
> >
> > Are you sure that you use Harmony VM when you debug your program?
> >
> > I can't think of a reason why this breakpoint is not hit, usually Java
> > code
> > that is called through VM is reachable by simple StepIn in debugging.
> > Maybe
> > you've found some regression in JVMTI support...
> >
> > > On Thu, Apr 10, 2008 at 9:43 AM, Gregory Shimansky <
> > gshimansky@apache.org>
> > >
> > > wrote:
> > > > Megha Chauhan said the following on 10.04.2008 18:16:
> > > > > I am not sure that String literal creation is done from java code.
> > Any
> > > > > other
> > > > > String object is done from java code but String literal creation
> > is
> > > > > something special. The object is instantiated at compile time
> > only. I
> > > > > am sure that no string constructor is called when a string literal
> > is
> > > > > created(but there might be some other way). Eclipse debugger is
> > not
> > > > > able to
> > > > > step into any code when a breakpoint is set at :
> > > > > String str = "Test String" ;
> > > >
> > > > I think this translates into ldc bytecode that loads a string from a
> > > > constant. This bytecode requires to load a string from class'
> > constant
> > > > pool and JIT inserts a call to a VM helper
> > > > class_get_const_string_intern_addr (see file C_Interface.cpp in
> > DRLVM
> > > > sources).
> > > >
> > > > This helper executes Java code for String.intern and returns the
> > > > reference to the interned string back to the code generated for
> > "ldc"
> > > > bytecode. The String.intern code in class library actually calls
> > > > VM.intern which calls InternMap.intern code from VM, but it is still
> > pure
> > > > Java code.
> > > >
> > > >  So I am assuming that there is no java code involved.
> > > >
> > > >
> > > > There is actually almost no VM native code involved.
> > > >
> > > >  Again, I am not sure.
> > > >
> > > > > Gregory : Can you point me to the java code that might be called
> > during
> > > > > string literal creation?
> > > >
> > > > See file InternMap.java in DRLVM sources.
> > > >
> > > >
> > > >  Thanks
> > > >
> > > > > Megha
> > > > >
> > > > > On Thu, Apr 10, 2008 at 9:07 AM, Gregory Shimansky <
> > > > > gshimansky@apache.org>
> > > > > wrote:
> > > > >
> > > > >  Megha Chauhan said the following on 10.04.2008 16:39:
> > > > > >  Hello everyone,
> > > > > >
> > > > > > > Thanks a lot for the response. Now, since I have a very small
> > > > > > > change in
> > > > > > > the
> > > > > > > String class is it possible for me to just add that extra
> > field in
> > > > > > > the
> > > > > > > init_fields method of vm_string.cpp and somehow recompile the
> > DLL?
> > > > > > > Basically I am not sure what kind of setup I need to do this
> > > > > > > change? I am still not very clear as to what classes are
> > involved
> > > > > > > in a String
> > > > > > > Literal creation.
> > > > > > > As far as I understand there are no Java methods involved. For
> > > > > > > example
> > > > > > > when
> > > > > > > we write something like :
> > > > > > > String str ="Test String" ;
> > > > > > > The VM automatically calls the native methods and instantiates
> > a
> > > > > > > String
> > > > > > > object at compile time itself.
> > > > > > > The String.intern() method can be called on already existing
> > String
> > > > > > > objects
> > > > > > > and not during string literal creation.
> > > > > > >
> > > > > > >  AFAIK when a string is created in Java no VM code is
> > executed, all
> > > > > >
> > > > > > of the
> > > > > > stuff is done in Java only. The vm_strings.cpp code is used for
> > > > > > creating
> > > > > > string objects from native code. If you grep for "string_create"
> > you
> > > > > > will
> > > > > > see that it is used only in JNI and in VM initialization code.
> > > > > >
> > > > > > The String.intern is also implemented in Java code since
> > HARMONY-1016
> > > > > > was
> > > > > > integrated.
> > > > > >
> > > > > >  Can someone point me to any documentation that tells about the
> > > > > > sequence
> > > > > >
> > > > > > > of
> > > > > > > methods that are called for a string literal creation?
> > > > > > > And what sort of setup would I need to make the changes to
> > > > > > > vm_strings.cpp
> > > > > > > class and recompile the DLL.
> > > > > > >
> > > > > > >  For recompiling the VM you need the standard setup for
> > building
> > > > > >
> > > > > > DRLVM. See
> > > > > > the URL that Aleksey Shipilev gave in his reply.
> > > > > >
> > > > > > --
> > > > > > Gregory
> > > >
> > > > --
> > > > Gregory
> >
> >
> >
> > --
> > Gregory
> >
>
>