the previous fix for bug 7189 forgot the macro.f file in the commit 3bb89995c9512f34... 54/954/2
Serge Steer [Thu, 10 Jun 2010 08:36:59 +0000 (10:36 +0200)]
Change-Id: I59acdcb0b48632f50497775a15ae77843ec8a1e8

scilab/CHANGES_5.3.X
scilab/modules/core/src/fortran/macro.f
scilab/modules/core/src/fortran/stackp.f
scilab/modules/core/tests/nonreg_tests/bug_7019.dia.ref

index daa24d7..1309077 100644 (file)
@@ -809,4 +809,6 @@ Bug fixes:
 
 * bug 7181 fixed - The display of a struct having no fields did not work.
 
+* bug 7189 fixed - In some cases the usage of resume lead to a crash of Scilab.
+
 * bug 7224 fixed - export empty matrix in HDF5 did not unlock file.
index ba2fdfa..1336e8a 100644 (file)
@@ -1,17 +1,17 @@
 c     Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c     Copyright (C) INRIA
-c     
+c
 c     This file must be used under the terms of the CeCILL.
 c     This source file is licensed as described in the file COPYING,
 c     which
 c     you should have received as part of this distribution.  The terms
-c     are also available at    
+c     are also available at
 c     http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
       subroutine macro
-c     
+c
       include 'stack.h'
-c     
+c
       parameter (nz2=nsiz-2,nz3=nsiz-3)
       double precision val
       integer eol
@@ -24,22 +24,22 @@ c
       data blank/40/,eol/99/
       data varargin/169544223,387059739,nz2*673720360/
       data varargout/169544223,504893467,673720349,nz3*673720360/
-c     
-c     
+c
+c
       iadr(l)=l+l-1
