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
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
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
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