From 9d35e52984f7646a6094f776b12d842213c1df7b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 2 Nov 2009 16:16:13 +0100 Subject: [PATCH] Bug in if/else/endif Version:1.1.43 --- src/command_line.py | 2 ++ src/irp_stack.py | 9 +++++++++ src/parsed_text.py | 24 ++++++++++-------------- src/variable.py | 31 ++++++++++++++++++++++++++----- src/version.py | 2 +- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/command_line.py b/src/command_line.py index de9531e..e2f994c 100644 --- a/src/command_line.py +++ b/src/command_line.py @@ -38,6 +38,8 @@ options['i'] = [ 'init' , 'Initialize current directory', 0 ] options['D'] = [ 'define' , 'Define variable', 1 ] options['o'] = [ 'checkopt' , 'Show where optimization may be required', 0 ] options['p'] = [ 'preprocess' , 'Preprocess file', 1 ] +options['m'] = [ 'memory' , 'Debug memory info', 0 ] + class CommandLine(object): diff --git a/src/irp_stack.py b/src/irp_stack.py index 0e41af7..4b043ed 100644 --- a/src/irp_stack.py +++ b/src/irp_stack.py @@ -55,6 +55,15 @@ subroutine irp_enter(irp_where) ithread = 0 nthread = 1 $1 +""" + if command_line.do_memory: + txt+=""" + if (.not.alloc) then + print *, 'Allocating irp_stack(',STACKMAX,',',nthread,')' + print *, 'Allocating irp_cpu(',STACKMAX,',',nthread,')' + print *, 'Allocating stack_index(',nthread,')' + endif""" + txt +=""" $2 end subroutine diff --git a/src/parsed_text.py b/src/parsed_text.py index 85ee2cb..94ee199 100644 --- a/src/parsed_text.py +++ b/src/parsed_text.py @@ -252,35 +252,30 @@ def move_variables(): varlist = [] result.append( ([],line) ) elif type(line) in [ Endif, End_select ]: - old_ifvars.append(ifvars) - old_elsevars.append(elsevars) - old_varlist.append(varlist) + old_ifvars.append( list(ifvars) ) + old_elsevars.append( list(elsevars) ) + old_varlist.append( list(varlist) ) varlist = [] result.append( ([],line) ) elif type(line) == Else: + elsevars += list(varlist) result.append( (varlist,line) ) - elsevars = list(varlist) - if vars != []: - varlist = old_varlist.pop() - varlist += vars - old_varlist.append(varlist) varlist = [] elif type(line) in [ Elseif, Case ]: - ifvars += varlist + ifvars += list(varlist) result.append( (varlist,line) ) if vars != []: varlist = old_varlist.pop() varlist += vars - old_varlist.append(varlist) + old_varlist.append( list(varlist) ) varlist = [] elif type(line) in [ If, Select ]: - ifvars += varlist + ifvars += list(varlist) result.append( (varlist,line) ) vars += filter(lambda x: x in elsevars, ifvars) ifvars = old_ifvars.pop() elsevars = old_elsevars.pop() - varlist = old_varlist.pop() - varlist += vars + varlist = old_varlist.pop() + vars elif type(line) in [ Begin_provider, Subroutine, Function ]: varlist += vars result.append( (varlist,line) ) @@ -295,6 +290,7 @@ def move_variables(): varlist += vars result.append( ([],line) ) result.reverse() + # 2nd pass text = result result = [] @@ -448,7 +444,7 @@ check_opt() ###################################################################### if __name__ == '__main__': for i in range(len(parsed_text)): - if parsed_text[i][0] == 'orbitalJastrow.irp.f': + if parsed_text[i][0] == 'properties.irp.f': print '!-------- %s -----------'%(parsed_text[i][0]) for line in parsed_text[i][1]: print line[1] diff --git a/src/variable.py b/src/variable.py index e015d05..ce0c901 100644 --- a/src/variable.py +++ b/src/variable.py @@ -351,10 +351,17 @@ class Variable(object): result = [ "!","! >>> FREE %s"%(self.name), " %s_is_built = .False."%(self.same_as) ] if self.dim != []: - result += [ \ - " if (allocated(%s)) then"%(name), - " deallocate (%s)"%(name), - " endif" ] + if command_line.do_memory: + result += [ \ + " if (allocated(%s)) then"%(name), + " deallocate (%s)"%(name), + " print *, 'Deallocating %s'"%(name), + " endif" ] + else: + result += [ \ + " if (allocated(%s)) then"%(name), + " deallocate (%s)"%(name), + " endif" ] result.append("! <<< END FREE") self._free = result return self._free @@ -397,13 +404,27 @@ class Variable(object): def do_allocate(): result = " allocate(%s(%s),stat=irp_err)" result = result%(name,','.join(self.dim)) + if command_line.do_memory: + tmp = "\n print *, 'Allocating %s(%s), (',%s,')'" + d = ','.join(self.dim) + if ":" in d: + result += tmp%(name,d,"''") + else: + result += tmp%(name,d,d) return result result = [ " if (allocated (%s) ) then"%(name) ] result += dimensions_OK() result += [\ " if (.not.irp_dimensions_OK) then", - " deallocate(%s)"%(name) ] + " deallocate(%s,stat=irp_err)"%(name), + " if (irp_err /= 0) then", + " print *, irp_here//': Deallocation failed: %s'"%(name), + do_size(), + " endif"] + if command_line.do_memory: + result += [\ + " print *, 'Deallocating %s'"%(name) ] result.append(check_dimensions()) result.append(do_allocate()) result += [\ diff --git a/src/version.py b/src/version.py index 5e8d1b5..9630c29 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.42" +version = "1.1.43"