)]}'
{
  "commit": "0ca6bf523cb894233d1e5681004fe1060db8f9f0",
  "tree": "099c17b58b478a1cf1f86665ac10b410e1761920",
  "parents": [
    "73a6bcf2eb2708302cb37013f3128b90c6bbe1a6"
  ],
  "author": {
    "name": "Joshua Haberman",
    "email": "haberman@google.com",
    "time": "Wed Oct 21 15:25:22 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Mon Nov 09 00:58:54 2026 -0800"
  },
  "message": "Guard and privatize CMessage child-wrapper caches with ChildWrapperMap.\n\n`CMessage::composite_fields` and `CMessage::child_submessages` were\nstill raw `LazyUniquePtr\u003cPyWeakValueMap\u003e` members, and `GetFieldValue`\nand extension `subscript` registered lazily created wrappers after\nreleasing the parent\u0027s read lock, allowing a concurrent `Clear` or\n`ClearField` detach to miss a newly created wrapper and leave it on the\nold `MessageTree`.\n\nIntroduce `ChildWrapperMap` in `child_wrapper_map.h` to document and\nenforce the locking and lifetime invariants of `CMessage`\u0027s weak\nchild-wrapper caches against the tree `AccessGuard`, including\nsanitizer guard tracking and `DCheckChildWrapper` consistency checks on\nwrite-locked walks. Make `composite_fields` and `child_submessages`\nprivate on `CMessage`, and look up message classes before acquiring\n`WithRead` so wrapper creation and `SetCompositeField` registration\nhappen within a single read lock.\n\nPiperOrigin-RevId: 1004276266\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "791d474d05bc9ea5529bab4311f2fc7420aaf056",
      "old_mode": 33261,
      "old_path": "python/google/protobuf/internal/message_test.py",
      "new_id": "35ae0f28d1f911060536a6c92fd8b1b9f22dde0d",
      "new_mode": 33261,
      "new_path": "python/google/protobuf/internal/message_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7da30dbf28e917d39004cff3362d953da66a5351",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/child_wrapper_map.h"
    },
    {
      "type": "modify",
      "old_id": "64f379cf0fda40a8b0d0529852800ea5efbd459d",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/container_base.h",
      "new_id": "7315456b64c5ba46a906f1ffd2569b8e588c8406",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/container_base.h"
    },
    {
      "type": "modify",
      "old_id": "67cf059d14907866dacb2df4825367dde2512484",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/descriptor_containers.cc",
      "new_id": "277b3aaf8e685940ef9ad4a7b062e6b7bfb9e12f",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/descriptor_containers.cc"
    },
    {
      "type": "modify",
      "old_id": "25e5f40d93cfd89a8b9a2a786ec38a5517cc911e",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/extension_dict.cc",
      "new_id": "1bd83460d515d6c4e7cf4846048313313c2de66c",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/extension_dict.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cbabefe4d855b27ba8d55425f85f637a0869d306",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/field_container.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce2a2d16b28564ca7df5e1fdd1c6746538b98cdf",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/field_container.h"
    },
    {
      "type": "modify",
      "old_id": "51506eac4111dd0c832d5288f2b3d68b3d4cce71",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/map_container.cc",
      "new_id": "7f4aaed1e9cf2eccb5084e359701f37bb74c55e3",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/map_container.cc"
    },
    {
      "type": "modify",
      "old_id": "fed569d9bf8202c994bbfe01d1d299c701cbd7bd",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/map_container.h",
      "new_id": "db1170406930e613a51e4089a4b228a3028dcd62",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/map_container.h"
    },
    {
      "type": "modify",
      "old_id": "64f8911ee54ae42dadc3da69c34eae82650e2c68",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/message.cc",
      "new_id": "ac24a8b99095bbf1528c1b3038b9e51aad46d474",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/message.cc"
    },
    {
      "type": "modify",
      "old_id": "71a637602871653dfdb4ad05518182457e065ab5",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/message.h",
      "new_id": "dc62f3e38c74e9b53ec1d3d273f4fab5e3aafd76",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/message.h"
    },
    {
      "type": "modify",
      "old_id": "d8762e59f117ab09e28bb20c26f295418f5f1328",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_composite_container.cc",
      "new_id": "44ac705e3bbed033dfb46caf15ce80b81b4c131a",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_composite_container.cc"
    },
    {
      "type": "modify",
      "old_id": "2a040d115190d909d8c767f34ded242fe69eddd7",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_composite_container.h",
      "new_id": "dda520a1f9bc6f84b6441592d51bc3b62906ccb8",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_composite_container.h"
    },
    {
      "type": "modify",
      "old_id": "72056aed266dff3df8f1b605c0d25957f3027739",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_scalar_container.cc",
      "new_id": "e80a76286ad2f19ff12946f1f49f75d9ecea6b7c",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_scalar_container.cc"
    },
    {
      "type": "modify",
      "old_id": "71d068b350e5bb40f5bfd791526af9177f05bbc4",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/pyext/repeated_scalar_container.h",
      "new_id": "aaab64cc4174b0ec7887f916db0bcaddb86c1517",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/pyext/repeated_scalar_container.h"
    }
  ]
}
