<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  </head>
  <body>
    <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>


</body></html>