예제 #1
0
 def setitem(self, index, value):
     if not isinstance(index, Integer):
         raise Error(u"index not an integer")
     if not 0 <= index.value < len(self.contents):
         raise Error(u"index out of range")
     self.contents[index.value] = value
     return value
예제 #2
0
 def invoke_method(self, argv, suppress_default):
     self = jit.promote(self)
     if len(argv) < self.arity:
         raise Error(u"expected at least %d arguments, got %d" %
                     (self.arity, len(argv)))
     if self.arity == 1:
         method = self.get_method(jit.promote(argv[0].__class__.interface))
     elif self.arity == 2:
         method = self.get_method(jit.promote(argv[0].__class__.interface),
                                  jit.promote(argv[1].__class__.interface))
     elif self.arity == 3:
         method = self.get_method(jit.promote(argv[0].__class__.interface),
                                  jit.promote(argv[1].__class__.interface),
                                  jit.promote(argv[2].__class__.interface))
     elif self.arity == 4:
         method = self.get_method(jit.promote(argv[0].__class__.interface),
                                  jit.promote(argv[1].__class__.interface),
                                  jit.promote(argv[2].__class__.interface),
                                  jit.promote(argv[3].__class__.interface))
     else:
         vec = []
         for i in range(self.arity):
             vec.append(argv[i].__class__.interface)
         method = self.methods.get(List(vec), None)
     if method is None:
         vec = []
         for i in range(self.arity):
             vec.append(argv[i].__class__.interface)
         if self.default is None or suppress_default:
             names = []
             for i in range(self.arity):
                 names.append(vec[i].name)
             raise Error(u"no method for [" + u' '.join(names) + u"]")
         return self.default.call(argv)
     return method.call(argv)
예제 #3
0
 def fancy_frame(argv):
     args = ()
     if len(argv) < argc:
         raise Error(u"expected %d arguments" % argc)
     for i in argi:
         arg = argv[i]
         if isinstance(arg, argt[i]):
             args += (arg, )
         else:
             raise Error(u"expected %s as arg: %d" %
                         (argt[i].interface.name, i))
     return func(*args)
예제 #4
0
 def setattr_force(self, name, value):
     try:
         cell = jit.promote(self.lookup(name, assign=True))
         if isinstance(cell, FrozenCell):
             raise Error(u"cell %s is frozen" % name)
         elif isinstance(cell, MutableCell):
             cell.slot = value
         else:
             assert False
     except KeyError:
         if self.frozen:
             self.cells[name] = FrozenCell(value)
         else:
             self.cells[name] = MutableCell(value)
     return value
예제 #5
0
 def getitem(self, index):
     try:
         return self.data[index]
     except KeyError as error:
         raise Error(u"key %s not in %s" % (index.repr(), self.repr()))
예제 #6
0
 def setattr(self, name, value):
     if self.frozen:
         raise Error(u"module %s is frozen" % self.name)
     return self.setattr_force(name, value)
예제 #7
0
def as_cstring(value):
    if isinstance(value, String):
        return value.string.encode('utf-8')
    raise Error(u"expected string and got " + value.repr())
예제 #8
0
def argument(argv, index, cls):
    if index < len(argv):
        arg = argv[index]
        if isinstance(arg, cls):
            return arg
    raise Error(u"expected %s as argv: %d" % (cls.interface.name, index))