Esempio n. 1
0
 def call(self, frame, anchor, args, kwargs):
     from pyntch.basic_types import StrType
     from pyntch.aggregate_types import DictType, TupleType
     from pyntch.expression import TupleUnpack, TupleSlice
     # Process keyword arguments first.
     varsleft = list(self.argvars)
     varikwargs = []
     for (kwname, kwvalue) in kwargs.iteritems():
         for var1 in varsleft:
             if isinstance(var1, Variable) and var1.name == kwname:
                 var1.bind(kwvalue)
                 # When a keyword argument is given, remove that name from the remaining arguments.
                 varsleft.remove(var1)
                 break
         else:
             if self.kwarg:
                 varikwargs.append(kwvalue)
             else:
                 frame.raise_expt(ErrorConfig.InvalidKeywordArgs(kwname))
     # Process standard arguments.
     variargs = []
     for arg1 in args:
         assert arg1 != None, args
         if varsleft:
             var1 = varsleft.pop(0)
             assign_arg(frame, anchor, var1, arg1)
         elif self.variarg:
             variargs.append(arg1)
         else:
             # Too many arguments.
             frame.raise_expt(
                 ErrorConfig.InvalidNumOfArgs(len(self.argvars), len(args)))
     if len(self.defaults) < len(varsleft):
         # Too few arguments.
         frame.raise_expt(
             ErrorConfig.InvalidNumOfArgs(len(self.argvars), len(args)))
     # Handle remaining arguments: kwargs and variargs.
     if self.variarg and variargs:
         self.space[self.variarg].bind(TupleType.create_tuple(variargs))
     if self.kwarg:
         if varikwargs:
             self.space[self.kwarg].bind(
                 DictType.create_dict(key=StrType.get_object(),
                                      value=varikwargs))
         else:
             self.space[self.kwarg].bind(DictType.create_null(
                 frame, anchor))
     # Remember where this is called from.
     self.frames.add(frame)
     # Propagate the exceptions upward.
     self.frame.connect(frame.recv)
     return self.body
Esempio n. 2
0
 def call(self, frame, anchor, args, kwargs):
   from pyntch.basic_types import StrType
   from pyntch.aggregate_types import DictType, TupleType
   from pyntch.expression import TupleUnpack, TupleSlice
   # Process keyword arguments first.
   varsleft = list(self.argvars)
   varikwargs = []
   for (kwname, kwvalue) in kwargs.iteritems():
     for var1 in varsleft:
       if isinstance(var1, Variable) and var1.name == kwname:
         var1.bind(kwvalue)
         # When a keyword argument is given, remove that name from the remaining arguments.
         varsleft.remove(var1)
         break
     else:
       if self.kwarg:
         varikwargs.append(kwvalue)
       else:
         frame.raise_expt(ErrorConfig.InvalidKeywordArgs(kwname))
   # Process standard arguments.
   variargs = []
   for arg1 in args:
     assert arg1 != None, args
     if varsleft:
       var1 = varsleft.pop(0)
       assign_arg(frame, anchor, var1, arg1)
     elif self.variarg:
       variargs.append(arg1)
     else:
       # Too many arguments.
       frame.raise_expt(ErrorConfig.InvalidNumOfArgs(len(self.argvars), len(args)))
   if len(self.defaults) < len(varsleft):
     # Too few arguments.
     frame.raise_expt(ErrorConfig.InvalidNumOfArgs(len(self.argvars), len(args)))
   # Handle remaining arguments: kwargs and variargs.
   if self.variarg and variargs:
     self.space[self.variarg].bind(TupleType.create_tuple(variargs))
   if self.kwarg:
     if varikwargs:
       self.space[self.kwarg].bind(DictType.create_dict(key=StrType.get_object(), value=varikwargs))
     else:
       self.space[self.kwarg].bind(DictType.create_null(frame, anchor))
   # Remember where this is called from.
   self.frames.add(frame)
   # Propagate the exceptions upward.
   self.frame.connect(frame.recv)
   return self.body