# HG changeset patch # User Paul Boddie # Date 1247439762 -7200 # Node ID 13558f703a70550be2568785911f6b010ee077fa # Parent cda541c40c81a470ba6340bd9c35e77eb0f8a840 Added tuple methods and tests. diff -r cda541c40c81 -r 13558f703a70 rsvp.py --- a/rsvp.py Sun Jul 12 22:09:41 2009 +0200 +++ b/rsvp.py Mon Jul 13 01:02:42 2009 +0200 @@ -127,9 +127,6 @@ cls = self._get_class("__builtins__", "TypeError") self.type_error = cls.location self.type_error_instance = cls.instance_template_location - cls = self._get_class("__builtins__", "IndexError") - self.index_error = cls.location - self.index_error_instance = cls.instance_template_location # Debugging attributes. @@ -781,6 +778,9 @@ cls = self.machine._get_class("__builtins__", "list") self.list_class = cls.location self.list_instance = cls.instance_template_location + cls = self.machine._get_class("__builtins__", "IndexError") + self.index_error = cls.location + self.index_error_instance = cls.instance_template_location cls = self.machine._get_class("__builtins__", "tuple") self.tuple_class = cls.location @@ -1001,6 +1001,7 @@ # NOTE: Assume single location for data and header. item_pos = self.machine.load(item + 1) + if item_pos >= 0 and item_pos < nelements: pass elif item_pos < 0 and item_pos >= -nelements: @@ -1088,6 +1089,66 @@ self.machine.save(obj + 1, (None, new_fragment)) + def builtins_tuple_len(self): + frame = self.local_sp_stack[-1] + + # Get the tuple address. + + obj_context, obj = self.frame_stack[frame] + + # Get the header. + # NOTE: Assume single location for header. + + header = self.machine.load(obj) + nelements = header.size - 1 + + # Make a new object. + + addr = self.machine._MakeObject(2, self.int_instance) + + # Store the result. + # NOTE: The data is considered ready to use. + + self.machine.save(addr + 1, nelements) + + # Return the new object. + # Introduce object as context for the new object. + + self.machine.result = addr, addr + + def builtins_tuple_getitem(self): + frame = self.local_sp_stack[-1] + + # Get the operand address. + + item_context, item = self.frame_stack[frame + 1] + + # Get the tuple address. + + obj_context, obj = self.frame_stack[frame] + + # Get the header. + # NOTE: Assume single location for header. + + header = self.machine.load(obj) + nelements = header.size - 1 + + # NOTE: Assume single location for data and header. + + item_pos = self.machine.load(item + 1) + + if item_pos >= 0 and item_pos < nelements: + pass + elif item_pos < 0 and item_pos >= -nelements: + item_pos = nelements + item_pos + else: + self.machine.exception = self.machine._MakeObject(2, self.index_error_instance) + return self.machine.RaiseException() + + # NOTE: Assume single location for header. + + self.machine.result = self.machine.load(obj + 1 + item_pos) + def builtins_object_init(self): pass @@ -1111,6 +1172,11 @@ "__builtins__.list.__getitem__" : builtins_list_getitem, "__builtins__.list.__len__" : builtins_list_len, "__builtins__.list.append" : builtins_list_append, + "__builtins__.tuple.__len__" : builtins_tuple_len, + "__builtins__.tuple.__getitem__" : builtins_tuple_getitem, + + # Native initialisers: + "__builtins__.object.__init__" : builtins_object_init, # NOTE: A no-operation. "__builtins__.BaseException.__init__" : builtins_object_init, # NOTE: To be made distinct, potentially in the builtins module. diff -r cda541c40c81 -r 13558f703a70 tests/tuple.py --- a/tests/tuple.py Sun Jul 12 22:09:41 2009 +0200 +++ b/tests/tuple.py Mon Jul 13 01:02:42 2009 +0200 @@ -1,7 +1,15 @@ #!/usr/bin/env python -1, 2, 3 -a = (1, 2, 3) -1, (2, 3), 4, 5 +a1 = 1, 2, 3 +a2 = (1, 2, 3) +b1 = 1, (2, 3), 4, 5 + +result_1 = a1[0] +result_2 = a2[1] +result_3 = b1[1][1] +result_4 = b1[2] +resultL_2 = len(b1[1]) +resultL_3 = len(a1) +resultL_4 = len(b1) # vim: tabstop=4 expandtab shiftwidth=4