예제 #1
0
 def _Apply(self, appl):
     fn = appl.function()
     if isinstance(fn, S.Closure):
         fn_name = fn.body().id
     else:
         fn_name = fn.id
     if fn_name in self.procedures:
         instantiatedFunction = self.procedures[fn_name]
         functionArguments = instantiatedFunction.variables[1:]
         instantiatedArguments = appl.parameters[1:]
         if isinstance(fn, S.Closure):
             instantiatedArguments.extend(fn.variables)
         env = pltools.Environment()
         for (internal, external) in zip(functionArguments,
                                         instantiatedArguments):
             env[internal.id] = external
         return_finder = ReturnFinder()
         return_finder.visit(instantiatedFunction)
         #XXX HACK. Need to do conditional statement->expression conversion
         # In order to make inlining possible
         if return_finder.return_in_conditional:
             return appl
         env[return_finder.return_value.id] = self.activeBinding
         statements = filter(lambda x: not isinstance(x, S.Return),
                             instantiatedFunction.body())
         statements = [S.substituted_expression(x, env) for x in \
                           statements]
         singleAssignmentInstantiation = single_assignment_conversion(
             statements,
             exceptions=set((x.id for x in flatten(self.activeBinding))),
             M=self.M)
         self.statements = singleAssignmentInstantiation
         return None
     return appl
예제 #2
0
 def __init__(self, env, exceptions, state):
     self.env = pltools.Environment(env)
     self.exceptions = exceptions
     if state:
         self.serial = state
     else:
         self.serial = itertools.count(1)
예제 #3
0
 def __init__(self, globals):
     self.globals = globals
     import copperhead.prelude_impl as PI
     self.prelude_impl = set(dir(PI))
     self.PI = PI
     self.env = pltools.Environment()
     self.clean = []
예제 #4
0
 def __init__(self, globals):
     self.globals = globals
     self.locals = pltools.Environment()
     import copperhead.prelude_impl as PI
     self.prelude_impl = set(dir(PI))
     self.PI = PI
     self.bools = ["True", "False"]
예제 #5
0
    def _Apply(self, apply):
        functionName = apply.parameters[0].id
        if functionName in self.procedures:
            instantiatedFunction = self.procedures[functionName]
            functionArguments = instantiatedFunction.variables[1:]
            instantiatedArguments = apply.parameters[1:]
            env = pltools.Environment()
            for (internal, external) in zip(functionArguments,
                                            instantiatedArguments):
                env[internal.id] = external
            return_finder = ReturnFinder(self.activeBinding, env)
            return_finder.visit(instantiatedFunction)
            statements = [S.substituted_expression(x, env) for x in \
                              instantiatedFunction.body() \
                              if not isinstance(x, S.Return)]

            singleAssignmentInstantiation = single_assignment_conversion(
                statements,
                exceptions=set((x.id for x in flatten(self.activeBinding))))
            self.statements = singleAssignmentInstantiation
            return None
        return apply
예제 #6
0
 def __init__(self):
     self.env = pltools.Environment()
예제 #7
0
 def __init__(self, globals=None):
     self.globals = globals or dict()
     self.env = pltools.Environment()
예제 #8
0
 def __init__(self, globals):
     self.globals = globals
     self.env = pltools.Environment()
     self.clean = []
예제 #9
0
 def __init__(self, env, exceptions):
     self.env = pltools.Environment(env)
     self.exceptions = exceptions
     self.freeze = False