<div dir="ltr"><div dir="auto"><div dir="ltr"><div dir="auto"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif">Hello,</span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"></span></span><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><br></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><br></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif">I would like to bring to your consideration the following set of observations and user-model suggestions<span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">, in the hope that</span> they will <span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">bring some useful</span> <span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">ideas to</span> the <span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">development</span> of the Valhalla project.<span class="gmail_default"></span><b><br></b></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><b><br></b></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><b><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></b><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br><b>Definition<br></b><br></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>shared-mutable</u> - a variable that is mutable (non-final) and can be shared between threads; shared-mutables are the non-final subset of the shared-variables (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-17.html#jls-17.4.1" rel="noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer" target="_blank">§17.4.1.</a>)<br><br><br><b>Observations<br></b><br>Shared-mutables are the only variables that have these two apparently independent properties:<br></span></span></span><ol><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">lack definite-assignment (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-16.html" rel="noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer" target="_blank">§16.</a>) - the variable is initialized with a default-value if not definitely-assigned (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-4.html#jls-4.12.5" rel="noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer" target="_blank">§4.12.5.</a>)</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">allow data-races - the variable may be read/written while being written by another thread, with both events happening in an unpredictable order (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-17.html#jls-17.4.5" rel="noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer" target="_blank">§17.4.5.</a>)</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></li></ol><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">Via properties 1 and 2, <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">nullability and encoding-mode, <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">respectively, </span></span></span></span></span></span></span></span></span>affect <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">the semantics<span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"> of variables </span></span></span></span><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></span></span></span>in a way that is unique to shared-mutables:</span></span></span></span></span></span><ol><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">if not definitely-assigned, the variable is initialized with:</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">if nullable: the null value, regardless of type</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">if not nullable: the zero-value of the type</span></span></span></li></ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">in a data-race, the value read/written:</span></span></span></li><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">if reference: has unpredictable origin in <u>one</u> of the various writes</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">if inline, either:</span></span></span></li><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">has unpredictable origin in one of the various writes</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">is torn i.e. has distinct internal parts with separate unpredictable origins in <u>more than one</u> of the various writes (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-17.html#jls-17.7" rel="noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer" target="_blank">§17.7.</a>)</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li></ul></ul></ol><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><br><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">These are the 3 kinds of shared-mutable variables (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-4.html#jls-4.12.3" rel="noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer noreferrer" target="_blank">§4.12.3.</a>):</span></span></span></div><div><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">non-final class variables</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">non-final instance variables</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">array components</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></li></ul><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">The remaining kinds of variables don't have any of the above properties:<br></span></span></span><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">final class variables</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">final instance variables</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">method parameters</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">constructor parameters</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">lambda parameters</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">exception parameters</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">local variables</span></span></span><br><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li></ul><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br><br><b>Ideal user-model</b><br></span></span></span></div><div><br><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">In this user-model, the encoding-mode is not complected with nullability.</span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">For class-authors:<br></span></span></span><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>value-knob</u> to reject identity - Applicable on class declarations, if used by a class-author to indicate that the class instances don't require identity (a value-class), the runtime will be free to copy these values and choose between reference or inline encoding everywhere except in shared-mutables, as doing so does not introduce any semantic changes to the program. In shared-mutables, however, value-instances can only be inlined if atomicity is guaranteed, which will depend on the hardware and the variable bit-size (value plus nullability).</span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>tearable-knob</u> to allow tearing - Applicable on value-class declarations, may be used by the class-author to <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">hand <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">the class-user </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>the responsibility of how to avoid tearing<span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">, </span></span></span></span></span></span></span></span></span></span></span></span>freeing the runtime to always inline instances in shared-mutables <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">(bikeshedding: <span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">when dealing with tearable value-classes, </span>the <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">"terrible" sound </span></span></span>can work as a warning for the <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">dangers of neglecting this responsibility</span></span></span></span></span></span><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">). Conversely, if </span>this knob is not used, instances will be kept atomic, which allows the class-author to guarantee constructor invariants, which may be useful for the class implementation and class-users to rely upon. </span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>no-default-knob</u> to forbid using the zero-value as a default - Applicable on value-class declarations, may be used by the class-author to force shared-mutables of this type to either be definitely-assigned or nullable. (Actually, I don't believe this knob will be useful, since I think all zero-values are equally bad: moving across the spectrum from useful to useless to out-of-domain default-values is moving from hidden to noticeable to obvious missed-initialization-bugs. Ex:  false -> 0.0 -> Jan 1, 1970 -> 0/0 -> null. The only good solution is definite-assignment on as many kinds of shared-mutables as possible.)</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></li></ul><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">For class-users:<br></span></span></span><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>nullable-knob</u> to include null in the value-set of variables - Applicable on any variable declaration. I<span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">n either encoding-mode, t</span></span></span>he runtime is free to choose the encoding for the extra bit of information required to represent null. In shared-mutables that are not definitely-assigned, controls the default-value: either null or the zero-value of the type. Since identity-types lack a zero-value, any non-nullable shared-mutable with an <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">identity-type </span></span></span></span></span></span> must be definitely-assigned. If, on some kinds of shared-mutables, definite-assignment can't be enforced, then those kinds of variables (probably array components) cannot have an identity-type and be non-nullable.</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>atomic-knob</u> to avoid tearing - Applicable on shared-mutable declarations, may be used by the class-user to reverse the effect of the tearable-knob, thereby restoring atomicity.</span></span></span><br><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li></ul><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><b>Complected user-model<br></b><br>If, for compatibility, the encoding-mode must remain complected with nullability, the above user-model can be adapted as follows.<br></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></span></span></div><div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">The knobs for class-users are replaced with:<br></span></span></span><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>inline-knob</u>
 to require inline encoding - Applicable on 
shared-mutable declarations with a <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">value-type</span></span></span>, gives the 
class-user control over the tradeoffs between performance, footprint, 
nullability, <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">nullability's</span></span></span> implied default-values, and how to avoid 
tearing.</span></span></span></li></ul></div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">The knobs for class-authors get their scope restricted:<br></span></span></span><ul><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>value-knob</u> - by itself, no longer allows the runtime to inline any value-instances on shared-mutables.</span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>tearable-knob</u>
 - only applicable if the instance bit-size is higher than 32 bits, will
 simply enable/prohibit using the inline-knob on 
variables of this type. </span></span></span><br><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></li><li><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><u>no-default-knob</u></span></span></span> - only affecting inline shared-mutables of this type, forces them to be definitely-assigned. <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">For any kind of shared-mutable </span></span></span></span></span></span>where definite-assignment can't be enforced<span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">, this knob prevents those variables (probably array components) to have values of this type encoded inline. If, on the other hand, <span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">definite-assignment can be enforced in </span></span></span>all kinds of<span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"> </span></span></span></span></span></span></span></span></span>shared-mutables, then it should always be enforced, as this solves both the useless zero-values problem and the missed-initialization-bugs problem. However, in that case, this knob no longer has a reason to exist. </span></span></span></span></span></span></span></span></span></li></ul></div><div style="font-family:verdana,sans-serif;color:rgb(7,55,99)" class="gmail_default"></div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span><div><br><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"></span></span></span></div><div><span style="color:rgb(7,55,99)"><span style="font-family:verdana,sans-serif"><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)">Kind regards,<br>João Mendonça</span><b><span class="gmail_default" style="font-family:verdana,sans-serif;color:rgb(7,55,99)"><br></span></b></span></span></div></div>
</div></div>
</div>