From patchwork Fri Dec 15 15:19:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 82261 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5266F38618E8 for ; Fri, 15 Dec 2023 15:20:22 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic302-20.consmr.mail.ir2.yahoo.com (sonic302-20.consmr.mail.ir2.yahoo.com [87.248.110.83]) by sourceware.org (Postfix) with ESMTPS id 2732C3858D1E for ; Fri, 15 Dec 2023 15:20:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2732C3858D1E Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 2732C3858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=87.248.110.83 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702653608; cv=none; b=VpsYV5loCdnXaWBYg/qu3VKHRrQiH0hUM4P+RNCUvMAhKSPLWEVM58w70ZV+K7UYLNhIXOwW33MUwDAPvOx+nVKNAhrcwxkzenmccxaVD8bZZKjG4R+r2oWo9secDHMEKgT5WrcOFsnz+IIbwisinhvtchRoxC7cHWP7UEE5m7w= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702653608; c=relaxed/simple; bh=6N7USAfsJO/CvnzxL++p8OG2n4NFqrb4hp1VL1hIM3Y=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=lSI3ur/5mCaDhywQmGyMqjVeqN2W4wlK09VRNOzsYAn3aE+Jiv6w2CeePS/Xrt7YWSHd9kP3BrEqHvod05LwUykZSSJDFSuZEGdEG1w6+o7GLfHGSsPXLGfET7y7nlxTb5L0rs3S5exNEKWWL83BG6MMzHHpPY0cpRuDvyrMYQI= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1702653605; bh=sBeP6JTi6cmmxnFcxAPIf8tfXiNXeHgDBgTO77CbWoo=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=XpS5BQMFi6oLMaR57EzoOaolrlOwIsJIVe1eOGOQAc0MkFO6DrRQoamAwZhMK4ksUlZ+ioMRK3UZrUWdc9MbMed0pYN7bzluOr/iUX+9nyYOKNqHp8WPteNAbIgeTSyTN2Sdhb+dwmhpBVU/w3q/0moptOqG2Pms2en2phUrrSU4j+STQVD99frajg6Os+BZGIOn4aVtkF6elZEtA5nIu6km0SDHiiJ8JKDr0hVvRCGSFXxyVWBQAVB8tuEk825uaQt6DZi0KvDFQw8EgZzSd30QXRyUmgtxP1FdxqSCYyH6ZbqNsI1uC5hbuWKxbdxJ7gIivO/klDgXKl4uMR6LxQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1702653605; bh=DKcHVWPDI9orhWiAx0+gH7SL4QBsgi5Z4+ExGPPLRW0=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=Swh7l4PTE6oFD8DdNGn/Mu3KE57xWhRw/UAPgw96kf5J275KQ2XEfqu6nbTwtum5BAn4LT2ayt3ZIYX6PGmRsLjkjVWRZ40bPyTFZ/txn7Fn9VqmeeIyzTSkWceB+D6vb6LPizb4IO2Ae6r7V2anpkGLTA8VhxxNktpqK547GXA8EdfGydrE48xOZfKKcPC6pnkbAat3pqf5DURCZaNyrvO4SZfP0DuSItc6wU4rFIWLYWycyqh6waVYdE3OsyKUeiboTJtdgzWPt07IeRt39Y158GBKSOuuCuZT9uVQG/oXTWGlpd/pCT0tlwHAu9S7qShy7gsqPPM5JNLePFHpCw== X-YMail-OSG: RNuKL5EVM1lWFBDDsDQtMFnS8Oc2TICHC4xOwv9.o8qZOXuzxps8NrMLr6_uaFX UbuRwrgUDIRKm_SuIy3BLjZo9KXHfKy2.sEsTzIhSddzhGQhWV.lyGMVkHZYXrx4_WCIQ7H3szH5 3_CXxcDUaCkN1QhLCSPGj4fcyJjT834xYkTkNEyHmE56Vb40q0HiMo_tHzW30YtlWE2JCb1sAvGW aQVacPj0qJDWN9JdyoqMKNsyKlQxzNOQyEOeRNIta6PDaWcN7Zy8Tt.yELJyh_eLapo2JTIt3ktk yNDO2EIgynKGXdObL1tujjVAhf.dglfJeF8CAs78bkrML6fCyHhG_iSTbyEPc_lbqF7sbC9fvc_g fwFjTPYpNGwj6n7i8QDLROosIYLNykcurUe7ICaU94J1mquTKlIfj9mmeHLACtZro1j1kNqvxEHV FWs1E99Vfe9XwXqVsPHvXHFCWeCXWfMQxvAnVwF4AwsbgyPgKA6tNAB_OH1Iy3lJni8ijAXssOZx 8wBBH94BWi9Dk7udXK4GMrvQyl1kyj2A9OzfPkBbrnJyHL1BFcQqhzA84.yNz3xflTzCi35IDAFz I5q6KtIp.FHUmEB2sZsY2uBLxd32EG0WQHpXgR75OQsz8PktbuVUYrgAu3UaLjOKQwSPPavNomxl ScwFSEiMHDFHkt9fv7nsPSATep4nv5gPRui7qGx2SobNgNgEEtYJeahzblrIfPAjw2uah.shsnwF HOl4GErkf0S.uOupXsok6yA3j62A8KGrV2FqOG40MRhsCe5D1sekjJcfeEEL8CN0H_YHCvmt983g aut2LAPyPb3nSIaQ3pbJOiyHvUmvIKdGDK6_HE2WZaYFQUACazyNnEZKzmLwrR3PJVimO4g29oVT bZ18pSBjiTRyuy.1LPXdCs_XYZkM8slC3B_mt.BGxmQrYiqpOpfPupMlbQ56KIfd3nQ2eLmfWcWy ZpIiDpkIVHFydbYRhnULN8Ti7Z9LmZ4Y3HbTl8A3ZxpNki38rK9m_DKCGHSE5KIXb_zWjik0NBb. UEiZQ1KNR3GH2aRrsrbaHoQ4mR9TnN46Cih8sBljmPaZ3HPBBUeUws5heYzhFY9d1guK8jQ1GPUD GPhq3snfMUpfvhix4RZ2bxd7tAU0OisEaWqVaR5Dt5SsdJl3Ton2Ts57ib3Gusp0C6Z7IQ2M8t2L S2bd1q7uGJy.0en9Zti4bWW7Jq_zul.KkLfix.XJFxOR9TQw5YY2k5iJIN5FpP1GpuXNngGNg1w5 WeMqY1IHyq_.2_UgFCyvqBMtyTJoGQkGAKBW7YVADrbWS_wdWgrf_ghR.7q.4vPBkoaUbLkY1cDJ FKRMWLkFAgP9q1IlKezM.ilTnWxU2N6jxdvDUr8AA8libbDO4I_J9lqlPBy7qtw52WA68Ep51j7H reRPeFkVqH_O3TDrQgPk6SnZU67BUMehkJiqzqP5iX3FGCVmOeC.dhVK0rMsjzMPM.j2FNmAmkqF MeYYpwxiohzlK2oNwDRHsaqc74VlwjFYP3eKNu_qxcddkzUHi9sZeuoLS2nSvO5CkLVamO8JyJut En6sYynN4UB9_iFEvZfi.1mzyvItYpoklwckuESlF0BjcEGf1Vg3VVjhg_7UrCIcDqFtVPXdRctm .h2W4asXNSuq8Z5a5bxjPR5.bd6MEYt4SaDFsexLh9pl9o65h5vJCXdYlKe1bzHD6zayCk2gn1Jc lRNSkwi9EEwPvv01txBNgudYzmYVYfl_pHMULURqCnsyXAFg0CCVbjnA5ZAhGlu6UM_DAZHwvMq2 9jImlT9RFhVK7tHQZyisnk20JH7VGH8Ls_L6_fmKUsi0.yKEAjwwsbt1quGaUBfuaMB4ZaHK8GwV AJ1lbFAuZ1XLY8fRd1InZe3EIIrpWtLVqELyuXQsXI3lQ8VFZCMr1xrETWYJyKDjsGn7l.HUKYey DXIGd.HvfQ4LIfDYMaJ3EsomdOBrwcqNwin32tNmW3g3xcJLrKROxu6uCcKPdGWCdoBCh6DTEHPQ VOTLHMuWr3QEpEf5RRdonKaKHR4RTqVdfhsdKNoKIWtz_Wb8ayXFWaFP_Bhn9LUBYxUxYnwuntN7 HcSCI7p9OuRHnnFRpOL2Wsz.QIzfZejNxss50x4zi9SydaqaJHe90T4xeo5cPEXUwydx3ezbbhq6 q1AqZEo0xwaJI.mGWCqSVvdglIisM.jp9ITYxptnghfsSvkZwNfE5vfPgM9kCN_3pjCJ8lSNsk59 VcWXr_N1WfR_Lk92NR.TH7LL9e3tL X-Sonic-MF: X-Sonic-ID: a2597d93-a611-4584-bed6-95220aa3a685 Received: from sonic.gate.mail.ne1.yahoo.com by sonic302.consmr.mail.ir2.yahoo.com with HTTP; Fri, 15 Dec 2023 15:20:05 +0000 Received: by hermes--production-ir2-6488884f6f-z2znk (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID b70a6c365ed8a99ba989620b1610e66d; Fri, 15 Dec 2023 15:20:02 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH] Allow calling of C++ methods from python Date: Fri, 15 Dec 2023 16:19:38 +0100 Message-Id: <20231215151938.3887-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 231215-6, 12/15/2023), Outbound message X-Antivirus-Status: Clean References: <20231215151938.3887-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org 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+patchwork=sourceware.org@sourceware.org Currently it's not possible to call C++ methods from python. Using this example: ``` class B { static int static_func (); int arg0_func (); int arg1_func (int arg1); int arg2_func (int arg1, int arg2); }; B *b_obj = new B; ``` Trying to call B::static_func gives this error: ``` (gdb) py b_obj = gdb.parse_and_eval('b_obj') (gdb) py print(b_obj['static_func']()) Traceback (most recent call last): File "", line 1, in RuntimeError: Value is not callable (not TYPE_CODE_FUNC). Error while executing Python code. ``` TYPE_CODE_METHOD was simply missing as a possible type in valpy_call, now the same is possible: ``` (gdb) py b_obj = gdb.parse_and_eval('b_obj') (gdb) py print(b_obj['static_func']()) 1111 ``` Note that it's necessary to explicitely add the this pointer as the first argument in a call of non-static methods: ``` (gdb) py print(b_obj['arg0_func']()) Traceback (most recent call last): File "", line 1, in gdb.error: Too few arguments in function call. Error while executing Python code. (gdb) py print(b_obj['arg0_func'](b_obj)) 198 ``` Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=13326 --- gdb/python/py-value.c | 5 +++-- gdb/testsuite/gdb.python/py-value-cc.cc | 25 ++++++++++++++++++++++++ gdb/testsuite/gdb.python/py-value-cc.exp | 12 ++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index f360f849ce6..f5e22593254 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1214,10 +1214,11 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords) GDB_PY_HANDLE_EXCEPTION (except); } - if (ftype->code () != TYPE_CODE_FUNC) + if (ftype->code () != TYPE_CODE_FUNC && ftype->code () != TYPE_CODE_METHOD) { PyErr_SetString (PyExc_RuntimeError, - _("Value is not callable (not TYPE_CODE_FUNC).")); + _("Value is not callable (not TYPE_CODE_FUNC" + " or TYPE_CODE_METHOD).")); return NULL; } diff --git a/gdb/testsuite/gdb.python/py-value-cc.cc b/gdb/testsuite/gdb.python/py-value-cc.cc index d82e385d6c5..61a8f1a7b0f 100644 --- a/gdb/testsuite/gdb.python/py-value-cc.cc +++ b/gdb/testsuite/gdb.python/py-value-cc.cc @@ -37,8 +37,33 @@ union U { class B : public A { public: char a; + + static int static_func (); + int arg0_func (); + int arg1_func (int arg1); + int arg2_func (int arg1, int arg2); }; +int B::static_func () +{ + return 1111; +} + +int B::arg0_func () +{ + return A::a + a; +} + +int B::arg1_func (int arg1) +{ + return a * arg1; +} + +int B::arg2_func (int arg1, int arg2) +{ + return a * arg1 + arg2; +} + struct X { union { int x; char y; }; diff --git a/gdb/testsuite/gdb.python/py-value-cc.exp b/gdb/testsuite/gdb.python/py-value-cc.exp index b6571cd8297..6a424e3b407 100644 --- a/gdb/testsuite/gdb.python/py-value-cc.exp +++ b/gdb/testsuite/gdb.python/py-value-cc.exp @@ -99,3 +99,15 @@ gdb_test "python print(uu\[uu_fields\[1\]\]\['a'\])" "1000" "uu.a via field" # Test overloaded operators. gdb_test_no_output "python a = gdb.parse_and_eval('a')" "init a" gdb_test "python print(a + 5)" "10" "a + 5" + +# Test inferior function calls of methods. +gdb_test "py print(b_obj\['static_func'\]())" "1111" +gdb_test "py print(b_obj\['arg0_func'\]())" ".*Too few arguments in function call.*" +gdb_test "py print(b_obj\['arg0_func'\](b_obj))" "198" +gdb_test "py print(b_obj\['arg1_func'\]())" ".*Too few arguments in function call.*" +gdb_test "py print(b_obj\['arg1_func'\](b_obj))" ".*Too few arguments in function call.*" +gdb_test "py print(b_obj\['arg1_func'\](b_obj, 3))" "294" +gdb_test "py print(b_obj\['arg2_func'\]())" ".*Too few arguments in function call.*" +gdb_test "py print(b_obj\['arg2_func'\](b_obj))" ".*Too few arguments in function call.*" +gdb_test "py print(b_obj\['arg2_func'\](b_obj, 4))" ".*Too few arguments in function call.*" +gdb_test "py print(b_obj\['arg2_func'\](b_obj, 5, 6))" "496"