1.1 --- a/lib/builtins.py Sat Jun 12 01:07:13 2010 +0200
1.2 +++ b/lib/builtins.py Sat Jun 12 01:42:22 2010 +0200
1.3 @@ -157,7 +157,8 @@
1.4 self.append(arg)
1.5
1.6 def __new__(self):
1.7 - self._elements = None # defined in a native method
1.8 + # Reserve space for a fragment reference.
1.9 + self._elements = None
1.10
1.11 def __getitem__(self, index): pass
1.12 def __setitem__(self, index, value): pass
2.1 --- a/rsvp.py Sat Jun 12 01:07:13 2010 +0200
2.2 +++ b/rsvp.py Sat Jun 12 01:42:22 2010 +0200
2.3 @@ -449,7 +449,8 @@
2.4
2.5 def MakeFragment(self):
2.6 size = self.operand
2.7 - addr = self._MakeFragment(size)
2.8 + # Reserve twice the amount of space.
2.9 + addr = self._MakeFragment(size, size * 2)
2.10 # NOTE: Context is not relevant for fragments.
2.11 self.value = DataValue(None, addr)
2.12
2.13 @@ -806,11 +807,10 @@
2.14 self.save(addr, data.with_size(size))
2.15 return addr
2.16
2.17 - def _MakeFragment(self, size):
2.18 - # Reserve twice the amount of space.
2.19 - addr = self.new(size * 2)
2.20 + def _MakeFragment(self, occupied, size):
2.21 + addr = self.new(size)
2.22 # Save the header, overriding the size.
2.23 - self.save(addr, FragmentObject(size, size * 2))
2.24 + self.save(addr, FragmentObject(occupied, size))
2.25 return addr
2.26
2.27 def _LoadAddressContextCond(self, context, ref, inst_ref):
3.1 --- a/rsvplib.py Sat Jun 12 01:07:13 2010 +0200
3.2 +++ b/rsvplib.py Sat Jun 12 01:42:22 2010 +0200
3.3 @@ -261,13 +261,13 @@
3.4 # Make a new sequence.
3.5 # NOTE: Using an arbitrary size.
3.6
3.7 - new_fragment = self.machine._MakeFragment(5)
3.8 + new_fragment = self.machine._MakeFragment(1, 5) # include the header
3.9
3.10 # Complete the list instance by saving the fragment reference.
3.11 + # NOTE: This requires an attribute in the list structure.
3.12
3.13 addr = list_value.ref + 1
3.14 self.machine.save(addr, DataValue(None, new_fragment))
3.15 - self.machine.result = DataValue(addr, addr)
3.16
3.17 def builtins_list_getitem(self):
3.18 frame = self.local_sp_stack[-1]
3.19 @@ -367,14 +367,14 @@
3.20 # Make a new fragment, maintaining more space than currently
3.21 # occupied in order to avoid reallocation.
3.22
3.23 - new_fragment = self.machine._MakeFragment(header.allocated_size + 1)
3.24 + new_fragment = self.machine._MakeFragment(header.occupied_size, header.occupied_size * 2)
3.25
3.26 # Copy existing elements.
3.27
3.28 - for i in range(1, header.allocated_size):
3.29 + for i in range(1, header.occupied_size):
3.30 self.machine.save(new_fragment + i, self.machine.load(fragment.ref + i))
3.31
3.32 - self.machine.save(new_fragment + header.allocated_size, arg_value)
3.33 + self.machine.save(new_fragment + header.occupied_size, arg_value)
3.34
3.35 # Set the new fragment in the object.
3.36 # NOTE: The old fragment could be deallocated.