<div dir="ltr">On Fri, Aug 2, 2013 at 10:15 AM, Nick Williams <span dir="ltr">&lt;<a href="mailto:nicholas+openjdk@nicholaswilliams.net" target="_blank">nicholas+openjdk@nicholaswilliams.net</a>&gt;</span> wrote:<br><div class="gmail_extra">
<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><div class="im"><div>On Aug 1, 2013, at 9:07 PM, Krystal Mok wrote:</div>
<br></div><blockquote type="cite"><div dir="ltr">Hi Nick,<div><br></div><div class="im"><div>All right, that explains everything. My take on this:</div><div><br></div><div>In HotSpot VM, the compiler threads shouldn&#39;t manipulate the Java object graph; in other words, although the compilers have access to certain Java objects through the Compiler Interface, it should only be &quot;reading&quot;, but not &quot;writing&quot; or creating new Java objects.</div>

<div><br></div><div>In your case, calling java_lang_StackTraceFrame::create() from compiler code creates a new object, and that&#39;s probably not the right way.</div><div>You&#39;re trying to embed a pointer to a StackTraceFrame object in the generated code, as a constant. You don&#39;t have to do that. It might work if you embed the Method* (as a TypeMetadataPtr), and generate a runtime call to java_lang_StackTraceFrame::create() with that pointer, instead of calling it at compile time.</div>
</div></div></blockquote><div><br></div><div>Sounds good, but I&#39;m not exactly sure how to do it. Do you mind assisting a bit? Remember that &quot;ciMethod* m&quot; is the executing method on the stack frame we&#39;re interested in. &quot;Method* method&quot; is the same thing, just in a different form. It sounds like I need to actually embed a runtime call to java_lang_StackTraceFrame::create()? I may be missing something. :-)</div>
<span class="HOEnZb"><font color="#888888"><div><br></div></font></span></div></div></blockquote><div style>Sure. I can give it a shot and see if it works.</div><div style>Do you have a full patch that I can use as a base, or would you just like to see a demo of doing a runtime call passing an embedded pointer constant?</div>
<div style><br></div><div style>- Kris</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><span class="HOEnZb"><font color="#888888"><div>
</div><div>Nick</div></font></span><div><div class="h5"><br><blockquote type="cite"><div dir="ltr">
<div><br></div><div>HTH,</div><div>Kris</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Aug 2, 2013 at 9:28 AM, Nick Williams <span dir="ltr">&lt;<a href="mailto:nicholas+openjdk@nicholaswilliams.net" target="_blank">nicholas+openjdk@nicholaswilliams.net</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Well let me explain what I&#39;m trying to do, and maybe someone can point me in the right direction.<div>

<br></div><div>On the core-libs-dev mailing list, I proposed a public API replacement for the sun.reflect.Reflection#getCallerClass(int) of old and the sun.reflect.Reflection#getCallerClass() of now. The new class, java.lang.StackTraceFrame, has the following four methods that are relevant to this discussion:</div>

<div><br></div><div>@CallerSensitive</div><div>public native Class&lt;?&gt; getCallerClass();</div><div>public native Class&lt;?&gt; getCallerClass(int);</div><div>@CallerSensitive</div><div>public native StackTraceFrame getCallerFrame();</div>

<div>public native StackTraceFrame getCallerFrame(int);</div><div><br></div><div>There is code in library_call.cpp that inlines Reflection.getCallerClass(), and I took advantage of that code to also inline StackTraceFrame.getCallerClass(). I also recreated (with changes necessary due to new way of doing things in library_call.cpp) the inline code for Reflection.getCallerClass(int) from the jdk7 source code. All of that works perfectly. Code is inlined as expected, and all is well.</div>

<div><br></div><div>Now I want to inline getCallerFrame() and getCallerFrame(int) as well. If the Class&lt;?&gt; versions can be inlined, I see no reason that the StackTraceFrame versions can&#39;t be inlined, but that may be my first wrong assumption. If these methods aren&#39;t eligible for inlining for some reason, please let me know and I can move on.</div>

<div><br></div><div>So the code that gets the Class&lt;?&gt; and sets it as an inline constant replacing the method call works like this (where m is a ciMethod*):</div><div><br></div><div>          // Acquire method holder as java.lang.Class and push as constant.</div>

<div><div>          ciInstanceKlass* caller_klass = m-&gt;holder();</div><div>          ciInstance* caller_mirror = caller_klass-&gt;java_mirror();</div><div>          set_result(makecon(TypeInstPtr::make(caller_mirror)));</div>

