Implement Context.copy_range(), ranges for constants. Progress!
Chris Pressey
7 years ago
187 | 187 |
|
188 | 188 |
def set_meaningful(self, *refs):
|
189 | 189 |
for ref in refs:
|
190 | |
self._range[ref] = ref.max_range()
|
|
190 |
if ref not in self._range:
|
|
191 |
self._range[ref] = ref.max_range()
|
191 | 192 |
|
192 | 193 |
def set_top_of_range(self, ref, top):
|
193 | 194 |
self.assert_meaningful(ref)
|
|
200 | 201 |
self.assert_meaningful(ref)
|
201 | 202 |
(_, top) = self._range[ref]
|
202 | 203 |
return top
|
|
204 |
|
|
205 |
def copy_range(self, src, dest):
|
|
206 |
self.assert_meaningful(src)
|
|
207 |
if src in self._range:
|
|
208 |
src_range = self._range[src]
|
|
209 |
else:
|
|
210 |
src_range = src.max_range()
|
|
211 |
self._range[dest] = src_range
|
203 | 212 |
|
204 | 213 |
def set_unmeaningful(self, *refs):
|
205 | 214 |
for ref in refs:
|
|
330 | 339 |
)
|
331 | 340 |
else:
|
332 | 341 |
context.assert_meaningful(src)
|
|
342 |
context.copy_range(src, dest)
|
333 | 343 |
context.set_written(dest, FLAG_Z, FLAG_N)
|
334 | 344 |
elif opcode == 'st':
|
335 | 345 |
if isinstance(dest, IndexedRef):
|
130 | 130 |
"""read-only means that the program cannot change the value
|
131 | 131 |
of a location. constant means that the value of the location
|
132 | 132 |
will not change during the lifetime of the program."""
|
133 | |
raise NotImplementedError
|
|
133 |
raise NotImplementedError("class {} must implement is_constant()".format(self.__class__.__name__))
|
134 | 134 |
|
135 | 135 |
def max_range(self):
|
136 | |
raise NotImplementedError
|
|
136 |
raise NotImplementedError("class {} must implement max_range()".format(self.__class__.__name__))
|
137 | 137 |
|
138 | 138 |
|
139 | 139 |
class LocationRef(Ref):
|
|
286 | 286 |
def is_constant(self):
|
287 | 287 |
return True
|
288 | 288 |
|
|
289 |
def max_range(self):
|
|
290 |
return (self.value, self.value)
|
|
291 |
|
289 | 292 |
def high_byte(self):
|
290 | 293 |
return (self.value >> 8) & 255
|
291 | 294 |
|