)]}'
{
  "commit": "78901f985eb3a387ffb636a1bd35821cde995ae9",
  "tree": "d9d566f1716c42c4a890022d72f3f7e8c3e2da07",
  "parents": [
    "42e85144f366f16cb611f5b10546bc8b34bc06d4"
  ],
  "author": {
    "name": "Dmitri Prime",
    "email": "bolms@google.com",
    "time": "Thu Oct 10 11:35:34 2024 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Oct 10 11:35:34 2024 -0700"
  },
  "message": "Cache the generated parser tables as a .py file (#196)\n\nThis change adds a checked in, cached copy of the parser tables,\r\nwhich will normally be used instead of generating a fresh set of\r\ntables.  On my machine, this saves approximately 2.05s on first\r\nrun of `embossc`, and 4.96s after `.pyc` files have been generated.\r\n\r\nFor a small `.emb` file, those savings translate to approximately 36%\r\nand 87% of the current total runtime, respectively.\r\n\r\nIn order to minimize frustrating cache decoherence problems, there are\r\ntwo additional features:\r\n\r\n*   When loading the cached parser, the set of grammar productions that\r\n    were used to generate the cached parser is compared to the current\r\n    set.  If they do not match, the cached parser is ignored, and a\r\n    fresh parser is generated.  This allows developers to work on\r\n    `module_ir.py` without manually regenerating the parser tables on\r\n    every change.\r\n*   The new `cached_parser_is_up_to_date_test` will fail if the cached\r\n    parser text is not an *exact* match for the text that would be\r\n    generated from a fresh run of `generate_cached_parser`.  This\r\n    ensures that the version of `cached_parser.py` that is in the\r\n    master Emboss repo is always up to date, no matter what might have\r\n    changed in the source tree.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "6f77145f8c1dde1436c3c2cb50cef8a94f9fc631",
      "old_mode": 33188,
      "old_path": "compiler/front_end/BUILD",
      "new_id": "efcec3efe9937a20e7168e15d484cfbe1810fb43",
      "new_mode": 33188,
      "new_path": "compiler/front_end/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d8512eacc09ed404ee60db1caf509fb0d7f11173",
      "new_mode": 33188,
      "new_path": "compiler/front_end/cached_parser_is_up_to_date_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8a3443aac45825aa4f36fcfce19f7c6c9d1b23f7",
      "new_mode": 33188,
      "new_path": "compiler/front_end/generate_cached_parser.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0953efbc544cab564e5dafbd9b849356209067b1",
      "new_mode": 33188,
      "new_path": "compiler/front_end/generated/cached_parser.py"
    },
    {
      "type": "modify",
      "old_id": "610820a4958b7451eb6f5b5c8dace9032bb636f3",
      "old_mode": 33188,
      "old_path": "compiler/front_end/lr1.py",
      "new_id": "58d50764859b223130df4786c7b7d75fdf2844a2",
      "new_mode": 33188,
      "new_path": "compiler/front_end/lr1.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "39e9a18d503c4591a372867d3ff030edbb80e292",
      "new_mode": 33188,
      "new_path": "compiler/front_end/make_parser.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8ab13ad301e2c0eb215c2b624264e5b949eaa973",
      "new_mode": 33188,
      "new_path": "compiler/front_end/make_parser_test.py"
    },
    {
      "type": "modify",
      "old_id": "a6d7130f5fd6800f6cabd6c371861733f0cc2c3a",
      "old_mode": 33188,
      "old_path": "compiler/front_end/parser.py",
      "new_id": "a7d5826672f856fec5d0f128a7dac088462088e4",
      "new_mode": 33188,
      "new_path": "compiler/front_end/parser.py"
    },
    {
      "type": "modify",
      "old_id": "f5f111b5d015a6d7247097fd22b9a92e0c06f56c",
      "old_mode": 33188,
      "old_path": "compiler/front_end/parser_test.py",
      "new_id": "463a91c4533f52ab72000770e67771213fe5abc7",
      "new_mode": 33188,
      "new_path": "compiler/front_end/parser_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "61ca1b89c49c097038b379c71ada0ba389292231",
      "new_mode": 33188,
      "new_path": "pyproject.toml"
    }
  ]
}
