)]}'
{
  "log": [
    {
      "commit": "c8adb641be21ef1660ee80e8234257c5173006c0",
      "tree": "80effe13f088056adbda72eba03fea7c687c4be6",
      "parents": [
        "75f3577d0f36e95d260f147d9be3a1d98971ac78"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@apache.org",
        "time": "Tue Jun 30 20:16:18 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jun 30 20:16:58 2026 -0400"
      },
      "message": "Version 2.0.2\n"
    },
    {
      "commit": "75f3577d0f36e95d260f147d9be3a1d98971ac78",
      "tree": "0a9f4456439be5aff02ef28b4e14e4e47e56919c",
      "parents": [
        "c26d934186e12b890a38505756b9b7c72e41207e"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Jun 30 17:22:52 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jun 30 20:14:16 2026 -0400"
      },
      "message": "Fix out-of-bounds heap write in string encoder\n\nPreviously if we had a run of unescaped bytes copid as a single memcpy after\nreserving space with enc_ensure(run), enc_ensure() could report success without\nactually growing the buffer so the memcpy would have overwritten memory. There\nis a good chance it fell around the memory allocate heap metadata so the crash\nmight have shown up the allocator calls in OTP.\n\nThis would be pretty hard to hit, it would be something like long strings\nstarting with lots escapes (to push e-\u003ei high enough) then also followed by\nlong runs of non-escapes. That explains why property tests never caught this.\n\nThe fix is to check the buffer size if he have a buffer already before\nreturning. If it\u0027s too small, return otherwise release and allocate one of the\nright size.\n\nTo ensure we catch these kind of errors in the future, enhance property tests\nby switching to PropEr (code borrowed from Apache CouchDB). For\nbelt-and-suspenders and also added some determistic tests as well for the\nissue.\n\nFix https://github.com/davisp/jiffy/issues/303\n"
    },
    {
      "commit": "c26d934186e12b890a38505756b9b7c72e41207e",
      "tree": "ec29c867a7d1666e89d274e449781055c44c8b47",
      "parents": [
        "172c8bdc252d6eecb76b92cfdd3235ee27c9cf27"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Jun 14 01:01:56 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jun 16 11:10:53 2026 -0400"
      },
      "message": "Encode maps directly without an intermediate EJSON proplist\n\nEncode a map from a flat `[k1, v1, ...]` list built from a map itertor instead\n`{k,v}` tuples. To drive yielding properly a new `$map_ref$` stack marker but\notherwise it\u0027s a regular old list.\n\nSaw a 5% median speedup on tests with lots of json objects like `gsoc` and\nneutral on others.\n"
    },
    {
      "commit": "172c8bdc252d6eecb76b92cfdd3235ee27c9cf27",
      "tree": "59000151bbfe4936c572f5dce2b50e3020251c35",
      "parents": [
        "b74c78357478237b6eae2c60df3938c71e0cee3e"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Jun 14 01:06:04 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 15 12:52:42 2026 -0400"
      },
      "message": " Reduce encoder memory allocations\n\nFlush the buffer into iolist segments with a chunk size that doubles (up to\n64KB). Large documents should now have O(log n) allocation.\n\nWe can use tprof to check allocation with OTP 27+. Example of memory profiling\nbefore and after with `canada.json` from bench data:\n\n```\n{ok, B} \u003d file:read_file(\"data/canada.json\").\nT \u003d jiffy:decode(B, [return_maps]).\ntprof:profile(jiffy, encode, [T], #{type \u003d\u003e call_memory}).\n```\n\nBefore\n```\n****** Process \u003c0.114.0\u003e  --  100.00% of total ***\nFUNCTION                 CALLS  WORDS  PER CALL  [    %]\nlists:reverse/1              1      4      4.00  [ 0.03]\nlists:reverse/2              1   2062   2062.00  [14.21]\njiffy:nif_encode_init/2      1  12441  12441.00  [85.76]\n                                14507            [100.0]\n```\n\nAfter\n```\n****** Process \u003c0.101.0\u003e  --  100.00% of total ***\nFUNCTION                 CALLS  WORDS  PER CALL  [    %]\nlists:reverse/1              1      4      4.00  [ 0.29]\nlists:reverse/2              1     68     68.00  [ 4.88]\njiffy:nif_encode_init/2      1   1321   1321.00  [94.83]\n```\n\nThis shows a good speed improvment on some benchmarks especially ones with\nlarger objects. Saw about ~6% speedup on on object-heavy benchmarks\n(citm, pokedex, github):. Larger ones like \"canada\" showed about a ~1.25x\nspeedup.\n"
    },
    {
      "commit": "b74c78357478237b6eae2c60df3938c71e0cee3e",
      "tree": "8d5ce27cc764bd913402354699a4a9c3b3f0b4b6",
      "parents": [
        "e2411f566346aa4f07be4efd76391e5952866760"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 12 20:18:14 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 12 20:20:31 2026 -0400"
      },
      "message": "Version 2.0.1\n"
    },
    {
      "commit": "e2411f566346aa4f07be4efd76391e5952866760",
      "tree": "0a06c9c290ae03c7442f759f43efd8806baed20a",
      "parents": [
        "6a6ccd4fb8e216f38265bc88207d0f1421fc5aa4"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 12 20:11:14 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 12 20:14:59 2026 -0400"
      },
      "message": "Update ffc.h : faster numbers parsing\n\nA quick microbench showed 10% speedup on numbers.json.\n\nUpstream PR: https://github.com/kolemannix/ffc.h/pull/23\n"
    },
    {
      "commit": "6a6ccd4fb8e216f38265bc88207d0f1421fc5aa4",
      "tree": "9f58802bfb5fcf6394917275dcbf7532d4360617",
      "parents": [
        "1f412fc1c9f4b1fdc61d5dbd0ed962c842c565d5"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 12 18:38:05 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 12 18:46:41 2026 -0400"
      },
      "message": "Add OTP 29 support. Fix beam Windows 2025 CI.\n"
    },
    {
      "commit": "1f412fc1c9f4b1fdc61d5dbd0ed962c842c565d5",
      "tree": "bcce8c04caa4f4ec3539b1d2320271b840ec1115",
      "parents": [
        "320f0d681a37ff199483b3c0f3d6d4eb5bdda547"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 12 18:00:05 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 12 18:46:41 2026 -0400"
      },
      "message": "Fix unitialized var access on allocation failure\n\nFix two places where we didn\u0027t handle allocation failures. While\n`enif_alloc_resource()` blows up on allocation failure, `enif_alloc()` and\n`enif_alloc_binary()` don\u0027t. During encoder and decoder resource creation if\nsmall (a few KB) mallocs fail we could end up calling the resource destructor\nwith some uninitalized flags like `have_buffer`.\n\nTo prevent this class of errors in the future opt to memset the encoder and\ndecoder structure so new fields in the future are by default 0-initialized.\n\nThanks to @qzhuyan (William) in https://github.com/davisp/jiffy/pull/296 for\npointing this issue out and providing a fix.\n"
    },
    {
      "commit": "320f0d681a37ff199483b3c0f3d6d4eb5bdda547",
      "tree": "db71ee5e03010dff90bbdbabde546ce356cad3e9",
      "parents": [
        "2cd848450795a92c0cfc9e09533145bcd5be1f75"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jun 08 22:13:18 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 08 22:15:24 2026 -0400"
      },
      "message": "Fixup license name to make Hex happy\n\nHex wants a specific BSD license type or it won\u0027t let us publish.\n\nConferring with Paul we decided on a 3-clause version.\n"
    },
    {
      "commit": "2cd848450795a92c0cfc9e09533145bcd5be1f75",
      "tree": "73d673ba5f81e148b891b4221eb01bb423e81773",
      "parents": [
        "834a3d44230781619627fc5d6a860f5a37dde32e"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon May 04 22:43:07 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon May 04 22:44:51 2026 -0400"
      },
      "message": "Fix typo\n"
    },
    {
      "commit": "834a3d44230781619627fc5d6a860f5a37dde32e",
      "tree": "cbeb93b9d75328d13baa805bd62983412a3cd21d",
      "parents": [
        "83a470a574c543812a11b6dd92dd2698eb00c615"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon May 04 18:41:03 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon May 04 22:33:47 2026 -0400"
      },
      "message": "Remove EEP0018 references\n\nAdd a blurb about not blocking dirty CPU schedulers\n"
    },
    {
      "commit": "83a470a574c543812a11b6dd92dd2698eb00c615",
      "tree": "cc3ee7f19e00ca2fdc5cd086f287798c03a5cb1c",
      "parents": [
        "81f1918f680dde7b1274decdd17023112b02e577"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 25 12:07:30 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 25 12:07:30 2026 -0400"
      },
      "message": "Version 2.0.0\n\nPerformance\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\n - **SIMD vectorization** for ASCII scan-ahead loops in both decoder string parsing and encoder\n  string emission. This meant replacing the byte-at-a-time scans with 16/32-byte chunked compares.\n  The most interesting part is it was done without writing a single line of assembly, just relying\n  on compiler auto-vectorization. This showed a **15x** performance improvement on encoding large\n  strings like in the \"Issue 90\" benchmark. To get even better auto-vectorizer behavior, it\u0027s\n  advisable to set `-march\u003dnative` or `-march\u003dx86-64-v3`. That can make the auto-vectorizers on\n  recent compilers switch to using 256bit AVX2 registers and instructions.\n\n- **UTF-8 skip-ahead in encoder** and faster UTF-8 validation. This is like the scan-ahead loop for\n  ASCII, but it\u0027s for UTF-8 validation. This helps quite a bit on non-ASCII, Unicode-heavy inputs.\n  \"UTF-8 unescaped\" benchmark got a **5.8x** speedup from it.\n\n- Use **Ryu** for number encoding. This is the exact Ryu version from the latest Erlang/OTP release\n  with all the updates and tweaks they added. This makes the float output the same as Erlang\u0027s.\n  However, this means the output is not exactly the same as before for Jiffy (we used to emit more\n  fractional digits, now it switches to the scientific notation a bit earlier). Number heavy\n  benchmarks like \"Canada\" showed a **2x** speedup.\n\n- **ffc.h** for number parsing in the decoder. This is the fastest C number parser around at this\n  time. I worked with the upstream author to add a new API to it parse JSON numbers as a single call\n  which returns back either an integer or a double, as opposed pre-parsing to figure out which is\n  which first (https://github.com/kolemannix/ffc.h/pull/22). Using this library yielded a **4x**\n  speedup in the number-heavy \"Canada\" benchmark on decoding.\n\n- **Faster array and map creation** for building the result term in fewer steps. (In the processes\n  discovered that maps with duplicates created from NIFs were subtly broken in Erlang\n  https://github.com/erlang/otp/pull/10976. The fix is now merged and should be in the recent patch\n  Erlang releases). This bulk creation improved decoding across the board. Some examples are\n  **2.5x** for \"JSON Generator\", **2.6x** for \"Github\" and **3.3x** for \"Blockchain\". Most of those\n  a mixed inputs so number parsing and scan-ahead played a role in there as well.\n\n- **Branch hints** (`JIFFY_LIKELY` / `JIFFY_UNLIKELY`) on encoder hot paths. I saw QuickJS library\n  doing this, so experimented around and saw few percent speedup from it.\n\n- **Unity build**. Having handled a few issues over the years related to enabling, disabling and\n  detecting LTO (Link-time optimization) compiler features, decided to side-step it and go with a\n  unity build. This is where we include all the source file into one `jiffy.c` file and compile\n  that. We get all the benefits of LTO but without having to juggle linker flags.\n\nYielding \u0026 scheduler behavior\n\n- **Reduction count bumped to 4000** to match current Erlang VM defaults\n\n- **Bytes per reduction lowered** so cooperative yields fire more\n  often on long input. This results in better latency under contention without a\n  measurable throughput hit.\n\nSince Jiffy is a NIF, it\u0027s crucial for it to never block schedulers and always yield appropriately.\nAs the concurrency increases it should degrade gracefully in proportion to the applied load. This is\nnot a trivial task to accomplish in a NIF, in general. Some json library NIFs use dirty schedulers,\nhowever in cases where Jiffy is used that wouldn\u0027t work as that is still a limited resource and\nduring high concurrency it would lead to bottlenecks.\n\nA separate benchmark, `bench_scheduling.sh` in https://github.com/nickva/bench runs concurrent JSON\nencoding and decoding scaled by the number of schedulers. Testing with a few Erlang json libraries\nshows something like this:\n\n```\n./bench_scheduling.sh\n...\nscheduler responsiveness check\n  input:       citm-catalog.json duration: 2000\n  schedulers:  12 online\n  impls:       json, jiffy, simdjsone, jsone, jsx\n\n[json]\n  1x encdec                    n\u003d84 p50\u003d135.0ms p95\u003d182.9ms p99\u003d191.9ms max\u003d196.7ms\n  12x encdec                   n\u003d86 p50\u003d129.7ms p95\u003d189.9ms p99\u003d203.0ms max\u003d206.2ms\n  24x encdec                   n\u003d87 p50\u003d263.0ms p95\u003d461.2ms p99\u003d506.1ms max\u003d527.1ms\n\n[jiffy]\n  1x encdec                    n\u003d309 p50\u003d38.3ms p95\u003d51.9ms p99\u003d57.4ms max\u003d66.5ms\n  12x encdec                   n\u003d300 p50\u003d41.2ms p95\u003d52.5ms p99\u003d59.7ms max\u003d66.2ms\n  24x encdec                   n\u003d306 p50\u003d80.2ms p95\u003d111.8ms p99\u003d118.8ms max\u003d140.1ms\n\n[simdjsone]\n  1x encdec                    n\u003d20 p50\u003d690.1ms p95\u003d784.6ms p99\u003d784.6ms max\u003d784.8ms\n  12x encdec                   n\u003d16 p50\u003d790.9ms p95\u003d887.5ms p99\u003d887.5ms max\u003d899.9ms\n  24x encdec                   n\u003d24 p50\u003d1448.4ms p95\u003d1876.7ms p99\u003d1879.5ms max\u003d1882.7ms\n\n[jsone]\n  1x encdec                    n\u003d60 p50\u003d213.1ms p95\u003d261.8ms p99\u003d263.9ms max\u003d264.8ms\n  12x encdec                   n\u003d60 p50\u003d204.9ms p95\u003d329.8ms p99\u003d345.0ms max\u003d350.9ms\n  24x encdec                   n\u003d52 p50\u003d440.1ms p95\u003d700.3ms p99\u003d773.3ms max\u003d817.3ms\n\n[jsx]\n  1x encdec                    n\u003d24 p50\u003d398.8ms p95\u003d539.0ms p99\u003d544.1ms max\u003d548.3ms\n  12x encdec                   n\u003d24 p50\u003d391.5ms p95\u003d684.9ms p99\u003d687.0ms max\u003d689.6ms\n  24x encdec                   n\u003d24 p50\u003d1181.3ms p95\u003d1479.0ms p99\u003d1558.1ms max\u003d1654.7ms\n```\n\nThere we measure both the latency of sending a term back and forth between two encoder/decoder\nprocesses, as well as the throughput (`n` is how many times we managed to do that).\n\nFeatures\n\n- **Pre-encoded JSON** — embed already-encoded JSON fragments directly in a value being encoded,\n  saving a round-trip through the decoder. Use `{json, IoData}` terms and they will be embedded in\n  the emitted stream as is. This was a surprisingly popular feature over the years. Paul J. Davis\n  (Jiffy\u0027s original author) suggested a nice and quick patch to make it work so I went with that.\n\n- **Encode UTF-8 atoms** (on OTP 26+ only!) atoms with non-ASCII bytes now encode as their UTF-8\n  source. Unfortunately this is for OTP 26+ only.\n\n- **Number-as-key encoding** — integer/float map keys are encoded as string keys instead of\n  erroring. Both Python and Erlang/OTP\u0027s built-in json already does this.\n\nCorrectness \u0026 compliance\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\n- **RFC 8259 100% compliance.** A new test suite based on `nst/JSONTestSuite` is wired in and all\n  conformance tests pass.\n\n- **Big List of Naughty Strings (BLNS)** added in the test mix.\n\nBuild \u0026 CI\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\n- **OTP 21** is the new minimum.\n\n- **C coverage checks** added so the test suite reports per-file C line coverage; several uncovered\n  paths were closed during this work.\n"
    },
    {
      "commit": "81f1918f680dde7b1274decdd17023112b02e577",
      "tree": "bf61fdd3d6b69a99dcd32e9b97976146b4391e03",
      "parents": [
        "62c80e72268411ce83cb87c6a839ea5ec249208c"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 23 14:22:57 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 24 14:39:15 2026 -0400"
      },
      "message": "Skip-ahead for UTF8 encoding\n\nJust like we do it for ASCII-only input, this should help unicode-heavy input.\n"
    },
    {
      "commit": "62c80e72268411ce83cb87c6a839ea5ec249208c",
      "tree": "8ce67c579b7f70c1972b90bf55202d56f1a362e5",
      "parents": [
        "3e3a06bf5cf9d4301bbaab93cb01bd4cd2c8a35e"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 24 00:10:05 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 24 00:16:41 2026 -0400"
      },
      "message": "Remove dead yielding code\n\nLooking at scheduling and yielding noticed we had a whole bunch of dead code\nhanging around. Nothing calls iterator code in Erlang any longer, all our\nscheduling is done in C now.\n\nOn one hand it\u0027s a bit silly to keep the functions named `_init` but, on the\nother hand, I think it kind of makes sense, since they are still following init\n+ iter pattern, just that the iteration continues in C.\n"
    },
    {
      "commit": "3e3a06bf5cf9d4301bbaab93cb01bd4cd2c8a35e",
      "tree": "661234bdef6f3aac6a2b22d5431fd9cb869aab13",
      "parents": [
        "bd7df5f12fc87373e1400ec461d8408086f45f75"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 23 22:20:41 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 23 22:39:38 2026 -0400"
      },
      "message": "Implement pre-encoded json\n\nThere have been issues raised and at at least two PRs trying to implement this over\nthe years:\n\nhttps://github.com/davisp/jiffy/issues/128\nhttps://github.com/davisp/jiffy/pull/139\nhttps://github.com/davisp/jiffy/pull/140\n\nHere we\u0027ll just go with @davisp\u0027s neat idea from\nhttps://github.com/davisp/jiffy/commit/46136403945d03224f9e7fe545ebbfdf5dfae057\nwith a few tests attached. It\u0027s minimal and does what most folks seem to want.\n\nCo-authored-by: Paul J. Davis \u003cpaul.joseph.davis@gmail.com\u003e\n"
    },
    {
      "commit": "bd7df5f12fc87373e1400ec461d8408086f45f75",
      "tree": "42ede262ec06f7c7c0122051b1b0dd58d25453c9",
      "parents": [
        "465193c6cdaf9abb1608fe5d8c3ce5c0c6c05f18"
      ],
      "author": {
        "name": "Feng Lee",
        "email": "feng@emqx.io",
        "time": "Sun Jan 19 10:24:46 2020 +0800"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 23 15:34:17 2026 -0400"
      },
      "message": "Export \u0027encode_options/0\u0027 and \u0027decode_options/0\u0027 types\n"
    },
    {
      "commit": "465193c6cdaf9abb1608fe5d8c3ce5c0c6c05f18",
      "tree": "4f6879ebe1c05fa36f4e723d7404191fecd911c7",
      "parents": [
        "25ad8b52b3f1a09d7a96541b85f2641e0a33ca41"
      ],
      "author": {
        "name": "Gaspar Chilingarov",
        "email": "gasparch@gmail.com",
        "time": "Thu Jun 29 15:12:38 2017 +0300"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 23 12:53:41 2026 -0400"
      },
      "message": "Allow number encoding as keys\n\nCo-author: Nick Vatamaniuc \u003cvatamane@apache.org\u003e\n"
    },
    {
      "commit": "25ad8b52b3f1a09d7a96541b85f2641e0a33ca41",
      "tree": "0cf80341c95f0c234baa78f6e4473c40a2101100",
      "parents": [
        "514d5485efdcdda5d499d25eead78b3af2324f3a"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 22 15:11:16 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 22 23:01:18 2026 -0400"
      },
      "message": "Encode UTF8 atoms (OTP 26+ only)\n\nAs a nice side-benefit we get to de-duplicate string encoding between atoms and\nstrings. The only snag is this is an OTP 26+ only feature. Below that ERL NIF\ninterface doesn\u0027t return atom in UTF8 format.\n\nFix https://github.com/davisp/jiffy/issues/231\n"
    },
    {
      "commit": "514d5485efdcdda5d499d25eead78b3af2324f3a",
      "tree": "3d413878d511d92404cbb93e21cd66a2bebb6579",
      "parents": [
        "9dc7d0ac7ca9ad19bc03024cc53c95c4b3f8672b"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 22 00:45:59 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 22 13:19:16 2026 -0400"
      },
      "message": "Simplify and speed up number parsing\n\nWith the ffc_parse_json_number [1] patch, and consolidating overflow atoms [2]\nin jiffy, we can now have our cake and eat it, too; that is we simplify and\nspeed-up number decoding at the same time.\n\n[1] https://github.com/kolemannix/ffc.h/pull/22\n[2] https://github.com/davisp/jiffy/pull/284\n"
    },
    {
      "commit": "9dc7d0ac7ca9ad19bc03024cc53c95c4b3f8672b",
      "tree": "585186d9c1f80943d253aa3416f651a5275c0b32",
      "parents": [
        "a81f9b716d1c56daae6e702708df3e6990fcd488"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 20 18:56:44 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Apr 21 15:40:11 2026 -0400"
      },
      "message": "Simplify numerical overflow handling for doubles\n\nPreviously, we handled the exponent and the fractional part with different\nflags and different atoms on the NIF side. There is not reason to do that since\nwe split them on e/E in Erlang anyway, so we can figure out what\u0027s what and\ndifferentiate between the two cases.\n"
    },
    {
      "commit": "a81f9b716d1c56daae6e702708df3e6990fcd488",
      "tree": "e73fb94283926385810e21157687d53080a93f1d",
      "parents": [
        "b8a2299fe4f688c2b7b022dc694f063450ab0edb"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 20 00:55:21 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Apr 20 13:47:30 2026 -0400"
      },
      "message": "Speed up UTF8 validation by about 25%\n\nUse a pseudo-simd (SWAR-like) trick to validate UTF8 faster. There are\nessentially two improvements here:\n\n   1) Use a table similar to `hexvals` to quicky get the length and knock out\n   some of the invalid cases\n\n   2) check continuation bytes in parallel by packing them into an int and then\n   applying a mask on all of them\n\nAll in all, we get a nice perf boost on UTF8-heavy benchmarks and it\u0027s not just\nstats padding since some users have data that is UTF8-heavy so it seems worthy\nat the expense of making the code a tiny bit more complicated.\n\nThe idea here is not new, and originally was presented by Keiser and Lemire in\n\"Validating UTF-8 In Less Than One Instruction Per\nByte\" (https://arxiv.org/pdf/2010.03090) and a practical C implementation of\nloading all bytes into an unsigned is form\n[yyjson](https://github.com/ibireme/yyjson).\n"
    },
    {
      "commit": "b8a2299fe4f688c2b7b022dc694f063450ab0edb",
      "tree": "1b922e8426c459ff7883ba4c9d623fee48f99457",
      "parents": [
        "c93691c63c72d75720a19c263a250c34d724d0c5"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 16 18:07:43 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 16 18:20:22 2026 -0400"
      },
      "message": "Reduce bytes per reduction a bit\n\nA scheduling benchmark test showed we had too high p99 and max values compared\nwith the built-in OTP 27 json\n\nBefore\n\u003d\u003d\u003d\u003d\u003d\n\n```\n[jiffy]\n  idle (no workers)            n\u003d2489 p50\u003d997us p95\u003d1.1ms p99\u003d1.2ms max\u003d11.5ms\n  12x decode                   n\u003d1679 p50\u003d1.5ms p95\u003d4.4ms p99\u003d10.7ms max\u003d76.7ms\n  12x encode                   n\u003d1148 p50\u003d2.8ms p95\u003d7.8ms p99\u003d12.6ms max\u003d32.2ms\n  24x decode                   n\u003d1187 p50\u003d2.4ms p95\u003d8.3ms p99\u003d13.9ms max\u003d72.2ms\n  24x encode                   n\u003d754 p50\u003d5.0ms p95\u003d10.7ms p99\u003d16.8ms max\u003d30.0ms\n  48x decode                   n\u003d750 p50\u003d4.0ms p95\u003d13.8ms p99\u003d27.6ms max\u003d58.7ms\n  48x encode                   n\u003d137 p50\u003d35.7ms p95\u003d68.7ms p99\u003d92.4ms max\u003d102.0ms\n\n[json]\n  idle (no workers)            n\u003d2500 p50\u003d997us p95\u003d1.1ms p99\u003d1.2ms max\u003d1.7ms\n  12x decode                   n\u003d2008 p50\u003d1.0ms p95\u003d3.7ms p99\u003d10.5ms max\u003d50.1ms\n  12x encode                   n\u003d1977 p50\u003d1.0ms p95\u003d4.9ms p99\u003d10.3ms max\u003d26.0ms\n  24x decode                   n\u003d2173 p50\u003d1.0ms p95\u003d2.8ms p99\u003d5.5ms max\u003d23.8ms\n  24x encode                   n\u003d1850 p50\u003d1.1ms p95\u003d5.1ms p99\u003d8.7ms max\u003d67.4ms\n  48x decode                   n\u003d1596 p50\u003d1.9ms p95\u003d4.7ms p99\u003d9.3ms max\u003d21.0ms\n  48x encode                   n\u003d1698 p50\u003d1.2ms p95\u003d6.2ms p99\u003d11.5ms max\u003d32.9ms\n```\n\nAfter\n\u003d\u003d\u003d\u003d\n\n```\n[jiffy]\n  idle (no workers)            n\u003d2500 p50\u003d998us p95\u003d1.1ms p99\u003d1.2ms max\u003d1.3ms\n  12x decode                   n\u003d2302 p50\u003d1.1ms p95\u003d2.0ms p99\u003d3.2ms max\u003d17.0ms\n  12x encode                   n\u003d1703 p50\u003d1.8ms p95\u003d3.4ms p99\u003d5.1ms max\u003d11.5ms\n  24x decode                   n\u003d1872 p50\u003d1.4ms p95\u003d3.5ms p99\u003d5.2ms max\u003d9.5ms\n  24x encode                   n\u003d1183 p50\u003d2.9ms p95\u003d6.1ms p99\u003d10.4ms max\u003d16.7ms\n\n[json]\n  idle (no workers)            n\u003d2500 p50\u003d998us p95\u003d1.1ms p99\u003d1.2ms max\u003d2.2ms\n  12x decode                   n\u003d2354 p50\u003d1.0ms p95\u003d1.8ms p99\u003d4.0ms max\u003d12.1ms\n  12x encode                   n\u003d2239 p50\u003d993us p95\u003d3.1ms p99\u003d5.7ms max\u003d13.5ms\n  24x decode                   n\u003d2216 p50\u003d1.0ms p95\u003d2.4ms p99\u003d6.0ms max\u003d15.0ms\n  24x encode                   n\u003d2155 p50\u003d1.0ms p95\u003d3.3ms p99\u003d6.8ms max\u003d14.2ms\n```\n"
    },
    {
      "commit": "c93691c63c72d75720a19c263a250c34d724d0c5",
      "tree": "1bed1b3ca8c358b6155497fc7b14aaf3cf5a955e",
      "parents": [
        "0b795ab40ab123a3cd19ba53a09cdc567156f1f7"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 16 15:53:43 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 16 16:04:48 2026 -0400"
      },
      "message": "Improve coverage even more\n\nWe slipped in some cases, for example when we bumped the reduction count. When\nadding more tests for yielding found out the `byte_per_iter` could become \u003c\n1 (made the test stuck) so add a fix to clip it to 1.\n\nThen there a few more odds and ends for string escaping and options.\n"
    },
    {
      "commit": "0b795ab40ab123a3cd19ba53a09cdc567156f1f7",
      "tree": "54371673122725f9cb31a8cab7a55ca6973a6bc2",
      "parents": [
        "c77f342ab89182c06a4bfe064fa3d365d7d26bd5"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Apr 14 13:52:48 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 16 12:31:28 2026 -0400"
      },
      "message": "Implement SIMD vectorization\n\nStructure scan-ahead logic so Clang and GCC will auto-vectorize the code.\nFor the auto-vectorizer we want a loop with a known bound and no early exit,\nwhich is a bit tricky, since the whole idea is to exit when we find a \"stop\"\ncharacter. To get the best of both worlds we scan 32 bytes at a time, and then\nhave an outer loop around that.\n\nThe title and the .h file name is also a subtle joke, as we didn\u0027t actually\nwrite a single line of SIMD assembly. However, we\u0027ve shown vectorization takes\nplace (left some command lines in the file as proof) and we still keep the code\nfairly readable.\n\nTo get an even better speed boost someone who knows they\u0027ll deploy on certain\nCPUs could choose to compile with -march\u003dnative or -march\u003dcore-avx2 or\nsomething like that. In that case the auto-vectorizing code may do an even\nbetter job and use wider AVX2 registers. Most Intel and AMD CPUs since 2013 or\nso would support that.\n"
    },
    {
      "commit": "c77f342ab89182c06a4bfe064fa3d365d7d26bd5",
      "tree": "77fb572e4e5f682f5fe1251d8de4956bd745670a",
      "parents": [
        "f6f49d1c0dce7d42d89b7b25aaab3a1ceb17c86e"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 15 23:12:57 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 15 23:37:24 2026 -0400"
      },
      "message": "Use branch predictors for encoding\n\nBranch predictors are compiler hints to structure the code such that some code\nis more/less likely to be speculatively executed. This is a technique I noticed\nin QuickJS code and figured it\u0027s worth trying here. This turns out to help in\nencoding more than decoding. I guess encoding is more \"branchy\".\n\nThe improvements are not huge, just a few percentage points, but they are\nconsistent for the majority of encoding benchmarks and with both GCC (Debian)\nand Clang (MacOS) compilers:\n\nSample of results from Debian 13/GCC\n\n```\n\u003d\u003d\u003d\u003d\u003d With input Encode Pokedex \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        1.87 K      535.83 us    +/-10.10%      541.35 us      674.64 us\njiffy (master)                  1.70 K      589.32 us    +/-11.87%      579.90 us      783.70 us\nComparison:\njiffy (branch-predictor)        1.87 K\njiffy (master)                  1.70 K - 1.10x slower +53.49 us\n\u003d\u003d\u003d\u003d\u003d With input Encode Semanticscholar Corpus \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (master)                   20.13       49.68 ms     +/-4.94%       49.70 ms       58.81 ms\njiffy (branch-predictor)         19.37       51.64 ms    +/-11.48%       50.40 ms       62.91 ms\nComparison:\njiffy (master)                   20.13\njiffy (branch-predictor)         19.37 - 1.04x slower +1.95 ms\n\u003d\u003d\u003d\u003d\u003d With input Encode Twitter \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        272.86        3.66 ms    +/-14.99%        3.55 ms        5.15 ms\njiffy (master)                  252.14        3.97 ms    +/-14.50%        3.83 ms        5.18 ms\nComparison:\njiffy (branch-predictor)        272.86\njiffy (master)                  252.14 - 1.08x slower +0.30 ms\n\u003d\u003d\u003d\u003d\u003d With input Encode UTF-8 escaped \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        8.88 K      112.59 us     +/-0.76%      112.45 us      115.26 us\njiffy (master)                  8.44 K      118.48 us     +/-1.41%      118.07 us      124.21 us\nComparison:\njiffy (branch-predictor)        8.88 K\njiffy (master)                  8.44 K - 1.05x slower +5.89 us\n\u003d\u003d\u003d\u003d\u003d With input Encode UTF-8 unescaped \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        8.87 K      112.73 us     +/-0.72%      112.58 us      115.29 us\njiffy (master)                  8.48 K      117.87 us     +/-0.67%      117.84 us      120.02 us\nComparison:\njiffy (branch-predictor)        8.87 K\njiffy (master)                  8.48 K - 1.05x slower +5.14 us\n```\n\nSample of results from MacOS (Clang)\n\n```\n\u003d\u003d\u003d\u003d\u003d With input Encode Pokedex \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        1.81 K      551.89 us    +/-11.53%      545.92 us      734.93 us\njiffy (master)                  1.70 K      587.50 us    +/-11.49%      580.93 us      779.05 us\nComparison:\njiffy (branch-predictor)        1.81 K\njiffy (master)                  1.70 K - 1.06x slower +35.61 us\n\u003d\u003d\u003d\u003d\u003d With input Encode Semanticscholar Corpus \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (master)                   19.34       51.70 ms     +/-9.42%       50.46 ms       64.43 ms\njiffy (branch-predictor)         19.33       51.73 ms    +/-12.60%       50.31 ms       71.43 ms\nComparison:\njiffy (master)                   19.34\njiffy (branch-predictor)         19.33 - 1.00x slower +0.0301 ms\n\u003d\u003d\u003d\u003d\u003d With input Encode Twitter \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        274.06        3.65 ms    +/-14.39%        3.52 ms        4.81 ms\njiffy (master)                  256.28        3.90 ms    +/-14.25%        3.78 ms        5.11 ms\nComparison:\njiffy (branch-predictor)        274.06\njiffy (master)                  256.28 - 1.07x slower +0.25 ms\n\u003d\u003d\u003d\u003d\u003d With input Encode UTF-8 escaped \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        8.89 K      112.47 us     +/-0.77%      112.32 us      115.13 us\njiffy (master)                  8.47 K      118.05 us     +/-0.79%      118.02 us      120.57 us\nComparison:\njiffy (branch-predictor)        8.89 K\njiffy (master)                  8.47 K - 1.05x slower +5.58 us\n\u003d\u003d\u003d\u003d\u003d With input Encode UTF-8 unescaped \u003d\u003d\u003d\u003d\u003d\nName                               ips        average  deviation         median         99th %\njiffy (branch-predictor)        8.86 K      112.90 us     +/-0.90%      112.67 us      116.13 us\njiffy (master)                  8.48 K      117.95 us     +/-0.72%      117.92 us      120.21 us\nComparison:\njiffy (branch-predictor)        8.86 K\njiffy (master)                  8.48 K - 1.04x slower +5.05 us\n```\n"
    },
    {
      "commit": "f6f49d1c0dce7d42d89b7b25aaab3a1ceb17c86e",
      "tree": "9466675a2862191ddfb1ccb5db4a64d0a21283e9",
      "parents": [
        "4c4cf905a1f2885cf42d3dea7f43d6757b508f72"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 13 22:44:00 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Apr 14 16:09:04 2026 -0400"
      },
      "message": "Use ffc.h library to parse numbers\n\nThis is currently the fastest number parsing library available in C. It\u0027s port\nof Dr. Lemire\u0027s https://github.com/fastfloat/fast_float to C by Koleman Nix and\navailable at https://github.com/kolemannix/ffc.h\n\nThe nice thing about this library is it can parse the numbers directly from the\nstream without needing a separe copy into buffer just to have a \\0 terminator\nfor strtod and strtol.\n"
    },
    {
      "commit": "4c4cf905a1f2885cf42d3dea7f43d6757b508f72",
      "tree": "753b08827b025ad21f8d418dcfdccb2c30559a5f",
      "parents": [
        "ac3c936f41987a59b8b6ad30d7cc8598ff1aafb7"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 13 17:38:10 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Apr 13 18:33:34 2026 -0400"
      },
      "message": "Optimize termstack_restore allocation\n\nWhen we restore try to get back to the memory size we had before instead of\nalways doubling\n\nh/t to @davisp for spotting this one\n"
    },
    {
      "commit": "ac3c936f41987a59b8b6ad30d7cc8598ff1aafb7",
      "tree": "cc083effb1573546f0e8bb788688fe4ee5a55e97",
      "parents": [
        "c3dce8afc2708e288caf2ed22a8387030fc136fe"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 13 16:43:58 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Apr 13 17:26:47 2026 -0400"
      },
      "message": "Fix potential segfault in termstack expansion\n\nWhen we go from a stack array to a heap in `termstack_push()`, we should copy\n`stack-\u003esize * sizeof(ERL_NIF_TERM)` number of bytes not `num_bytes`.\n`num_bytes` is the new value which is twice as large.\n\nThis means we\u0027ve been doing dirty reads and copying extra junk data that we\ndidn\u0027t need before. If we had used up most of the stack and were right against\nthe limit, and there was some stack protection involed we could have hit a\nsegfault here.\n"
    },
    {
      "commit": "c3dce8afc2708e288caf2ed22a8387030fc136fe",
      "tree": "73e2935053648aa80493b98e3aec6576a2681852",
      "parents": [
        "34d4b1ef518d8eb55880b02399daf3af996cb997"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 13 12:21:48 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Apr 13 14:54:26 2026 -0400"
      },
      "message": "Skip setting buffer to 0 for strtod and strtol\n\nJust terminate with 0 after copy\n"
    },
    {
      "commit": "34d4b1ef518d8eb55880b02399daf3af996cb997",
      "tree": "a082bb0501fde3f87a44a3626776b928467c3ca6",
      "parents": [
        "6b04965ca668ecc84196a7c6360267cbc63c914f"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@apache.org",
        "time": "Sat Apr 11 21:25:45 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Apr 13 11:53:49 2026 -0400"
      },
      "message": "100% compliance with RFC 8259\n\nPreviously Jiffy was a tiny bit more linient and accepted numbers like\n0.3e+ and that\u0027s not a valid JSON number, it turns out.\n"
    },
    {
      "commit": "6b04965ca668ecc84196a7c6360267cbc63c914f",
      "tree": "79beb7cba9613cf2813a7cd4a70b79084138342e",
      "parents": [
        "34b00c10d5fe0346f40c9e4909cfda6f47389ece"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Apr 12 22:16:50 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sun Apr 12 22:19:48 2026 -0400"
      },
      "message": "Header cleanups\n\n`include-what-you-use` says we don\u0027t need \u003cstdio.h\u003e in decoder and encoder so\nremoving them\n"
    },
    {
      "commit": "34b00c10d5fe0346f40c9e4909cfda6f47389ece",
      "tree": "c28cdd783a6c316780a084fd0d753651e9fd9dbf",
      "parents": [
        "5681d76519f539b3ce1a9ac9a316d706b67d1139"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 11 02:31:40 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Apr 11 02:33:38 2026 -0400"
      },
      "message": "Another l2b/b2l cleanup\n"
    },
    {
      "commit": "5681d76519f539b3ce1a9ac9a316d706b67d1139",
      "tree": "ecfb5d1c64dceab0dc9eaea3027cf4e9c2e4c61b",
      "parents": [
        "a03cbf4d3c9591575645e96a07dd9bf0011b4da6"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 11 02:17:51 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Apr 11 02:25:22 2026 -0400"
      },
      "message": "Cleanup jiffy erl module\n\nRemove the no_native bit, it\u0027s not needed any longer. Also our supported\nversions of Erlang have direct binary_to_float/1 and binary_to_integer/1 so we\nhave to proxy through binary_to_list/1. Also we can do direct splits with\nbinary:split/2 and not have to turn it into a list so we can use\nstring:to_integer/1\n"
    },
    {
      "commit": "a03cbf4d3c9591575645e96a07dd9bf0011b4da6",
      "tree": "07f13936a70bfb4b439e9432e0873c4224e0861f",
      "parents": [
        "56117fab3aa5d57989787ee643791061efad28f1"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 11 01:39:51 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Apr 11 02:02:25 2026 -0400"
      },
      "message": "RFC 8259 Tests\n\nAdd and run tests from ttps://github.com/nst/JSONTestSuite\n\nIt turns out jiffy is a bit linient about accepting truncated exponents like\n`0.3e+`, where RFC 8259 would reject it we accept it as `0.3`. So, had to added\nthose to a deviations list. Otherwise it looks pretty good and brings us to a\ntotal of about 780 tests.\n\nWhile adding the license for these from the author add the license for the \"big\nnaughty list\" and Ryu as well, while removing the double conversion one.\n"
    },
    {
      "commit": "56117fab3aa5d57989787ee643791061efad28f1",
      "tree": "b6d9fae99bebe0667207c0dd2bb49ebb45705b59",
      "parents": [
        "2649ba2f073c1e202e9787bc70b33bdae8ec6305"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 11 00:12:50 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Apr 11 00:18:12 2026 -0400"
      },
      "message": "Test with the Big List of Naughty Strings (BLNS)\n\nFrom https://github.com/minimaxir/big-list-of-naughty-strings\n"
    },
    {
      "commit": "2649ba2f073c1e202e9787bc70b33bdae8ec6305",
      "tree": "6ee134bd1d63dc75256b4c2fd78479201239e370",
      "parents": [
        "38dffa9e043ae61591b6624823deee7b4eff5b4f"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 10 17:11:05 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 10 17:28:45 2026 -0400"
      },
      "message": "Prevent forward slashes from breaking scan-ahead optimization\n\nForward slash escapes are a rare (I couldn\u0027t find anyone using it at least)\noption we support, but when we do string scan-aheads we always stop on it,\nbecause it might have to be handled specially. To avoid that, we first check if\nwe need them escaped and run two versions of scan-ahead: one with forward\nslashes and one without.\n"
    },
    {
      "commit": "38dffa9e043ae61591b6624823deee7b4eff5b4f",
      "tree": "80f693576023fd851f40408fe28e3abb07ba1b11",
      "parents": [
        "a529615e4cd40e3ec857ce2e7c2f334ef777a0eb"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 10 15:11:14 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 10 15:56:57 2026 -0400"
      },
      "message": "Produce a unity build\n\nInclude all the .c files jiffy.c and let the compiler do all the possible\noptimizations. This in the same vein as linking with LTO.\n\nThis unexpectedly produced a speed-up in large string encoding:\n\n```\n\u003d\u003d\u003d\u003d\u003d With input Issue 90 \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                  99.37       10.06 ms    +/-21.47%        9.63 ms       18.06 ms\njiffy (master)         67.72       14.77 ms     +/-2.57%       14.62 ms       16.13 ms\nComparison:\njiffy                  99.37\njiffy (master)         67.72 - 1.47x slower +4.70 ms\n```\n"
    },
    {
      "commit": "a529615e4cd40e3ec857ce2e7c2f334ef777a0eb",
      "tree": "9632a2a2718e95377b8613bb5446dfbb2f4f7ab6",
      "parents": [
        "57682e4679666723eb72f84387559884c8e267e2"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 10 14:31:11 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 10 14:44:39 2026 -0400"
      },
      "message": "Add some NIF lifecyle coverage\n\nNot 100% if these ever worked right. Resources do have `ERL_NIF_RT_TAKEOVER`\nspecified and we end up re-creating the private context on upgrade so at least\nlet\u0027s try to test them with a few purge and reload checks.\n\nAnother alternative is to make these `NULL`s and just say that upgrade is not\nsupported.\n"
    },
    {
      "commit": "57682e4679666723eb72f84387559884c8e267e2",
      "tree": "d9066c8db8b26fe48fc4ae06d008400ac7314156",
      "parents": [
        "3ab87a6bebce441ddf9dfc2541690779fdcaee5a"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 10 13:55:43 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 10 14:11:03 2026 -0400"
      },
      "message": "Add extra tests and cleanup to increase coverage\n\nTests are pretty self-explanatory, just a bunch of corner cases like empty\nobjects with `return_maps` we never tested, or props with atom keys. Most fun\nones are the truncated literals like `tru`, `nul` etc.\n\nThe NIF lifecyle `reload` callback is deprecate to so we an slap a NULL in\nthere instead.\n\nhttps://www.erlang.org/doc/apps/erts/erl_nif.html\n\n\u003e The fourth argument NULL is ignored. It was earlier used for the deprecated\nreload callback which is no longer supported since OTP 20.\n"
    },
    {
      "commit": "3ab87a6bebce441ddf9dfc2541690779fdcaee5a",
      "tree": "1c8beb890381439c93671a129904e35568b60e6c",
      "parents": [
        "e1f4d4d9fa67c052495a9e887e8e3aeac24dce90"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 09 20:34:16 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Apr 10 13:01:10 2026 -0400"
      },
      "message": "No more FLTO\n\nInstead enable the equivalent optimization in compiler using includes and\nstatic inline functions.\n\nWe had bunch of logic to enable FLTO and some issues around it not working\nsometimes. There was snippet even to do a test compile something to see if it\ncan be enabled at all in the rebar script. Since it provided enough benefit\nthat folks wanted it, let\u0027s just have an effective LTO all the time. Let\u0027s put\nthe hot-path utilities like utf8 and bump-reductions into a header and use\n`static inline` functions. These will let the compiler do the-right-thing(tm)\nand optimize whole compilation unit and will eliminate the need for messing\naround to FLTO linker and compiler options.\n"
    },
    {
      "commit": "e1f4d4d9fa67c052495a9e887e8e3aeac24dce90",
      "tree": "14de0c33ae83701cc2fe4e41d99d17c3174f9d15",
      "parents": [
        "f84f7845d33fe77d5d69ae351d7c2fe75ff5cb8b"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 06 15:29:17 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 09 17:55:55 2026 -0400"
      },
      "message": "Faster array creation\n\nSame idea as in the faster object creation PR [1]: use\n`enif_make_list_from_array` API function to create the object in one API call.\nJust like for objects, if they are just a few (\u003d\u003c64) items, use a stack to hold\nthe terms, otherwise use a the heap.\n\n`enif_make_list_from_array` is available since R13B04 so we\u0027re not losing any\ncompatibility or needing to bump minimum OTP versions here.\n\n[1] https://github.com/davisp/jiffy/pull/262\n[2] https://www.erlang.org/doc/apps/erts/erl_nif.html#enif_make_list_from_array\n"
    },
    {
      "commit": "f84f7845d33fe77d5d69ae351d7c2fe75ff5cb8b",
      "tree": "a77af8a812ed4124508ca958bb09dc963557e785",
      "parents": [
        "b42c9a48c89e4a09d6e1090e99f971f099b5f7e6"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 03 23:44:49 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 09 13:24:57 2026 -0400"
      },
      "message": "Faster map encoding with enif_make_map_from_arrays\n\nOptimize map encoding: instead of updating the map element by element, use\n`enif_make_map_from_arrays` to create the map in a single API call.\n\nThe documentation for the `enif_make_map_from_arrays` indicates `If successful,\nthis function sets *map_out to the new map and returns true. Returns false\nthere are any duplicate keys.` However, it turns out this API has a bug, at\nleast as of the time of this commit (Apr, 2026), where it does not properly\ndetect duplicates and instead can return an invalid map object [1]. To work\naround the issue, if we see a large map, we first remove the duplicates as we\ndo for props, and only then call `enif_make_map_from_arrays`\n\nSince `enif_make_map_from_arrays` is newer we bump the minimum Erlang version\nby 1 version number: from 20 to 21. That still gives as an 8 years worth of\nErlang versions support.\n\nAnd lastly, since the \"seen\" deduplication set was the only thing keeping us\nfrom dropping C++, implement a simple open addressing hash table to replace and\nit drop C++ as a dependency. The hash table is very basic since we know its size\nahead of time we don\u0027t have to resize it. We don\u0027t remove objects from it and\nwe get to use enif_* functions for hashing and comparison and such. So it\u0027s a\ntiny bit more code but it\u0027s dropping a large dependency.\n\nOverall, this yields a decent 1.5x-2x speed-ups for object-heavy benchmarks, at\nthe expense of a slightly messier code and losing OTP 20 support:\n\n```\nFormatting results...\n\u003d\u003d\u003d\u003d\u003d With input Blockchain \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                 8.72 K      114.73 us    +/-15.02%      106.39 us      186.28 us\njiffy (master)        4.85 K      206.03 us    +/-65.05%      164.38 us      869.99 us\nComparison:\njiffy                 8.72 K\njiffy (master)        4.85 K - 1.80x slower +91.30 us\n\u003d\u003d\u003d\u003d\u003d With input Giphy \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                 791.56        1.26 ms    +/-48.35%        1.27 ms        2.26 ms\njiffy (master)        510.21        1.96 ms    +/-62.14%        1.84 ms        3.31 ms\nComparison:\njiffy                 791.56\njiffy (master)        510.21 - 1.55x slower +0.70 ms\n\u003d\u003d\u003d\u003d\u003d With input GitHub \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                 2.99 K      334.18 us    +/-31.88%      292.58 us      672.58 us\njiffy (master)        1.58 K      634.12 us   +/-107.87%      636.50 us     1112.16 us\nComparison:\njiffy                 2.99 K\njiffy (master)        1.58 K - 1.90x slower +299.94 us\n\u003d\u003d\u003d\u003d\u003d With input GovTrack \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                  23.28       42.96 ms     +/-8.28%       41.99 ms       57.78 ms\njiffy (master)          9.98      100.21 ms     +/-8.27%       98.87 ms      133.05 ms\nComparison:\njiffy                  23.28\njiffy (master)          9.98 - 2.33x slower +57.25 ms\n\u003d\u003d\u003d\u003d\u003d With input Issue 90 \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                  51.78       19.31 ms    +/-11.90%       18.46 ms       27.40 ms\njiffy (master)         45.29       22.08 ms     +/-6.48%       21.50 ms       28.60 ms\nComparison:\njiffy                  51.78\njiffy (master)         45.29 - 1.14x slower +2.77 ms\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                 774.15        1.29 ms    +/-34.64%        1.26 ms        2.23 ms\njiffy (master)        326.05        3.07 ms     +/-9.14%        3.01 ms        4.22 ms\nComparison:\njiffy                 774.15\njiffy (master)        326.05 - 2.37x slower +1.78 ms\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator (Pretty) \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                 843.42        1.19 ms    +/-17.96%        1.21 ms        1.89 ms\njiffy (master)        429.22        2.33 ms    +/-12.48%        2.23 ms        3.38 ms\nComparison:\njiffy                 843.42\njiffy (master)        429.22 - 1.96x slower +1.14 ms\n\u003d\u003d\u003d\u003d\u003d With input Large Numbers \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy (master)        268.80        3.72 ms     +/-9.06%        3.69 ms        4.86 ms\njiffy                 255.66        3.91 ms    +/-52.92%        3.63 ms       10.46 ms\nComparison:\njiffy (master)        268.80\njiffy                 255.66 - 1.05x slower +0.191 ms\n\u003d\u003d\u003d\u003d\u003d With input Pokedex \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                 881.07        1.13 ms    +/-98.50%        0.99 ms        2.13 ms\njiffy (master)        417.85        2.39 ms    +/-19.26%        2.43 ms        3.94 ms\nComparison:\njiffy                 881.07\njiffy (master)        417.85 - 2.11x slower +1.26 ms\n\u003d\u003d\u003d\u003d\u003d With input UTF-8 escaped \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy (master)        8.80 K      113.69 us    +/-26.59%      109.55 us      186.69 us\njiffy                 8.12 K      123.12 us    +/-63.53%      115.93 us      234.39 us\nComparison:\njiffy (master)        8.80 K\njiffy                 8.12 K - 1.08x slower +9.42 us\n\u003d\u003d\u003d\u003d\u003d With input UTF-8 unescaped \u003d\u003d\u003d\u003d\u003d\nName                     ips        average  deviation         median         99th %\njiffy                13.05 K       76.63 us    +/-35.80%       72.95 us      140.51 us\njiffy (master)       12.56 K       79.64 us    +/-12.14%       77.81 us      123.34 us\nComparison:\njiffy                13.05 K\njiffy (master)       12.56 K - 1.04x slower +3.01 us\n```\n\n[1] https://github.com/erlang/otp/issues/10975\n"
    },
    {
      "commit": "b42c9a48c89e4a09d6e1090e99f971f099b5f7e6",
      "tree": "77426663af354caf3bb38071805a1b190aec499c",
      "parents": [
        "6362a567dc967062c6dab99a57eed6d0a32859df"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Apr 03 10:14:49 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Apr 04 16:12:02 2026 -0400"
      },
      "message": "Switch to Ryu for float point encoding\n\n[Ryu](https://github.com/ulfjack/ryu) is faster then `double-conversion`, is\nadopted by Erlang/OTP team (and other languages and frameworks), and is written\nin C instead of C++.\n\nSince we\u0027re an Erlang library we\u0027ll just use the Erlang/OTP version of\n[Ryu](https://github.com/erlang/otp/tree/master/erts/emulator/ryu). We\u0027ll\naccept its defaults and peculiariaties and go with it, even if it means not\nproducing string-identical output as we did before (for instance, after this\nchange we don\u0027t emit `+` signs in front of the exponent and we also switch to\nthe scientific notation a lot sooner, but as they say \"when in Rome ...\").\n"
    },
    {
      "commit": "6362a567dc967062c6dab99a57eed6d0a32859df",
      "tree": "11ce16ca82242991cbb55d0bb63bdbb345e79cf0",
      "parents": [
        "09a75e966d041b0b57cc3f48d41969ad28e62101"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 22:24:01 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 22:26:37 2026 -0400"
      },
      "message": "Replace chocolatey with erlef/setup-beam\n\nUnfortunatly chocolatey has been pretty flaky lately. Let\u0027s see if we have\nbetter luck with erlef\n"
    },
    {
      "commit": "09a75e966d041b0b57cc3f48d41969ad28e62101",
      "tree": "be02effd4cf49092f1ab8c8fc0609a2c1a3c70f8",
      "parents": [
        "7d37dd191c96cb36954d481a0c43ab126986d455"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 19:35:33 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 22:26:37 2026 -0400"
      },
      "message": "Optimize dedupe_keys option\n\nSwitch sets in objects.cc (used for deduping keys) from an `set` to\n`unordered_set`. Unordered sets have O(1) lookups and regular sets have\nO(logN).\n\nThis option mostly useful for projects like Apache CouchDB which rely on the\nproplist represention and use the `dedupe_keys`.\n\nSince we\u0027re trying to be backwards comptable as much as possible let\u0027s add a\nmacro check and use a `set` if `unordered` set is not available.\n"
    },
    {
      "commit": "7d37dd191c96cb36954d481a0c43ab126986d455",
      "tree": "a02059f3c71499fa5caac2b93c8f47c23fc43676",
      "parents": [
        "13686ba4e39d35d317ebc4fd0ad44a08d339c119"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 18:00:04 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 18:06:26 2026 -0400"
      },
      "message": "Ignore .cache\n\nThis is createdy by lsp-mode\u0027s clangd daemon\n"
    },
    {
      "commit": "13686ba4e39d35d317ebc4fd0ad44a08d339c119",
      "tree": "1af167b5af737afc079d2a51a29131a20ced83af",
      "parents": [
        "32062a26820bf56ad7c60e29d6979c248df0f28d"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 17:08:41 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 17:13:34 2026 -0400"
      },
      "message": "Add bench folder to gitignore\n"
    },
    {
      "commit": "32062a26820bf56ad7c60e29d6979c248df0f28d",
      "tree": "a44377c7e2161cef45359928f02ebe317c76af1b",
      "parents": [
        "0e5c71c878f3774f98801c9201e6ab311ca88e41"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 16:56:27 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 17:07:18 2026 -0400"
      },
      "message": "Whitespace scan ahead optimization in decoder\n\nSame idea as with plain ASCII and number scanning optimization: if we see one\nwhitespace character, check if more follow it. This would be most helpful when\ndecoding pretty formatted json objects.\n"
    },
    {
      "commit": "0e5c71c878f3774f98801c9201e6ab311ca88e41",
      "tree": "b736e3cbdeae0f0ebbbe912d6c6cbb664f1b40f7",
      "parents": [
        "f8a7c77b6ba79de515162d7c5207a36e91fa3d4d"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 14:59:00 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 15:46:17 2026 -0400"
      },
      "message": "Bump yielding reduction count to 4000\n\nAlso avoid using a division and a separate function call for bumping\nreductions. Instead make it static inline and use a multiplication instead.\n\n[1] It\u0027s the new value in OTP since 19.2.\n OTP commit:\n https://github.com/erlang/otp/commit/6bcdd45abd97134fddfb5b0307b1d256337b0c67\n Doc mention:\n https://www.erlang.org/doc/apps/erts/erlang.html#bump_reductions/1\n"
    },
    {
      "commit": "f8a7c77b6ba79de515162d7c5207a36e91fa3d4d",
      "tree": "149f8a78aec93f5e3ca2c9547cdee7c6a1e3992f",
      "parents": [
        "67571e1bbb04131d3f35441b683373476d94a6e7"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 02 01:02:31 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Apr 02 14:04:00 2026 -0400"
      },
      "message": "Plain ASCII scan ahead optimization in string encoding\n\nWhat\u0027s good for the gander is good for the ... duck?\n\nApply the same lookahead optimization from string [1] and number decoding [2] to string\nand atom encoding. Hoist the index update (`e-\u003ei`) out of the loop and mark the\nsource pointer as restricted. Another good perf boost comes from a single final\n`memcpy` instead of updating the buffer a byte at a time.\n\nAs a curiosity, while the compiler doesn\u0027t do any fancy auto-vectorization in\nthe while loop, it manages to use a single bitmask check instruction (bt) to\ncheck for all three special cases `\"`, `/` and \u0027\\\u0027 which is kind of neat:\n\n```c\n i++;\n while(i \u003c size \u0026\u0026 p[i] \u003e\u003d 0x20 \u0026\u0026 p[i] \u003c 0x80\n       \u0026\u0026 p[i] !\u003d \u0027\\\"\u0027 \u0026\u0026 p[i] !\u003d \u0027\\\\\u0027 \u0026\u0026 p[i] !\u003d \u0027/\u0027\n  ) {i++;}\n```\n\nAT\u0026T syntax (sorry)\n```\nleaq\t1(%r15), %rdx               ## i++\nmovzbl\t%dil, %r8d                  ## r8d contains p[i]\naddl\t$-34, %r8d                  ## r8d -\u003d \u0027\"\u0027\ncmpl\t$58, %r8d                   ## if r8d - \u0027\\\u0027 \u003e 0\nja\tLBB12_23                    ## then jump away\nmovabsq\t$288230376151719937, %rdi   ## imm \u003d 0x400000000002001\nbtq\t%r8, %rdi                   ## if bitmask matches \" / and \\\njae     LBB12_23                    ## then jump away\n```\n\nUsing the bench benchee benchmark [3], this optimization shows decent results\nfor the encoding side. For the long strings case (issue 90) we get a 5x(!)\nspeedup. Some like GovTrack and Giphy get about a 30-40% boost. Others are\nlower, and Canada, since it\u0027s number heavy (coordinates), unsurprisingly\ndoesn\u0027t change much.\n\n\u003d\u003d\u003d\u003d\u003d Master \u003d\u003d\u003d\u003d\u003d\n\n```\n\u003d\u003d\u003d\u003d\u003d With input Blockchain \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           8.58 K      116.54 us    +/-50.23%      109.87 us      199.99 us\n\n\u003d\u003d\u003d\u003d\u003d With input Canada \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            32.70       30.58 ms     +/-2.13%       30.51 ms       34.36 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Giphy \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           780.56        1.28 ms    +/-14.11%        1.23 ms        1.65 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GitHub \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           2.35 K        0.43 ms    +/-14.52%        0.40 ms        0.60 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GovTrack \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            26.39       37.89 ms     +/-3.95%       37.77 ms       47.00 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Issue 90 \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            15.97       62.60 ms     +/-6.27%       61.84 ms       96.36 ms\n\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           775.51        1.29 ms    +/-12.40%        1.32 ms        1.81 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Pokedex \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           1.35 K        0.74 ms     +/-9.76%        0.74 ms        0.95 ms\n\n\u003d\u003d\u003d\u003d\u003d With input UTF-8 unescaped \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           8.20 K      121.88 us     +/-7.75%      119.79 us      161.74 us\n```\n\n\u003d\u003d\u003d\u003d\u003d PR \u003d\u003d\u003d\u003d\u003d\n```\n\u003d\u003d\u003d\u003d\u003d With input Blockchain \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           9.86 K      101.46 us    +/-13.45%       96.60 us      162.25 us\n\n\u003d\u003d\u003d\u003d\u003d With input Canada \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            31.41       31.84 ms    +/-10.76%       31.33 ms       58.22 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Giphy \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           1.03 K        0.97 ms    +/-17.42%        0.91 ms        1.38 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GitHub \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           3.17 K        0.32 ms    +/-21.45%        0.28 ms        0.51 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GovTrack \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            39.19       25.51 ms    +/-14.82%       23.80 ms       37.69 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Issue 90 \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            84.84       11.79 ms     +/-3.38%       11.71 ms       14.03 ms\n\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           1.10 K        0.91 ms    +/-21.32%        0.85 ms        1.55 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Pokedex \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           1.44 K        0.70 ms    +/-48.81%        0.63 ms        1.69 ms\n\n\u003d\u003d\u003d\u003d\u003d With input UTF-8 unescaped \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           9.19 K      108.82 us     +/-7.33%      107.02 us      141.75 us\n```\n\n[1] https://github.com/davisp/jiffy/pull/252\n[2] https://github.com/davisp/jiffy/pull/254\n[2] https://github.com/nickva/bench\n"
    },
    {
      "commit": "67571e1bbb04131d3f35441b683373476d94a6e7",
      "tree": "3f7b6425a8efc978992a0ca501b511c8eca5c85d",
      "parents": [
        "e48ccda83d4e93b4de47f93ff718148f4bc01013"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 01 16:58:29 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 01 19:39:38 2026 -0400"
      },
      "message": "Use quick lookahead parsing for numbers\n\nSame idea as we did for strings in [1]. For numbers we do it for any states\nwhich are looping (mantissa, frac and edigit). The wins are not as great since\nmost numbers are not that long but it\u0027s plausible someone has some large\ndataset of mostly number arrays perhaps and it could help them.\n\nBenchmarking with jason\u0027s benchee setup with a new data file consisting from an\narray of largish numbers showed a 7% improvement compared to current master.\n\n[1]\nhttps://github.com/davisp/jiffy/commit/dbd7bcc2804ccf37ee936ff36fbe9fdeff8a3664\n"
    },
    {
      "commit": "e48ccda83d4e93b4de47f93ff718148f4bc01013",
      "tree": "92de200cbd0ab17c75c0837c091fabfa4fc816c5",
      "parents": [
        "b2c4ae23a9e8f936fde471bd99baa0e8704d83f3"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 01 15:16:31 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 01 15:26:26 2026 -0400"
      },
      "message": "Improve error handling in dec_number\n\nUse davisp\u0027s suggestion and make an explicit label + goto to it.\n"
    },
    {
      "commit": "b2c4ae23a9e8f936fde471bd99baa0e8704d83f3",
      "tree": "aa674550596624c8a1749c8df54f651c019ac572",
      "parents": [
        "efaaae1fd24d203d97e2c8edad5e03e20fe0c3c3"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 01 15:08:05 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 01 15:26:26 2026 -0400"
      },
      "message": "Use assert for dec_number unreacheable state\n\nHat tip to davisp for noticing this is unreacheable and for the nice tip on how\nto make lcov ignore it.\n"
    },
    {
      "commit": "efaaae1fd24d203d97e2c8edad5e03e20fe0c3c3",
      "tree": "70eea11e441a6f129d724ffda053e1d10944db59",
      "parents": [
        "b699032dcd9447ac435f393cc2adf94025052d3a"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 01 01:50:06 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 01 15:26:26 2026 -0400"
      },
      "message": "Use the restrict pointer qualifier when decoding numbers\n\nWhat\u0027s good for the goose is good for the gander. Use the same \"trick\" in\n`dec_number` as we did in `dec_string`. To make it work pull out d-\u003ep and d-\u003ei\nand then avoiding updating d-\u003ei on every digit. Only update it once at the end.\n\nOn master\n\n```\n\u003d\u003d\u003d\u003d\u003d With input Giphy \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           404.94        2.47 ms    +/-54.98%        2.26 ms        4.72 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GitHub \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           1.20 K        0.83 ms    +/-27.98%        0.82 ms        1.60 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GovTrack \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy             7.64      130.82 ms    +/-11.64%      134.32 ms      153.93 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Issue 90 \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            42.52       23.52 ms    +/-32.15%       20.04 ms       49.11 ms\n\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           323.84        3.09 ms    +/-60.78%        2.81 ms        8.63 ms\n\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator (Pretty) \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           221.14        4.52 ms    +/-80.60%        3.53 ms       18.46 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Pokedex \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           307.46        3.25 ms    +/-59.47%        2.84 ms       13.28 ms\n```\n\nWith PR\n```\n\u003d\u003d\u003d\u003d\u003d With input Giphy \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           494.10        2.02 ms     +/-4.45%        2.01 ms        2.37 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GitHub \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           1.54 K        0.65 ms    +/-33.14%        0.68 ms        0.78 ms\n\n\u003d\u003d\u003d\u003d\u003d With input GovTrack \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy             8.38      119.34 ms    +/-26.92%      110.64 ms      226.90 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Issue 90 \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy            46.22       21.64 ms     +/-4.33%       21.30 ms       26.07 ms\n\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           408.25        2.45 ms     +/-9.09%        2.48 ms        2.92 ms\n\n\u003d\u003d\u003d\u003d\u003d With input JSON Generator (Pretty) \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           338.91        2.95 ms    +/-73.30%        2.76 ms        5.37 ms\n\n\u003d\u003d\u003d\u003d\u003d With input Pokedex \u003d\u003d\u003d\u003d\u003d\nName               ips        average  deviation         median         99th %\njiffy           484.97        2.06 ms     +/-3.21%        2.07 ms        2.24 ms\n```\n"
    },
    {
      "commit": "b699032dcd9447ac435f393cc2adf94025052d3a",
      "tree": "fcc8b69b77942a4721c0f005ecef88b750ed3ff6",
      "parents": [
        "dbd7bcc2804ccf37ee936ff36fbe9fdeff8a3664"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 01 00:12:54 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 01 10:26:42 2026 -0400"
      },
      "message": "Gate the restrict macro with a C version check\n\nFor those who are using pre-C99 C compiler, it won\u0027t have the `restrict`\nkeyword, so define it as an empty macro. If it\u0027s undefined the compiler just\nwon\u0027t do the optimization but it should still work fine.\n\nWhile monkeying around with macros do some other cleanups:\n\n 1) Noticed that some macros were not used at all, some were redefined per\n module when a single definition in jiffy.h would be better\n\n 2) `termstack` functions are only used in encode.c, so there is no need to\n compile a separate module for it. Those are just a handful of function so move\n them to `encode.c` file. This way if folks don\u0027t have link-time optimization\n set up, they\u0027ll still get pretty much the same kind of optimization from the\n inline hints and all the code being in the same module.\n"
    },
    {
      "commit": "dbd7bcc2804ccf37ee936ff36fbe9fdeff8a3664",
      "tree": "be7a8b541cd9f2ce8fec9b2d1aacf1880ed387ee",
      "parents": [
        "7606c3f35b2e5cbf179a35bb0e34be1b5c3e8061"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 17:26:47 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 01 10:26:42 2026 -0400"
      },
      "message": "Plain ASCII scan ahead optimization in string decoding\n\nSeeing some of the SWAR [1] [2] optimizations going around for json parsing,\ntook at look jiffy, and before we get fancy with casting to 64bit ints, and\ndoing xors and such, let\u0027s try a simple look-ahead parsing which turns out\nalready gives us a nice speed boost.\n\njason/poison bench shows a 40% speed improvement for what they call in the\nbenchmark: \"Issue 90\".\n\nA new thing we\u0027re using here is the `restrict` keyword which is a C99 type\nqualifier [3] for pointer to mark object which won\u0027t be aliased through any\nother pointer. This lets the compiler do a lot more optimizations to the\nunderlying machine code (verified this by staring at the assembly code),\nbecause it doesn\u0027t have always write back to the memory and it can keep more\nstate in the registers.\n\nThere are likely more of these opportunities around - both lookaheads (for\nwhitespace parsing?) and perhaps sprinkling in `restrict` qualifiers. If it\ncomes to it can always borrow Dr. Lemire\u0027s neat SWAR trick, but for now let\u0027s\nsee far we can go a simpler approach...\n\nWith master branch\n\n```\nName               ips        average  deviation         median         99th %\njiffy            13.97       71.56 ms     �1.65%       71.42 ms       76.51 ms\nOTP json          9.36      106.84 ms     �4.24%      106.98 ms      113.52 ms\n\nComparison:\njiffy            13.97\nOTP json          9.36 - 1.49x slower +35.28 ms\n```\n\nWith this PR\n\n```\nName               ips        average  deviation         median         99th %\njiffy            52.05       19.21 ms    �13.54%       18.32 ms       32.48 ms\nOTP json          8.83      113.23 ms     �0.79%      112.96 ms      115.99 ms\n\nComparison:\njiffy            52.05\nOTP json          8.83 - 5.89x slower +94.02 ms\n```\n\n[1] https://lemire.me/blog/2025/04/13/detect-control-characters-quotes-and-backslashes-efficiently-using-swar/\n\n[2] https://github.com/erlang/otp/pull/10938\n\n[3] https://en.cppreference.com/w/c/language/restrict.html\n"
    },
    {
      "commit": "7606c3f35b2e5cbf179a35bb0e34be1b5c3e8061",
      "tree": "0508e12d323346fdd5d441e283bf0978e77c791a",
      "parents": [
        "e1fa8a41314ecc6a901d5f8573dd3832d464c0ad"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 01:09:48 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Add coverage for random unicode edge cases\n\nWe had pretty good coverage except some odds and ends like uencoded sequences\nthat started off well but ended up being junk.\n"
    },
    {
      "commit": "e1fa8a41314ecc6a901d5f8573dd3832d464c0ad",
      "tree": "d5491859854b704aa40d046c2ec7f04ba72ff314",
      "parents": [
        "0693a9a827604dd971835e8221090175d89bb412"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 01:03:51 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Add yielding tests\n\nYielding properly is one of the best \"hidden\" features of Jiffy, which makes it\nrun very well in a highly concurrent environment. It turns out we didn\u0027t have a\ntest which tried to explicilty consume more time slices so try to add one.\n\nThe rest is a rather boring set of bytes_per_red/bytes_per_iter option\ncombinations.\n"
    },
    {
      "commit": "0693a9a827604dd971835e8221090175d89bb412",
      "tree": "3ce04ef6248963bbf8ef25194c91b5af42a2dc5f",
      "parents": [
        "953a171134e25ae63195caaae51e192e5d12f8aa"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 01:02:59 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Increase coverage for bad options\n\nHere we\u0027re mostly being silly and padding out stats\n"
    },
    {
      "commit": "953a171134e25ae63195caaae51e192e5d12f8aa",
      "tree": "d73f40ba9fc452dafb2f295b22fe5b083b70f0e1",
      "parents": [
        "8f5016201cb7c562f4a393115049aa5fdf42b31d"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 01:00:13 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Add a deep pretty printing test\n\nCoverage showed we didnt\u0027 test the `NUM_SHIFT\u003e8` case in `enc_shift` (Yay for\ncoverage!)\n"
    },
    {
      "commit": "8f5016201cb7c562f4a393115049aa5fdf42b31d",
      "tree": "be72642913e7a2933e7346ef9a8057f69b26021e",
      "parents": [
        "024386313a07d3c5d41546f6ccec9aafc3db763d"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 00:52:38 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Add extra number tests\n\nMost importantly coverage showed we didn\u0027t exercise some path in `digits10`\nfunction. We needed large enough digits but which are smaller than bigints.\n"
    },
    {
      "commit": "024386313a07d3c5d41546f6ccec9aafc3db763d",
      "tree": "ea0e5ebe4faa49d75416beff240ce6acf4b19330",
      "parents": [
        "5ba849569f27cb607eb0ae1289e4db43d327b072"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 00:49:45 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Make most of decode functions static\n\nSince we did this to the encoder, it seems right to do likewise to the decoder.\nAdd some \"inline\" suggestions to the compiler for some smaller ones. Saw\nencoder used some of those so it fits here as well.\n"
    },
    {
      "commit": "5ba849569f27cb607eb0ae1289e4db43d327b072",
      "tree": "0d61131cbd9f0be6305ab1ae276d20ac8cbfdc95",
      "parents": [
        "0435946bdf84fdeb095f8ffc1257379a1d817327"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Mar 31 00:05:17 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Clean up unused code paths. Make OTP 20 the official minimum version\n\nThese are based on the new coverage reports\n\n * `make_ok()` function is not used anywhere\n * `CONSUME_TIMESLICE_PRESENT` and SCHEDULE_NIF_PRESENT features are always present\n * `ERROR()` and `U()` macros are not used.\n\nThe most \"interesting\" change is finding out `enif_alloc_resource()` cannot\nreturn `NULL` [1][2], and so `dec_new()` and its callers don\u0027t have to handle\n`NULL`s. Which, in turn, eliminated a bunch of `make_error()` calls. With some\n`make_error()`s removed, it doesn\u0027t have to be utility function, so can be\nmoved to the encoder only.\n\nWhen moving `make_error()` to the encoder, noticed those functions along with\nothers should really be static if they are not used from other modules.\n\nSince we removed checks for CONSUME_TIMESLICE_PRESENT, which is present since\nOTP 17 onwards, and to avoid users getting surprises later during C during\ncompilation, make OTP 20 the official minimum OTP version (so far it\u0027s been\nunofficial only).\n\n[1] https://www.erlang.org/doc/apps/erts/erl_nif.html#enif_alloc_resource\n\n[2]\n\n - In [beam/erl_nif.c](https://github.com/erlang/otp/blob/639c85d7400d34c82df962547561cc1dc0a42755/erts/emulator/beam/erl_nif.c#L3121)\nit calls `bin \u003d erts_create_magic_binary_x()`\n\n - In\n [beam/erl_binary.h](https://github.com/erlang/otp/blob/639c85d7400d34c82df962547561cc1dc0a42755/erts/emulator/beam/erl_binary.h#L407)\n if the magic binary allocation fails it calls `erts_alloc_n_enomem()`\n\n - In\n [beam/erl_alloc.c](https://github.com/erlang/otp/blob/639c85d7400d34c82df962547561cc1dc0a42755/erts/emulator/beam/erl_alloc.c#L2108)\n `erts_alloc_n_enomem()` calls `erts_alc_fatal_error()` which calls\n `erts_exit()` after a bunch of logging and debug dumps.\n"
    },
    {
      "commit": "0435946bdf84fdeb095f8ffc1257379a1d817327",
      "tree": "6a867820c6b7f0a9aa0e5d24766c8992ececc1c7",
      "parents": [
        "936e0f8c1a871915ea8c10673b35075a7fdf4317"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Mar 30 22:15:02 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Mar 31 09:55:55 2026 -0400"
      },
      "message": "Add C coverage checks\n\nUse gcov for coverage checks and lcov for report generation while running the\nfull test suite, including all the property tests.\n\nThis seems to work on Ubuntu and on MacOS. In CI we\u0027ll go with Ubuntu and run\nit as one job for now. We don\u0027t fail on low coverage, instead we\u0027ll track it\nmanually by comparing with previous runs. This mostly helpful to run locally,\nas lcov html report is pretty and intuitive to browse through.\n\nNoticed Windows CI kept failing. Trying the next highest Windows version, maybe\nthat will succeed.\n"
    },
    {
      "commit": "936e0f8c1a871915ea8c10673b35075a7fdf4317",
      "tree": "6338fceff1c595eef7f8b913159aab6668381a2e",
      "parents": [
        "7fdf2762e49257272188c2d6c02929db5f92fc00"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Mar 28 15:32:07 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Mar 28 15:45:39 2026 -0400"
      },
      "message": "Fix OTP 27 prop tests\n\nIn OTP 27 0.0 \u003d/\u003d -0.0 and because of that exact term matching in the prop\ncheck started to fail. To avoid that, do not generate -0.0 in the prop tests\ninstead test it explicilty elsewhere.\n\nIt may seem tempting to switch to \u003d\u003d for prop check instead, however that would\nmean we\u0027d also loose type checks that ints stayed ints and floats stayed\nfloats in general.\n"
    },
    {
      "commit": "7fdf2762e49257272188c2d6c02929db5f92fc00",
      "tree": "ab90af8db02ceda7d2f146cffefc0eee03f45105",
      "parents": [
        "229c05bf4b0b1e96886bd1f0d0f9e90e7687ef2a"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Mar 28 13:08:57 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Mar 28 14:55:08 2026 -0400"
      },
      "message": "Run prop tests in CI\n\nWe got prop tests but we almost never run them as installing EQC mini is a bit\nof an adventure. Once I figured it out how to install it let\u0027s make it a script\nand run it in CI before I forget how to do it again.\n\nI didn\u0027t want to spam the download endpoint with fetching the beams on every\nmatrix build so made a single run on Erlang 27 for it. Besides probably good\nidea to stick with 27 only since the beams seem to be built in OTP 25, and we\nonly get guarantees about compatibility up to 2 version ahead only.\n"
    },
    {
      "commit": "229c05bf4b0b1e96886bd1f0d0f9e90e7687ef2a",
      "tree": "fb4ea9247177a94ff5ad0d29964ead322a82fe9f",
      "parents": [
        "66a6d9940673bfa94fcfb980e5510f9e6beea316"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Mar 22 01:13:08 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sun Mar 22 17:21:53 2026 -0400"
      },
      "message": "Add specific gcc and clang versions to CI\n\nWhile at it add macos tahoe as well\n"
    },
    {
      "commit": "66a6d9940673bfa94fcfb980e5510f9e6beea316",
      "tree": "54336be5a53e59f025bd6a5523906c549d67fa86",
      "parents": [
        "3282a1a7d6498ffdd506b21336e4d7a038e3c8d9"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Mar 22 01:14:24 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sun Mar 22 17:21:53 2026 -0400"
      },
      "message": "Fix -Wextra warnings\n\nCompiling with gcc 14 and `-Wextra` flags showed a few instances of invalid\nsign compare (comparing int to unsigned long int for ex). So update some\nvariables to match the types.\n\nTo fix sign compare warnings, the return type of `utf8_validate()` changed from\nan `int` to `size_t`, and the error result is indicated by `0` and not `-1`, as\nbefore. Previously it returned -1, or 1,2,3,4 values only. Since 0 wasn\u0027t used\nand it\u0027s not a valid return, use it as the new error result.\n"
    },
    {
      "commit": "3282a1a7d6498ffdd506b21336e4d7a038e3c8d9",
      "tree": "46171149d3bf984b849ed3ebbb2d8324cbce7838",
      "parents": [
        "e0fa42eccd393bf9b761ca436488f434e9a55bba"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Mar 18 19:16:03 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Mar 18 19:32:31 2026 -0400"
      },
      "message": "Add a missing else in utf8 validation\n\nThe code worked just fine previously, just did an extra comparison.\n"
    },
    {
      "commit": "e0fa42eccd393bf9b761ca436488f434e9a55bba",
      "tree": "e066ca17d1305ffcf8881a455f6a59828ea03889",
      "parents": [
        "e52a6cd8a70ad84b0f689ecc26e48104042009f0"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Mar 02 14:25:21 2026 -0500"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Mar 02 14:32:45 2026 -0500"
      },
      "message": "Remove macos-13 CI workers\n\nAdd a \"latest\" macos version\n"
    },
    {
      "commit": "e52a6cd8a70ad84b0f689ecc26e48104042009f0",
      "tree": "05df157919fe69f0fa028b5e610c9ab17991edda",
      "parents": [
        "16edfe9e1ab4643280b769220bce90698f97b34a"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.davis@tiledb.com",
        "time": "Mon Mar 02 12:46:40 2026 -0600"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Mar 02 14:30:15 2026 -0500"
      },
      "message": "Disable exporting internal symbols\n"
    },
    {
      "commit": "16edfe9e1ab4643280b769220bce90698f97b34a",
      "tree": "fa8f1b43bdb68699d047e1334ec70a227ef11ccf",
      "parents": [
        "50daa80a62a97ffb6dd46ea9cb8ccb4930cbf1ae"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Sep 17 14:37:30 2025 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Sep 17 15:13:38 2025 -0400"
      },
      "message": "Add OTP 28 to CI\n\nUpdate Windows and MacOS runners while at it\n"
    },
    {
      "commit": "50daa80a62a97ffb6dd46ea9cb8ccb4930cbf1ae",
      "tree": "619886867c1bc6ed89a683bae3c269aaa6e26a57",
      "parents": [
        "f23099409d7bb7a0b5f0a71472cfb119781ea068"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 07 20:33:50 2024 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 07 20:34:41 2024 -0400"
      },
      "message": "Jiffy 1.1.2\n"
    },
    {
      "commit": "f23099409d7bb7a0b5f0a71472cfb119781ea068",
      "tree": "d02b2c0827a4888d2b0f4c74d918ff6cdf9ae7b8",
      "parents": [
        "2de97923ed20638ef810e13014d2bda22d723c16"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 07 20:27:47 2024 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 07 20:30:01 2024 -0400"
      },
      "message": "Fix build badge\n\nWe have the GH actions CI working now\n"
    },
    {
      "commit": "2de97923ed20638ef810e13014d2bda22d723c16",
      "tree": "e4d28308ba7de3b356e9e26e32f826bfd8ca2214",
      "parents": [
        "9ea1b35b6e60ba21dfd4adbd18e7916a831fd7d4"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 07 19:58:40 2024 -0400"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Fri Jun 07 19:20:38 2024 -0500"
      },
      "message": "Add GH Actions CI and fix tests on Erlang 27\n\nAdd CI for Windows, MacOS and Ubuntu Linux. For Linux, test both rebar2 and\nrebar3.\n\nApparently due to `string:split/2` in `rebar.config.script` jiffy wasn\u0027t\ncompatible with Erlang \u003c20 for quite a now, and we didn\u0027t see any complaints,\nso make Erlang 20 the minimum supported version. Old jiffy releases are still\navailable for anyone who needs them. In addition, only Erlang OTP docker images\n20+ work with the latest (v4) checkout CI action, so that\u0027s another reason to\nmake that the new cutoff.\n\nOn Erlang 27 needed to make a few test updates:\n\n * The referenced binary length size computation changed so make sure to make\n   the binaries large enough to avoid triggering the inconsistencies between\n   \u003c27 and 27+ version and needing to do an ifdef of some sort.\n\n * In Erlang 27 -0.0 \u003d/\u003d 0.0 so updated a few tests expecting exact comparison,\n   to use numeric equality `\u003d`. Jiffy doesn\u0027t round-trip -0.0s anyway, so it\u0027s\n   only a test-side discrepancy.\n"
    },
    {
      "commit": "9ea1b35b6e60ba21dfd4adbd18e7916a831fd7d4",
      "tree": "bfbfbdb7917e9caab08efcebecf47c074c222300",
      "parents": [
        "44a62c92c1c1b650539103280ba5415ed7a13319"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Wed Feb 23 12:46:15 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Wed Feb 23 12:46:15 2022 -0600"
      },
      "message": "Jiffy 1.1.1\n"
    },
    {
      "commit": "44a62c92c1c1b650539103280ba5415ed7a13319",
      "tree": "84a1ee800391381b1c692a6f765413a673c1e591",
      "parents": [
        "e93c20844981a499dfb0a804bb9d892b8509b6a1"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Wed Feb 23 09:08:59 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Wed Feb 23 12:32:30 2022 -0600"
      },
      "message": "Prevent rebar3 from seeing any global config\n\nWith the hex plugin download it would cause rebar3 tests to fail on any\nVM that couldn\u0027t load the pre-compiled plugin modules. This just hides\nthe config and plugin cache from rebar3 when running under this test\nscript.\n"
    },
    {
      "commit": "e93c20844981a499dfb0a804bb9d892b8509b6a1",
      "tree": "762316765048b3544992097599ce555f6d7b0c55",
      "parents": [
        "b5f3d087cffcbcae5c6702bd0da00fb46cdfd9e7"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Wed Feb 23 09:01:55 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Wed Feb 23 09:01:55 2022 -0600"
      },
      "message": "Fix builds using mix as a build tool\n\nThis subtly changes the default config to a rebar3 style config that can\nbe used by non-rebar build tools like mix. Only on a positive test for\nrebar2 do we avoid adding the port_compiler plugin and related options.\n"
    },
    {
      "commit": "b5f3d087cffcbcae5c6702bd0da00fb46cdfd9e7",
      "tree": "f680c5a9b45081fb155b8acf58881f44ae81c582",
      "parents": [
        "f8c6612f13d4fbbe440087f4b6ca7ec3ca481341"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 15:16:43 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 15:16:43 2022 -0600"
      },
      "message": "Fix typos spotted by GitHub user kianmeng\n"
    },
    {
      "commit": "f8c6612f13d4fbbe440087f4b6ca7ec3ca481341",
      "tree": "23bab947679a7dbf356564aa67c295f263dc8cd7",
      "parents": [
        "3fb115039ca6bd43e9163a30892b2682f71e00c4"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 15:11:01 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 15:12:14 2022 -0600"
      },
      "message": "Jiffy 1.1.0\n"
    },
    {
      "commit": "3fb115039ca6bd43e9163a30892b2682f71e00c4",
      "tree": "f30e11a4f8f8cdefce4a58ed41e423c9c8de73de",
      "parents": [
        "ec198b19c27a956a8bcfcedbdb9c03f90a50a0d5"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Fri Feb 18 11:31:56 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 15:12:14 2022 -0600"
      },
      "message": "Replace build system with port_compiler\n\nIt appears that whatever previous prevented me from using the rebar3\nport_compiler is no longer an issue. This change allows rebar2 and\nrebar3 compilation by relying on port_compiler for rebar3 and\nreverting to standard rebar2 otherwise.\n"
    },
    {
      "commit": "ec198b19c27a956a8bcfcedbdb9c03f90a50a0d5",
      "tree": "8561422fbf5d5507f278c7966040a33bd14fa58f",
      "parents": [
        "60043d5604564d86244d6fd28c90050b09ee0807"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 14:57:18 2022 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Feb 22 15:12:14 2022 -0600"
      },
      "message": "Use rebar3 for building and testing Jiffy directly\n"
    },
    {
      "commit": "60043d5604564d86244d6fd28c90050b09ee0807",
      "tree": "72d5975dcf1a19c753fccd737c2785b1da929f66",
      "parents": [
        "a6bc8ee730c3c61cc7e6755a896a07eb9ed73665"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Oct 05 10:00:17 2021 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Oct 05 10:00:17 2021 -0500"
      },
      "message": "Jiffy 1.0.9\n"
    },
    {
      "commit": "a6bc8ee730c3c61cc7e6755a896a07eb9ed73665",
      "tree": "904efae7d945a3f0c5fe008a721a9f9001971806",
      "parents": [
        "73ba656378a9ee24f1e595718fb097fc3917f313"
      ],
      "author": {
        "name": "Mojken",
        "email": "mikaelgillis@gmail.com",
        "time": "Thu May 07 13:47:11 2020 +0200"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Oct 05 09:52:41 2021 -0500"
      },
      "message": "Fix typo in README"
    },
    {
      "commit": "73ba656378a9ee24f1e595718fb097fc3917f313",
      "tree": "a7582c7a36071665ae67fd2ce325b31acdd761af",
      "parents": [
        "37039ba32e950480715be74751a53339420a6fe1"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@apache.org",
        "time": "Mon Oct 04 21:03:07 2021 +0000"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Oct 05 09:51:47 2021 -0500"
      },
      "message": "Update enc to exclude linking with erl_interface.lib on Windows\n\nhttps://github.com/davisp/erlang-native-compiler/commit/2c92afb0292165edd0e5d66c792ad9fe4bb265eb\n\nCompiled with the oldest supported OTP R15B03-1\n"
    },
    {
      "commit": "37039ba32e950480715be74751a53339420a6fe1",
      "tree": "d496690ced2214907c0a80e05e96ba112e26361a",
      "parents": [
        "effc3c9a68478b692523e61b308ad9257c1ddeca"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Mon Dec 14 15:29:37 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Mon Dec 14 15:29:37 2020 -0600"
      },
      "message": "Fix support for R16\n"
    },
    {
      "commit": "effc3c9a68478b692523e61b308ad9257c1ddeca",
      "tree": "6b90cc06ab92f5301ff25f817a421282a4a79fc1",
      "parents": [
        "3f478cf0c51e9cf18dec00c248ef426d84934c44"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:07:15 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:07:15 2020 -0600"
      },
      "message": "Jiffy 1.0.8\n"
    },
    {
      "commit": "3f478cf0c51e9cf18dec00c248ef426d84934c44",
      "tree": "31a2545d9fa8d24701e5cf33fcc75be661400e07",
      "parents": [
        "a3c36d652cc7f5f942d3f23ee9dd5a488746c70e"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:06:31 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:06:31 2020 -0600"
      },
      "message": "Remove unnecessary `maybe_map/1`\n\nThought slightly harder and realized this was unnecessary.\n"
    },
    {
      "commit": "a3c36d652cc7f5f942d3f23ee9dd5a488746c70e",
      "tree": "9f2a1c5499e5ccae6e8a45f856cc055020ce4222",
      "parents": [
        "6c88f830fdc433d6e363aaf7de05a89af9cde0f1"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:04:05 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:04:05 2020 -0600"
      },
      "message": "Jiffy 1.0.7\n"
    },
    {
      "commit": "6c88f830fdc433d6e363aaf7de05a89af9cde0f1",
      "tree": "3e286f404fb051da79a58a82f4f626cc1f36cd60",
      "parents": [
        "1388db4e6428b876b00d00bcb9bce08f04d7fafa"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:03:35 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Dec 10 10:03:35 2020 -0600"
      },
      "message": "Fixes #206\n"
    },
    {
      "commit": "1388db4e6428b876b00d00bcb9bce08f04d7fafa",
      "tree": "547e46eee959de89bbc4308ae569eef92181f336",
      "parents": [
        "046035068f136ec4536ddd7c4b7b2b9aba592aea"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Oct 22 09:56:44 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Oct 22 09:56:44 2020 -0500"
      },
      "message": "Finally write down the package uplaod command\n"
    },
    {
      "commit": "046035068f136ec4536ddd7c4b7b2b9aba592aea",
      "tree": "961d80e057a6152c0cd98f8dd9f5e470f32ff616",
      "parents": [
        "f74b04fd11a0a21544c90941ae1e239907e4fe67"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Oct 22 09:54:33 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Oct 22 09:54:33 2020 -0500"
      },
      "message": "Jiffy 1.0.6\n"
    },
    {
      "commit": "f74b04fd11a0a21544c90941ae1e239907e4fe67",
      "tree": "de3046c2e5f92e66d65eb018040435dffea15653",
      "parents": [
        "6dadc0cd22b06e2b1972ee8aba5708c478418926"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Oct 22 09:53:26 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Oct 22 09:53:26 2020 -0500"
      },
      "message": "Fix bug in bytes_per_red option\n\nTurns out this was never implemented correctly since it was referring to\nthe original bytes_per_iter atom.\n"
    },
    {
      "commit": "6dadc0cd22b06e2b1972ee8aba5708c478418926",
      "tree": "191d39edc7beee0178198c9ca271d7c75168b937",
      "parents": [
        "685f14ef609d686c67997d14b376a932cdfa0adb"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Jun 30 12:26:27 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Jun 30 12:26:27 2020 -0500"
      },
      "message": "Jiffy 1.0.5\n"
    },
    {
      "commit": "685f14ef609d686c67997d14b376a932cdfa0adb",
      "tree": "3295b3f82098deae427b631f68b1ef5a54c072ec",
      "parents": [
        "1df5ac5997745d6b564e6848cea442a9c62b5d9c"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Jun 30 12:20:18 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Jun 30 12:22:07 2020 -0500"
      },
      "message": "Silence compiler warnings for tests\n"
    },
    {
      "commit": "1df5ac5997745d6b564e6848cea442a9c62b5d9c",
      "tree": "d057866105e6f1114ce30d21f844493c4f4b6d84",
      "parents": [
        "2f73ba9afd05a0169b84a77d23ecf4524914f609"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Jun 30 12:20:34 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Tue Jun 30 12:22:07 2020 -0500"
      },
      "message": "Update rebar/enc binaries to R15B03-1\n\nThe recent release of Erlang 23.0 removed support for loading beam\nmodules compiled under R14 and earlier. Thus we\u0027re now forced to abandon\nsupport for R13 and R14.\n"
    },
    {
      "commit": "2f73ba9afd05a0169b84a77d23ecf4524914f609",
      "tree": "4e797cc3ca6003cf5f9987bed5f0aed1f0b4fd46",
      "parents": [
        "0ba322e42171bb48ffdd0c053cef28a42eb35fc9"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 27 11:48:51 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 27 11:48:51 2020 -0600"
      },
      "message": "1.0.4\n"
    },
    {
      "commit": "0ba322e42171bb48ffdd0c053cef28a42eb35fc9",
      "tree": "3935c27b2a9fbcd31d57e898fa13b810d0866bf5",
      "parents": [
        "e60916fb15604a7d4fed4f664cfa1aa0bc03dd28"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 27 11:45:58 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 27 11:45:58 2020 -0600"
      },
      "message": "Fix binary leak when encoding large strings\n\nThis bug was due to an interaction between two optimizations. If we\nattempt to flush the buffer before any bytes are used we refused.\nHowever, in enc_ensure we were not checking whether the buffer was\nactually flushed so we would allocate a new buffer for the request.\n\nThe easiest way to encounter this issue was by encoding a raw binary\nlonger than 2041 bytes (i.e., `jiffy:encode(\u003c\u003c\"stuff...\"\u003e\u003e).`).\n"
    },
    {
      "commit": "e60916fb15604a7d4fed4f664cfa1aa0bc03dd28",
      "tree": "6aa254eec3a9cd0157893bd411825bd696adcfd9",
      "parents": [
        "265be337f8c9dce338c09be80c3e9e91e2ea1d92"
      ],
      "author": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 06 15:52:59 2020 -0600"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 06 15:53:41 2020 -0600"
      },
      "message": "Version 1.0.3\n"
    },
    {
      "commit": "265be337f8c9dce338c09be80c3e9e91e2ea1d92",
      "tree": "6ed8e5fd97c50d4c105d6961b6aabb70fc4ab8df",
      "parents": [
        "4c30454f8df6b9a7b5115c28b0b72bccc4949256"
      ],
      "author": {
        "name": "Joan Touzet",
        "email": "joant@atypical.net",
        "time": "Thu Feb 06 15:55:10 2020 -0500"
      },
      "committer": {
        "name": "Paul J. Davis",
        "email": "paul.joseph.davis@gmail.com",
        "time": "Thu Feb 06 15:50:25 2020 -0600"
      },
      "message": "Force Windows to export inlined functions\n"
    }
  ],
  "next": "4c30454f8df6b9a7b5115c28b0b72bccc4949256"
}
