From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id iToKBwxDhF/CZgAAWB0awg (envelope-from ) for ; Mon, 12 Oct 2020 07:50:36 -0400 Received: by simark.ca (Postfix, from userid 112) id 0F18E1EF6F; Mon, 12 Oct 2020 07:50:36 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id DE5261E58C for ; Mon, 12 Oct 2020 07:50:34 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3F362388A419; Mon, 12 Oct 2020 11:50:34 +0000 (GMT) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by sourceware.org (Postfix) with ESMTPS id CC62C387089F for ; Mon, 12 Oct 2020 11:50:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CC62C387089F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=alves.ped@gmail.com Received: by mail-wr1-f68.google.com with SMTP id x7so10231515wrl.3 for ; Mon, 12 Oct 2020 04:50:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=CVTG3Da01EkTOHLYGM491awFXZ+lKBsUInDiLarkjDM=; b=cP2QxHTstv3E+aBSSvklcWGj99Zui+C3z74Ey5lc/KOJL8u8EQlPpK69SyUxLtdF7N 7moNmUAaGZFzT6Un06uOYFH51JZRHCMkU+Fyos5qa4uTEsxBZBUCnDHw+uD0GrkOII/6 d1YGvmotkse8L5lU/eHeT5kGHRLMZoFw2RH8VteZntlU9F5d0ZXsZFj8MnhwXpcOPUgs n+COEYYJtV3h/D6CJEDiM7RpcKqlEV6jcvF2UQxSlIEpr7tq9vEUbU3SdhMf2PI128Nc 3W26IBBs9V0iUJL15FgotZKOUArYg1XRZ1MJichvzax/6l3kg4fhWK5r6xD7qAP/ZfOP rR3Q== X-Gm-Message-State: AOAM530bwNxN19JbIEl5+XVEo0bC3UBOIBMJEQOJzzCnuQkPSot87FR0 bucsvY9LyJZ+cPgpkjAvFY8lh8JylDo7u43n X-Google-Smtp-Source: ABdhPJwEMtVZQI528t7zKpopE4HhOKlUen4sZ6VTS7JKyKyFx1KIQLxe/BqGhCccZZJSXdBlBc6gTg== X-Received: by 2002:a05:6000:8a:: with SMTP id m10mr11115115wrx.46.1602503430094; Mon, 12 Oct 2020 04:50:30 -0700 (PDT) Received: from ?IPv6:2001:8a0:f91e:6d00:c80a:ea25:47ef:5f73? ([2001:8a0:f91e:6d00:c80a:ea25:47ef:5f73]) by smtp.gmail.com with ESMTPSA id j17sm24807940wrw.68.2020.10.12.04.50.28 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 12 Oct 2020 04:50:29 -0700 (PDT) Subject: Re: Add a way to invoke redefined (overridden) GDB commands To: Marco Barisione , gdb-patches@sourceware.org References: <20200914093925.5442-1-mbarisione@undo.io> From: Pedro Alves Message-ID: Date: Mon, 12 Oct 2020 12:50:27 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20200914093925.5442-1-mbarisione@undo.io> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" On 9/14/20 10:39 AM, Marco Barisione wrote: > Currently, when a GDB command is redefined, the original implementation is not > available any more. This makes it difficult to build features on top of > existing commands. > > Last year I submitted a patch to fix this but I ran out of time to address the > review comments (the original patch was sent on the 28th of October 2019). > These patches restart that work and should address all the comments I got last > time. As the patchea are very different and a long time passed, I'm > submitting as a new series. > > My patches add a new "uplevel" command and a new gdb.Command.invoke_uplevel > method inspired by TCL (as initially suggested by Andrew Burgess) so you can > do this: > > (gdb) define run > echo Will run!\n > uplevel 0 run > end > (gdb) run > Will run! > [... normal output of run ...] > > > There are a couple of other things which could be added to make the "uplevel" > command more helpful, but I think they are out of scope and my patches are > already useful as they are. So I'm looking at this afresh, and really questioning this "uplevel N" design. This it not really like TCL's "uplevel". With TCL's uplevel, you are accessing a different scope or frame, not a previous implementation of the function that was overwritten. To me, the naming choice is confusing, from that angle. If someone extends GDB's CLI to gain support for local variables, then a really-TCL-like uplevel is likely handy, and then calling that feature "uplevel" would be good. I also question whether "uplevel N" with "N>0" is really usable, since in general you don't know what other scripts may have overridden. E.g., you never know what "uplevel 3 cmd" will run, since you don't know how many scripts redefined/overridden cmd. If we stick with the TCL inspiration, I think a better approach would be to add support for renaming commands, like TCL's rename command: https://www.tcl.tk/man/tcl8.4/TclCmd/rename.htm So a user would do: (gdb) rename run org_run (gdb) define run > echo Will run!\n > org_run > end (gdb) run Will run! [... normal output of run ...] (gdb) org_run [... normal output of run ...] (You can find many examples of TCL's rename in use in GDB's testsuite.) Thanks, Pedro Alves > > The first thing is adding a way of accessing the untokenised arguments to a > command via something like "$arg@" (Andrew Burgess suggested "$argv", but > Pedro Alves pointed out that would look like an argument vector). > > Another thing which could be added is the ability to do "uplevel -1 ..." to > access the directly redefined command. > This is implemented in Python but I couldn't find an obvious way of doing that > for the "uplevel" command as there's no way of knowing which command you are > currently executing (at least from what I could see). > Maybe it could be implemented in a similar way to how command arguments are > kept around with scoped_user_args_level, so we could keep a stack of all (user > and non-user) commands which are being executed. By checking the latest one > you can know what "uplevel -1" would apply to. >