<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>I looked at the PR and I had a similar reaction as Adam.</p>
<p>It seems like the buildToXYZ methods have one less copy, but...
if the API returns a byte[], you can always wrap the byte[] as
either a MemorySegment (MemorySegment::ofArrays) or a ByteBuffer
(ByteBuffer::wrap). These methods do _not_ copy.</p>
<p>The way I see it, is that this PR doesn't remove the need to copy
on the way in (that would be a much more complex change), and it
doesn't improve things significantly _on the way out_ (because,
that side is already covered by existing API/views support).</p>
<p>So, while I'm not strongly opposed to the changes in the PR, at
the same time I don't see a lot of added value in the new methods.
At the same time I'm a bit skeptical to commit to the new API in
without doing the full exercise to see how these methods might be
implemented.</p>
<p>A good motto in API design is "when in doubt, leave it out" -- is
this one of those cases?</p>
<p>Maurizio<br>
</p>
<p><br>
</p>
<p><br>
</p>
<div class="moz-cite-prefix">On 21/03/2025 13:34, David Lloyd wrote:<br>
</div>
<blockquote type="cite" cite="mid:CANghgrRHKNvidkVg10F-zmfapFu3v2CnpVDpy15y3QaHFug_3g@mail.gmail.com">
<div dir="ltr">
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">The idea is
that in the future, it may be possible to do these things
without the extra copy. In the PR, I found that we can already
build to memory segments and byte buffers without more copies
than what we're doing for arrays. On the parsing side, we can
already sometimes work without copying in some cases that the
user won't have access to (e.g. accessing the backing array of
a memory segment, even if it's read-only). It's not hard to
imagine that we could possibly have a way to parse without the
extra copy in the native memory case in the future, without
impacting current performance on arrays. But without the API
support, it can never be possible.</div>
</div>
<br>
<div class="gmail_quote gmail_quote_container">
<div dir="ltr" class="gmail_attr">On Fri, Mar 21, 2025 at
8:26 AM Adam Sotona <<a href="mailto:adam.sotona@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">adam.sotona@oracle.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="msg-4103065197396529612">
<div style="overflow-wrap: break-word;" lang="EN-US">
<div class="m_-4103065197396529612WordSection1">
<p class="MsoNormal"><span style="font-size:11pt">I’m
more thinking that the API already provides all the
important entries and conversion from and to
`MemorySegment` can be done by simple call of
`MemorySegment::toArray` and
`MemorySegment::ofArray`.</span></p>
<p class="MsoNormal"><span style="font-size:11pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt"> </span></p>
<div id="m_-4103065197396529612mail-editor-reference-message-container">
<div>
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(181,196,223);padding:3pt 0in 0in">
<p class="MsoNormal" style="margin-bottom:12pt"><b><span style="font-size:12pt;color:black">From:
</span></b><span style="font-size:12pt;color:black">David
Lloyd <<a href="mailto:david.lloyd@redhat.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">david.lloyd@redhat.com</a>><br>
<b>Date: </b>Friday, 21 March 2025 at 13:37<br>
<b>To: </b>Adam Sotona <<a href="mailto:adam.sotona@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">adam.sotona@oracle.com</a>><br>
<b>Cc: </b><a href="mailto:classfile-api-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">classfile-api-dev@openjdk.org</a>
<<a href="mailto:classfile-api-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">classfile-api-dev@openjdk.org</a>><br>
<b>Subject: </b>[External] : Re: Class
files in ByteBuffer</span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">Please have a look
at the PR. If you feel the API surface has
grown too much, maybe removing the
`ByteBuffer` variants is a logical step,
since users can always wrap a `ByteBuffer`
with a `MemorySegment`? If you could
comment on the PR if you feel that to be
the case, I would appreciate it.</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">Thanks.</span></p>
</div>
</div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">On Thu, Mar 20,
2025 at 4:09</span><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt">PM Adam Sotona <<a href="mailto:adam.sotona@oracle.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">adam.sotona@oracle.com</a>>
wrote:</span></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11pt">I’m sorry to
join the discussion a bit late.</span><span style="font-size:12pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt"> </span><span style="font-size:12pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt">Here are the
points to consider:</span><span style="font-size:12pt"></span></p>
<ul type="disc">
<li class="m_-4103065197396529612m1102407431525991501msolistparagraph">
<span style="font-size:11pt">Class-File
API is implementation is after
many rounds of performance
optimizations purely based on byte
arrays.</span></li>
<li class="m_-4103065197396529612m1102407431525991501msolistparagraph">
<span style="font-size:11pt">Internal
use of ByteBuffer has been removed
from the implementation, as it
caused significant JDK bootstrap
performance regression.</span></li>
<li class="m_-4103065197396529612m1102407431525991501msolistparagraph">
<span style="font-size:11pt">Enormous
amount of work has been spent on
the API surface reduction and
removal of all unnecessary
“conveniences”.</span></li>
</ul>
<p class="MsoNormal"><span style="font-size:11pt"> </span><span style="font-size:12pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt">Adam</span><span style="font-size:12pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt"> </span><span style="font-size:12pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt"> </span><span style="font-size:12pt"></span></p>
<p class="MsoNormal"><span style="font-size:11pt"> </span><span style="font-size:12pt"></span></p>
<div id="m_-4103065197396529612m_1102407431525991501mail-editor-reference-message-container">
<div>
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(181,196,223);padding:3pt 0in 0in">
<p class="MsoNormal" style="margin-bottom:12pt"><b><span style="font-size:12pt;color:black">From:
</span></b><span style="font-size:12pt;color:black">classfile-api-dev <<a href="mailto:classfile-api-dev-retn@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">classfile-api-dev-retn@openjdk.org</a>>
on behalf of David Lloyd
<<a href="mailto:david.lloyd@redhat.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">david.lloyd@redhat.com</a>><br>
<b>Date: </b>Thursday, 20
March 2025 at 21:11<br>
<b>To: </b><a href="mailto:classfile-api-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">classfile-api-dev@openjdk.org</a> <<a href="mailto:classfile-api-dev@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">classfile-api-dev@openjdk.org</a>><br>
<b>Subject: </b>Re: Class
files in ByteBuffer</span><span style="font-size:12pt"></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">I've opened a bug
[1] and pull request [2]
incorporating this
discussion (more or less).
I've implemented support
for both `MemorySegment`
and `ByteBuffer`, but this
could be revisited if it
doesn't look OK. The
implementation is not
terribly invasive for now,
only grabbing a few
low-hanging optimizations.</span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">[1] </span><span style="font-size:12pt"><a href="https://bugs.openjdk.org/browse/JDK-8352536" target="_blank" moz-do-not-send="true"><span style="font-family:Arial,sans-serif">https://bugs.openjdk.org/browse/JDK-8352536</span></a></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">[2] </span><span style="font-size:12pt"><a href="https://urldefense.com/v3/__https:/github.com/openjdk/jdk/pull/24139__;!!ACWV5N9M2RV99hQ!MNdgtt56CgKWQQak5PkwC2t1L1q0tTZrT2fqzVPHYo3jer5CUfysIIx9uMuCoLb27YGoQWuUDgu3s_h8ZhlN-w$" target="_blank" moz-do-not-send="true"><span style="font-family:Arial,sans-serif">https://github.com/openjdk/jdk/pull/24139</span></a></span></p>
</div>
</div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">On
Mon, Mar 10, 2025 at 12:38</span><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt">PM
David Lloyd <<a href="mailto:david.lloyd@redhat.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">david.lloyd@redhat.com</a>> wrote:</span></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">When defining a
class in the JDK,
one may either use a
byte array or a byte
buffer to hold the
contents of the
class. The latter is
useful when (for
example) a JAR file
containing
uncompressed classes
is mapped into
memory. Thus, some
class loaders depend
on this form of the
API for class
definition.</span><span style="font-size:12pt"></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">If I were to
supplement such a
class loader with a
class transformation
step based on the
class file API, I
would have to copy
the bytes of each
class on to the heap
as a byte[] before I
could begin parsing
it. This is
potentially
expensive, and
definitely awkward.</span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">After
transformation, it
doesn't really
matter if you have a
byte[] or ByteBuffer
because either way,
the class can be
defined directly.</span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">It would be nice if
the class file
parser could accept
either a byte[] or a
ByteBuffer. I did a
quick bit of
exploratory work and
it looks like
porting the code to
read from a
ByteBuffer instead
of a byte[] (using
ByteBuffer.wrap()
for the array case)
would be largely
straightforward
*except* for the
code which parses
UTF-8 constants into
strings. Also there
could be some small
performance
differences (maybe
positive, maybe
negative) depending
on how the buffer is
accessed.</span><span style="font-size:12pt"></span></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt"></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif">Is this something
that might be
considered?</span><span style="font-size:12pt"></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span><span style="font-size:12pt"></span></p>
</div>
<p class="MsoNormal"><span class="m_-4103065197396529612m1102407431525991501gmailsignatureprefix"><span style="font-size:12pt">--
</span></span><span style="font-size:12pt"></span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">- DML • he/him</span></p>
</div>
</div>
</div>
</blockquote>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"><br clear="all">
</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
</div>
<p class="MsoNormal"><span class="m_-4103065197396529612m1102407431525991501gmailsignatureprefix"><span style="font-size:12pt">--
</span></span><span style="font-size:12pt"></span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">-
DML • he/him</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"><br clear="all">
</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
</div>
<p class="MsoNormal"><span class="m_-4103065197396529612gmailsignatureprefix"><span style="font-size:12pt">--
</span></span><span style="font-size:12pt"></span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">- DML • he/him</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<div><br clear="all">
</div>
<div><br>
</div>
<span class="gmail_signature_prefix">-- </span><br>
<div dir="ltr" class="gmail_signature">
<div dir="ltr">- DML • he/him<br>
</div>
</div>
</blockquote>
</body>
</html>