<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body><div style="font-family: sans-serif;"><div class="markdown" style="white-space: normal;">
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;"><p dir="auto"><a href="http://cr.openjdk.java.net/~dlsmith/jep8277163/latest" style="color: #777777;">http://cr.openjdk.java.net/~dlsmith/jep8277163/latest</a></p>
</blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">I edited the URL to find the corresponding JVMS updates:</p>
<p dir="auto"><a href="http://cr.openjdk.java.net/~dlsmith/jep8277163/jep8277163-20220830/specs/value-objects-jvms.html" style="color: #3983C4;">http://cr.openjdk.java.net/~dlsmith/jep8277163/jep8277163-20220830/specs/value-objects-jvms.html</a></p>
<p dir="auto">I have a few unsystematic comments on the special subject of special methods.</p>
<p dir="auto">In that draft JVMS, we say in 2.9.1</p>
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;"><p dir="auto">An instance initialization method may not be declared in a value class or an interface (4.6).</p>
</blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">and in 2.9.4</p>
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;"><p dir="auto">A value class instance creation method may not be declared in an identity class, an abstract class, or an interface (4.6).</p>
</blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">Then in 4.6 we reaffirm these restrictions on <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><init></code> and <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><vnew></code>, along with many similar pre-existing restrictions.  These are restrictions on <em>declaration</em> of special methods.</p>
<p dir="auto">Then in 4.9.1 we have similar static constraints on <em>uses</em> of special methods, by bytecodes.  Such constraints also appear on constants in the constant pool, in 4.4.8.</p>
<p dir="auto">Eventually in 5.3.5 we discover when and what we must throw if any of these conditions fail:</p>
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;"><p dir="auto">If the purported representation is not a ClassFile structure (§4.1, §4.8), loading throws an instance of ClassFormatError.</p>
</blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">IIRC somewhere there is a place in chapter 4 that tells us that all of the many requirements will be enforced.  I don’t remember where that promise is made.  (Remind me?)</p>
<p dir="auto">The phrases “instance initialization method ” and “value class instance creation method” are accompanied by  cross references to 2.9.1 and 2.9.4.  I’m starting to think that the cross references should <em>also</em> mention the special method names <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><init></code> and <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><vnew></code>.  That would be a new thing for the JVMS but makes more are more sense as we add more and more special method names.  Now we are at three such names; maybe it’s time to mention the names along with the cross references.  I think I should be able to grep the JVMS for <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><vnew></code> for mentions of this feature, not just the phrase “value class instance creation method” or the section number 2.9.4.  For example:</p>
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;"><p dir="auto">Only the invokestatic instruction is allowed to invoke a value class instance creation method (2.9.4 `<vnew>`).</p>
</blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">At some time we will want to change JVMS language that says things like “not <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><clinit></code>, <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><new></code>, or <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><vnew></code>” to “not a special method name”.  Is that time now yet?  Places that allow some but not all would have to say “not a special method name other than <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><clinit></code>” or something of that nature.  I think that would expose some irregularities in our treatment of “surprising” names, but that’s all to the good, even if embarrassing.</p>
<p dir="auto">You have this commentary:</p>
</div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;"><p dir="auto">As an alternative naming scheme, we could re-use <init> but give the method a non-void return type.</p>
</blockquote></div>
<div class="markdown" style="white-space: normal;">
<p dir="auto">You could also say something like:</p>
<blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #777777; color: #777777;">
<p dir="auto">An alternative implementation technique could use regular static methods (presumably marked with a <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;">Synthetic</code> attribute) of a standard name to implement constructors of value classes.  This would be convenient for some tools in that they could treat these factory methods like all other factory methods, without learning the new rules for <code style="margin: 0; padding: 0 0.4em; border-radius: 3px; background-color: #F7F7F7;"><vnew></code> symbols, but would be inconvenient for other tools, including the JVM, which need to make a clear distinction between constructors and other methods.</p>
</blockquote>

</div></div></body>

</html>