def copyWithoutStore(C6, funname, scalars, arrays, localglobals, brokeninvariants) : """makes a 2-deep copy of the functions, global invariants, novars within C6. Used to initialize a C6 for a function body for function, funname Makes store and heap empty and places dummy scalar and array values in store based on scalars and arrays . Sets rels to [] Subtracts localglobals from ``novars'' list to denote that these vars are mutable Revises globalinvs list, removing brokeninvariants that are no longer invariants because their vars are mutable Places brokeninvariants into brokeninvs list params: C6; funname : name of function scalars: vtree list of scalar vars; arrays: vtree list of array vars localglobals : vtree list of global vars that can be mutated brokeninvariants: invariants that mention local globals, a btree list returns new C6 configuration """ newC6 = empty() fcns = C6["funs"] for f in fcns : newC6["funs"][f] = fcns[f] newC6["globalinvs"] = [ g for g in C6["globalinvs"] \ if g not in brokeninvariants ] newC6["brokeninvs"] = brokeninvariants newC6["defs"] = [ d for d in C6["defs"] ] newC6["novars"] = [ g for g in C6["novars"] if g not in localglobals] newC6["whoami"] = funname for v in scalars : newC6["store"][v[1]] = PE.make(PE.makeSym()) for v in arrays : newloc = PE.make(PE.makeSym()) newarray = PE.makeArray() newC6["store"][v[1]] = newloc newC6["heap"][PE.peToTuple(newloc)] = newarray return newC6
def reset(C6, modified_vars) : """changes C6's sigma so that new constants are generated for each var mentioned in modified_vars. param: modified_vars, a sequence of lhs-trees; can be either ["var", s] or ["index" ["var", s] pe]. IMPORTANT: in the latter case, the etree has been replaced by its pe-value """ sigma = C6["store"] heap = C6["heap"] #print "In reset" #print "store=", sigma for m in modified_vars : if m[0] == "var" and lookupType(C6, m[1]) != "array" : # simple var sigma[m[1]] = PE.make(PE.makeSym()) elif m[0] == "var" and lookupType(C6, m[1]) == "array" : arrayname = m[1] newarray = PE.makeArray() newloc = PE.make(PE.makeSym()) sigma[m[1]] = newloc heap[PE.peToTuple(newloc)] = newarray elif m[0] == "index" or m[0] == "len" : vname = m[1][1] loc = PE.peToTuple(sigma[vname]) length = heap[loc][0] vector = heap[loc][1] # make copy: copy = {} for k in vector : copy[k] = vector[k] newloc = PE.make(PE.makeSym()) if m[0] == "index" : # indexed var ["index" ["var", s] pe] saveDistinctElements(C6, copy, PE.evall(C6, m[2])) elif m[0] == "len": # ["len", ["var", s]], as a result of append length = PE.make(PE.makeSym()) sigma[vname] = newloc heap[PE.peToTuple(newloc)] = (length, copy)