def _reduceFreeVariableMemberAccessChains(self, expr, freeVariableMemberAccessChainToImplValMap): """ given an expression `expr` and mapping `freeVariableMemberAccessChainToImplValMap`, replace the occurences of the keys of the mapping in expr with fresh variable names. Returns the new expression, and a mapping from the replacing variables to their corresponding (implval) values. """ renamedVariableMapping = {} for chain, implval in freeVariableMemberAccessChainToImplValMap.iteritems(): assert isinstance(chain, str) chain = chain.split('.') if len(chain) == 1: renamedVariableMapping[chain[0]] = implval else: newName = Expression.freshVarname( '_'.join(chain), set(expr.mentionedVariables) ) renamedVariableMapping[newName] = implval expr = expr.rebindFreeVariableMemberAccessChain( chain, newName ) return expr, renamedVariableMapping
def computeRenamedObjectMapping(self, objectIdToForaFunctionExpression): renamedObjectMapping = dict() mentionedVariables = set() for objectId, foraFunctionExpression in objectIdToForaFunctionExpression.iteritems( ): mentionedVariables.update( foraFunctionExpression.mentionedVariables) renamedObjectMapping[objectId] = Expression.freshVarname( "_%s_" % objectId, mentionedVariables) return renamedObjectMapping
def computeRenamedObjectMapping(self, objectIdToForaFunctionExpression): renamedObjectMapping = dict() mentionedVariables = set() for objectId, foraFunctionExpression in objectIdToForaFunctionExpression.iteritems(): mentionedVariables.update(foraFunctionExpression.mentionedVariables) renamedObjectMapping[objectId] = Expression.freshVarname( "_%s_" % objectId, mentionedVariables ) return renamedObjectMapping
def specializeFreeVariableMemberAccessChains( self, expr, freeVariableMemberAccessChainToImplValMap): renamedVariableMapping = {} for chain, implval in freeVariableMemberAccessChainToImplValMap.iteritems( ): assert isinstance(chain, str) chain = chain.split('.') if len(chain) == 1: renamedVariableMapping[chain[0]] = implval else: newName = Expression.freshVarname('_'.join(chain), set(expr.mentionedVariables)) renamedVariableMapping[newName] = implval expr = expr.rebindFreeVariableMemberAccessChain(chain, newName) return expr, renamedVariableMapping
def _computeRenamedObjectMapping(self, objectIdToForaFunctionExpression): """ Given a map: objectId -> functionExpression, return a map: objectId -> varName where each varName is essentially the hash of the corresponding functionExpression """ renamedObjectMapping = dict() mentionedVariables = set() for objectId, foraFunctionExpression in objectIdToForaFunctionExpression.iteritems(): mentionedVariables.update(foraFunctionExpression.mentionedVariables) renamedObjectMapping[objectId] = Expression.freshVarname( "_%s_" % foraFunctionExpression.hash(), mentionedVariables ) return renamedObjectMapping
def unpackToExpression(self): """Returns the StatementTerm as an Expression. The resulting expression returns ((l1, l2, ...), e) where 'e' is the result of the whole expression, the l's are the variables in the given let assignment (if any) and the a's are variables in the calling context that are assigned to. This function verifies that every 'assigned' variable is available in the calling context. """ symbolsBoundInLetStatement, nativeExpression = self.nativeStatementTerm_.extractExpressionAndBoundVariables() expression = Expression.Expression(nativeExpression, self.codeDefPoint_) return symbolsBoundInLetStatement, expression
def specializeFreeVariableMemberAccessChains(self, expr, freeVariableMemberAccessChainToImplValMap): renamedVariableMapping = {} for chain, implval in freeVariableMemberAccessChainToImplValMap.iteritems(): assert isinstance(chain, str) chain = chain.split('.') if len(chain) == 1: renamedVariableMapping[chain[0]] = implval else: newName = Expression.freshVarname('_'.join(chain), set(expr.mentionedVariables)) renamedVariableMapping[newName] = implval expr = expr.rebindFreeVariableMemberAccessChain( chain, newName ) return expr, renamedVariableMapping