gnucap-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: scope and CARD_LIST:_card_list


From: al davis
Subject: Re: scope and CARD_LIST:_card_list
Date: Fri, 29 Jan 2021 16:19:21 -0500

On Wed, 27 Jan 2021 00:55:06 +0100
Felix Salfelder <felix@salfelder.org> wrote:
> On Mon, Jan 25, 2021 at 03:08:15PM -0500, al davis wrote:
> > > I also have issues with DEV_DOT. Symptoms are that commands like "get"
> > > wont work properly if scope != CARD_LIST::_card_list. This is because
> > > the owner is lost in command elaboration.[..]  
> > 
> > use scope?  
> 
> Not sure what you mean. I was thinking of something like
> 
> {
>       CARD_LIST cl;
>       CMD::command("get file", &cl);
> }

You could, but it needs to change underneath.  You have the idea with
the s_* files.  It needs to be extended to all.  Use the Scope argument
to do_it(), instead of direct access to CARD_LIST::card_list.

To check that it really works, add check code:


void XXXXXXXXXX::do_it(CS& Cmd, CARD_LIST* Scope)
{
  assert(Scope);
  if (Scope == &CARD_LIST::card_list) {untested();
  }else{untested();
  }


Then change all CARD_LIST::card_list to Scope->


> e.g. LANG_SPICE_BASE::parse_command does
> 
> CARD_LIST* scope = (x->owner()) ? x->owner()->subckt() : 
> &CARD_LIST::card_list;
> [..]                   ^ is NULL
> CMD::cmdproc(cmd, scope);

Keep this use of CARD_LIST::card_list.


> I think the workaround is to use a CARD at the root instead, and avoid
> CMD::command. Similar to
> 
> {
>       BASE_SUBCKT* root = device_dispatcher.clone("subckt");
>       CS cs(STRING, "get file");
>       new__instance(cs, root, root->subckt());
> }

I thought of that.  It might be an improvement.  

It's not really necessary, and really just cosmetic, so don't do that
yet.  Get the first part working, then try it.

> Not sure which consequences this will have. CARD::long_label might not
> play well if there is an additional owner at the top. 


> (and set_owner has
> an assertion against resetting it NULL, perhaps for a reason).

 void   set_owner(CARD* o) {assert(!_owner||_owner==o); _owner=o;}

That assertion is against resetting _owner, to anything, but allowing redundant 
calls.

!owner .........  it's not set.
_owner==o   .........   the call is a confirmation.

Once _owner is set, you can't reset it, but you can hit it again to
make sure it is set.

I don't remember any problem with changing the owner after it was set,
but it wasn't tested.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]