-c     
+c
       r=rstk(pt)
       if (ddt .eq. 4) then
          write(buf(1:18),'(2i4,i6)') pt,r,fin
          call basout(io,wte,' macro  pt:'//buf(1:4)//' rstk(pt):'//
      &        buf(5:8)//' fin:'//buf(9:14))
       endif
-c     
+c
       ir=r/100
       if(ir.ne.5) goto 10
       goto(40,40,60,40),r-500
       goto 99
-c     
+c
  10   continue
 
 c     check for interpreted pause(701),compiled pause(604) or exec(902)
@@ -47,10 +47,10 @@ c     check for interpreted pause(701),compiled pause(604) or exec(902)
 
 c     initialize macro or execstr execution
 c------------------------------------------
-c     
+c
       ilk=iadr(fin)
       wmacn=0
-c     
+c
       if(istk(ilk).eq.10) then
 c     an execstr
          exec=.false.
@@ -161,8 +161,9 @@ c     save line pointers
       call putid(lin(k+12),syn)
       lin(k+12+nsiz)=lct(8)
       lpt(1) = k + 13+nsiz
-c     
+c
       if ( ptover(1,psiz-1)) return
+      rstk(pt)=0
       ids(1,pt) = rhs
       ids(2,pt) = lhs
       ids(3,pt) = lf
@@ -174,7 +175,7 @@ c
       ids(4,pt)=ids(4,pt)+2*wmac
       wmac=wmacn
       pstk(pt)=lct(4)
-c     
+c
       macr=macr+1
 c     set line pointers
       k=lpt(1)
@@ -191,9 +192,8 @@ c     c_ex lct(1) = 0
       endif
       char1 = blank
       lin(lpt(4)+1)=blank
-c     
+c
 c     save input variables
-
 c     next line should be suppressed, but when no arg given rhs is -1
 c     and not 0
       irhs=max(rhs,0)
@@ -229,7 +229,7 @@ C     .           the same global variable is used inside the macro
             call stackp(varargout,0)
          endif
       endif
-c     
+c
       ids(6,pt)=toperr
       toperr=top
       if(istk(ilk).eq.13) then
@@ -248,7 +248,7 @@ c     pstk(pt)=0
 c     *call* parse
       endif
       go to 99
-c     
+c
  40   continue
 c     terminate macro or execstr execution
 c-----------------------------------------
@@ -278,10 +278,10 @@ C     .     try level found
             goto 401
          endif
       endif
-      
+
 
       lhsr=lhs
-c     
+c
       lct(4)=pstk(pt)
       rhs=ids(1,pt)
       lhs=ids(2,pt)
@@ -294,7 +294,7 @@ c     restaure  pointers
       char1=lin(k+10)
       sym=lin(k+11)
       call putid(syn,lin(k+12))
-c     
+c
       if (err1.gt.0.and.catch.eq.0) then
          top=toperr
          toperr=ids(6,pt)
@@ -304,8 +304,8 @@ c
       endif
 
       toperr=ids(6,pt)
-      
-c     
+
+c
       if(comp(1).ne.0) then
          comp(2)=comp(1)
          comp(1)=0
@@ -354,7 +354,7 @@ c     .   extract required output variables out of varargout
             l0=l0+nsiz
          endif
       endif
-c     
+c
       macr=macr-1
       if(istk(ilk).eq.10.or.exec) goto 48
       bot=lin(k+5)
@@ -365,7 +365,7 @@ c     .   handle variables returned by resume
          top1=top
          top=top-lhs
          count=0
-c     
+c
          if(rstk(pt).eq.501) then
 c     .     resume in a "compiled" macro
             count=pstk(pt+2)
@@ -394,7 +394,7 @@ c     .        retained for 2.7 and earlier version compatibility (old affectati
                if(err.gt.0) return
  44         continue
          else
-c     .     resume in "uncompiled" macros 
+c     .     resume in "uncompiled" macros
 c     .     and in execstr call in a macro (rstk(pt)==504 see sci_resume)
 
             ptr=pstk(pt+1)
@@ -412,10 +412,10 @@ c     .      reset lpt(1) for error recovery
  45         continue
             lpt(1)=lpt1s
          endif
-c     
+c
 c     .  remove top variables relatives to for or select if any
          top=top-count
-c     
+c
          if(lhs.gt.0) then
 c     .     move macro output variables at the top of the stack
             top1=top1-lhs
@@ -432,7 +432,7 @@ c     .     move macro output variables at the top of the stack
             endif
          endif
       endif
-c     
+c
  47   continue
       if(lhs.eq.0) then
          top=top+1
@@ -451,7 +451,7 @@ c
       ival(2)=lin(k+9)
       stk(lstk(isiz))=val
       return
-c     
+c
 c     exec
  50   continue
       k = lpt(6)
@@ -464,7 +464,7 @@ c     exec
       lin(k+3) = lpt(3)
       lin(k+4) = lpt(4)
       lin(k+5) = bot0
-c     two following lines set information necessary for  stackp to know 
+c     two following lines set information necessary for  stackp to know
 c     current macro context
       if(macr.ge.1) lin(k+5)=lin(lpt(1)-(8+nsiz))
       if(rio.eq.rte) lin(k+5)=bot
@@ -473,7 +473,7 @@ c     current macro context
 c     following lines allows to distinguish between macro (<>0) and
 c     exec (=0)
       lin(k+7)=0
-c     
+c
       lin(k+10)=char1
       lin(k+11)=sym
       lin(k+12+nsiz)=lct(8)
@@ -487,8 +487,8 @@ c
       lct(8)=0
       rstk(pt)=503
       pstk(pt)=wmac
-      
-      if(r.eq.701.or.r.eq.604) then 
+
+      if(r.eq.701.or.r.eq.604) then
 c     .  disable error recovery mode , for pause only (is it mandatory?)
          ids(2,pt)=errct
          ids(3,pt)=err2
@@ -503,7 +503,7 @@ c     .  disable error recovery mode , for pause only (is it mandatory?)
       icall=7
 c     *call parse*
       go to 99
-c     
+c
 c     fin exec
  60   continue
       k = lpt(1) - (13+nsiz)
@@ -522,7 +522,7 @@ c     fin exec
       endif
       wmac=pstk(pt)
       r=rstk(pt-1)
-      if(r.eq.701.or.r.eq.604) then 
+      if(r.eq.701.or.r.eq.604) then
 c     restore current error recovery modes
          errct=ids(2,pt)
          err2=ids(3,pt)
@@ -533,7 +533,7 @@ c     restore current error recovery modes
 
       pt=pt-1
       go to 99
-c     
+c
  99   continue
       return
       end
index 4d6e360..ba858dd 100644 (file)
@@ -1,10 +1,10 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) INRIA
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
       subroutine stackp(id,macmod)
@@ -29,10 +29,10 @@ c
       endif
 c
 
-      
+
       if(err1.gt.0) return
 c     compilation  stackp: <1,nom(1:4)>
-      if (compil(1,id,0,0,0)) then 
+      if (compil(1,id,0,0,0)) then
          w=compil(22,sym,0,0,0)
          fin=0
          return
@@ -51,11 +51,11 @@ c     cas des variables modifiees sur place (insertion)
             pntr=istk(il+2)
             top=top-1
             fin=pntr
-            return 
+            return
          endif
       endif
 
-      
+
       new=.true.
 c
 c
@@ -63,7 +63,7 @@ c     find the scope where the variable has to be stored
       if(macr.ne.0.or.paus.ne.0) then
 c     .  inside a macro or a pause
          k=lpt(1) - (13+nsiz)
-      
+
          if(rstk(pt).eq.504) then
 c     .     [...]=resume(....) case , use the upper scope
             lpt1=lin(k+1)
@@ -87,15 +87,15 @@ c     does variable already exist
 
       if (k .eq. bot-1) then
 c     .  the variable does not exist, check for function redefinition
-         if(macprt.ne.0) then  
+         if(macprt.ne.0) then
 c     SCI_HFUNCTIONS_FIND = 1
             call funtab(id,ifun,1,'NULL_NAME',0)
             if(ifun.gt.0) then
-               if(macprt.eq.2) then  
+               if(macprt.eq.2) then
                   call  putid(ids(1,pt+1),id)
                   call error(223)
                   if(err.gt.0) return
-               elseif(macprt.eq.1) then  
+               elseif(macprt.eq.1) then
                   call  putid(ids(1,pt+1),id)
                   call msgs(42,vt)
                endif
@@ -167,10 +167,10 @@ c     .        are macros identical
                goto 20
 c     .        it not the same
  19            call  putid(ids(1,pt+1),id)
-               if(macprt.eq.2) then  
+               if(macprt.eq.2) then
                   call error(111)
                   return
-               elseif(macprt.eq.1) then  
+               elseif(macprt.eq.1) then
                   call msgs(42,vt)
                endif
  20            continue
index f983eb4..8b904dc 100644 (file)
@@ -13,6 +13,7 @@
 // <-- Short Description -->
 // resume() produces an error instead of beeing equivalent to resume
 mputl(["y=33;";"resume()";"y=44"],TMPDIR+"/bug7019.sce");
+if execstr("exec(TMPDIR+""/bug7019.sce"")","errcatch")<>46 then bugmes();quit;end
  
 y=33;