From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id mb9uJbMKp2m9pBIAWB0awg (envelope-from ) for ; Tue, 03 Mar 2026 11:22:11 -0500 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=JvswaXiM; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=JvswaXiM; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 90DE01E089; Tue, 03 Mar 2026 11:22:11 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 71A281E089 for ; Tue, 03 Mar 2026 11:22:06 -0500 (EST) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id F1F0C4B9DB4B for ; Tue, 3 Mar 2026 16:22:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F1F0C4B9DB4B Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=JvswaXiM; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=selector1 header.b=JvswaXiM Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11013050.outbound.protection.outlook.com [40.107.162.50]) by sourceware.org (Postfix) with ESMTPS id A3DCA4BA23D3 for ; Tue, 3 Mar 2026 16:19:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A3DCA4BA23D3 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A3DCA4BA23D3 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.162.50 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1772554754; cv=pass; b=Zsm4A8Sph+eb06+uatgVimOLHLe3dz9pKo3KGP1ko2bw9+OxJFhiGzlFthcom8BOiY2oVSXEJDMwsWhpsiaiihuNIi3B0aQf3Q73H4GN1b5il8CnwSL92kbzb8kpTO035f905wBYrn66R9kRCOmGCtYtNxUQDHiB/FitpGWuB4k= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1772554754; c=relaxed/simple; bh=tl3WbEAYBadRFpBGK+xE1nMJ/1SrlnmJj/WYka7IdrA=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=L6QDoa7T40ID1QNt/U7HRrQSxUBReBGz+fMk/TrGPAQOuv72VphJGwsAPqidY+dk+K5GVEQer0dum561MPOWTTzasNCYxbyrmHpomOz+q4RtON0aAh35Ew63Vd48HB157AqRUVx6ibvN9pp2dEuMX+vRq1BJ6tgHwbnPzpBgxnk= ARC-Authentication-Results: i=3; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A3DCA4BA23D3 ARC-Seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=IkQLG3Tk6s15w2E+VhZlt1IHzM7GlOfW0wYo1EllnoEIyhT1Ef8FNd0Ui4RRoonSGxS7Wxm2juSLzD6iOoNEQFrREymIygq0rqWVq8oh7Nz7pl5xFyCYBbxExFmHVoMyE/WpXLI0/OJqU/Eln6SlFJXvN6QBXir904ealMJHm8nUKlb2O0gKC6a1nnHJgefH/Lli3llpCjIdqntw7nE+vsZdN9pJ637EHj+3EX3wGG501uGatvC31VwkvmYY+KkKtY3FwmXy5W8cDbrBn3NxfgN594nQBSs4u8kfn1FonddcnpfZRv06TIAUpU027S2fUlm1D95EFxYit8xjyi5uhw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qKoW+tpF0z6WbtzSdkekqv9iq8wuNm72sw5yOd3e3Ug=; b=GYJvlhQgvNoAvmPrKhLph9pMQUGN0vIeEAXZBR2IjInDmaQR7lfgQKln2ybu/POUvT9CcAN4DVcwo3WsgwI7gfp7jmJMTsLFaDOnfd3m81zcWE76DhwXsq9H6PchiBQ26MYwNy6Ghe4HRQOCRRh4MfeLwexz1YAR/2DIM/h4NWoVij5bq/G2c5AX2KA3uDClW6W/M05fZBgeYrhAQMCz3fd6uJuwLC/xCviSWkSdXzPZz0nFsFWjI1L9danvjTNjgLVLxfVNicyhBG+nS8oyJCKGpy/7jVfM+ULz/P4V6mteDU9ZPuc0E/pF1kGE7H8bINbpJhOxeKgO7c7OmonSIg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) smtp.rcpttodomain=sourceware.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qKoW+tpF0z6WbtzSdkekqv9iq8wuNm72sw5yOd3e3Ug=; b=JvswaXiMT5gmJwrtGAChYOMqsjFp4cZwkRDauBSO0mPwwOqyCeleBVXVIs9l4p19Qoh2TZJKIP4FjT7bLVwTvlu8mi0jGacGnqCyYY6MkAG7qItZ7r83aSxbcuPbGKAkMGUhU9uTmyyxaq6KbGQaO0KdnPhOUd7C+gbipF5GFBE= Received: from AS4P189CA0032.EURP189.PROD.OUTLOOK.COM (2603:10a6:20b:5dd::18) by AM8PR08MB6323.eurprd08.prod.outlook.com (2603:10a6:20b:354::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.22; Tue, 3 Mar 2026 16:19:05 +0000 Received: from AMS1EPF0000004D.eurprd04.prod.outlook.com (2603:10a6:20b:5dd:cafe::24) by AS4P189CA0032.outlook.office365.com (2603:10a6:20b:5dd::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.22 via Frontend Transport; Tue, 3 Mar 2026 16:19:05 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 4.158.2.129) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=arm.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 4.158.2.129 as permitted sender) receiver=protection.outlook.com; client-ip=4.158.2.129; helo=outbound-uk1.az.dlp.m.darktrace.com; pr=C Received: from outbound-uk1.az.dlp.m.darktrace.com (4.158.2.129) by AMS1EPF0000004D.mail.protection.outlook.com (10.167.16.138) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.16 via Frontend Transport; Tue, 3 Mar 2026 16:19:02 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WcNpwNCFtcnR9YY5PyFvic1z1KAnYlQNti4QZa6fTnXvlpBgM//995A1GtVcBiE3FHk6szD5oC1UTTJc2KfczDGzw+zg1wIrzqYBDR7zTNkQINBN27fc5RTzEt/aDtklvIViwxmmh4MapV6IXLj47o6hDameHWKVgbaaiWYOUuymt4mHn2HZoKbg9oYpxgJz9lUcNuVvG9kCoW6r05GMmnWQNSdwGD+XnCdum7G0/RJIoZeamf2lnBRy9aMfXpRCJH9gqzM3GvWOTgctq0QBs0ztSF3gnKGUELE73IXoBmXI1zXmHu0BHnvrvC/4qHuTswg2gdFXWfZFvoFVAIU5AQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qKoW+tpF0z6WbtzSdkekqv9iq8wuNm72sw5yOd3e3Ug=; b=bZcHqM3HbBJFgQG9iiIVr4Na8LOHtBAmqjF+H5Omv/j9z8esxUNQGcLSeoXlCbL/zLJPB9bub3Ma2S/12l6c/ylJDZrQvmlq0hWx6ZYOTDrFaVRcT7xo6DXNiDh00aHxGnzVeZV+Z/t7rtAvpAiKrJnIaQIrJPJoq60lC7GCsmbO3SpT8cgb2r8d1la3Gam3nJenoeUchBgpn27v2KlPOs9VsnwFm69UZHFCjfbZsZLlCglePkqW+BxzOLHGCUw5dr6OF4K7bLsAP6EjAt26OIrtPODIHKyj1XiYmTjj4km2EqZoICNvhriEm4D2UBr0sR+0YoEpI1UIgEumO54HdA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 172.205.89.229) smtp.rcpttodomain=sourceware.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arm.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qKoW+tpF0z6WbtzSdkekqv9iq8wuNm72sw5yOd3e3Ug=; b=JvswaXiMT5gmJwrtGAChYOMqsjFp4cZwkRDauBSO0mPwwOqyCeleBVXVIs9l4p19Qoh2TZJKIP4FjT7bLVwTvlu8mi0jGacGnqCyYY6MkAG7qItZ7r83aSxbcuPbGKAkMGUhU9uTmyyxaq6KbGQaO0KdnPhOUd7C+gbipF5GFBE= Received: from AM0PR10CA0015.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:17c::25) by AM9PR08MB6691.eurprd08.prod.outlook.com (2603:10a6:20b:303::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.22; Tue, 3 Mar 2026 16:17:55 +0000 Received: from AM4PEPF00027A5D.eurprd04.prod.outlook.com (2603:10a6:208:17c:cafe::87) by AM0PR10CA0015.outlook.office365.com (2603:10a6:208:17c::25) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.21 via Frontend Transport; Tue, 3 Mar 2026 16:17:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 172.205.89.229) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 172.205.89.229 as permitted sender) receiver=protection.outlook.com; client-ip=172.205.89.229; helo=nebula.arm.com; pr=C Received: from nebula.arm.com (172.205.89.229) by AM4PEPF00027A5D.mail.protection.outlook.com (10.167.16.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.16 via Frontend Transport; Tue, 3 Mar 2026 16:17:54 +0000 Received: from AZ-NEU-EX04.Arm.com (10.240.25.138) by AZ-NEU-EX03.Arm.com (10.240.25.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Tue, 3 Mar 2026 16:17:48 +0000 Received: from PF4S4363.arm.com (10.57.82.243) by mail.arm.com (10.240.25.138) with Microsoft SMTP Server id 15.2.2562.29 via Frontend Transport; Tue, 3 Mar 2026 16:17:47 +0000 From: Matthieu Longo To: , Tom Tromey CC: Matthieu Longo Subject: [PATCH v2 4/9] gdb: add new helpers for retrieving a type's fully qualified name Date: Tue, 3 Mar 2026 16:16:54 +0000 Message-ID: <20260303161659.397427-5-matthieu.longo@arm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260303161659.397427-1-matthieu.longo@arm.com> References: <20260303161659.397427-1-matthieu.longo@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EOPAttributedMessage: 1 X-MS-TrafficTypeDiagnostic: AM4PEPF00027A5D:EE_|AM9PR08MB6691:EE_|AMS1EPF0000004D:EE_|AM8PR08MB6323:EE_ X-MS-Office365-Filtering-Correlation-Id: a946bd2b-14c5-4f85-c711-08de794095b6 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; ARA:13230040|1800799024|376014|82310400026|36860700013|13003099007; X-Microsoft-Antispam-Message-Info-Original: CeVnsJHpTyMlSp/qvOCwioE8be+FuBJv3fSeg2W+wvTH2HIkN1yOCyhx9EUxQ+mr6VR8zP0DhB4tZFla3QZZuaaUC7E+DcbK3ouXk3Mpwx+sIr8wy66tSHzY/xc4tAAdHCErQr+fVlNvm1QB8J9itPH/PhGG2Y5u8XMtBIKmaN3r0W5tBqfjnxgEo49Cz+wN0l/Jn1r2R9EAGpXemDsPhYvz4yMgu9mMFfonIwldggXQYku0TupJOlo+I6Tp5iQjkjpdPw+YeBBIqpdNGLdyhYY7zfYzW7Oi0Z8hI/xWCJKS0SnsSLFepRSPI3l1+Q4twynPr3T9KZcX8u4O/mZUiAF2uG9qKrLAEYfzi7M1OdJG4jD9Qrf+bLR0qkirV10IPg79OxY1m5G4825Z6gNLwz5AXSaH/fbTly1F+c7D1WNo8j1OtOHcF+9qxnvyADibyLjvbYrZUd5R4Xi0g5NXTtqcw1qEKTKHxfJOZtGEBzfCLiD8QKCfkiLHM7HysNIr7BwYTBN3XR6GMw4hmoBWhmODN0RCpka8+TTcTTohuY5alyXCREzsNxSl+rr8EZjOC5gqStoj9YoNappa8KQjQLKnoH050r6dJzZZi/tdOyU/3VEfhLaxe5WOJm2H7rT0T6FqyiJVjjI8osKL6Ye5WrILgzD7o2EZXRCwNklIyUCXRaRw6YdAcPufQlzMyKTS2rT641W8Ti+bMUtrT09PgAR73a0chGYb/N821EaEDOwQ7raQxOwkbmveGYPgtjF1PrXr76IMl+SnWewlCIAXAMKG8XtGL9pPvau64EIpFL3ieozpWfCUdmpUfWGpcCOU8ZeKl2Fv8aK05i2zctePm68Z7KQfNhAHw4LuoZgSS0c= X-Forefront-Antispam-Report-Untrusted: CIP:172.205.89.229; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(1800799024)(376014)(82310400026)(36860700013)(13003099007); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR08MB6691 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS1EPF0000004D.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: ce473e58-85c0-4c85-7e0c-08de79406d2d X-Microsoft-Antispam: BCL:0; ARA:13230040|35042699022|1800799024|36860700013|376014|82310400026|14060799003|13003099007; X-Microsoft-Antispam-Message-Info: 1aSOJGsxeG9CWTrBq4SDf/xZUUekHl6HmPdbKcaqJl/GCARkXVXpgqpMWCOdrPN/IsL3QHhftWCA8tqQDokNau96ah3o/7HAAFd/PU4kZuODjOz53Aq05TE+Q1kpZ7RAZyXG3m06fCK1wYmFx2hKGqoGAW9t5He1yUCg2uYXiDJY4UiX333tqRRFa8VygwqOPpCAazthJ/mMmh3V64sskSK0ctPkbDC4gmlmzktNRMUli722OxhSZQEJuPi2ZzFuqJkNwCiBFFDLMBjj3AzA8BbI/SMb8i42VznBRHT5R7ESBjjCIRoOa2KLE1rEtiJO3RG4jVcf/zSvxh/c4jqro5qzfMXEZFRe/WXXzS+Pk58dRoTEGTOU4RcPwVYakpT8nxetukVhynihaKBN1J2NOqZvNISwCeDr75LL/JprlqH55CsmW1xMZkuQRZPrpvJG7+N8PCUrZpCYMd1hHMmHG2laN5jvLjpY0LoPjMO6xLfMdUZ6fDj0yhyxWPwHZ/IPzzbGTSB/WaOapDXqVdGqRBQpc/4glyLH02KK9jcf6Wxi8gzZZDeRVCDtWdFfowNY1C0GesLYMpKXVBNNfRL8qOxt0Rq9rBEzyDGRLZ66ovfkMcwhKidoPY9MODZbEvsdncjLU51Krp+MKZNaZru/1QWGDnIaMIbzBZddkI+4SLaqR2ureiHxNtFKcvcuXWN7QHBx7VQySNyo73GCT+SqBtDHPG75AZTP5siePu6y14XwO3UO+sWp8gJ8UFtT+T9XfodicH7r5lubvu93JFX4q7jRtPKNyhznwua3lEww3zSuNdmb2pcxJlLFS8oN69nr/tsZ0fx/hY7sQqkKhOIxyo3A3n1LltvJnOiwuyVMqUA= X-Forefront-Antispam-Report: CIP:4.158.2.129; CTRY:GB; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:outbound-uk1.az.dlp.m.darktrace.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(35042699022)(1800799024)(36860700013)(376014)(82310400026)(14060799003)(13003099007); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gLcZNrHJ4FjeUWQddTNFulHs+qvVct2SUbdQEDQ+lTDDnQC5BjW9rjimz6IUeI4n0x5t6+F9sIJL8H3u4tpvnMx/cEbSf3elygFnCQ6dROLP6Tnvp/2mO47LTRsAAVwcD5euHIyqQKMFfV6h1WZq9nS57d0Sb3iViv/Kep1iuWfcGRyRdRpyxceZ6qkTiH9cP3qYi0hCb/52F9/FGKfngqHeJP3Wj/5nzAtjeOuYb3mH2F7tdI7cxOuLlX8UKgAacdO4q6NvkfYFYKlWjuY18oCRiGijOki3bDtkMpg/rtDPnbodFA9x2a5Zixk1XqjX27E6ESFfzdlbwH51VamfBhcBQQEB5t14CK8LCLs/BghdIaY8HeLZx18aRc7k0TewfHaxvIipJdaRsYOVdCNwWSgCgLeba/PDpTof3XuQ13fM7bVer3QAwLh7wC09gAVL X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Mar 2026 16:19:02.9303 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a946bd2b-14c5-4f85-c711-08de794095b6 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[4.158.2.129]; Helo=[outbound-uk1.az.dlp.m.darktrace.com] X-MS-Exchange-CrossTenant-AuthSource: AMS1EPF0000004D.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB6323 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Py_TYPE (self)->tp_name is the traditional idiomatic way to get a Python type's fully qualified name. However, in the context of the Python limited API, PyTypeObject is opaque, so the 'tp_name' attribute is no longer accessible. Additionally, retrieving the type of a Python object requires Py_TYPE, which is only available as part of the stable API starting with Python 3.14. This patch increases minimal Python limited API version from 3.11 to 3.14. It also introduces two new helpers to retrieve a type's fully qualified name: gdb_py_tp_name() and gdbpy_py_obj_tp_name(), which extract the fully qualified name from a PyTypeObject and a PyObject, respectively. Ifdefery allows these wrappers to select the appropriate API depending on the Python version and whether the Python limited API is enabled. For any Python version less than 3.13, gdb_py_tp_name() fallbacks using __qualname__ instead. However, the result may differ slightly in some cases, e.g. the module name may be missing. Finally, this patch adapts the existing code to use these wrappers, and adjusts some test expectations to use the fully qualified name (or __qualname__ for versions <= 3.13) where it was not previously used. Note that the corner case where the module name would be missing does not appear in the testsuite. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=23830 --- gdb/Makefile.in | 1 + gdb/configure | 6 +- gdb/configure.ac | 6 +- gdb/python/py-arch.c | 3 +- gdb/python/py-block.c | 3 +- gdb/python/py-breakpoint.c | 9 ++- gdb/python/py-connection.c | 2 +- gdb/python/py-corefile.c | 2 +- gdb/python/py-disasm.c | 17 ++--- gdb/python/py-frame.c | 4 +- gdb/python/py-infthread.c | 2 +- gdb/python/py-mi.c | 2 +- gdb/python/py-micmd.c | 2 +- gdb/python/py-obj-type.c | 84 ++++++++++++++++++++++ gdb/python/py-obj-type.h | 31 ++++++++ gdb/python/py-style.c | 14 ++-- gdb/python/py-symbol.c | 3 +- gdb/python/py-type.c | 3 +- gdb/python/py-unwind.c | 8 +-- gdb/python/py-utils.c | 4 +- gdb/python/python-internal.h | 6 +- gdb/python/python.c | 2 +- gdb/testsuite/gdb.python/py-disasm.exp.tcl | 8 +-- gdb/testsuite/gdb.python/py-unwind.exp | 2 +- 24 files changed, 175 insertions(+), 49 deletions(-) create mode 100644 gdb/python/py-obj-type.c create mode 100644 gdb/python/py-obj-type.h diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 2aa95be968a..4f5966de25c 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -422,6 +422,7 @@ SUBDIR_PYTHON_SRCS = \ python/py-micmd.c \ python/py-newobjfileevent.c \ python/py-objfile.c \ + python/py-obj-type.c \ python/py-param.c \ python/py-prettyprint.c \ python/py-progspace.c \ diff --git a/gdb/configure b/gdb/configure index 12c54521682..9802f41f71f 100755 --- a/gdb/configure +++ b/gdb/configure @@ -28761,12 +28761,12 @@ fi if test "$enable_py_limited_api" = yes; then - # The minimal Python limited API version is currently set to 3.11 for the - # support of PyBuffer_FillInfo and PyBuffer_Release. + # The minimal Python limited API version is currently set to 3.14 for the + # support of Py_TYPE(). # The choice of the minimal version for the Python limited API won't be frozen # until the end of the migration. -$as_echo "#define Py_LIMITED_API 0x030b0000" >>confdefs.h +$as_echo "#define Py_LIMITED_API 0x030e0000" >>confdefs.h fi diff --git a/gdb/configure.ac b/gdb/configure.ac index cf8078e1d89..a3343dec118 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1070,11 +1070,11 @@ AC_ARG_ENABLE([py-limited-api], [enable_py_limited_api=no]) if test "$enable_py_limited_api" = yes; then - # The minimal Python limited API version is currently set to 3.11 for the - # support of PyBuffer_FillInfo and PyBuffer_Release. + # The minimal Python limited API version is currently set to 3.14 for the + # support of Py_TYPE(). # The choice of the minimal version for the Python limited API won't be frozen # until the end of the migration. - AC_DEFINE(Py_LIMITED_API, 0x030b0000, + AC_DEFINE(Py_LIMITED_API, 0x030e0000, [Define if GDB should be built against the Python limited C API.]) fi diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c index f40d7da1763..d859d66dc82 100644 --- a/gdb/python/py-arch.c +++ b/gdb/python/py-arch.c @@ -338,7 +338,8 @@ archpy_repr (PyObject *self) auto arch_info = gdbarch_bfd_arch_info (gdbarch); return PyUnicode_FromFormat ("<%s arch_name=%s printable_name=%s>", - Py_TYPE (self)->tp_name, arch_info->arch_name, + gdbpy_py_obj_tp_name (self), + arch_info->arch_name, arch_info->printable_name); } diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c index 263819e1292..602e86c3766 100644 --- a/gdb/python/py-block.c +++ b/gdb/python/py-block.c @@ -485,7 +485,8 @@ blpy_repr (PyObject *self) if (++written_symbols < len) str += ", "; } - return PyUnicode_FromFormat ("<%s %s {%s}>", Py_TYPE (self)->tp_name, + return PyUnicode_FromFormat ("<%s %s {%s}>", + gdbpy_py_obj_tp_name (self), name, str.c_str ()); } diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index 408d4b9d857..bdab68ec686 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -1065,9 +1065,11 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) static PyObject * bppy_repr (PyObject *self) { + const char *tp_name = gdbpy_py_obj_tp_name (self); + const auto bp = (struct gdbpy_breakpoint_object*) self; if (bp->bp == nullptr) - return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name); + return PyUnicode_FromFormat ("<%s (invalid)>", tp_name); std::string str = " "; if (bp->bp->thread != -1) @@ -1079,7 +1081,7 @@ bppy_repr (PyObject *self) str.pop_back (); return PyUnicode_FromFormat ("<%s%s number=%d hits=%d%s>", - Py_TYPE (self)->tp_name, + tp_name, (bp->bp->enable_state == bp_enabled ? "" : " disabled"), bp->bp->number, bp->bp->hit_count, str.c_str ()); @@ -1771,7 +1773,8 @@ bplocpy_repr (PyObject *py_self) str += fn_name; } - return PyUnicode_FromFormat ("<%s %s>", Py_TYPE (self)->tp_name, + return PyUnicode_FromFormat ("<%s %s>", + gdbpy_py_obj_tp_name (py_self), str.c_str ()); } diff --git a/gdb/python/py-connection.c b/gdb/python/py-connection.c index e2c29f6f180..c0cbfbd710e 100644 --- a/gdb/python/py-connection.c +++ b/gdb/python/py-connection.c @@ -201,7 +201,7 @@ connpy_repr (PyObject *obj) return gdb_py_invalid_object_repr (obj); return PyUnicode_FromFormat ("<%s num=%d, what=\"%s\">", - Py_TYPE (obj)->tp_name, + gdbpy_py_obj_tp_name (obj), target->connection_number, make_target_connection_string (target).c_str ()); } diff --git a/gdb/python/py-corefile.c b/gdb/python/py-corefile.c index 88fedbd718c..762348121a7 100644 --- a/gdb/python/py-corefile.c +++ b/gdb/python/py-corefile.c @@ -362,7 +362,7 @@ cfpy_repr (PyObject *self) bfd *core_bfd = get_inferior_core_bfd (obj->inferior); gdb_assert (core_bfd != nullptr); return PyUnicode_FromFormat ("<%s inferior=%d filename='%s'>", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), obj->inferior->num, bfd_get_filename (core_bfd)); } diff --git a/gdb/python/py-disasm.c b/gdb/python/py-disasm.c index 7635e45db56..1c5661dd307 100644 --- a/gdb/python/py-disasm.c +++ b/gdb/python/py-disasm.c @@ -304,7 +304,7 @@ disasmpy_info_repr (PyObject *self) const char *arch_name = (gdbarch_bfd_arch_info (obj->gdbarch))->printable_name; return PyUnicode_FromFormat ("<%s address=%s architecture=%s>", - Py_TYPE (obj)->tp_name, + gdbpy_py_obj_tp_name (self), core_addr_to_string_nz (obj->address), arch_name); } @@ -995,7 +995,7 @@ disasmpy_result_init (PyObject *self, PyObject *args, PyObject *kwargs) { PyErr_Format (PyExc_ValueError, _("Cannot use 'string' and 'parts' when creating %s."), - Py_TYPE (self)->tp_name); + gdbpy_py_obj_tp_name (self)); return -1; } @@ -1079,7 +1079,7 @@ disasmpy_result_repr (PyObject *self) gdb_assert (obj->parts != nullptr); return PyUnicode_FromFormat ("<%s length=%d string=\"%U\">", - Py_TYPE (obj)->tp_name, + gdbpy_py_obj_tp_name (self), obj->length, disasmpy_result_str (self)); } @@ -1294,7 +1294,7 @@ gdbpy_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr, PyErr_Format (PyExc_TypeError, _("Result from Disassembler must be gdb.DisassemblerResult, not %s."), - Py_TYPE (result.get ())->tp_name); + gdbpy_py_obj_tp_name (result.get ())); gdbpy_print_stack (); return std::optional (-1); } @@ -1381,8 +1381,9 @@ disasmpy_dealloc_result (PyObject *self) static int disasmpy_part_init (PyObject *self, PyObject *args, PyObject *kwargs) { - PyErr_SetString (PyExc_RuntimeError, - _("Cannot create instances of DisassemblerPart.")); + PyErr_Format (PyExc_RuntimeError, + _("Cannot create instances of %s."), + gdbpy_py_obj_tp_name (self)); return -1; } @@ -1419,7 +1420,7 @@ disasmpy_text_part_repr (PyObject *self) gdb_assert (obj->string != nullptr); return PyUnicode_FromFormat ("<%s string='%s', style='%s'>", - Py_TYPE (obj)->tp_name, + gdbpy_py_obj_tp_name (self), obj->string->c_str (), get_style_name (obj->style)); } @@ -1462,7 +1463,7 @@ disasmpy_addr_part_repr (PyObject *self) disasm_addr_part_object *obj = (disasm_addr_part_object *) self; return PyUnicode_FromFormat ("<%s address='%s'>", - Py_TYPE (obj)->tp_name, + gdbpy_py_obj_tp_name (self), core_addr_to_string_nz (obj->address)); } diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index c8548791f1f..93a3ba3e980 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -95,7 +95,7 @@ frapy_repr (PyObject *self) const frame_id &fid = frame_obj->frame_id; return PyUnicode_FromFormat ("<%s level=%d frame-id=%s>", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), frame_relative_level (f_info), fid.to_string ().c_str ()); } @@ -544,7 +544,7 @@ frapy_read_var (PyObject *self, PyObject *args, PyObject *kw) { PyErr_Format (PyExc_TypeError, _("argument 1 must be gdb.Symbol or str, not %s"), - Py_TYPE (sym_obj)->tp_name); + gdbpy_py_obj_tp_name (sym_obj)); return NULL; } diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c index 652355990ee..0f29e9fb7a4 100644 --- a/gdb/python/py-infthread.c +++ b/gdb/python/py-infthread.c @@ -355,7 +355,7 @@ thpy_repr (PyObject *self) thread_info *thr = thread_obj->thread; return PyUnicode_FromFormat ("<%s id=%s target-id=\"%s\">", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), print_full_thread_id (thr), target_pid_to_str (thr->ptid).c_str ()); } diff --git a/gdb/python/py-mi.c b/gdb/python/py-mi.c index 5189bda944e..27c79d60636 100644 --- a/gdb/python/py-mi.c +++ b/gdb/python/py-mi.c @@ -379,7 +379,7 @@ gdbpy_notify_mi (PyObject *self, PyObject *args, PyObject *kwargs) PyErr_Format (PyExc_ValueError, _("MI notification data must be either None or a dictionary, not %s"), - Py_TYPE (data)->tp_name); + gdbpy_py_obj_tp_name (data)); return nullptr; } diff --git a/gdb/python/py-micmd.c b/gdb/python/py-micmd.c index 0c820751c56..dac8234f095 100644 --- a/gdb/python/py-micmd.c +++ b/gdb/python/py-micmd.c @@ -510,7 +510,7 @@ micmdpy_set_installed (PyObject *self, PyObject *newvalue, void *closure) { PyErr_Format (PyExc_TypeError, _("gdb.MICommand.installed must be set to a bool, not %s"), - newvalue == Py_None ? "None" : Py_TYPE(newvalue)->tp_name); + newvalue == Py_None ? "None" : gdbpy_py_obj_tp_name (newvalue)); return -1; } diff --git a/gdb/python/py-obj-type.c b/gdb/python/py-obj-type.c new file mode 100644 index 00000000000..034ebd26b8d --- /dev/null +++ b/gdb/python/py-obj-type.c @@ -0,0 +1,84 @@ +/* Helpers related to Python object type + + Copyright (C) 2026 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "python-internal.h" +#include "py-obj-type.h" + +/* Return the type's fully qualified name from a PyTypeObject. */ +const char * +gdb_py_tp_name (PyTypeObject *py_type) noexcept +{ +#if PY_VERSION_HEX >= 0x030d0000 + /* Note: PyType_GetFullyQualifiedName() was added in version 3.13, and is + part of the stable ABI since version 3.13. */ + PyObject *fully_qualified_name = PyType_GetFullyQualifiedName (py_type); + if (fully_qualified_name == nullptr) + return nullptr; + + return PyUnicode_AsUTF8AndSize (fully_qualified_name, nullptr); + +#elif ! defined (Py_LIMITED_API) + /* For non-heap types, the fully qualified name corresponds to tp_name. */ + if (! (PyType_GetFlags (py_type) & Py_TPFLAGS_HEAPTYPE)) + return py_type->tp_name; + + /* In the absence of PyType_GetFullyQualifiedName(), we fallback using + __qualname__ instead. However, the result may differ slightly in some + cases, e.g. the module name may be missing. */ + +# if PY_VERSION_HEX >= 0x030b0000 + /* Note: PyType_GetQualName() was added in version 3.11. */ + PyObject *qualname = PyType_GetQualName (py_type); + if (qualname == nullptr) + return nullptr; + + return PyUnicode_AsUTF8AndSize (qualname, nullptr); + +# else + /* In the absence of PyType_GetQualName(), fallback on using PyHeapTypeObject + which is not part of the public API. + Tested on 3.10 which is the oldest supported version at the time of this + writing, i.e. February 2026. Hopefully, this workaround should go away + when the minimum supported Python version is increased above 3.10. */ + PyHeapTypeObject *ht = (PyHeapTypeObject *) py_type; + if (ht->ht_qualname == nullptr) + return nullptr; + + return PyUnicode_AsUTF8AndSize (ht->ht_qualname, nullptr); +# endif + +#else + #error "The version of Python you are using does not expose " \ + "PyType_GetFullyQualifiedName() as a part of the limited C API." +#endif +} + +/* Return the type's fully qualified name from a PyObject. */ +const char * +gdbpy_py_obj_tp_name (PyObject *self) noexcept +{ + /* Note: Py_TYPE () is part of the stable ABI since version 3.14. */ +#if ! defined (Py_LIMITED_API) \ + || Py_LIMITED_API >= 0x030e0000 + return gdb_py_tp_name (Py_TYPE (self)); +#else + #error "The version of Python you are using does not expose Py_TYPE() "\ + "as a part of the limited C API." +#endif +} diff --git a/gdb/python/py-obj-type.h b/gdb/python/py-obj-type.h new file mode 100644 index 00000000000..f1b118e287a --- /dev/null +++ b/gdb/python/py-obj-type.h @@ -0,0 +1,31 @@ +/* Helpers related to Python object type + + Copyright (C) 2026 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef GDB_PYTHON_PY_OBJ_TYPE_H +#define GDB_PYTHON_PY_OBJ_TYPE_H + +/* Return the type's fully qualified name from a PyTypeObject. */ +extern const char * +gdb_py_tp_name (PyTypeObject *py_type) noexcept; + +/* Return the type's fully qualified name from a PyObject. */ +extern const char * +gdbpy_py_obj_tp_name (PyObject *self) noexcept; + +#endif /* GDB_PYTHON_PY_OBJ_TYPE_H */ diff --git a/gdb/python/py-style.c b/gdb/python/py-style.c index aa6eccaadbe..e0b40fe6844 100644 --- a/gdb/python/py-style.c +++ b/gdb/python/py-style.c @@ -268,7 +268,7 @@ stylepy_init_from_parts (PyObject *self, PyObject *fg, PyObject *bg, PyErr_Format (PyExc_TypeError, _("'foreground' argument must be gdb.Color or None, not %s."), - Py_TYPE (fg)->tp_name); + gdbpy_py_obj_tp_name (fg)); return -1; } @@ -277,7 +277,7 @@ stylepy_init_from_parts (PyObject *self, PyObject *fg, PyObject *bg, PyErr_Format (PyExc_TypeError, _("'background' argument must be gdb.Color or None, not %s."), - Py_TYPE (bg)->tp_name); + gdbpy_py_obj_tp_name (bg)); return -1; } @@ -484,7 +484,7 @@ stylepy_set_foreground (PyObject *self, PyObject *newvalue, void *closure) if (!gdbpy_is_color (newvalue)) { PyErr_Format (PyExc_TypeError, _("value must be gdb.Color, not %s"), - Py_TYPE (newvalue)->tp_name); + gdbpy_py_obj_tp_name (newvalue)); return -1; } @@ -542,7 +542,7 @@ stylepy_set_background (PyObject *self, PyObject *newvalue, void *closure) if (!gdbpy_is_color (newvalue)) { PyErr_Format (PyExc_TypeError, _("value must be gdb.Color, not %s"), - Py_TYPE (newvalue)->tp_name); + gdbpy_py_obj_tp_name (newvalue)); return -1; } @@ -624,7 +624,7 @@ stylepy_set_intensity (PyObject *self, PyObject *newvalue, void *closure) PyErr_Format (PyExc_TypeError, _("value must be a Long (a gdb.INTENSITY constant), not %s"), - Py_TYPE (newvalue)->tp_name); + gdbpy_py_obj_tp_name (newvalue)); return -1; } @@ -734,12 +734,12 @@ stylepy_repr (PyObject *self) if (style_obj->style_name == nullptr) return PyUnicode_FromFormat ("<%s fg=%s, bg=%s, intensity=%s>", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), fg_str.get (), bg_str.get (), intensity_str); else return PyUnicode_FromFormat ("<%s name='%s', fg=%s, bg=%s, intensity=%s>", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), style_obj->style_name, fg_str.get (), bg_str.get (), intensity_str); } diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c index fe4d6dac000..e74c8e4b368 100644 --- a/gdb/python/py-symbol.c +++ b/gdb/python/py-symbol.c @@ -384,7 +384,8 @@ sympy_repr (PyObject *self) if (symbol == nullptr) return gdb_py_invalid_object_repr (self); - return PyUnicode_FromFormat ("<%s print_name=%s>", Py_TYPE (self)->tp_name, + return PyUnicode_FromFormat ("<%s print_name=%s>", + gdbpy_py_obj_tp_name (self), symbol->print_name ()); } diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 7ba77ad1d4a..ec4126d0589 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -1084,7 +1084,8 @@ typy_repr (PyObject *self) auto py_typename = PyUnicode_Decode (type_name.c_str (), type_name.size (), host_charset (), NULL); - return PyUnicode_FromFormat ("<%s code=%s name=%U>", Py_TYPE (self)->tp_name, + return PyUnicode_FromFormat ("<%s code=%s name=%U>", + gdbpy_py_obj_tp_name (self), code, py_typename); } diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index 9ffa382d093..dcf86f7db3d 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -247,7 +247,7 @@ unwind_infopy_repr (PyObject *self) if (frame == nullptr) return PyUnicode_FromFormat ("<%s for an invalid frame>", - Py_TYPE (self)->tp_name); + gdbpy_py_obj_tp_name (self)); std::string saved_reg_names; struct gdbarch *gdbarch = pending_frame->gdbarch; @@ -262,7 +262,7 @@ unwind_infopy_repr (PyObject *self) } return PyUnicode_FromFormat ("<%s frame #%d, saved_regs=(%s)>", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), frame_relative_level (frame), saved_reg_names.c_str ()); } @@ -456,7 +456,7 @@ pending_framepy_repr (PyObject *self) } return PyUnicode_FromFormat ("<%s level=%d, sp=%s, pc=%s>", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), frame_relative_level (frame), sp_str, pc_str); @@ -924,7 +924,7 @@ frame_unwind_python::sniff (const frame_info_ptr &this_frame, gdb_assert (pyo_unwind_info != nullptr); if (!PyObject_TypeCheck (pyo_unwind_info, &unwind_info_object_type)) error (_("an Unwinder should return gdb.UnwindInfo, not %s."), - Py_TYPE (pyo_unwind_info)->tp_name); + gdbpy_py_obj_tp_name (pyo_unwind_info)); { unwind_info_object *unwind_info = diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index 8283b30db04..47ba1a71ef4 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -362,7 +362,7 @@ gdb_py_generic_getattro (PyObject *self, PyObject *attr) Therefore, we must explicitly raise an AttributeError in this case. */ PyErr_Format (PyExc_AttributeError, "'%s' object has no attribute '%s'", - Py_TYPE (self)->tp_name, + gdbpy_py_obj_tp_name (self), PyUnicode_AsUTF8AndSize (attr, nullptr)); return nullptr; } @@ -700,5 +700,5 @@ gdbpy_fix_doc_string_indentation (gdb::unique_xmalloc_ptr doc) PyObject * gdb_py_invalid_object_repr (PyObject *self) { - return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name); + return PyUnicode_FromFormat ("<%s (invalid)>", gdbpy_py_obj_tp_name (self)); } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index fdd353ffbeb..06b9804d01e 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -59,6 +59,7 @@ #include #include #include "py-ref.h" +#include "py-obj-type.h" static_assert (PY_VERSION_HEX >= 0x03040000); @@ -1120,12 +1121,13 @@ gdbpy_type_ready (PyTypeObject *type, PyObject *mod = nullptr) { if (PyType_Ready (type) < 0) return -1; + const char *tp_name = gdb_py_tp_name (type); if (mod == nullptr) { - gdb_assert (startswith (type->tp_name, "gdb.")); + gdb_assert (startswith (tp_name, "gdb.")); mod = gdb_module; } - const char *dot = strrchr (type->tp_name, '.'); + const char *dot = strrchr (tp_name, '.'); gdb_assert (dot != nullptr); return gdb_pymodule_addobject (mod, dot + 1, (PyObject *) type); } diff --git a/gdb/python/python.c b/gdb/python/python.c index 5474b8d644f..27cb3417c89 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1579,7 +1579,7 @@ gdbpy_write (PyObject *self, PyObject *args, PyObject *kw) PyErr_Format (PyExc_TypeError, _("'style' argument must be gdb.Style or None, not %s."), - Py_TYPE (style_obj)->tp_name); + gdbpy_py_obj_tp_name (style_obj)); return nullptr; } diff --git a/gdb/testsuite/gdb.python/py-disasm.exp.tcl b/gdb/testsuite/gdb.python/py-disasm.exp.tcl index 07131a44bff..e4391fa59ce 100644 --- a/gdb/testsuite/gdb.python/py-disasm.exp.tcl +++ b/gdb/testsuite/gdb.python/py-disasm.exp.tcl @@ -124,7 +124,7 @@ set test_plans \ [list "" "${base_pattern}\r\n.*"] \ [list "GlobalNullDisassembler" "${base_pattern}\r\n.*"] \ [list "ShowInfoRepr" "${base_pattern}\\s+## \]+>\r\n.*"] \ - [list "ShowInfoSubClassRepr" "${base_pattern}\\s+## \]+>\r\n.*"] \ + [list "ShowInfoSubClassRepr" "${base_pattern}\\s+## \]+>\r\n.*"] \ [list "ShowResultRepr" "${base_pattern}\\s+## \r\n.*"] \ [list "ShowResultStr" "${base_pattern}\\s+## ${nop}\r\n.*"] \ [list "GlobalPreInfoDisassembler" "${base_pattern}\\s+## ad = $hex, ar = ${curr_arch}\r\n.*"] \ @@ -154,10 +154,10 @@ set test_plans \ "Buffer returned from read_memory is sized $decimal instead of the expected $decimal"]] \ [list "ResultOfWrongType" \ [make_exception_pattern "TypeError" \ - "Result from Disassembler must be gdb.DisassemblerResult, not Blah."]] \ + "Result from Disassembler must be gdb.DisassemblerResult, not ResultOfWrongType.Blah."]] \ [list "ResultOfVeryWrongType" \ [make_exception_pattern "TypeError" \ - "Result from Disassembler must be gdb.DisassemblerResult, not Blah."]] \ + "Result from Disassembler must be gdb.DisassemblerResult, not ResultOfVeryWrongType.Blah."]] \ [list "ErrorCreatingTextPart_NoArgs" \ [make_exception_pattern "TypeError" \ [missing_arg_pattern "style" 1]]] \ @@ -337,7 +337,7 @@ foreach len {0 -1} { foreach type {DisassemblerTextPart DisassemblerAddressPart} { gdb_test "python result = gdb.disassembler.${type}()" \ [multi_line \ - "RuntimeError.*: Cannot create instances of DisassemblerPart\\." \ + "RuntimeError.*: Cannot create instances of gdb.disassembler.${type}\\." \ "Error occurred in Python.*"] \ "try to create an instance of ${type}" } diff --git a/gdb/testsuite/gdb.python/py-unwind.exp b/gdb/testsuite/gdb.python/py-unwind.exp index 8c90da50a1d..784d9dfcb64 100644 --- a/gdb/testsuite/gdb.python/py-unwind.exp +++ b/gdb/testsuite/gdb.python/py-unwind.exp @@ -249,7 +249,7 @@ with_test_prefix "bad object unwinder" { gdb_test_no_output "python obj = bad_object_unwinder(\"bad-object\")" gdb_test_no_output "python gdb.unwinder.register_unwinder(None, obj, replace=True)" gdb_test "backtrace" \ - "Python Exception : an Unwinder should return gdb.UnwindInfo, not Blah\\.\r\n.*" + "Python Exception : an Unwinder should return gdb.UnwindInfo, not bad_object_unwinder.+Blah\\.\r\n.*" } # Gather information about every frame. -- 2.53.0