1.1 --- a/rsvplib.py Mon Sep 27 23:30:55 2010 +0200
1.2 +++ b/rsvplib.py Mon Nov 01 01:22:44 2010 +0100
1.3 @@ -60,6 +60,14 @@
1.4 self.frame_stack = self.machine.frame_stack
1.5 self.local_sp_stack = self.machine.local_sp_stack
1.6
1.7 + def _get_absolute_index(self, pos, nelements):
1.8 + if pos >= 0 and pos < nelements:
1.9 + return pos
1.10 + elif pos < 0 and pos >= -nelements:
1.11 + return nelements + pos
1.12 + else:
1.13 + return None
1.14 +
1.15 def builtins_int_arithmetic_op(self, op):
1.16 frame = self.local_sp_stack[-1]
1.17
1.18 @@ -270,7 +278,7 @@
1.19 addr = list_value.ref + 1
1.20 self.machine.save(addr, DataValue(None, new_fragment))
1.21
1.22 - def builtins_list_getitem(self):
1.23 + def builtins_list_get_single_item(self):
1.24 frame = self.local_sp_stack[-1]
1.25
1.26 # Get the operand address.
1.27 @@ -291,24 +299,14 @@
1.28 header = self.machine.load(fragment.ref)
1.29 nelements = header.occupied_size - 1
1.30
1.31 - # Test operand suitability.
1.32 -
1.33 - if self.machine._CheckInstance(item_value.ref, self.int_class):
1.34 + # NOTE: Assume single location for data and header.
1.35
1.36 - # NOTE: Assume single location for data and header.
1.37 -
1.38 - item_pos = self.machine.load(item_value.ref + 1)
1.39 + item_pos = self.machine.load(item_value.ref + 1)
1.40
1.41 - if item_pos >= 0 and item_pos < nelements:
1.42 - pass
1.43 - elif item_pos < 0 and item_pos >= -nelements:
1.44 - item_pos = nelements + item_pos
1.45 - else:
1.46 - self.machine.exception = self.machine._MakeObject(2, self.index_error_instance)
1.47 - return self.machine.RaiseException()
1.48 + item_pos = self._get_absolute_index(item_pos, nelements)
1.49
1.50 - else:
1.51 - self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
1.52 + if item_pos is None:
1.53 + self.machine.exception = self.machine._MakeObject(2, self.index_error_instance)
1.54 return self.machine.RaiseException()
1.55
1.56 # NOTE: Assume single location for header.
1.57 @@ -417,7 +415,7 @@
1.58
1.59 self.machine.result = DataValue(addr, addr)
1.60
1.61 - def builtins_tuple_getitem(self):
1.62 + def builtins_tuple_get_single_item(self):
1.63 frame = self.local_sp_stack[-1]
1.64
1.65 # Get the operand address.
1.66 @@ -438,11 +436,9 @@
1.67
1.68 item_pos = self.machine.load(item_value.ref + 1)
1.69
1.70 - if item_pos >= 0 and item_pos < nelements:
1.71 - pass
1.72 - elif item_pos < 0 and item_pos >= -nelements:
1.73 - item_pos = nelements + item_pos
1.74 - else:
1.75 + item_pos = self._get_absolute_index(item_pos, nelements)
1.76 +
1.77 + if item_pos is None:
1.78 self.machine.exception = self.machine._MakeObject(2, self.index_error_instance)
1.79 return self.machine.RaiseException()
1.80
1.81 @@ -488,11 +484,11 @@
1.82 "__builtins__.int.__or__" : builtins_int_or,
1.83 "__builtins__.int.__ror__" : builtins_int_or,
1.84 "__builtins__.bool.__bool__" : builtins_bool_bool,
1.85 - "__builtins__.list.__getitem__" : builtins_list_getitem,
1.86 + "__builtins__.list.__get_single_item__" : builtins_list_get_single_item,
1.87 "__builtins__.list.__len__" : builtins_list_len,
1.88 "__builtins__.list.append" : builtins_list_append,
1.89 "__builtins__.tuple.__len__" : builtins_tuple_len,
1.90 - "__builtins__.tuple.__getitem__" : builtins_tuple_getitem,
1.91 + "__builtins__.tuple.__get_single_item__" : builtins_tuple_get_single_item,
1.92 "__builtins__.basestring.__lt__" : builtins_str_lt,
1.93 "__builtins__.basestring.__le__" : builtins_str_le,
1.94 "__builtins__.basestring.__gt__" : builtins_str_gt,