1.1 --- a/rsvplib.py Sat Jan 29 21:07:27 2011 +0100
1.2 +++ b/rsvplib.py Sat Feb 19 23:29:55 2011 +0100
1.3 @@ -26,6 +26,11 @@
1.4
1.5 "Native function implementations."
1.6
1.7 + # NOTE: These attributes need changing if the instance layout changes.
1.8 +
1.9 + instance_data_offset = 2
1.10 + instance_size = 3
1.11 +
1.12 def __init__(self, machine, constants):
1.13
1.14 """
1.15 @@ -77,22 +82,20 @@
1.16 if not (self.machine._CheckInstance(left_value.ref, self.int_class) and
1.17 self.machine._CheckInstance(right_value.ref, self.int_class)):
1.18
1.19 - self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
1.20 + self.machine.exception = self.machine._MakeObject(self.instance_size, self.type_error_instance)
1.21 return self.machine.RaiseException()
1.22
1.23 - # NOTE: Assume single location for data.
1.24 -
1.25 - left_data = left_value.ref + 1
1.26 - right_data = right_value.ref + 1
1.27 + left_data = left_value.ref + self.instance_data_offset
1.28 + right_data = right_value.ref + self.instance_data_offset
1.29
1.30 # Make a new object.
1.31
1.32 - addr = self.machine._MakeObject(2, self.int_instance)
1.33 + addr = self.machine._MakeObject(self.instance_size, self.int_instance)
1.34
1.35 # Store the result.
1.36 # NOTE: The data is considered ready to use.
1.37
1.38 - self.machine.save(addr + 1, op(self.machine.load(left_data), self.machine.load(right_data)))
1.39 + self.machine.save(addr + self.instance_data_offset, op(self.machine.load(left_data), self.machine.load(right_data)))
1.40
1.41 # Return the new object.
1.42 # Introduce object as context for the new object.
1.43 @@ -118,10 +121,8 @@
1.44 self.machine.result = DataValue(notimpl, notimpl)
1.45 return
1.46
1.47 - # NOTE: Assume single location for data.
1.48 -
1.49 - left_data = left_value.ref + 1
1.50 - right_data = right_value.ref + 1
1.51 + left_data = left_value.ref + self.instance_data_offset
1.52 + right_data = right_value.ref + self.instance_data_offset
1.53
1.54 # Test the data.
1.55 # NOTE: The data is considered ready to use.
1.56 @@ -199,12 +200,10 @@
1.57 # Test operand suitability.
1.58
1.59 if not self.machine._CheckInstance(left_value.ref, self.int_class):
1.60 - self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
1.61 + self.machine.exception = self.machine._MakeObject(self.instance_size, self.type_error_instance)
1.62 return self.machine.RaiseException()
1.63
1.64 - # NOTE: Assume single location for data.
1.65 -
1.66 - left_data = left_value.ref + 1
1.67 + left_data = left_value.ref + self.instance_data_offset
1.68
1.69 # Test the data.
1.70 # NOTE: The data is considered ready to use.
1.71 @@ -224,21 +223,19 @@
1.72 # Test operand suitability.
1.73
1.74 if not self.machine._CheckInstance(left_value.ref, self.int_class):
1.75 - self.machine.exception = self.machine._MakeObject(2, self.type_error_instance)
1.76 + self.machine.exception = self.machine._MakeObject(self.instance_size, self.type_error_instance)
1.77 return self.machine.RaiseException()
1.78
1.79 - # NOTE: Assume single location for data.
1.80 -
1.81 - left_data = left_value.ref + 1
1.82 + left_data = left_value.ref + self.instance_data_offset
1.83
1.84 # Make a new object.
1.85
1.86 - addr = self.machine._MakeObject(2, self.int_instance)
1.87 + addr = self.machine._MakeObject(self.instance_size, self.int_instance)
1.88
1.89 # Store the result.
1.90 # NOTE: The data is considered ready to use.
1.91
1.92 - self.machine.save(addr + 1, -self.machine.load(left_data))
1.93 + self.machine.save(addr + self.instance_data_offset, -self.machine.load(left_data))
1.94
1.95 # Return the new object.
1.96 # Introduce object as context for the new object.
1.97 @@ -270,7 +267,7 @@
1.98 # Complete the list instance by saving the fragment reference.
1.99 # NOTE: This requires an attribute in the list structure.
1.100
1.101 - addr = list_value.ref + 1
1.102 + addr = list_value.ref + self.instance_data_offset
1.103 self.machine.save(addr, DataValue(None, new_fragment))
1.104
1.105 def builtins_list_get_single_item(self):
1.106 @@ -285,26 +282,25 @@
1.107 obj_value = self.frame_stack[frame]
1.108
1.109 # Get the fragment address.
1.110 - # NOTE: Assume single location for header.
1.111
1.112 - fragment = self.machine.load(obj_value.ref + 1)
1.113 + fragment = self.machine.load(obj_value.ref + self.instance_data_offset)
1.114
1.115 # Get the fragment header.
1.116
1.117 header = self.machine.load(fragment.ref)
1.118 nelements = header.occupied_size - 1
1.119
1.120 - # NOTE: Assume single location for data and header.
1.121 + # Get the item position.
1.122
1.123 - item_pos = self.machine.load(item_value.ref + 1)
1.124 + item_pos = self.machine.load(item_value.ref + self.instance_data_offset)
1.125
1.126 if not self._check_index(item_pos, nelements):
1.127 - self.machine.exception = self.machine._MakeObject(2, self.index_error_instance)
1.128 + self.machine.exception = self.machine._MakeObject(self.instance_size, self.index_error_instance)
1.129 return self.machine.RaiseException()
1.130
1.131 - # NOTE: Assume single location for header.
1.132 + # Get the item itself.
1.133
1.134 - self.machine.result = self.machine.load(fragment.ref + 1 + item_pos)
1.135 + self.machine.result = self.machine.load(fragment.ref + self.instance_data_offset + item_pos)
1.136
1.137 def builtins_list_len(self):
1.138 frame = self.local_sp_stack[-1]
1.139 @@ -314,9 +310,8 @@
1.140 obj_value = self.frame_stack[frame]
1.141
1.142 # Get the fragment address.
1.143 - # NOTE: Assume single location for header.
1.144
1.145 - fragment = self.machine.load(obj_value.ref + 1)
1.146 + fragment = self.machine.load(obj_value.ref + self.instance_data_offset)
1.147
1.148 # Get the fragment header.
1.149
1.150 @@ -325,12 +320,12 @@
1.151
1.152 # Make a new object.
1.153
1.154 - addr = self.machine._MakeObject(2, self.int_instance)
1.155 + addr = self.machine._MakeObject(self.instance_size, self.int_instance)
1.156
1.157 # Store the result.
1.158 # NOTE: The data is considered ready to use.
1.159
1.160 - self.machine.save(addr + 1, nelements)
1.161 + self.machine.save(addr + self.instance_data_offset, nelements)
1.162
1.163 # Return the new object.
1.164 # Introduce object as context for the new object.
1.165 @@ -349,9 +344,8 @@
1.166 obj_value = self.frame_stack[frame]
1.167
1.168 # Get the fragment address.
1.169 - # NOTE: Assume single location for header.
1.170
1.171 - fragment = self.machine.load(obj_value.ref + 1)
1.172 + fragment = self.machine.load(obj_value.ref + self.instance_data_offset)
1.173
1.174 # Get the fragment header.
1.175
1.176 @@ -379,7 +373,7 @@
1.177 # Set the new fragment in the object.
1.178 # NOTE: The old fragment could be deallocated.
1.179
1.180 - self.machine.save(obj_value.ref + 1, DataValue(None, new_fragment))
1.181 + self.machine.save(obj_value.ref + self.instance_data_offset, DataValue(None, new_fragment))
1.182
1.183 def builtins_tuple_len(self):
1.184 frame = self.local_sp_stack[-1]
1.185 @@ -389,19 +383,18 @@
1.186 obj_value = self.frame_stack[frame]
1.187
1.188 # Get the header.
1.189 - # NOTE: Assume single location for header.
1.190
1.191 header = self.machine.load(obj_value.ref)
1.192 - nelements = header.size - 1
1.193 + nelements = header.size - self.instance_data_offset
1.194
1.195 # Make a new object.
1.196
1.197 - addr = self.machine._MakeObject(2, self.int_instance)
1.198 + addr = self.machine._MakeObject(self.instance_size, self.int_instance)
1.199
1.200 # Store the result.
1.201 # NOTE: The data is considered ready to use.
1.202
1.203 - self.machine.save(addr + 1, nelements)
1.204 + self.machine.save(addr + self.instance_data_offset, nelements)
1.205
1.206 # Return the new object.
1.207 # Introduce object as context for the new object.
1.208 @@ -420,22 +413,21 @@
1.209 obj_value = self.frame_stack[frame]
1.210
1.211 # Get the header.
1.212 - # NOTE: Assume single location for header.
1.213
1.214 header = self.machine.load(obj_value.ref)
1.215 - nelements = header.size - 1
1.216 + nelements = header.size - self.instance_data_offset
1.217
1.218 # NOTE: Assume single location for data and header.
1.219
1.220 - item_pos = self.machine.load(item_value.ref + 1)
1.221 + item_pos = self.machine.load(item_value.ref + self.instance_data_offset)
1.222
1.223 if not self._check_index(item_pos, nelements):
1.224 - self.machine.exception = self.machine._MakeObject(2, self.index_error_instance)
1.225 + self.machine.exception = self.machine._MakeObject(self.instance_size, self.index_error_instance)
1.226 return self.machine.RaiseException()
1.227
1.228 - # NOTE: Assume single location for header.
1.229 + # Get the item.
1.230
1.231 - self.machine.result = self.machine.load(obj_value.ref + 1 + item_pos)
1.232 + self.machine.result = self.machine.load(obj_value.ref + self.instance_data_offset + item_pos)
1.233
1.234 def builtins_object_init(self):
1.235 pass