# HG changeset patch # User Paul Boddie # Date 1276299742 -7200 # Node ID 171279c4c97a0caa76764012034beecefa4679eb # Parent 1bb8c2609f1eea7ec3e95a087efefc575575c888 Fixed memory allocation for list fragments. diff -r 1bb8c2609f1e -r 171279c4c97a lib/builtins.py --- a/lib/builtins.py Sat Jun 12 01:07:13 2010 +0200 +++ b/lib/builtins.py Sat Jun 12 01:42:22 2010 +0200 @@ -157,7 +157,8 @@ self.append(arg) def __new__(self): - self._elements = None # defined in a native method + # Reserve space for a fragment reference. + self._elements = None def __getitem__(self, index): pass def __setitem__(self, index, value): pass diff -r 1bb8c2609f1e -r 171279c4c97a rsvp.py --- a/rsvp.py Sat Jun 12 01:07:13 2010 +0200 +++ b/rsvp.py Sat Jun 12 01:42:22 2010 +0200 @@ -449,7 +449,8 @@ def MakeFragment(self): size = self.operand - addr = self._MakeFragment(size) + # Reserve twice the amount of space. + addr = self._MakeFragment(size, size * 2) # NOTE: Context is not relevant for fragments. self.value = DataValue(None, addr) @@ -806,11 +807,10 @@ self.save(addr, data.with_size(size)) return addr - def _MakeFragment(self, size): - # Reserve twice the amount of space. - addr = self.new(size * 2) + def _MakeFragment(self, occupied, size): + addr = self.new(size) # Save the header, overriding the size. - self.save(addr, FragmentObject(size, size * 2)) + self.save(addr, FragmentObject(occupied, size)) return addr def _LoadAddressContextCond(self, context, ref, inst_ref): diff -r 1bb8c2609f1e -r 171279c4c97a rsvplib.py --- a/rsvplib.py Sat Jun 12 01:07:13 2010 +0200 +++ b/rsvplib.py Sat Jun 12 01:42:22 2010 +0200 @@ -261,13 +261,13 @@ # Make a new sequence. # NOTE: Using an arbitrary size. - new_fragment = self.machine._MakeFragment(5) + new_fragment = self.machine._MakeFragment(1, 5) # include the header # Complete the list instance by saving the fragment reference. + # NOTE: This requires an attribute in the list structure. addr = list_value.ref + 1 self.machine.save(addr, DataValue(None, new_fragment)) - self.machine.result = DataValue(addr, addr) def builtins_list_getitem(self): frame = self.local_sp_stack[-1] @@ -367,14 +367,14 @@ # Make a new fragment, maintaining more space than currently # occupied in order to avoid reallocation. - new_fragment = self.machine._MakeFragment(header.allocated_size + 1) + new_fragment = self.machine._MakeFragment(header.occupied_size, header.occupied_size * 2) # Copy existing elements. - for i in range(1, header.allocated_size): + for i in range(1, header.occupied_size): self.machine.save(new_fragment + i, self.machine.load(fragment.ref + i)) - self.machine.save(new_fragment + header.allocated_size, arg_value) + self.machine.save(new_fragment + header.occupied_size, arg_value) # Set the new fragment in the object. # NOTE: The old fragment could be deallocated.