예제 #1
0
 def get_ruints(self, required_len=-1):
     from rpython.rlib.rarithmetic import r_uint
     words = [r_uint(x) for x in self.chunk.data]
     if required_len != -1 and len(words) != required_len:
         raise error.CorruptImageError("Expected %d words, got %d" %
                                       (required_len, len(words)))
     return words
예제 #2
0
 def read_version(self):
     version = self.try_read_version()
     if not version:
         if self.stream.length() > POSSIBLE_IMAGE_OFFSET + 4:
             self.stream.skipbytes(POSSIBLE_IMAGE_OFFSET)
             version = self.try_read_version()
     if not version:
         raise error.CorruptImageError("Illegal version magic.")
     version.configure_stream(self.stream)
     self.version = version
예제 #3
0
    def init_w_object(self):
        """ 0      no fields
            1      fixed fields only (all containing pointers)
            2      indexable fields only (all containing pointers)
            3      both fixed and indexable fields (all containing pointers)
            4      both fixed and indexable weak fields (all containing pointers).

            5      unused
            6      indexable word fields only (no pointers)
            7      indexable long (64-bit) fields (only in 64-bit images)

         8-11      indexable byte fields only (no pointers) (low 2 bits are low 2 bits of size)
        12-15     compiled methods:
                       # of literal oops specified in method header,
                       followed by indexable bytes (same interpretation of low 2 bits as above)
        """
        if self.w_object is None:
            # the instantiate call circumvents the constructors
            # and makes empty objects
            if self.ispointers():
                self.w_object = objectmodel.instantiate(model.W_PointersObject)
            elif self.format == 5:
                raise error.CorruptImageError("Unknown format 5")
            elif self.isfloat():
                self.w_object = objectmodel.instantiate(model.W_Float)
            elif self.is32bitlargepositiveinteger():
                self.w_object = objectmodel.instantiate(
                    model.W_LargePositiveInteger1Word)
            elif self.iswords():
                self.w_object = objectmodel.instantiate(model.W_WordsObject)
            elif self.format == 7:
                raise error.CorruptImageError(
                    "Unknown format 7, no 64-bit support yet :-)")
            elif self.isbytes():
                self.w_object = objectmodel.instantiate(model.W_BytesObject)
            elif self.iscompiledmethod():
                self.w_object = objectmodel.instantiate(model.W_CompiledMethod)
            else:
                assert 0, "not reachable"
        return self.w_object
예제 #4
0
 def read_object(self):
     kind = self.stream.peek() & 3  # 2 bits
     if kind == 0:  # 00 bits
         chunk, pos = self.read_3wordobjectheader()
     elif kind == 1:  # 01 bits
         chunk, pos = self.read_2wordobjectheader()
     elif kind == 3:  # 11 bits
         chunk, pos = self.read_1wordobjectheader()
     else:  # 10 bits
         raise error.CorruptImageError("Unused block not allowed in image")
     size = chunk.size
     chunk.data = [self.stream.next()
                   for _ in range(size - 1)]  #size-1, excluding header
     return chunk, pos