<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  </head>
  <body>
    <p>CryptographyRSPluginExtending-rww.7.mcz now has all 7 missing
      primitives, for the FECDecoder, the GFPoly and the
      GaloisCodingLoop. Here is a list.</p>
    <ol>
      <li>
GaloisCodingLoopOutputByteInputExpCodingLoopWithPlugin>>#primCheckSomeShardsMatrixRows:
        matrixRows <br/>
            inputs: inputs <br/>
            toCheck: toCheck <br/>
            offset: offset <br/>
            byteCount: byteCount</li>
      <li>GaloisCodingLoopOutputByteInputExpCodingLoopWithPlugin>>#primCodeSomeShardsMatrixRows:
        matrixRows <br/>
            inputs: inputs
        <br/>
            outputs: outputs <br/>
            offset: offset <br/>
            byteCount: byteCount</li>
      <li>GaloisCodingLoopOutputByteInputExpCodingLoopWithPlugin>>#primComputeValueMatrixRow:
        matrixRow <br/>
            inputs: inputs
        <br/>
            inputIndex: inputIndex <br/>
            byteIndex: byteIndex <br/>
            value: value</li>
      <li>FECGFPolyWithPlugin>>#primInitializePolyFieldSize: 
        fieldSize <br/>
            coefficients: localCoefficients</li>
      <li>FECGFPolyWithPlugin>>#primDividePolySelfCoefficients:
        coefficients <br/>
            otherCoefficients: otherCoefficients <br/>
            fieldSize: fieldSize </li>
      <li>FECDecoderWithPlugin>>#primDecode: decoded <br/>
            twoS: twoS <br/>
            generatorBase: generatorBase</li>
      <li>FECDecoderWithPlugin>>#primRunEuclideanAlgorithmPolyA:
        polyA <br/>
            polyB: polyB <br/>
            degrees: fieldSize</li>
    </ol>
    <div class="moz-signature">---<br/>
      Kindly,<br/>
      Robert<br/>
      <br/>
      <br/>
    </div>
    <div class="moz-cite-prefix">On 6/5/21 9:50 AM, Robert Withers
      wrote:<br/>
    </div>
    <blockquote type="cite" cite="mid:a809d087-b54b-508d-44fc-3160ced9bef8@pm.me">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <p>A bit more detail on my refactoring. I combined the Plugins to
        1 RSPlugin.<br/>
      </p>
      <p>I updated the package: CryptographyRSPluginExtending to include
        all problematic primitives and their send sites. This includes
        GFPolyWithPlugin>>#initializeField:coefficients: and the
        ErasureOutputByteInputCodingLoopWithPlugin methods. To load this
        extension (which blows up the image by the way) run this
        compound script:</p>
      <blockquote>
        <p>Installer ss<br/>
              project: 'Cryptography';<br/>
              install: 'ProCrypto-1-1-1';<br/>
              install: 'ProCryptoTests-1-1-1';<br/>
              install: 'CryptographyRSPlugin'.<br/>
        </p>
        <p>Installer ss<br/>
              project: 'Cryptography';<br/>
              install: 'CryptographyRSPluginExtending'.<br/>
        </p>
      </blockquote>
      <p>To unload and restore prior functionality, run this compound
        script:</p>
      <blockquote>
        <p>Installer ss<br/>
              project: 'Cryptography';<br/>
              unload: 'CryptographyRSPluginExtending'.<br/>
          <br/>
          Installer ss<br/>
              project: 'Cryptography';<br/>
              install: 'CryptographyRSErasure';<br/>
              install: 'CryptographyRSFEC';<br/>
              install: 'CryptographyRSPlugin'.<br/>
        </p>
      </blockquote>
      That is all.<br/>
      <div class="moz-signature">---<br/>
        Kindly,<br/>
        Robert<br/>
        <br/>
        <br/>
      </div>
      <div class="moz-cite-prefix">On 6/5/21 8:34 AM, Robert Withers
        wrote:<br/>
      </div>
      <blockquote type="cite" cite="mid:418da687-415c-e9cb-61b2-1afbe94c7c56@pm.me">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <p>I consolidated the RS Plugins into 1 RSPlugin class. Here is
          the new load script:</p>
        <blockquote>
          <p>Installer ss<br/>
                project: 'Cryptography';<br/>
                install: 'ProCrypto-1-1-1';<br/>
                install: 'ProCryptoTests-1-1-1';<br/>
                install: 'CryptographyRSPlugin'.<br/>
          </p>
        </blockquote>
        <p><br/>
        </p>
        <div class="moz-signature">---<br/>
          Kindly,<br/>
          Robert<br/>
          <br/>
          <br/>
        </div>
        <div class="moz-cite-prefix">On 6/4/21 2:51 PM, Robert Withers
          wrote:<br/>
        </div>
        <blockquote type="cite" cite="mid:453fd624-25c7-8052-0da3-05457d9862d1@pm.me">
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
          <p>Hi Levente,</p>
          <p>I hope you are having a great day! Are you in Budapest?
            That must be awesome! A very old city.</p>
          <p>I thought I would post the Squeak code for this
            instantiatePoly primitive. My image still blows up on
            startUp:. I am grateful you have guided me through this!<br/>
          </p>
          <blockquote>
            <p>primitiveInitializePolyFieldSizeCoefficients<br/>
              <br/>
                  <export: true><br/>
                  <var: 'coefficients' type: 'unsigned char*' ><br/>
              <br/>
                  | coefficients count coefficientsOop fieldSize result
              |<br/>
                  interpreterProxy methodArgumentCount = 2<br/>
                      ifFalse: [ ^interpreterProxy primitiveFailFor:
              PrimErrBadNumArgs ].<br/>
                  fieldSize := interpreterProxy stackIntegerValue: 1.<br/>
                  coefficientsOop := interpreterProxy stackObjectValue:
              0.<br/>
              <br/>
                  (interpreterProxy isIntegerValue: fieldSize)<br/>
                      ifFalse: [ ^interpreterProxy primitiveFailFor:
              PrimErrBadArgument ].<br/>
                  (interpreterProxy isBytes: coefficientsOop) <br/>
                      ifFalse: [ ^interpreterProxy primitiveFailFor:
              PrimErrBadArgument ].<br/>
                  count := interpreterProxy stSizeOf: coefficientsOop.<br/>
                  coefficients := interpreterProxy firstIndexableField:
              coefficientsOop.<br/>
              <br/>
                  (count = 0)<br/>
                      ifTrue: [ ^interpreterProxy primitiveFailFor:
              PrimErrBadArgument ].<br/>
              <br/>
                  result := self <br/>
                      initializePolyFieldSize: fieldSize <br/>
                      coefficients: coefficients <br/>
                      coefficientsCount: count.<br/>
              <br/>
                  ^ interpreterProxy failed<br/>
                          ifTrue: [interpreterProxy primitiveFail]<br/>
                          ifFalse: [interpreterProxy methodReturnValue:
              result].</p>
          </blockquote>
          <p>Which is calling:</p>
          <blockquote>
            <p>initializePolyFieldSize: fieldSize coefficients:
              coefficients coefficientsCount: coefficientsCount<br/>
              <br/>
                  <var: 'coefficients' type: #'unsigned char*'><br/>
              <br/>
                  | coefficientsLength firstNonZero mutableCoefficients
              |<br/>
                  mutableCoefficients := coefficients.<br/>
                  coefficientsLength := coefficientsCount.<br/>
                  ((coefficientsLength > 1) & ((coefficients at:
              1) = 0))<br/>
                      ifTrue: [<br/>
                          firstNonZero := 2.<br/>
                          [(firstNonZero <= coefficientsLength) and:
              [(mutableCoefficients at: firstNonZero) = 0]]<br/>
                              whileTrue: [firstNonZero := firstNonZero +
              1].<br/>
                          (firstNonZero > coefficientsLength)<br/>
                              ifTrue: [<br/>
                                      mutableCoefficients :=
              interpreterProxy<br/>
                                          instantiateClass:
              interpreterProxy classByteArray<br/>
                                          indexableSize: 1]<br/>
                              ifFalse: [<br/>
                                      mutableCoefficients :=
              interpreterProxy<br/>
                                          instantiateClass:
              interpreterProxy classByteArray<br/>
                                          indexableSize:
              (coefficientsLength - firstNonZero + 1).<br/>
                                      0 to: (coefficientsLength - 1)<br/>
                                          do: [:index |<br/>
                                              coefficients at: index
              put: (mutableCoefficients at: index)]]].<br/>
                  ^ mutableCoefficients.</p>
          </blockquote>
          <p><br/>
          </p>
          <div class="moz-signature">---<br/>
            K<span class="Y2IQFc" lang="hu">öszönöm</span>,<br/>
            Robert<br/>
            <br/>
            <br/>
          </div>
          <div class="moz-cite-prefix">On 6/4/21 1:38 PM, Robert Withers
            wrote:<br/>
          </div>
          <blockquote type="cite" cite="mid:7fcbbbac-f85c-f8e7-7c48-728bb3142495@pm.me">
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <p>I am getting this warning when cross compiling the Squeak
              plugin to C code.</p>
            <blockquote>
              <p>warning, signature of
                InterpreterProxy>>instantiateClass:indexableSize:
                does not match reference implementation.<br/>
              </p>
            </blockquote>
            <div class="moz-signature">---<br/>
              Kindly,<br/>
              Robert<br/>
              <br/>
              <br/>
            </div>
            <div class="moz-cite-prefix">On 6/4/21 1:21 PM, Robert
              Withers wrote:<br/>
            </div>
            <blockquote type="cite" cite="mid:efd9382f-edae-5651-b786-1c8d7c53c375@pm.me">
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
              <p>Nope, this wasn't it.<br/>
              </p>
              <div class="moz-signature">---<br/>
                Kindly,<br/>
                Robert<br/>
                <br/>
                <br/>
              </div>
              <div class="moz-cite-prefix">On 6/4/21 12:36 PM, Robert
                wrote:<br/>
              </div>
              <blockquote type="cite" cite="mid:n23wnbUwGw2wMIxOOu-mPD8niO5UREKvqUkPrAe9NRseu1S4Ld208KPpZE1ljmxwbiWxMp476bGrC3lMvRYK5g==@protonmail.internalid">
                <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
                <div>Oh! Heading for a coffee with my nurse. I realized
                  I may be passing the field into the primitive instead
                  of the field size. I’ll check it when I get back home!<caret></caret></div>
                <div><br/>
                </div>
                <div id="protonmail_signature_block" class="protonmail_signature_block">
                  <div>
                    <div>Kindly,<br/>
                      Robert<br/>
                      . .. ... ‘...^,^ </div>
                  </div>
                </div>
                <div><br/>
                </div>
                <div><br/>
                </div>
                On Fri, Jun 4, 2021 at 12:12, Robert Withers <<a href="mailto:robert.withers@pm.me" class="" moz-do-not-send="true">robert.withers@pm.me</a>>
                wrote:
                <blockquote class="protonmail_quote" type="cite">
                  <blockquote> </blockquote>
                  <pre class="lang-c s-code-block hljs"><code><span class="hljs-function">Oh! I forgot to relocate leaves that have already been plugganized. This leaves (heh) 3 possible plugganizations that all instantiate ByteArrays. Here, I fixed it.</span></code>
