Yuck, a very ancient crasher in going area-full screen in Blender.
authorTon Roosendaal <ton@blender.org>
Fri, 17 Nov 2006 12:44:15 +0000 (12:44 +0000)
committerTon Roosendaal <ton@blender.org>
Fri, 17 Nov 2006 12:44:15 +0000 (12:44 +0000)
I wonder how this survived so long in Blender... (2005/03/09 commit).

Reason was the call to BPY_free_screen_spacehandlers(sc) in kernel,
which was freeing up scripthandlers in a weird way. That call is
really obsolete. The real freeing should go in the del_area() call,
to prevent copying and deleting area in the UI to go wrong.

(Crash happened in testing timeline markers, and holding CTRL+Uparrow
a while...)

source/blender/blenkernel/BKE_bad_level_calls.h
source/blender/blenkernel/bad_level_call_stubs/stubs.c
source/blender/blenkernel/intern/screen.c
source/blender/python/BPY_interface.c
source/blender/src/editscreen.c

index a5ad16e752e157d641d0ee7ebc6f77a0c05191a4..91268ffe2439fa1406b242639d444b09b1cb048e 100644 (file)
@@ -66,7 +66,6 @@ struct Object;
 void BPY_do_pyscript (struct ID *id, short int event);
 void BPY_clear_script (struct Script *script);
 void BPY_free_compiled_text (struct Text *text);
-void BPY_free_screen_spacehandlers (struct bScreen *sc);
 /* pydrivers */
 struct Object **BPY_pydriver_get_objects(struct IpoDriver *driver);
 float BPY_pydriver_eval(struct IpoDriver *driver);
index 173a130a25e98f7945ec3d7837c32fa4e8b021c8..18b59a751338bf1804a9062fbc764e32b0a4b99f 100644 (file)
@@ -109,7 +109,6 @@ void mainqenter (unsigned short event, short val){}
 void BPY_do_pyscript(ID *id, short int event){}
 void BPY_clear_script(Script *script){}
 void BPY_free_compiled_text(struct Text *text){}
-void BPY_free_screen_spacehandlers (struct bScreen *sc){}
 void BPY_pydriver_update(void){}
 float BPY_pydriver_eval(struct IpoDriver *driver)
 {
index 59bfa17472ea72cd3afee9367dba1ed5a23b2fd4..5e8735147c37feda6107cb46fae05feee0c93ea8 100644 (file)
@@ -51,7 +51,6 @@ void free_screen(bScreen *sc)
 {
        unlink_screen(sc);
 
-       BPY_free_screen_spacehandlers(sc);
        BLI_freelistN(&sc->vertbase);
        BLI_freelistN(&sc->edgebase);
        BLI_freelistN(&sc->areabase);
index fcf00a895e2008d3d351f9995ec402b8a202bfcd..755842a9754dc2fa2e715769e713a39ba80223f3 100644 (file)
@@ -116,8 +116,6 @@ PyObject *blender_import( PyObject * self, PyObject * args );
 void BPY_Err_Handle( char *script_name );
 PyObject *traceback_getFilename( PyObject * tb );
 
-void BPY_free_screen_spacehandlers(struct bScreen *sc);
-
 /****************************************************************************
 * Description: This function will start the interpreter and load all modules
 * as well as search for a python installation.
@@ -1648,23 +1646,19 @@ int BPY_do_spacehandlers( ScrArea *sa, unsigned short event,
 void BPY_free_scriptlink( struct ScriptLink *slink )
 {
        if( slink->totscript ) {
-               if( slink->flag )
+               if( slink->flag ) {
                        MEM_freeN( slink->flag );
-               if( slink->scripts )
+                       slink->flag= NULL;
+               }
+               if( slink->scripts ) {
                        MEM_freeN( slink->scripts );
+                       slink->scripts= NULL;
+               }
        }
 
        return;
 }
 
-void BPY_free_screen_spacehandlers(struct bScreen *sc)
-{
-       ScrArea *sa;
-
-       for (sa = sc->areabase.first; sa; sa = sa->next)
-               BPY_free_scriptlink(&sa->scriptlink);
-}
-
 static int CheckAllSpaceHandlers(Text *text)
 {
        bScreen *screen;
index 2fdc3bc6025d3e3baea649872ec5ffba6b58da28..4154b73ffa53cb536c6f1e20768d58685976f8c1 100644 (file)
@@ -1836,8 +1836,10 @@ static void del_area(ScrArea *sa)
        uiFreeBlocks(&sa->uiblocks);
        uiFreePanels(&sa->panels);
        
-       if(sa==curarea) curarea= 0;
-       if(sa==g_activearea) g_activearea= 0;
+       BPY_free_scriptlink(&sa->scriptlink);
+       
+       if(sa==curarea) curarea= NULL;
+       if(sa==g_activearea) g_activearea= NULL;
 }
 
 /* sa2 to sa1 */