<html xmlns:v="urn:schemas-microsoft-com:vml" 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:"Yu Gothic";
        panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@Yu Gothic";
        panose-1:2 11 4 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.E-MailFormatvorlage18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Prototype for native classes<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b>//example C-Struct Point:<o:p></o:p></b></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>struct</span><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Point</span><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>int</span><span lang=FR style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> x,y;<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>};<o:p></o:p></span></p><p class=MsoNormal><b><o:p> </o:p></b></p><p class=MsoNormal><b>//the base class Native:<o:p></o:p></b></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>import</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>java</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>lang</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>foreign</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>MemorySegment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>;<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>import</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>java</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>util</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Objects</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>;<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>abstract</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>class</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Native</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    <o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>protected</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>final</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>MemorySegment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4FC1FF'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>;<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>protected</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>Native</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>MemorySegment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>) {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>this</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#4FC1FF'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> = </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Objects</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>requireNonNull</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>if</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> (</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>byteSize</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>() != </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>layout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>().</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>byteSize</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>())<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>            </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>throw</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>new</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>IllegalArgumentException</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#CE9178'>"Segment does not match native class."</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    <o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>MemorySegment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>() {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>return</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4FC1FF'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>;<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>abstract</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>GroupLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>layout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>();<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>}<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal><b><o:p> </o:p></b></p><p class=MsoNormal><b>//the declaration of the native class Point:<o:p></o:p></b></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>native</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>class</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#008469'>Point</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> int </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>x</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>, </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> int </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>y</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>) {}<o:p></o:p></span></p><p class=MsoNormal><b><span lang=FR><o:p> </o:p></span></b></p><p class=MsoNormal><b>//the expansion of the syntax above:<o:p></o:p></b></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>final</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>class</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Point</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>extends</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Native</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>private</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>static</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>final</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>GroupLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>$LAYOUT</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> = </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>MemoryLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>structLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>ValueLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>JAVA_INT</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>withBitAlignment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#B5CEA8'>32</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>).</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>withName</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#CE9178'>"x"</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>),<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>ValueLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>JAVA_INT</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>withBitAlignment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#B5CEA8'>32</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>).</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>withName</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#CE9178'>"y"</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>));<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>private</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>static</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>final</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>VarHandle</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>X$HANDLE</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> = </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>$LAYOUT</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>varHandle</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>MemoryLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>PathElement</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>groupElement</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#CE9178'>"x"</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>));<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>private</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>static</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>final</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>VarHandle</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>Y$HANDLE</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> = </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>$LAYOUT</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>varHandle</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>MemoryLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>PathElement</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>groupElement</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#CE9178'>"y"</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>));<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>Point</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>MemorySegment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>segment</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>) {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>super</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(segment);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>int</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>getX</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>() {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>return</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> (</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>int</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>)</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>X$HANDLE</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>get</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(segment);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>void</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>setX</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>int</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>x</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>) {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>X$HANDLE</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>set</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(segment, x);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>int</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>getY</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>() {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>return</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> (</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>int</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>)</span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>Y$HANDLE</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>get</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(segment);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>void</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>setY</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>int</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>y</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>) {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#9CDCFE'>Y$HANDLE</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>.</span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>set</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>(segment, y);<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p> </o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    @</span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>Override</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'><o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    </span><span style='font-size:10.5pt;font-family:Consolas;color:#569CD6'>public</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#4EC9B0'>GroupLayout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> </span><span style='font-size:10.5pt;font-family:Consolas;color:#DCDCAA'>layout</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>() {<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>        </span><span style='font-size:10.5pt;font-family:Consolas;color:#C586C0'>return</span><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'> $LAYOUT;<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>    }<o:p></o:p></span></p><p class=MsoNormal style='line-height:14.25pt;background:#1E1E1E'><span style='font-size:10.5pt;font-family:Consolas;color:#D4D4D4'>}<o:p></o:p></span></p><p class=MsoNormal><b><o:p> </o:p></b></p><p class=MsoNormal><b>The expansion would be done by the compiler at compile time just like records.<o:p></o:p></b></p><p class=MsoNormal><b>As said this is just a prototype and different or additional ideas are very welcome.<o:p></o:p></b></p><p class=MsoNormal><b>The visibility of the accessor methods can be set in the field declaration brackets.<o:p></o:p></b></p><p class=MsoNormal><b>To change visibility of only getter or setter you would simply choose the lower visibility and define a custom one instead of the default.<o:p></o:p></b></p><p class=MsoNormal><b>To access the default in the custom method super could be used.<o:p></o:p></b></p><p class=MsoNormal><b>As you might have notices this looks similar to the class jextract creates and that’s intentional.<o:p></o:p></b></p><p class=MsoNormal><b>If this would be implemented jextract could just create native classes as bindings to native structs.<o:p></o:p></b></p><p class=MsoNormal><b>This would practically shift the modeling of the concrete c struct from jextract to the javac compiler.<o:p></o:p></b></p><p class=MsoNormal><b>Since the native struct declaration is very simplistic the need for jextract could be reduced.<o:p></o:p></b></p><p class=MsoNormal><b>I think the ability to describe a native struct in 1 line instead of using an extra tool would simplify the process of interfacing with native structs a lot. <o:p></o:p></b></p><p class=MsoNormal><b>The bindings created by jextract can look confusing and scary to many less experienced java developers.<o:p></o:p></b></p><p class=MsoNormal><b>Working with a native class is the exact same as working with a mutable record like class with the benefits that it can be used to interact with native memory.<o:p></o:p></b></p><p class=MsoNormal><b>Thinking further jextract could actually insert the generated native classes in signatures of the java representation of native functions.<o:p></o:p></b></p><p class=MsoNormal><b>This idea would promote native structs to first class citizens in java.<o:p></o:p></b></p><p class=MsoNormal><b><o:p> </o:p></b></p><p class=MsoNormal><b>In great regards<o:p></o:p></b></p><p class=MsoNormal><b>RedIODev<o:p></o:p></b></p><p class=MsoNormal><b><o:p> </o:p></b></p><p class=MsoNormal><b><o:p> </o:p></b></p><p class=MsoNormal><b><span lang=DE>Von:</span></b><span lang=DE> Red IO <redio.development@gmail.com> <br><b>Gesendet:</b> Dienstag, 8. November 2022 14:01<br><b>An:</b> Maurizio Cimadamore <maurizio.cimadamore@oracle.com><br><b>Cc:</b> panama-dev <panama-dev@openjdk.org><br><b>Betreff:</b> Re: Foreign memory access with classes<o:p></o:p></span></p></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>JPassport looks like a great take based on the raw Panama way of doing this. But it's still a pain to do and requires a precompiler. But both feel uncomfortable using strings to point to mark things.<o:p></o:p></p><div><p class=MsoNormal>Also my idea would still bahave like a normal class being on the heap (could be declared as primitive or value class but let's not focus on Valhalla). The only difference would be their fields, as they would technically not be part of the class. The only field part of the object would be the hidden MemorySegment managing the access of the fields.<o:p></o:p></p></div><div><p class=MsoNormal>My biggest problem with the current solution is that they try to simulate a simple struct with a complex factory. I understand your concerns but there is no split in the type system like you feared. Native objects are simply different, that their fields are stored somewhere else. Other than that they are plain objects. If projecting method calls from fields is too complicated to implement we could go for a record like syntax and only exposing the fake fields through methods. Most java developers would probably never create their own native classes but use those declared in libraries and returned by library methods. In this scenario they would be indistinguishable from normal objects.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Regards <o:p></o:p></p></div><div><p class=MsoNormal>RedIODev<o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>On Tue, Nov 8, 2022, 11:44 Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com">maurizio.cimadamore@oracle.com</a>> wrote:<o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm'><p class=MsoNormal>I believe adding Java syntax to model objects backed by memory segments <br>might be pushing things a little too far. From a pedagogical perspective <br>you would now have to explain to _every_ Java developers that there are <br>two different kinds of objects, plain and native, and the rules which <br>govern their access would be different (plain objects are <br>garbage-collected, native objects are not).<br><br>Seems like a nightmare, for a relatively little pay off. Note that, if <br>you declare a record class with components X and Y, it is relatively <br>easy to construct a function that can read a segment, with given struct <br>layout into a record with matching components. I believe JPassport [1] <br>does something in this direction. With something like this you get <br>basically 90% of what you are aiming for, without the need to change the <br>language by adding a new keyword, and making the programming model more <br>complex for all the developers out there, including those who do not <br>care about off-heap access.<br><br>Cheers<br>Maurizio<br><br>[1] - <a href="https://github.com/boulder-on/JPassport/" target="_blank">https://github.com/boulder-on/JPassport/</a><br><br><br>On 08/11/2022 06:52, Red IO wrote:<br>> I just had a crazy idea on how to make foreign memory access work and <br>> feel like java native class member access.<br>> The idea is that you define special classes maybe with an interface or <br>> a special class keyword. This class can then be "constructed" using a <br>> MemorySegment being bound by its special and temporal bounds. The <br>> object would be either null or every memory access throws an exception <br>> when the bounds are breached. The class would be implicitly final and <br>> would extend a class Native.<br>> This could look something like this :<br>><br>> //c struct<br>> typedef struct {<br>> int x;<br>> int y;<br>> } Point;<br>><br>> //java native class<br>> public native class Point {<br>><br>> int x;<br>> int y;<br>><br>> //implicit and forced private constructor<br>> //normal creation would make things difficult<br>> }<br>><br>> MemorySegment data =... //native memory<br>> Point p = data.object(Point.class);<br>><o:p></o:p></p></blockquote></div></div></body></html>