1.1 --- a/rsvplib.py Mon Jun 13 00:18:13 2011 +0200
1.2 +++ b/rsvplib.py Mon Jun 13 20:59:00 2011 +0200
1.3 @@ -69,25 +69,16 @@
1.4 def _check_index(self, pos, nelements):
1.5 return pos >= 0 and pos < nelements
1.6
1.7 - def builtins_int_arithmetic_op(self, op):
1.8 - frame = self.local_sp_stack[-1]
1.9 + # Native functionality.
1.10
1.11 - # Get operands addresses.
1.12 -
1.13 - left_value = self.frame_stack[frame]
1.14 - right_value = self.frame_stack[frame + 1]
1.15 + def builtins_no_op(self):
1.16 + pass
1.17
1.18 - # Test operand suitability.
1.19 - # NOTE: Support other types.
1.20 -
1.21 - if not (self.machine._CheckInstance(left_value.ref, self.int_class) and
1.22 - self.machine._CheckInstance(right_value.ref, self.int_class)):
1.23 -
1.24 - self.machine.exception = self.machine._MakeObject(self.instance_size, self.type_error_instance)
1.25 - return self.machine.RaiseException()
1.26 -
1.27 - left_data = left_value.ref + self.instance_data_offset
1.28 - right_data = right_value.ref + self.instance_data_offset
1.29 + def native_int_arithmetic_op(self, op):
1.30 + self.machine.LoadName(0) # left value
1.31 + left_data = self.machine.value + self.instance_data_offset
1.32 + self.machine.LoadName(1) # right value
1.33 + right_data = self.machine.value + self.instance_data_offset
1.34
1.35 # Make a new object.
1.36
1.37 @@ -104,28 +95,11 @@
1.38 self.machine.result_context = addr
1.39 self.machine.result_value = addr
1.40
1.41 - def builtins_logical_op(self, operand_class, op):
1.42 - frame = self.local_sp_stack[-1]
1.43 -
1.44 - # Get operands addresses.
1.45 -
1.46 - left_value = self.frame_stack[frame]
1.47 - right_value = self.frame_stack[frame + 1]
1.48 -
1.49 - # Test operand suitability.
1.50 - # NOTE: Handle comparisons of incompatible types more appropriately.
1.51 - # NOTE: Return NotImplemented.
1.52 -
1.53 - if not (self.machine._CheckInstance(left_value.ref, operand_class) and
1.54 - self.machine._CheckInstance(right_value.ref, operand_class)):
1.55 -
1.56 - notimpl = self.constants[NotImplemented]
1.57 - self.machine.result_context = notimpl
1.58 - self.machine.result_value = notimpl
1.59 - return
1.60 -
1.61 - left_data = left_value.ref + self.instance_data_offset
1.62 - right_data = right_value.ref + self.instance_data_offset
1.63 + def native_logical_op(self, op):
1.64 + self.machine.LoadName(0) # left value
1.65 + left_data = self.machine.value + self.instance_data_offset
1.66 + self.machine.LoadName(1) # right value
1.67 + right_data = self.machine.value + self.instance_data_offset
1.68
1.69 # Test the data.
1.70 # NOTE: The data is considered ready to use.
1.71 @@ -142,98 +116,44 @@
1.72 # still performed on the operands to ensure that they qualify for these
1.73 # native operations.
1.74
1.75 - def builtins_int_add(self):
1.76 - return self.builtins_int_arithmetic_op(operator.add)
1.77 -
1.78 - def builtins_int_sub(self):
1.79 - return self.builtins_int_arithmetic_op(operator.sub)
1.80 + def native_int_add(self):
1.81 + return self.native_int_arithmetic_op(operator.add)
1.82
1.83 - def builtins_int_pow(self):
1.84 - return self.builtins_int_arithmetic_op(operator.pow)
1.85 -
1.86 - def builtins_int_lt(self):
1.87 - return self.builtins_logical_op(self.int_class, operator.lt)
1.88 + def native_int_sub(self):
1.89 + return self.native_int_arithmetic_op(operator.sub)
1.90
1.91 - def builtins_int_le(self):
1.92 - return self.builtins_logical_op(self.int_class, operator.le)
1.93 -
1.94 - def builtins_int_gt(self):
1.95 - return self.builtins_logical_op(self.int_class, operator.gt)
1.96 + def native_int_pow(self):
1.97 + return self.native_int_arithmetic_op(operator.pow)
1.98
1.99 - def builtins_int_ge(self):
1.100 - return self.builtins_logical_op(self.int_class, operator.ge)
1.101 + def native_int_and(self):
1.102 + return self.native_int_arithmetic_op(operator.and_)
1.103
1.104 - def builtins_int_eq(self):
1.105 - return self.builtins_logical_op(self.int_class, operator.eq)
1.106 + def native_int_or(self):
1.107 + return self.native_int_arithmetic_op(operator.or_)
1.108
1.109 - def builtins_int_ne(self):
1.110 - return self.builtins_logical_op(self.int_class, operator.ne)
1.111 -
1.112 - def builtins_str_lt(self):
1.113 - return self.builtins_logical_op(self.str_class, operator.lt)
1.114 + def native_int_lt(self):
1.115 + return self.native_logical_op(operator.lt)
1.116
1.117 - def builtins_str_le(self):
1.118 - return self.builtins_logical_op(self.str_class, operator.le)
1.119 + def native_int_gt(self):
1.120 + return self.native_logical_op(operator.gt)
1.121
1.122 - def builtins_str_gt(self):
1.123 - return self.builtins_logical_op(self.str_class, operator.gt)
1.124 + def native_int_eq(self):
1.125 + return self.native_logical_op(operator.eq)
1.126
1.127 - def builtins_str_ge(self):
1.128 - return self.builtins_logical_op(self.str_class, operator.ge)
1.129 -
1.130 - def builtins_str_eq(self):
1.131 - return self.builtins_logical_op(self.str_class, operator.eq)
1.132 + def native_str_lt(self):
1.133 + return self.native_logical_op(operator.lt)
1.134
1.135 - def builtins_str_ne(self):
1.136 - return self.builtins_logical_op(self.str_class, operator.ne)
1.137 + def native_str_gt(self):
1.138 + return self.native_logical_op(operator.gt)
1.139
1.140 - def builtins_int_and(self):
1.141 - return self.builtins_int_arithmetic_op(operator.and_)
1.142 -
1.143 - def builtins_int_or(self):
1.144 - return self.builtins_int_arithmetic_op(operator.or_)
1.145 + def native_str_eq(self):
1.146 + return self.native_logical_op(operator.eq)
1.147
1.148 # Specific operator methods.
1.149
1.150 - def builtins_int_bool(self):
1.151 - frame = self.local_sp_stack[-1]
1.152 -
1.153 - # Get operands addresses.
1.154 -
1.155 - left_value = self.frame_stack[frame]
1.156 -
1.157 - # Test operand suitability.
1.158 -
1.159 - if not self.machine._CheckInstance(left_value.ref, self.int_class):
1.160 - self.machine.exception = self.machine._MakeObject(self.instance_size, self.type_error_instance)
1.161 - return self.machine.RaiseException()
1.162 -
1.163 - left_data = left_value.ref + self.instance_data_offset
1.164 -
1.165 - # Test the data.
1.166 - # NOTE: The data is considered ready to use.
1.167 -
1.168 - if self.machine.load(left_data) != 0:
1.169 - self.machine.result_context = self.constants[True]
1.170 - self.machine.result_value = self.constants[True]
1.171 - else:
1.172 - self.machine.result_context = self.constants[False]
1.173 - self.machine.result_value = self.constants[False]
1.174 -
1.175 def builtins_int_neg(self):
1.176 - frame = self.local_sp_stack[-1]
1.177 -
1.178 - # Get operands addresses.
1.179 -
1.180 - left_value = self.frame_stack[frame]
1.181 -
1.182 - # Test operand suitability.
1.183 -
1.184 - if not self.machine._CheckInstance(left_value.ref, self.int_class):
1.185 - self.machine.exception = self.machine._MakeObject(self.instance_size, self.type_error_instance)
1.186 - return self.machine.RaiseException()
1.187 -
1.188 - left_data = left_value.ref + self.instance_data_offset
1.189 + self.machine.LoadName(0) # left value
1.190 + left_data = self.machine.value + self.instance_data_offset
1.191
1.192 # Make a new object.
1.193
1.194 @@ -252,15 +172,6 @@
1.195
1.196 # Various built-in methods.
1.197
1.198 - def builtins_bool_bool(self):
1.199 - frame = self.local_sp_stack[-1]
1.200 -
1.201 - # Get operands addresses.
1.202 -
1.203 - left_value = self.frame_stack[frame]
1.204 - self.machine.result_context = left_value.ref
1.205 - self.machine.result_value = left_value.ref
1.206 -
1.207 def builtins_list_new(self):
1.208 frame = self.local_sp_stack[-1]
1.209
1.210 @@ -502,9 +413,6 @@
1.211 self.machine.result_context = data.context
1.212 self.machine.result_value = data.ref
1.213
1.214 - def builtins_object_init(self):
1.215 - pass
1.216 -
1.217 def builtins_getattr(self):
1.218 frame = self.local_sp_stack[-1]
1.219
1.220 @@ -569,30 +477,18 @@
1.221
1.222 # Native method implementations:
1.223
1.224 - "__builtins__.basestring.__lt__" : builtins_str_lt,
1.225 - "__builtins__.basestring.__le__" : builtins_str_le,
1.226 - "__builtins__.basestring.__gt__" : builtins_str_gt,
1.227 - "__builtins__.basestring.__ge__" : builtins_str_ge,
1.228 - "__builtins__.basestring.__eq__" : builtins_str_eq,
1.229 - "__builtins__.basestring.__ne__" : builtins_str_ne,
1.230 - "__builtins__.bool.__bool__" : builtins_bool_bool,
1.231 - "__builtins__.int.__add__" : builtins_int_add,
1.232 - "__builtins__.int.__radd__" : builtins_int_add, # NOTE: To be made distinct.
1.233 - "__builtins__.int.__sub__" : builtins_int_sub,
1.234 - "__builtins__.int.__pow__" : builtins_int_pow,
1.235 - "__builtins__.int.__iadd__" : builtins_int_add,
1.236 - "__builtins__.int.__bool__" : builtins_int_bool,
1.237 + "native._int_add" : native_int_add,
1.238 + "native._int_sub" : native_int_sub,
1.239 + "native._int_pow" : native_int_pow,
1.240 + "native._int_and" : native_int_and,
1.241 + "native._int_or" : native_int_or,
1.242 + "native._int_lt" : native_int_lt,
1.243 + "native._int_gt" : native_int_gt,
1.244 + "native._int_eq" : native_int_eq,
1.245 + "native._str_lt" : native_str_lt,
1.246 + "native._str_gt" : native_str_gt,
1.247 + "native._str_eq" : native_str_eq,
1.248 "__builtins__.int.__neg__" : builtins_int_neg,
1.249 - "__builtins__.int.__lt__" : builtins_int_lt,
1.250 - "__builtins__.int.__le__" : builtins_int_le,
1.251 - "__builtins__.int.__gt__" : builtins_int_gt,
1.252 - "__builtins__.int.__ge__" : builtins_int_ge,
1.253 - "__builtins__.int.__eq__" : builtins_int_eq,
1.254 - "__builtins__.int.__ne__" : builtins_int_ne,
1.255 - "__builtins__.int.__and__" : builtins_int_and,
1.256 - "__builtins__.int.__rand__" : builtins_int_and,
1.257 - "__builtins__.int.__or__" : builtins_int_or,
1.258 - "__builtins__.int.__ror__" : builtins_int_or,
1.259 "__builtins__.list.__get_single_item__" : builtins_list_get_single_item,
1.260 "__builtins__.list.__len__" : builtins_list_len,
1.261 "__builtins__.list.append" : builtins_list_append,
1.262 @@ -602,8 +498,7 @@
1.263
1.264 # Native initialisers:
1.265
1.266 - "__builtins__.object.__init__" : builtins_object_init, # NOTE: A no-operation.
1.267 - "__builtins__.BaseException.__init__" : builtins_object_init, # NOTE: To be made distinct, potentially in the builtins module.
1.268 + "__builtins__.BaseException.__init__" : builtins_no_op, # NOTE: To be made distinct, potentially in the builtins module.
1.269
1.270 # Native functions:
1.271