<code><span class="hljs-function"></span></code></pre>
                  <blockquote>
                    <pre class="lang-c s-code-block hljs"><code><span class="hljs-function">WITH GF & GFPOLY PRIMITIVES AND DECODER <span class="hljs-title">PRIMITIVES</span>
<span class="hljs-params">(<span class="hljs-number">3</span> asterix <span class="hljs-keyword">for</span> in-progress plugganization)

</span> - 22194 tallies, 22648 msec.

</span></code><code><span class="hljs-function">**Leaves**
29.1% </span>{<span class="hljs-number">6586</span>ms} RSFECDecoderWithPlugin>>decode:twoS:
<span class="hljs-number">14.7</span>% {<span class="hljs-number">3329</span>ms} RSFECGenericGFPoly <span class="hljs-class"><span class="hljs-keyword">class</span>></span>>newField:coefficients:
<span class="hljs-number">1.0</span>% {<span class="hljs-number">237</span>ms} RSFECDecoderWithPlugin>>runEuclideanAlgorithmPoly:poly:rDegrees:</code></pre>
                  </blockquote>
                  <pre class="lang-c s-code-block hljs"><code></code>Calls to plugganized GF/GFPoly methods, so I think these are as optimized as possible:</pre>
                  <blockquote>
                    <pre class="lang-c s-code-block hljs"><code><span class="hljs-number">7.3</span>% {<span class="hljs-number">1646</span>ms} RSFECDecoderWithPlugin>>primFindErrorLocationsDegree:coefficients:result:fieldSize:
