Skip to content

Commit

Permalink
Automated publish
Browse files Browse the repository at this point in the history
  • Loading branch information
Github Actions committed Apr 26, 2024
1 parent bcd08d8 commit 87039f9
Show file tree
Hide file tree
Showing 8 changed files with 201 additions and 201 deletions.
2 changes: 1 addition & 1 deletion blog/2022-12-08-progress-update/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<span class="line"><span style="color:#88846f">// to read, but the shape of the code is the same.</span></span>
<span class="line"><span style="color:#f8f8f2">object_ptr if_result;</span></span>
<span class="line"><span style="color:#f8f8f2">object_ptr even_result{ even_QMARK-&gt;</span><span style="color:#a6e22e">call</span><span style="color:#f8f8f2">(n) };</span></span>
<span class="line"><span style="color:#f92672">if</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e;text-decoration:underline">jank</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e;text-decoration:underline">runtime</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e;text-decoration:underline">detail</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">truthy</span><span style="color:#f8f8f2">(even_result))</span></span>
<span class="line"><span style="color:#f92672">if</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">jank</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">runtime</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">detail</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">truthy</span><span style="color:#f8f8f2">(even_result))</span></span>
<span class="line"><span style="color:#f8f8f2">{ if_result </span><span style="color:#f92672">=</span><span style="color:#f8f8f2"> kw_foo; }</span></span>
<span class="line"><span style="color:#f92672">else</span></span>
<span class="line"><span style="color:#f8f8f2">{ if_result </span><span style="color:#f92672">=</span><span style="color:#f8f8f2"> kw_bar; }</span></span>
Expand Down
106 changes: 53 additions & 53 deletions blog/2023-01-13-optimizing-sequences/index.html

Large diffs are not rendered by default.

122 changes: 61 additions & 61 deletions blog/2023-04-07-ray-tracing/index.html

Large diffs are not rendered by default.

