Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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