<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}
h2
{mso-style-priority:9;
mso-style-link:"Heading 2 Char";
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:18.0pt;
font-family:"Aptos",sans-serif;
font-weight:bold;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
font-size:10.0pt;
font-family:"Courier New";}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;}
span.Heading2Char
{mso-style-name:"Heading 2 Char";
mso-style-priority:9;
mso-style-link:"Heading 2";
font-family:"Aptos Display",serif;
color:#0F4761;}
span.EmailStyle22
{mso-style-type:personal-reply;
font-family:"Aptos",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">objectref and two arguments are three object to consume.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">Øystein Myhre Andersen <o.myhre@gmail.com><br>
<b>Date: </b>Monday, 17 June 2024 at 14:58<br>
<b>To: </b>Adam Sotona <adam.sotona@oracle.com><br>
<b>Cc: </b>classfile-api-dev <classfile-api-dev@openjdk.org><br>
<b>Subject: </b>[External] : Re: Wrong error reported<o:p></o:p></span></p>
</div>
<div>
<pre style="line-height:26.95pt;background:#F8F9FA"><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124">You say “</span><span style="font-family:"Arial",sans-serif;color:#222222">15: INVOKESPECIAL" consumes 3 objects from stack</span><span style="color:black"> </span><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124">”.</span><o:p></o:p></pre>
<pre style="line-height:26.95pt;background:#F8F9FA"><a name="tw-target-text1"></a><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124">I don't see how that could be the case. The jvm spec says:</span><o:p></o:p></pre>
<pre style="line-height:26.95pt;background:#F8F9FA"><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124"> </span><span lang="EN" style="font-size:11.0pt;font-family:"Times New Roman",serif;color:#202124">..., <i>objectref</i>, [<i>arg1</i>, [<i>arg2 </i>...]] →</span><o:p></o:p></pre>
<pre style="line-height:26.95pt;background:#F8F9FA"><o:p> </o:p></pre>
<pre style="line-height:26.95pt;background:#F8F9FA"><a name="tw-target-text2"></a><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124">In my case I have one argument and </span><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#222222">INVOKESPECIAL</span><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124"> should consume TWO objects.</span><o:p></o:p></pre>
<pre style="line-height:26.95pt;background:#F8F9FA"><o:p> </o:p></pre>
<pre style="line-height:26.95pt;background:#F8F9FA"><a name="tw-target-text3"></a><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#202124">In detail</span><o:p></o:p></pre>
<h2 style="margin-bottom:5.95pt"><span style="font-size:12.0pt;font-family:"Times New Roman",serif;font-weight:normal">Just before the
<span style="color:#222222">INVOKESPECIAL</span> the operand stack looks like this:</span><span style="font-weight:normal"><o:p></o:p></span></h2>
<p style="margin-bottom:12.0pt"><o:p> </o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Arial",sans-serif;color:#222222"> this.SL, P_TXT2, P_TXT2, this.P_T</span><span style="font-family:"Times New Roman",serif">
</span><o:p></o:p></p>
<p style="margin-bottom:12.0pt"><o:p> </o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Times New Roman",serif">where</span><o:p></o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Times New Roman",serif"> - this.SL is a pointer to the argument to the constructor.</span><o:p></o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Times New Roman",serif"> - P_TXT2 is the implicit object reference to the class being constructed.</span><o:p></o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Times New Roman",serif"> - After that, the rest of the operand stack which should not be touched</span><o:p></o:p></p>
<p style="margin-bottom:12.0pt"><o:p> </o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Times New Roman",serif">The
<span style="color:#222222">INVOKESPECIAL should in this case consume TWO objects from the operand stack.</span></span><o:p></o:p></p>
<p style="margin-bottom:5.95pt"><span style="font-family:"Times New Roman",serif;color:#222222">See the
</span><span style="font-family:"Arial",sans-serif;color:#222222">method type: (Lsimula/runtime/RTS_RTObject;Lsimula/runtime/RTS_TXT;)V}</span><o:p></o:p></p>
<pre><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#222222">As I mentioned earlier, the javac compiler produces the same code.</span><span lang="EN"><o:p></o:p></span></pre>
<pre><span lang="EN"><o:p> </o:p></span></pre>
<pre><span lang="EN" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#222222">- Øystein Myhre Andersen</span><span lang="EN"><o:p></o:p></span></pre>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Mon, Jun 17, 2024 at 1:09<span style="font-family:"Arial",sans-serif"> </span>PM Adam Sotona <<a href="mailto:adam.sotona@oracle.com">adam.sotona@oracle.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt">15: INVOKESPECIAL consumes 3 objects from stack</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<div id="m_8980700410496493579mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">classfile-api-dev <<a href="mailto:classfile-api-dev-retn@openjdk.org" target="_blank">classfile-api-dev-retn@openjdk.org</a>> on behalf of Øystein Myhre Andersen <<a href="mailto:o.myhre@gmail.com" target="_blank">o.myhre@gmail.com</a>><br>
<b>Date: </b>Monday, 10 June 2024 at 10:07<br>
<b>To: </b>classfile-api-dev <<a href="mailto:classfile-api-dev@openjdk.org" target="_blank">classfile-api-dev@openjdk.org</a>><br>
<b>Subject: </b>Wrong error reported</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I got:<o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<div>
<div>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">Exception in thread "main"
</span><span style="font-size:10.0pt;font-family:Consolas;color:#0066CC">java.lang.IllegalArgumentException</span><span style="font-size:10.0pt;font-family:Consolas;color:red">: Operand stack underflow at bytecode offset 26 of method _STM()</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">- max stack: 65535</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">max locals: 65535</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">attributes: []</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">//stack map frame @0: {locals: [simulaTestPrograms/adHoc01_P_TXT2], stack: []}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">0: {opcode: ALOAD_0, slot: 0}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">1: {opcode: GETFIELD, owner: simulaTestPrograms/adHoc01_P_TXT2, field name: P_T, field type: Lsimula/runtime/RTS_TXT;}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">4: {opcode: NEW, type: simulaTestPrograms/adHoc01_P_TXT2}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">7: {opcode: DUP}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">8: {opcode: ALOAD_0, slot: 0}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">9: {opcode: GETFIELD, owner: simula/runtime/RTS_RTObject, field name: _SL, field type: Lsimula/runtime/RTS_RTObject;}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">12: {opcode: CHECKCAST, type: simulaTestPrograms/adHoc01}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">15: {opcode: INVOKESPECIAL, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: <init>, method type: (Lsimula/runtime/RTS_RTObject;Lsimula/runtime/RTS_TXT;)V}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">18: {opcode: GETFIELD, owner: simulaTestPrograms/adHoc01_P_TXT2, field name: _RESULT, field type: Lsimula/runtime/RTS_TXT;}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">21: {opcode: LDC, constant value: Abra}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">23: {opcode: INVOKESTATIC, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: _ASGSTR, method type: (Lsimula/runtime/RTS_TXT;Ljava/lang/String;)Lsimula/runtime/RTS_TXT;}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">26: {opcode: INVOKESTATIC, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: _ASGTXT, method type: (Lsimula/runtime/RTS_TXT;Lsimula/runtime/RTS_TXT;)Lsimula/runtime/RTS_TXT;}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">29: {opcode: POP}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">30: {opcode: ALOAD_0, slot: 0}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">31: {opcode: INVOKEVIRTUAL, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: EBLK, method type: ()V}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">34: {opcode: ALOAD_0, slot: 0}</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:red">35: {opcode: ARETURN}</span><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Then I monitor the operand stack as follows:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> 0: {opcode: ALOAD_0, slot: 0}<br>
1: {opcode: GETFIELD, owner: simulaTestPrograms/adHoc01_P_TXT2, field name: P_T, field type: Lsimula/runtime/RTS_TXT;}<br>
==> STACK: this.P_T<br>
<br>
4: {opcode: NEW, type: simulaTestPrograms/adHoc01_P_TXT2}<br>
==> STACK: P_TXT2, this.P_T<br>
<br>
7: {opcode: DUP}<br>
==> STACK: P_TXT2, P_TXT2, this.P_T<br>
<br>
8: {opcode: ALOAD_0, slot: 0}<br>
9: {opcode: GETFIELD, owner: simula/runtime/RTS_RTObject, field name: _SL, field type: Lsimula/runtime/RTS_RTObject;}<br>
12: {opcode: CHECKCAST, type: simulaTestPrograms/adHoc01}<br>
==> STACK: this.SL, P_TXT2, P_TXT2, this.P_T<br>
<br>
15: {opcode: INVOKESPECIAL, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: <init>, method type: (Lsimula/runtime/RTS_RTObject;Lsimula/runtime/RTS_TXT;)V}<br>
==> STACK: P_TXT2, this.P_T<br>
<br>
18: {opcode: GETFIELD, owner: simulaTestPrograms/adHoc01_P_TXT2, field name: _RESULT, field type: Lsimula/runtime/RTS_TXT;}<br>
==> STACK: P_TXT2.RESULT, this.P_T<br>
<br>
21: {opcode: LDC, constant value: Abra}<br>
==> STACK: "Abra", P_TXT2.RESULT, this.P_T<br>
<br>
23: {opcode: INVOKESTATIC, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: _ASGSTR, method type: (Lsimula/runtime/RTS_TXT;Ljava/lang/String;)Lsimula/runtime/RTS_TXT;}<br>
==> STACK: Return-value-1, this.P_T<br>
<br>
26: {opcode: INVOKESTATIC, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: _ASGTXT, method type: (Lsimula/runtime/RTS_TXT;Lsimula/runtime/RTS_TXT;)Lsimula/runtime/RTS_TXT;}<br>
==> STACK: Return-value-2<br>
<br>
29: {opcode: POP}<br>
==> STACK: <br>
<br>
30: {opcode: ALOAD_0, slot: 0}<br>
31: {opcode: INVOKEVIRTUAL, owner: simulaTestPrograms/adHoc01_P_TXT2, method name: EBLK, method type: ()V}<br>
34: {opcode: ALOAD_0, slot: 0}<br>
35: {opcode: ARETURN}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">This shows that the error 'Operand stack underflow at bytecode offset 26 of method _STM()' is wrong.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I have also compiled it fram java source:<o:p></o:p></p>
</div>
<div>
<div>
<div>
<p style="margin:0in"><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">public</span></b><span style="font-size:10.0pt;font-family:Consolas;color:black"> adHoc01_P_TXT2 _STM() {</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:#3F7F5F">// JavaLine 45 <== SourceLine 6</span><o:p></o:p></p>
<p style="margin:0in"><i><span style="font-size:10.0pt;font-family:Consolas;color:black">_ASGTXT</span></i><span style="font-size:10.0pt;font-family:Consolas;color:black">(</span><span style="font-size:10.0pt;font-family:Consolas;color:#0000C0">P_T</span><span style="font-size:10.0pt;font-family:Consolas;color:black">,
<i>_ASGSTR</i>(</span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">new</span></b><span style="font-size:10.0pt;font-family:Consolas;color:black"> adHoc01_P_TXT2((</span><i><span style="font-size:10.0pt;font-family:Consolas;color:#0000C0">_CUR</span></i><span style="font-size:10.0pt;font-family:Consolas;color:black">.</span><span style="font-size:10.0pt;font-family:Consolas;color:#0000C0">_SL</span><span style="font-size:10.0pt;font-family:Consolas;color:black">)).</span><span style="font-size:10.0pt;font-family:Consolas;color:#0000C0">_RESULT</span><span style="font-size:10.0pt;font-family:Consolas;color:black">,
</span><span style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"Abra"</span><span style="font-size:10.0pt;font-family:Consolas;color:black">) );</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:black">EBLK();</span><o:p></o:p></p>
<p style="margin:0in"><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">return</span></b><span style="font-size:10.0pt;font-family:Consolas;color:black"> (</span><b><span style="font-size:10.0pt;font-family:Consolas;color:#7F0055">this</span></b><span style="font-size:10.0pt;font-family:Consolas;color:black">);</span><o:p></o:p></p>
<p style="margin:0in"><span style="font-size:10.0pt;font-family:Consolas;color:black">}
</span><span style="font-size:10.0pt;font-family:Consolas;color:#3F7F5F">// End of Procedure BODY</span><o:p></o:p></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Which compiles to the same byte-code. AND it executes correctly.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Is there something I'm not seeing here ?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">- Regards, Øystein Myhre Andersen<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</body>
</html>