From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 36444 invoked by alias); 23 Jan 2017 22:43:49 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 35245 invoked by uid 89); 23 Jan 2017 22:43:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-HELO: sessmg23.ericsson.net Received: from sessmg23.ericsson.net (HELO sessmg23.ericsson.net) (193.180.251.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 23 Jan 2017 22:43:37 +0000 Received: from ESESSHC018.ericsson.se (Unknown_Domain [153.88.253.124]) by (Symantec Mail Security) with SMTP id 99.95.32317.41786885; Mon, 23 Jan 2017 23:43:33 +0100 (CET) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.72) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 23 Jan 2017 23:41:56 +0100 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; Received: from elxcz23q12-y4.ca.am.ericsson.se (192.75.88.130) by DBXPR07MB399.eurprd07.prod.outlook.com (10.141.14.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.874.6; Mon, 23 Jan 2017 22:40:35 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH 3/5] Make Python inferior-related internal functions return inferior_object* Date: Mon, 23 Jan 2017 22:43:00 -0000 Message-ID: <20170123224004.8893-4-simon.marchi@ericsson.com> In-Reply-To: <20170123224004.8893-1-simon.marchi@ericsson.com> References: <20170123224004.8893-1-simon.marchi@ericsson.com> MIME-Version: 1.0 Content-Type: text/plain X-ClientProxiedBy: CY4PR13CA0008.namprd13.prod.outlook.com (10.168.161.146) To DBXPR07MB399.eurprd07.prod.outlook.com (10.141.14.149) X-MS-Office365-Filtering-Correlation-Id: 59e2489d-02f9-47cd-1964-08d443e0d924 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DBXPR07MB399; X-Microsoft-Exchange-Diagnostics: 1;DBXPR07MB399;3:o62o7n9BOIkMKHVMHedUbFTJtqZ526NXgUXP0c/vLuXB/kH6x3ANDo1hJOqTMIqVps2c1CCvbpWBSL/LodMwOkfbp53V4T9U78aUWQ0Z2pxAL3EPOxKKLe+OwlNiRGMjopv26Ec9jaIvAnbmbtckx/02aRHHvGnxj7goeOTN3gNGK+9ICJApiespGYsRsjwrGXisY6K6osweoEjgkNhW4vXtC6XhiIcyDoswI07KsMwyK1UVcU8MsUSmlgGGvWQBP1+/pz5cTtCW0ihKcXrHcQ==;25:1tmxDafrFGUQXg47by83oiZMm2/FGCgpuCFgUbXvwE1aQyIQz52qhYuI3htvcdmGI9DMHKdDyJ4HoAAbOSdJoExOtEAicBHZzaKk/a4vgSe3kJOkX8ggIayWPSIuFp23aJfmyv5OrYHyFsdtQ/st0wb7XK+aZFJNtf6ZZpVkwzxE2czM9t2qxFwnyi++F0jAjDNiS/fSWulwMpGMBuKi2N0/GZ3dgAjNvNW7CVp2f0uB5ZEBW1UoPHqObSBCmHYNzaXJJs5Py2mBsoxKcbJAtNeM3XdUM1MH8dnYfkUvu6G2lEm7IqAp8GB1ND3JVE/avK0C5YHbO76n4HjUjV8eUtullWTqxGBUz0o35S6511qNN8vgtR096tE5BFiAsQePL3MB8nI2ffBpftHi07OFrOpdNBpwx3PGH8zfyPYAHFYIp8ui5tj0c79+ilYR+QNvatfgfFBGG1eCCk2QtsFGGg== X-Microsoft-Exchange-Diagnostics: 1;DBXPR07MB399;31:vApwtiSImfthCbOTa8xeDtrwgNWavqxYY6TKz5E5FI6n8aNf3PvHvFPBCcRrUZ+njr3PQwo8TZyowvV0X5oTLtSrPiyqO2EcZBJuovnacudT9UWeDxRPIKq696T608dkEAyIyqKhAPA1xCOeaH6JyL7clLpCgeN+EvCR0JoKMQwGSaGF3Xog8Xt+tYIb44nKX1opgUdBVnTsHlec4AsIcuH8NncBhaI0yCEfxPCBUtyM3KgNAYF4qo0m4dt79K3ym7R+cRSWqm+BeXexG43pqA==;20:XyKs15u81SgNy25pmHGPdoaClL4wrouGe4Umsuhp2szLd5mwpnkQMS4Jx8DsKTBXBrgIpp1BKbtBrUuIcPuK0sq4V5SDCOFNG1Mv9T5eAigMZFJoBmwBzfOgjmYHNsShuF9LXmLwH4wrnxeBigAGZ7xUQC8R4iUwBX/f3V1LnpHFxclTT3iV59OKzueWNcFAVTVs0uU7Q690gGttTGEaBK7B+YdmMaEthUK9dCxVmX2iuuIt8k2vHwSrKbjdn0lzxT8s8eentvb10LPIjiNxCXCg9nyXxRIPTpZKF3R9kBVqnvrO3yOgl+Ts2esLtYpL3L9PAeI0q2LpBbVPQK2Sv+rM1VDBNbx9MEeHKu0mfij3jMZEEhDpEkgPSFTdQG9Sp7vu9zZ+xX9FUYCjE6j3iuiUTWm88Oykl6XbTBxr7/QH+TVN4ylJLoG+JANYm2jnVqE69kNigpUZoMiJ++LH6iMwTZUlImIsuRMJY04/rX0Df2n5tKRCYHtfEbWjbWrL X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123560025)(20161123558021)(20161123555025)(20161123562025)(20161123564025)(6072148);SRVR:DBXPR07MB399;BCL:0;PCL:0;RULEID:;SRVR:DBXPR07MB399; X-Microsoft-Exchange-Diagnostics: 1;DBXPR07MB399;4:6359RExyr8UfbGxyLo2TeB72qOvwkYe5LKcAPZmaZK4a29148aygEQ/ChWHk+FBDYH0VOH54nCnwBqyOD74orB5bc+PjEKsDYmTRn8pKW96F6+aOlz8foeL0pG/fdUeArDUBanu1GoregG8x6c9VZAV7rRSE2rbpIrXGhB2EDqXTw1V9A/gWyA8bUneAs950/FuhYbrFsm+udWBB3R7pcwG7CuwzOv5un07p4TNpnsI5muHn67AN49DUaai0DwP3w2XrQz1aPq/yi+u/loSOT5jc+Nrxn9bRCNqgu0M7qPh28m8C3hHoGu9+VGzrJEhMMSTJsUmAZOGEKNHsInQHlx+Jjp/H+Ef2Zm8zUjU1XUOpN5oMO/cqYZwxfrSXuJuNIMRry8qxhl+ZtojLLX02c2uhN6GwJsuPzm2IOl/JlEdhuGZE+hwrux5CzUx8bBg+SX3o7tllwbbvgy+3xShvR0Nnr7tUknlY2fGVat0bgz6Tx1K2+2bdw9P/GbxN7dinWcY+mFdu4kOJ9B1VErpHKuaHLW9mDeQFSMBXNrzQjZ1UuCwE5BU0FMSE66vBxwn6YtmV13hQElJELQUjZtMakzbHK+vw6fH6hPmBa554FgY= X-Forefront-PRVS: 0196A226D1 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(39450400003)(199003)(54534003)(189002)(51444003)(6916009)(8676002)(110136003)(48376002)(4326007)(5660300001)(2906002)(105586002)(81156014)(81166006)(106356001)(2351001)(189998001)(7736002)(2950100002)(6666003)(50466002)(50226002)(68736007)(1076002)(5003940100001)(92566002)(305945005)(3846002)(6116002)(97736004)(6512007)(86362001)(25786008)(6486002)(6506006)(38730400001)(50986999)(33646002)(76176999)(42186005)(66066001)(47776003)(36756003)(53936002)(101416001);DIR:OUT;SFP:1101;SCL:1;SRVR:DBXPR07MB399;H:elxcz23q12-y4.ca.am.ericsson.se;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DBXPR07MB399;23:gENe3vBAvfME/PgG1Ac/P3qW0b7V1zYtaWwfwz6gIm?= =?us-ascii?Q?VRVUpm8bzp9QnLzc6edlXjaE5msHzM2t+6NBiadbEizVDhyfMeIuEK7APao9?= =?us-ascii?Q?WksnZ1kMmcNfIYHTQelbO0Vqx7GMPtvOOvftQF1W5WRXEX/1ZWMyRsyon9t/?= =?us-ascii?Q?rQwMF8EKNyWXoQP5ckqim4fN/Wdb1ezZZsONwhl36uZHLNJIQyK7GdEL+p1f?= =?us-ascii?Q?WTJxzw+wGIyyB9OGEFhY06AMPw9BTlFMFPcLZ9lDZw4QUSi/V/mzIcL5d8gt?= =?us-ascii?Q?uGK7HEPZO928yJV0hJTXqjs+LvRgAtb7AX7jVnYcCtJMnXCYuRv0yytl60nt?= =?us-ascii?Q?JZQ7XdGPFrHmGbN/UV/i5l4iMFpJFRcktiZyTFQ+68Vnir2k9SlTZVE3v0rf?= =?us-ascii?Q?CSr9XViFNmgAZBALTSVkRR9tofY9udtfqwrjYWGeFsvishefOupFG6z7P/Dm?= =?us-ascii?Q?lJRIGjWcoeSJuU6R8OXZRCROWXSkg2/xO4yr6nhrYEE/y8jFxNzmEZYwrXcJ?= =?us-ascii?Q?4hl5K0fBjYpA3Jfe9qKvgKdUgjpqKMirJwIk/AGlT8twWepCyPBL0J/uqe9E?= =?us-ascii?Q?deauMffDaCd4nxgtCZ/4MqmAXGaacVTALm7FmhyK8LBuzZ6lIwiu3JjQPiRY?= =?us-ascii?Q?IlQ1K19VjPqCcBB7P5ahfslp/z9d1ftqviyrh3qANwy4hFlhkmGzl5aWclSo?= =?us-ascii?Q?SKsoL3tG+1pNfhI+YOj04nnB7/s0HujtdwJi+rhezYrHyhHxUDdT3uoAUSBD?= =?us-ascii?Q?oKpv+XQ5fXqn8Hl5cEif8t1VYSMcsRYCMWLKx8mgOLTaT2mq5JAjkYiOB/D+?= =?us-ascii?Q?QRQXt87q+AuUgu1CBgGe4SxtHfiGIIo22AAzW11cPSzXdCSFeW9BX9P2kJMZ?= =?us-ascii?Q?T4dvo1EGltVwJrEsljNVpHLYNzHY6NfW/wjUmUoDFPCHfnaPZxsTscAR9wMW?= =?us-ascii?Q?Iqi30xL01JnkBrJl//Kw5y8ZBUXrwWfcuw8jIq+wqQ2Jz6jRvsp8YTRRLQJX?= =?us-ascii?Q?0UNSImLsFmH7Nnk4kgWL7GbszxNkOKUBOwqzWrt6ZnEtaiJ43t+oX05KfzPL?= =?us-ascii?Q?WjIJv7z1zdJPzgVktSIAccBrWkUK+ahzkxxW+sRqCw3UOYXtQR95Gq0im/e8?= =?us-ascii?Q?cc0F5CVyCWO2X9GwYX9t+8bQ1gfwgj0InnT5lxAJu7c6tfWOo4y1FZSSB8zi?= =?us-ascii?Q?NynmZfILacoMA=3D?= X-Microsoft-Exchange-Diagnostics: 1;DBXPR07MB399;6:tgBpWZ8Ct14/g8RBPdDW9fp6INDu1TDKe1FJq1lGMdVomXvYeRy2EM0AiWjdj6FtS5GBAcGNm9IEyMfN68EJq9xj6xYbAbs0sWzPMhoP5RmuSMgTUss71+WzCgjk2jUOOm27niiVNc8H0V/GXrSnVZJMU+EkeXBtamWmX8rL5BKQnXdRkkiD37cj0MBBp/vQc82dqG6pijDTPLDJK66t1BXitd3EFhhLOoARYeLM7SbITmDP6CU60VDU6oxzDGaZkTjlp8YSd77iTbTMmbeKAqQpgXynPB5XmzeivZ5SCrAzEy2b2hLHK/FZsx68SD8gGeKnXr5i0rETfE/L4+UP0HX3CRALDftVoVkeaW/h4dMCob/qgZuqSHqHj7BHkusZ7ts77roSNBQJKcOmnKK2O+k34CLqM4rbIYaVk8zxHiE=;5:lZS7CyK09pXxIzpqYJ/qrwxwgfYSNxd+s5zN2AlHmKOnx6msggp2EpIZi4a0DElYU0jhAA3MsLu6wq0ksAaYhckcDjISzcwkdWfpU+ogHO4NFXiG8PcDf2WvqCei28lUJjhTKjLjE9WQuutxdKapWg==;24:60uPpID/zu3WofDVXJlO0etLqgdoMTLFb/q9+xUxSZqe4OkEDCmU3j8IsUGGo7P+YPf+VPGAIVH0m2isj8QwfK6Key14GEbNjtZxz/s0C98= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DBXPR07MB399;7:76NrKXPc5ZBfrev8BNdw6+DgeHLbcMdSmA7/JDeMZHfhf/7W6TNVzYlTdGdPfWUaEexlbl36ZG7lpBygyyI2LMRV+jpYnoKMwFsgxNcBLEx1pK6r7Mq10r2vyJKKJxaRnXl0FGIEAuBPlMEyAbG0ejom4rzRiHbMLisn3ms7bgsk93I/QyUIU72x46H2rPyhOsdOi9gaMZeIxS956/+9RoNlc6mkdluxNmD71NAxyHgcrdMl/oMLU9bqLwgtNyYlFHRIRVJxIHc4dBA6N0/Sj57ex1cOeCgDI/PSAfGWcLWpzuGxOe0Ki9r0iSbTP6vPHhx9RX9CH7TJPv1F7a4hgrPpLYwDKVhVLbTqc4Bu2wHqOWpo2mJpM/y0rC2gvDLYILTYRmtfQdHDemSaNv79n8++bUNzwhGINh1old1waBu+RuTSXGsnSASIdKNr/avM8DOqjqkGs/LCS85NdXhuzw== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jan 2017 22:40:35.3651 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBXPR07MB399 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes X-SW-Source: 2017-01/txt/msg00474.txt.bz2 From: Simon Marchi This patch changes the functions that return an Inferior Python object so they return an inferior_object pointer instead of a generic PyObject pointer. This should remove some casting back and forth from PyObject* to inferior_object* in our codebase, helping a bit for type-safety. On the other hand, this requires adding some casts from inferior_object* to PyObject* when we deal with the Python API, which obviously accepts only PyObject*. I think this is a more appropriate place for casts though. It defines and uses gdbpy_inf_ref, a specialized version of gdbpy_ref_base for inferior_object. The next patch changes those functions again to make them return a gdbpy_inf_ref, but I think that this intermediary step is useful to verify the correctness, since the two changes have different goals (type-safety for this one, reference counting for the next one). One point I am not sure about is whether it breaks the gcc Python checking plugin: extern PyTypeObject inferior_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("inferior_object"); It says _FOR_TYPEDEF, but the inferior_object type is no longer a typedef, because I need to forward declare the type in python-internal.h, and it's not possible to forward-declare a typedef. I tried to use the cpychecker plugin but have to admit I am bit lost. I understand some manual fiddling with the gcc flags are required in order load the plugin (which can be done with gcc-with-cpychecker). It would be nice (if it's not the case yet) to have a configure switch to automatically enable that for the files in the python subdirectory. gdb/ChangeLog: * python/py-ref.h (gdbpy_inf_ref): New typedef. * python/python-internal.h (struct inferior_object): Forward-declare. (thread_object) : Change type to inferior_object*. (find_inferior_object): Change return type to inferior_object*. (inferior_to_inferior_object): Likewise. * python/py-exitedevent.c (create_exited_event_object): Use gdbpy_inf_ref. * python/py-inferior.c (inferior_object): Change from typedef + anonymous struct to simple struct. (inferior_to_inferior_object): Change return type to inferior_object*. (find_inferior_object): Likewise. (find_thread_object): Use gdbpy_inf_ref. (build_inferior_list): Likewise. (gdbpy_selected_inferior): Add cast. * python/py-infthread.c (thpy_get_inferior): Add cast. --- gdb/python/py-exitedevent.c | 4 ++-- gdb/python/py-inferior.c | 18 +++++++++--------- gdb/python/py-infthread.c | 2 +- gdb/python/py-ref.h | 1 + gdb/python/python-internal.h | 7 ++++--- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/gdb/python/py-exitedevent.c b/gdb/python/py-exitedevent.c index 4590077f8b..30dce9030b 100644 --- a/gdb/python/py-exitedevent.c +++ b/gdb/python/py-exitedevent.c @@ -42,10 +42,10 @@ create_exited_event_object (const LONGEST *exit_code, struct inferior *inf) return NULL; } - gdbpy_ref inf_obj (inferior_to_inferior_object (inf)); + gdbpy_inf_ref inf_obj (inferior_to_inferior_object (inf)); if (inf_obj == NULL || evpy_add_attribute (exited_event.get (), "inferior", - inf_obj.get ()) < 0) + inf_obj.get_py_obj ()) < 0) return NULL; return exited_event.release (); diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 5c215fef44..b6b43af7cd 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -35,7 +35,7 @@ struct threadlist_entry { struct threadlist_entry *next; }; -typedef struct +struct inferior_object { PyObject_HEAD @@ -48,7 +48,7 @@ typedef struct /* Number of threads in the list. */ int nthreads; -} inferior_object; +}; extern PyTypeObject inferior_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("inferior_object"); @@ -207,7 +207,7 @@ python_new_objfile (struct objfile *objfile) representing INFERIOR. If the object has already been created, return it and increment the reference count, otherwise, create it. Return NULL on failure. */ -PyObject * +inferior_object * inferior_to_inferior_object (struct inferior *inferior) { inferior_object *inf_obj; @@ -233,13 +233,13 @@ inferior_to_inferior_object (struct inferior *inferior) else Py_INCREF ((PyObject *)inf_obj); - return (PyObject *) inf_obj; + return inf_obj; } /* Finds the Python Inferior object for the given PID. Returns a reference, or NULL if PID does not match any inferior object. */ -PyObject * +inferior_object * find_inferior_object (int pid) { struct inferior *inf = find_inferior_pid (pid); @@ -260,7 +260,7 @@ find_thread_object (ptid_t ptid) if (pid == 0) return NULL; - gdbpy_ref inf_obj (find_inferior_object (pid)); + gdbpy_inf_ref inf_obj (find_inferior_object (pid)); if (inf_obj == NULL) return NULL; @@ -409,12 +409,12 @@ static int build_inferior_list (struct inferior *inf, void *arg) { PyObject *list = (PyObject *) arg; - gdbpy_ref inferior (inferior_to_inferior_object (inf)); + gdbpy_inf_ref inferior (inferior_to_inferior_object (inf)); if (inferior == NULL) return 0; - return PyList_Append (list, inferior.get ()) ? 1 : 0; + return PyList_Append (list, inferior.get_py_obj ()) ? 1 : 0; } /* Implementation of gdb.inferiors () -> (gdb.Inferior, ...). @@ -815,7 +815,7 @@ py_free_inferior (struct inferior *inf, void *datum) PyObject * gdbpy_selected_inferior (PyObject *self, PyObject *args) { - return inferior_to_inferior_object (current_inferior ()); + return (PyObject *) inferior_to_inferior_object (current_inferior ()); } int diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c index 5482bf9ea1..c7553310c3 100644 --- a/gdb/python/py-infthread.c +++ b/gdb/python/py-infthread.c @@ -163,7 +163,7 @@ thpy_get_inferior (PyObject *self, void *ignore) THPY_REQUIRE_VALID (thread_obj); - return thread_obj->inf_obj; + return (PyObject *) thread_obj->inf_obj; } /* Implementation of InferiorThread.switch (). diff --git a/gdb/python/py-ref.h b/gdb/python/py-ref.h index 8b3b7732cc..b212ef195f 100644 --- a/gdb/python/py-ref.h +++ b/gdb/python/py-ref.h @@ -67,5 +67,6 @@ public: /* Specializations of gdbpy_ref_base for concrete Python object types. */ typedef gdbpy_ref_base gdbpy_ref; +typedef gdbpy_ref_base gdbpy_inf_ref; #endif /* GDB_PYTHON_REF_H */ diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index ac98f12ab3..62a834d403 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -303,6 +303,7 @@ typedef struct gdbpy_breakpoint_object constructor and the breakpoint-created hook function. */ extern gdbpy_breakpoint_object *bppy_pending_object; +struct inferior_object; typedef struct { @@ -312,7 +313,7 @@ typedef struct struct thread_info *thread; /* The Inferior object to which this thread belongs. */ - PyObject *inf_obj; + inferior_object *inf_obj; } thread_object; extern struct cmd_list_element *set_python_list; @@ -420,8 +421,8 @@ PyObject *gdbarch_to_arch_object (struct gdbarch *gdbarch); thread_object *create_thread_object (struct thread_info *tp); thread_object *find_thread_object (ptid_t ptid) CPYCHECKER_RETURNS_BORROWED_REF; -PyObject *find_inferior_object (int pid); -PyObject *inferior_to_inferior_object (struct inferior *inferior); +inferior_object *find_inferior_object (int pid); +inferior_object *inferior_to_inferior_object (struct inferior *inferior); const struct block *block_object_to_block (PyObject *obj); struct symbol *symbol_object_to_symbol (PyObject *obj); -- 2.11.0