<span class="hljs-number">2.9</span>% {<span class="hljs-number">654</span>ms} RSFECDecoderWithPlugin>>findErrorMagnitudes:errorLocations:
<span class="hljs-number"></span></code><code><span class="hljs-number">1.4</span>% {<span class="hljs-number">317</span>ms} RSFECGenericGFWithPlugin>><span class="hljs-built_in">log</span>:
</code></pre>
                  </blockquote>
                  <pre class="lang-c s-code-block hljs"><code> </code></pre>
                  <div class="moz-signature">---<br/>
                    Kindly,<br/>
                    Robert<br/>
                    <br/>
                    <br/>
                  </div>
                  <div class="moz-cite-prefix">On 6/4/21 12:02 PM,
                    Robert Withers wrote:<br/>
                  </div>
                  <blockquote type="cite">
                    <blockquote>
                      <pre class="lang-c s-code-block hljs"><code><span class="hljs-function">WITH GF & GFPOLY PRIMITIVES AND DECODER <span class="hljs-title">PRIMITIVES</span>
<span class="hljs-params">(<span class="hljs-number">3</span> asterix <span class="hljs-keyword">for</span> in-progress plugganization)

</span> - 22194 tallies, 22648 msec.

</span></code><code><span class="hljs-function">**Leaves**
29.1% </span>{<span class="hljs-number">6586</span>ms} RSFECDecoderWithPlugin>>decode:twoS:
<span class="hljs-number">14.7</span>% {<span class="hljs-number">3329</span>ms} RSFECGenericGFPoly <span class="hljs-class"><span class="hljs-keyword">class</span>></span>>newField:coefficients:
<span class="hljs-number">7.3</span>% {<span class="hljs-number">1646</span>ms} RSFECDecoderWithPlugin>>primFindErrorLocationsDegree:coefficients:result:fieldSize:
<span class="hljs-number">2.9</span>% {<span class="hljs-number">654</span>ms} RSFECDecoderWithPlugin>>findErrorMagnitudes:errorLocations:
<span class="hljs-number">1.0</span>% {<span class="hljs-number">237</span>ms} RSFECDecoderWithPlugin>>runEuclideanAlgorithmPoly:poly:rDegrees:</code></pre>
                    </blockquote>
                    <pre class="lang-c s-code-block hljs"><code></code>Calls to plugganized GF/GFPoly methods:</pre>
                    <blockquote> <code><span class="hljs-number">1.4</span>%
                        {<span class="hljs-number">317</span>ms}
                        RSFECGenericGFWithPlugin>><span class="hljs-built_in">log</span>: </code></blockquote>
                  </blockquote>
                </blockquote>
                <div><br/>
                </div>
                <div><br/>
                </div>
              </blockquote>
            </blockquote>
          </blockquote>
        </blockquote>
      </blockquote>
    </blockquote>


</body></html>