コード例 #1
0
 def call(self, frame, anchor, args, kwargs):
   from pyntch.config import ErrorConfig
   if len(args) < self.minargs:
     frame.raise_expt(ErrorConfig.InvalidNumOfArgs(self.minargs, len(args)))
     return UndefinedTypeNode.get_object()
   if len(self.args) < len(args):
     frame.raise_expt(ErrorConfig.InvalidNumOfArgs(len(self.args), len(args)))
     return UndefinedTypeNode.get_object()
   return self.process_args(frame, anchor, args, kwargs)
コード例 #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
コード例 #3
0
 def call(self, frame, anchor, args, kwargs):
   from pyntch.config import ErrorConfig
   if len(args) == 0:
     frame.raise_expt(ErrorConfig.InvalidNumOfArgs(1, len(args)))
     return UndefinedTypeNode.get_object()
   arg0checker = TypeChecker(frame, [self.klass], 'arg0')
   args[0].connect(arg0checker.recv)
   return self.func.call(frame, anchor, args, kwargs)
コード例 #4
0
 def call(self, frame, anchor, args, kwargs):
     if kwargs:
         frame.raise_expt(ErrorConfig.NoKeywordArgs())
         return UndefinedTypeNode.get_object()
     if len(args) < self.minargs:
         frame.raise_expt(
             ErrorConfig.InvalidNumOfArgs(self.minargs, len(args)))
         return UndefinedTypeNode.get_object()
     return self.MapCaller(frame, anchor, args[0], args[1:])