136 changes: 68 additions & 68 deletions blog/2023-07-08-object-model/index.html

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions blog/2023-12-17-module-loading/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -54,31 +54,31 @@
<span class="line"><span style="color:#f92672">|</span><span style="color:#f92672"> |</span><span style="color:#f92672"> |</span></span>
<span class="line"><span style="color:#f92672">|</span><span style="color:#f92672"> |</span><span style="color:#88846f"> /* How many fixed arguments are required before the packed args? */</span></span>
<span class="line"><span style="color:#f92672">|</span><span style="color:#88846f"> /* Is there an ambiguous overload? */</span></span>
<span class="line"><span style="color:#88846f">/* Is the function variadic? */</span></span></code></pre><p>From there, when we use it, we disable the bit for question 2 and we <code>switch</code> on the rest. This allows us to do a <code>O(1)</code> jump on the combination of whether it's variadic and the required fixed args. Finally, we only need the question 2 bit to disambiguate one branch of each switch, which is the branch equal to however many arguments we received.<pre class="shiki monokai"style="background-color:#272822;color:#f8f8f2"tabindex="0"><code><span class="line"><span style="color:#a6e22e;text-decoration:underline">object_ptr</span><span style="color:#a6e22e"> dynamic_call</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e;text-decoration:underline">object_ptr</span><span style="color:#f92672"> const</span><span style="color:#fd971f;font-style:italic"> source</span><span style="color:#f8f8f2">, </span><span style="color:#a6e22e;text-decoration:underline">object_ptr</span><span style="color:#f92672"> const</span><span style="color:#fd971f;font-style:italic"> a1</span><span style="color:#f8f8f2">)</span></span>
<span class="line"><span style="color:#88846f">/* Is the function variadic? */</span></span></code></pre><p>From there, when we use it, we disable the bit for question 2 and we <code>switch</code> on the rest. This allows us to do a <code>O(1)</code> jump on the combination of whether it's variadic and the required fixed args. Finally, we only need the question 2 bit to disambiguate one branch of each switch, which is the branch equal to however many arguments we received.<pre class="shiki monokai"style="background-color:#272822;color:#f8f8f2"tabindex="0"><code><span class="line"><span style="color:#a6e22e">object_ptr</span><span style="color:#a6e22e"> dynamic_call</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">object_ptr</span><span style="color:#f92672"> const</span><span style="color:#fd971f;font-style:italic"> source</span><span style="color:#f8f8f2">, </span><span style="color:#a6e22e">object_ptr</span><span style="color:#f92672"> const</span><span style="color:#fd971f;font-style:italic"> a1</span><span style="color:#f8f8f2">)</span></span>
<span class="line"><span style="color:#f8f8f2">{</span></span>
<span class="line"><span style="color:#f92672"> return</span><span style="color:#f8f8f2"> visit_object</span></span>
<span class="line"><span style="color:#f8f8f2"> (</span></span>
<span class="line"><span style="color:#f8f8f2"> [</span><span style="color:#f92672">=</span><span style="color:#f8f8f2">](</span><span style="color:#66d9ef;font-style:italic">auto</span><span style="color:#f92672"> const</span><span style="color:#fd971f;font-style:italic"> typed_source</span><span style="color:#f8f8f2">) -&gt; </span><span style="color:#66d9ef;font-style:italic">object_ptr</span></span>
<span class="line"><span style="color:#f8f8f2"> {</span></span>
<span class="line"><span style="color:#f92672"> using</span><span> </span><span style="color:#a6e22e;text-decoration:underline">T</span><span style="color:#f92672"> =</span><span style="color:#f92672"> typename</span><span style="color:#66d9ef;font-style:italic"> decltype</span><span style="color:#f8f8f2">(typed_source)::value_type;</span></span>
<span class="line"><span style="color:#f92672"> using</span><span style="color:#a6e22e"> T</span><span style="color:#f92672"> =</span><span style="color:#f92672"> typename</span><span style="color:#66d9ef;font-style:italic"> decltype</span><span style="color:#f8f8f2">(typed_source)::value_type;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#f92672"> if</span><span style="color:#f92672"> constexpr</span><span style="color:#f8f8f2">(function_like</span><span style="color:#f92672">&lt;</span><span style="color:#f8f8f2">T</span><span style="color:#f92672">&gt;</span><span style="color:#f92672"> ||</span><span> </span><span style="color:#a6e22e;text-decoration:underline">std</span><span style="color:#f8f8f2">::is_base_of_v</span><span style="color:#f92672">&lt;</span><span style="color:#f8f8f2">callable, T</span><span style="color:#f92672">&gt;</span><span style="color:#f8f8f2">)</span></span>
<span class="line"><span style="color:#f92672"> if</span><span style="color:#f92672"> constexpr</span><span style="color:#f8f8f2">(function_like</span><span style="color:#f92672">&lt;</span><span style="color:#f8f8f2">T</span><span style="color:#f92672">&gt;</span><span style="color:#f92672"> ||</span><span style="color:#a6e22e"> std</span><span style="color:#f8f8f2">::is_base_of_v</span><span style="color:#f92672">&lt;</span><span style="color:#f8f8f2">callable, T</span><span style="color:#f92672">&gt;</span><span style="color:#f8f8f2">)</span></span>
<span class="line"><span style="color:#f8f8f2"> {</span></span>
<span class="line"><span style="color:#88846f"> /* This is the whole byte, answering all three questions. */</span></span>
<span class="line"><span style="color:#66d9ef;font-style:italic"> auto</span><span style="color:#f92672"> const</span><span style="color:#a6e22e"> arity_flags</span><span style="color:#f8f8f2">(typed_source-&gt;</span><span style="color:#a6e22e">get_arity_flags</span><span style="color:#f8f8f2">());</span></span>
<span class="line"><span style="color:#88846f"> /* We strip out the bit for ambiguous checking and switch on it. */</span></span>
<span class="line"><span style="color:#66d9ef;font-style:italic"> auto</span><span style="color:#f92672"> const</span><span style="color:#a6e22e"> mask</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e;text-decoration:underline">callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">extract_variadic_arity_mask</span><span style="color:#f8f8f2">(arity_flags));</span></span>
<span class="line"><span style="color:#66d9ef;font-style:italic"> auto</span><span style="color:#f92672"> const</span><span style="color:#a6e22e"> mask</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">extract_variadic_arity_mask</span><span style="color:#f8f8f2">(arity_flags));</span></span>
<span class="line"></span>
<span class="line"><span style="color:#88846f"> /* We're matching on variadic + required arg position. */</span></span>
<span class="line"><span style="color:#f92672"> switch</span><span style="color:#f8f8f2">(mask)</span></span>
<span class="line"><span style="color:#f8f8f2"> {</span></span>
<span class="line"><span style="color:#f92672"> case</span><span> </span><span style="color:#a6e22e;text-decoration:underline">callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">mask_variadic_arity</span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff">0</span><span style="color:#f8f8f2">):</span></span>
<span class="line"><span style="color:#f92672"> return</span><span style="color:#f8f8f2"> typed_source-&gt;</span><span style="color:#a6e22e">call</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">make_box</span><span style="color:#f8f8f2">&lt;</span><span style="color:#a6e22e;text-decoration:underline">obj</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e;text-decoration:underline">native_array_sequence</span><span style="color:#f8f8f2">&gt;(a1));</span></span>
<span class="line"><span style="color:#f92672"> case</span><span> </span><span style="color:#a6e22e;text-decoration:underline">callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">mask_variadic_arity</span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff">1</span><span style="color:#f8f8f2">):</span></span>
<span class="line"><span style="color:#f92672"> case</span><span style="color:#a6e22e"> callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">mask_variadic_arity</span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff">0</span><span style="color:#f8f8f2">):</span></span>
<span class="line"><span style="color:#f92672"> return</span><span style="color:#f8f8f2"> typed_source-&gt;</span><span style="color:#a6e22e">call</span><span style="color:#f8f8f2">(</span><span style="color:#a6e22e">make_box</span><span style="color:#f8f8f2">&lt;</span><span style="color:#a6e22e">obj</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">native_array_sequence</span><span style="color:#f8f8f2">&gt;(a1));</span></span>
<span class="line"><span style="color:#f92672"> case</span><span style="color:#a6e22e"> callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">mask_variadic_arity</span><span style="color:#f8f8f2">(</span><span style="color:#ae81ff">1</span><span style="color:#f8f8f2">):</span></span>
<span class="line"><span style="color:#88846f"> /* Only in the case where the arg count == the required arity do we</span></span>
<span class="line"><span style="color:#88846f"> check the extra bit in the flags. */</span></span>
<span class="line"><span style="color:#f92672"> if</span><span style="color:#f8f8f2">(</span><span style="color:#f92672">!</span><span style="color:#a6e22e;text-decoration:underline">callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">is_variadic_ambiguous</span><span style="color:#f8f8f2">(arity_flags))</span></span>
<span class="line"><span style="color:#f8f8f2"> { </span><span style="color:#f92672">return</span><span style="color:#f8f8f2"> typed_source-&gt;</span><span style="color:#a6e22e">call</span><span style="color:#f8f8f2">(a1, </span><span style="color:#a6e22e;text-decoration:underline">obj</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e;text-decoration:underline">nil</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">nil_const</span><span style="color:#f8f8f2">()); }</span></span>
<span class="line"><span style="color:#f92672"> if</span><span style="color:#f8f8f2">(</span><span style="color:#f92672">!</span><span style="color:#a6e22e">callable</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">is_variadic_ambiguous</span><span style="color:#f8f8f2">(arity_flags))</span></span>
<span class="line"><span style="color:#f8f8f2"> { </span><span style="color:#f92672">return</span><span style="color:#f8f8f2"> typed_source-&gt;</span><span style="color:#a6e22e">call</span><span style="color:#f8f8f2">(a1, </span><span style="color:#a6e22e">obj</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">nil</span><span style="color:#f8f8f2">::</span><span style="color:#a6e22e">nil_const</span><span style="color:#f8f8f2">()); }</span></span>
<span class="line"><span style="color:#88846f"> /* We're falling through! */</span></span>
<span class="line"><span style="color:#f92672"> default</span><span style="color:#f8f8f2">:</span></span>
<span class="line"><span style="color:#88846f"> /* The default case is not variadic. */</span></span>
Expand Down
Loading

0 comments on commit 87039f9

Please sign in to comment.