</div><div><br></div><div>In javaClasses.cpp, I already have a method that can create a StackTraceFrame from a Method* (not ciMethod*), method version (int), and bci (int):</div><div><br></div><div>oop java_lang_StackTraceFrame::create(Method* method, int version, int bci, TRAPS);</div>

<div><br></div><div>I tried calling that to create the StackTraceFrame, but it appears I can&#39;t actually set it to the result. First I tried this:</div><div><br></div><div><div>          // Acquire java.lang.StackTraceFrame and push as constant</div>

<div>          Method* method = (Method*)m-&gt;constant_encoding();</div><div>          oop stFrame = java_lang_StackTraceFrame::create(method, method-&gt;constants()-&gt;version(), caller_jvms-&gt;bci(), NULL);</div><div>

          set_result(makecon(TypeInstPtr::make(oop)));</div></div><div><br></div><div>But this obviously didn&#39;t work because there is no TypeInstPtr::make() method that takes an oopDesc&amp;. So I looked around trying to figure out how to convert an oop (or jobject, which I can get from an oop)  to a ciObject. I discovered that ciObject actually holds a jobject internally, so I figured surely this is possible. I found a few methods that appear to do it. ciObjectFactory has a ciObject* get(oop) method, but I can&#39;t figure out how to get the ciObjectFactory. ciEnv has a ciObject* get_object(oop) method which I tried to use, only to discover that it was private:</div>

<div><br></div><div><div>          // Acquire java.lang.StackTraceFrame and push as constant</div><div>          Method* method = (Method*)m-&gt;constant_encoding();</div><div>          oop stFrame = java_lang_StackTraceFrame::create(method, method-&gt;constants()-&gt;version(), caller_jvms-&gt;bci(), NULL);</div>

<div>          ciObject* stfObject = ciEnv::current()-&gt;get_object(stFrame);</div><div>          set_result(makecon(TypeInstPtr::make(stfObject)));</div></div><div><br></div><div>So that obviously doesn&#39;t work either. I&#39;ll admit, I&#39;m a little out of my league here. I was pretty confident working in javaClasses.hpp/cpp and jvm.h/cpp, but this inlining/compiler stuff is pretty over my head. Hopefully one of the knowledgeable people on this list can help me out with this. I want my code to perform as well as possible and also be stable--more likely to get accepted that way. :-)</div>

<div><br></div><div>Thanks,</div><div><br></div><div>Nick</div><div><div><div><br><div><div>On Aug 1, 2013, at 8:16 AM, Krystal Mok wrote:</div><br><blockquote type="cite"><div dir="ltr">Hi Nick,<div><br></div>
<div>This topic is related to HotSpot Server Compiler instead of the Java core library, so I&#39;m cc&#39;ing this email to hotspot-compiler-dev and dropping core-libs-dev.</div>
<div><br></div><div>As you already know, HotSpot compilers are shielded from VM runtime implementation details via the Compiler Interface (CI). That&#39;s why you shouldn&#39;t be getting raw oops in C2 code.</div>
<div><br></div><div>Where are you getting the oopInstance from? If it can be found from some known &quot;roots&quot;, e.g. &quot;well-known classes&quot;, fields of &quot;well-known classes&quot;, or the holder class of the method to be compiled, etc., then it&#39;s already available through CI.</div>


<div><br></div><div>- Kris</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 1, 2013 at 3:17 AM, Nick Williams <span dir="ltr">&lt;<a href="mailto:nicholas+openjdk@nicholaswilliams.net" target="_blank">nicholas+openjdk@nicholaswilliams.net</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In native code (library_call.cpp), if I have an oop (which I can convert to a jobject if need be), how do I get a ciObject? I see that ciEnv has a ciObject* get_object(oop) method, but it&#39;s private. And ciObjectFactory has a ciObject* get(oop) method, but I can&#39;t figure out how to get the ciObjectFactory instance.<br>



<br>
I know that ciObject keeps a jobject internally, and I know that ciObject has a ciObject(oop) constructor, but it&#39;s protected (for good reason).<br>
<br>
If it helps, I&#39;m trying to inline a method and need to set_result(makecon(TypeInstPtr::make(oopInstance))). I may be going down the wrong path.<br>
<br>
Thanks in advance for any help,<br>
<br>
Nick</blockquote></div><br></div>
</blockquote></div><br></div></div></div></div></blockquote></div><br></div>
</blockquote></div></div></div><br></div></blockquote></div><br></div></div>