)]}'
{
  "commit": "a840bf871e005d948ba6442948997eb3ef2e3c7f",
  "tree": "36868840f2743fad398c8737844a9cc8c751b2f9",
  "parents": [
    "0184fe5ece4f84fda9db04d2472b76efcaa8ef55"
  ],
  "author": {
    "name": "Russ Cox",
    "email": "rsc@golang.org",
    "time": "Wed Apr 27 09:02:53 2022 -0400"
  },
  "committer": {
    "name": "Russ Cox",
    "email": "rsc@golang.org",
    "time": "Fri Apr 29 14:23:31 2022 +0000"
  },
  "message": "[dev.boringcrypto] crypto/internal/boring: add GC-aware cache\n\nIn the original BoringCrypto port, ecdsa and rsa\u0027s public and private\nkeys added a \u0027boring unsafe.Pointer\u0027 field to cache the BoringCrypto\nform of the key. This led to problems with code that “knew” the layout\nof those structs and in particular that they had no unexported fields.\n\nIn response, as an awful kludge, I changed the compiler to pretend\nthat field did not exist when laying out reflect data. Because we want\nto merge BoringCrypto in the main tree, we need a different solution.\n\nThe different solution is this CL\u0027s boring.Cache, which is a\nconcurrent, GC-aware map from unsafe.Pointer to unsafe.Pointer (if\ngenerics were farther along we could use them nicely here, but I am\nafraid of breaking tools that aren\u0027t ready to see generics in the\nstandard library yet).\n\nMore complex approaches are possible, but a simple, fixed-size hash\ntable is easy to make concurrent and should be fine.\n\nFor #51940.\n\nChange-Id: I44062a8defbd87b705a787cffc64c6a9d0132785\nReviewed-on: https://go-review.googlesource.com/c/go/+/395882\nRun-TryBot: Russ Cox \u003crsc@golang.org\u003e\nTryBot-Result: Gopher Robot \u003cgobot@golang.org\u003e\nReviewed-by: Cherry Mui \u003ccherryyz@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4cf608368f165b7028200c1a95d69266ac578d35",
      "new_mode": 33188,
      "new_path": "src/crypto/internal/boring/cache.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "050ba457b2979ee0a86aca653be1012d39edec67",
      "new_mode": 33188,
      "new_path": "src/crypto/internal/boring/cache_test.go"
    },
    {
      "type": "modify",
      "old_id": "604d0db24a2492e3ba6c6f929aad59d66ff3681e",
      "old_mode": 33188,
      "old_path": "src/runtime/mgc.go",
      "new_id": "b2558c8bd3c44264fac27cd9b3163ea57cc98b62",
      "new_mode": 33188,
      "new_path": "src/runtime/mgc.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "149ba51dd7e6fe3e77d658ef4ecb689aca2adaac",
      "new_mode": 33188,
      "new_path": "src/runtime/mgc_boring.go"
    }
  ]
}
