)]}'
{
  "commit": "135ba8deafb8bf64a15b24d1513899eb600e2011",
  "tree": "5298abf06c411910b15e66098a7a32eb2057ca87",
  "parents": [
    "720136bfa7bba696feb2e56a24a34ff09b9322c3"
  ],
  "author": {
    "name": "Dean Moldovan",
    "email": "dean0x7d@gmail.com",
    "time": "Sat Sep 10 11:58:02 2016 +0200"
  },
  "committer": {
    "name": "Dean Moldovan",
    "email": "dean0x7d@gmail.com",
    "time": "Sat Sep 10 12:08:32 2016 +0200"
  },
  "message": "Make error_already_set fetch and hold the Python error\n\nThis clears the Python error at the error_already_set throw site, thus\nallowing Python calls to be made in destructors which are triggered by\nthe exception. This is preferable to the alternative, which would be\nguarding every Python API call with an error_scope.\n\nThis effectively flips the behavior of error_already_set. Previously,\nit was assumed that the error stays in Python, so handling the exception\nin C++ would require explicitly calling PyErr_Clear(), but nothing was\nneeded to propagate the error to Python. With this change, handling the\nerror in C++ does not require a PyErr_Clear() call, but propagating the\nerror to Python requires an explicit error_already_set::restore().\n\nThe change does not break old code which explicitly calls PyErr_Clear()\nfor cleanup, which should be the majority of user code. The need for an\nexplicit restore() call does break old code, but this should be mostly\nconfined to the library and not user code.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "638e4245f8bb8adfcdf1af7379a9130e9e88547f",
      "old_mode": 33188,
      "old_path": "include/pybind11/cast.h",
      "new_id": "8741498d52f4d03c402be8098552010b92ddcc52",
      "new_mode": 33188,
      "new_path": "include/pybind11/cast.h"
    },
    {
      "type": "modify",
      "old_id": "ef92daff7f6b2d223e28810be2ce8ec21b17b8ca",
      "old_mode": 33188,
      "old_path": "include/pybind11/common.h",
      "new_id": "cd07429800274fe50310e41ee5708b8e8bdbbf4b",
      "new_mode": 33188,
      "new_path": "include/pybind11/common.h"
    },
    {
      "type": "modify",
      "old_id": "63a48088aae92484298b3aec6410523482d4a396",
      "old_mode": 33188,
      "old_path": "include/pybind11/eigen.h",
      "new_id": "c0925a7f3003370b6f383c08fe02cbc5cce755c7",
      "new_mode": 33188,
      "new_path": "include/pybind11/eigen.h"
    },
    {
      "type": "modify",
      "old_id": "4a50b3353336540ae40eee4083fc858bc41de3d8",
      "old_mode": 33188,
      "old_path": "include/pybind11/pybind11.h",
      "new_id": "24f10e379a4a6a9e0cd0a52834be594166d970fa",
      "new_mode": 33188,
      "new_path": "include/pybind11/pybind11.h"
    },
    {
      "type": "modify",
      "old_id": "45d811d747148290222e5fb6b99cfd438e8c02dc",
      "old_mode": 33188,
      "old_path": "tests/test_eval.cpp",
      "new_id": "ed4c226fe4f54c1a9d53a14d6216cde8e9ed21bb",
      "new_mode": 33188,
      "new_path": "tests/test_eval.cpp"
    },
    {
      "type": "modify",
      "old_id": "67133a6370138d58b7ef2a64e4708facc0d31497",
      "old_mode": 33188,
      "old_path": "tests/test_exceptions.cpp",
      "new_id": "613b1355f90f89a4b64fe54573329a3b2fbb343f",
      "new_mode": 33188,
      "new_path": "tests/test_exceptions.cpp"
    },
    {
      "type": "modify",
      "old_id": "a92300c325216aaefd79652b1f938cedc6c73e34",
      "old_mode": 33188,
      "old_path": "tests/test_exceptions.py",
      "new_id": "4048d43f54a9d947aede6dfe20a7cfb76514f20c",
      "new_mode": 33188,
      "new_path": "tests/test_exceptions.py"
    }
  ]
}
