SlickEdit Community

SlickEdit Product Discussion => SlickEditĀ® => Slick-CĀ® Macro Programming => Topic started by: jporkkahtc on January 16, 2017, 05:34:13 am

Title: Loading and unloading macro files and Slick Stack
Post by: jporkkahtc on January 16, 2017, 05:34:13 am
I've got a project with several *.E files.

To try to a avoid getting into a weird state, I've written 2 commands and placed them into a separate FOO.e file._command void SymTagUnload() name_info(',')
{
    unload("m1.ex");
    unload("m2.ex");
    unload("m3.ex");
}

_command void SymTagload() name_info(',')
{
    load("C:\\Users\\joe\\Documents\\Slickedit\\macros\\m3.e");
    load("C:\\Users\\joe\\Documents\\Slickedit\\macros\\m2.e");
    load("C:\\Users\\joe\\Documents\\Slickedit\\macros\\m1.e");
}


Now, sometimes after unloading Slick gets into a state where it gets a slick-stack everytime slick gets focus - so then I have to kill Slick with the taskman. The stack
stack[2017-01-15T21:25:18Z] Slick-C STACK TRACE ******************************
stack[2017-01-15T21:25:18Z] Created on 1/15/2017 at 21:25:18 (776 ms)
stack[2017-01-15T21:25:18Z] SlickEdit Pro Version 21.0.1.0 Copyright 1988-2016 SlickEdit Inc.
stack[2017-01-15T21:25:18Z] Edit module and type "st -f <offset>" to get the
stack[2017-01-15T21:25:18Z] run-time error position
stack[2017-01-15T21:25:18Z]
stack[2017-01-15T21:25:18Z] error code=-3015
stack[2017-01-15T21:25:18Z] Invalid argument
stack[2017-01-15T21:25:18Z]
stack[2017-01-15T21:25:18Z]files.ex 12164 call_list(_switchbuf_,,W,<empty>,-1)   p_window_id: 246   p_object: OI_EDITOR   p_name: edit1
stack[2017-01-15T21:25:18Z]stdprocs.ex 13633 switch_buffer(,W,<empty>,-1)   p_window_id: 246   p_object: OI_EDITOR   p_name: edit1
stack[2017-01-15T21:25:18Z]stdprocs.ex 13381 _on_got_focus()   p_window_id: 246   p_object: OI_EDITOR   p_name: edit1


In m1,m2 and m3, there are a couple of call_list() event handlers, like:
void _switchbuf_m2(_str oldbuffname, _str flag)
{
}


An apparently, call_list doesn't seem to get the memo that this macro file was unloaded.


What is the best way to got about loading and unloading *.E files during development?
Slick seems to be pretty flaky about it - I imagine there is some trick to it?
Title: Re: Loading and unloading macro files and Slick Stack
Post by: Graeme on January 17, 2017, 10:41:01 am
I almost never use unload, for no particular reason.  I just tried the call_list _switchbuf problem you mention and I get a slick c stack the same as you.  I wonder why I get two (and sometimes 4) calls to _switchbuf every time I switch buffers.  If I comment out the _switchbuf function and reload the module, there's no slick stack  - so maybe instead of unloading a module you could load an empty module of the same name from another folder.
Title: Re: Loading and unloading macro files and Slick Stack
Post by: jporkkahtc on January 17, 2017, 06:23:47 pm
Nice that its easy to repro :-)

Good idea about the empty file, though I think I got things more under control now.
My _switchbuf code wasn't needed so I just removed it - solving that problem.

With timers at least, you can kill the timers before unloading a module, but I don't know how you could avoid the wrath of call_list.

I've also had more luck now using SymTagLoad() to reload everything, in the right order, rather than just reloading each file as I make changes. It helps also that unloading works with the _switchbuf function removed.

I'm a little surprised to find that global variables in a module survive and keep their values even with unload / load: I would have expected them to vanish with unloading - I'd imagine this can cause vslick.sta to get bloated.

Title: Re: Loading and unloading macro files and Slick Stack
Post by: jporkkahtc on January 17, 2017, 06:57:01 pm
In Files.e,  call_list keeps a global cache of function indexes - gcall_list_indexes.
This isn't updates on module unload, and it should be.

It is updated on module load.

files.e implements
    void _on_load_module_call_list()
But it also needs to implement
    void _on_unload_module_call_list()

and clear this cache.
Title: Re: Loading and unloading macro files and Slick Stack
Post by: Clark on January 26, 2017, 03:52:31 pm
I've checked in a fix for v21.0.2 so that call_list() handles the case where you unload a module. Need to pre-check the cached listed to make sure the indexes are all callable with index_callable(index).