# HG changeset patch # User Paul Boddie # Date 1253820569 -7200 # Node ID 11aaa493c62886ee8c3577174dd07af9519bbd19 # Parent f9de38187743adc0e41776c7b58c745726e905c9 Added support for bitwise operators. Added a listiterator class to the builtins module, employed by the list class. diff -r f9de38187743 -r 11aaa493c628 lib/builtins.py --- a/lib/builtins.py Fri Sep 04 00:26:30 2009 +0200 +++ b/lib/builtins.py Thu Sep 24 21:29:29 2009 +0200 @@ -148,9 +148,18 @@ def __add__(self, other): pass def __iadd__(self, other): pass def __str__(self): pass - def __iter__(self): pass def __bool__(self): pass + def __iter__(self): + + "Return an iterator." + + return listiterator(self) + +class listiterator(object): + def __init__(self, l): pass + def next(self): pass + class long(object): def __init__(self, number_or_string=None): pass def __iadd__(self, other): pass diff -r f9de38187743 -r 11aaa493c628 micropython/ast.py --- a/micropython/ast.py Fri Sep 04 00:26:30 2009 +0200 +++ b/micropython/ast.py Thu Sep 24 21:29:29 2009 +0200 @@ -201,9 +201,9 @@ # Binary operators. visitAdd = Helper._visitBinary - visitBitand = Helper._visitBinary - visitBitor = Helper._visitBinary - visitBitxor = Helper._visitBinary + visitBitand = Helper._visitBinaryBit + visitBitor = Helper._visitBinaryBit + visitBitxor = Helper._visitBinaryBit visitDiv = Helper._visitBinary visitFloorDiv = Helper._visitBinary visitLeftShift = Helper._visitBinary diff -r f9de38187743 -r 11aaa493c628 micropython/trans.py --- a/micropython/trans.py Fri Sep 04 00:26:30 2009 +0200 +++ b/micropython/trans.py Thu Sep 24 21:29:29 2009 +0200 @@ -1065,6 +1065,21 @@ self.discard_temp(temp) self.discard_temp(temp_out) + def _visitBinaryBit(self, node): + + """ + Need to impose binary rules over a sequence of nodes. The + short-circuiting of the similar logical operators is not imposed by the + bitwise operators. + """ + + left = None + + for right in node.nodes: + if left is not None: + self._visitBinaryMethods(node, left, right) + left = right + def _visitBinary(self, node): """ @@ -1083,16 +1098,20 @@ raise TypeError """ + self._visitBinaryMethods(node, node.left, node.right) + + def _visitBinaryMethods(self, node, left, right): + left_method, right_method = binary_methods[node.__class__.__name__] # Evaluate and store the left operand in temporary storage. - self.dispatch(node.left) + self.dispatch(left) temp1 = self.optimiser.optimise_temp_storage() # Evaluate and store the right operand in temporary storage. - self.dispatch(node.right) + self.dispatch(right) temp2 = self.optimiser.optimise_temp_storage() temp_out = self._generateBinary(node, temp1, temp2, left_method, right_method) diff -r f9de38187743 -r 11aaa493c628 rsvp.py --- a/rsvp.py Fri Sep 04 00:26:30 2009 +0200 +++ b/rsvp.py Thu Sep 24 21:29:29 2009 +0200 @@ -858,12 +858,6 @@ self.machine.result = addr, addr - def builtins_int_add(self): - return self.builtins_int_arithmetic_op(operator.add) - - def builtins_int_sub(self): - return self.builtins_int_arithmetic_op(operator.sub) - def builtins_int_bool(self): frame = self.local_sp_stack[-1] @@ -952,6 +946,12 @@ else: self.machine.result = self.false_constant, self.false_constant + def builtins_int_add(self): + return self.builtins_int_arithmetic_op(operator.add) + + def builtins_int_sub(self): + return self.builtins_int_arithmetic_op(operator.sub) + def builtins_int_lt(self): return self.builtins_int_op(operator.lt, 0) @@ -970,6 +970,12 @@ def builtins_int_ne(self): return self.builtins_int_op(operator.ne, 1) + def builtins_int_and(self): + return self.builtins_int_arithmetic_op(operator.and_) + + def builtins_int_or(self): + return self.builtins_int_arithmetic_op(operator.or_) + def builtins_bool_bool(self): frame = self.local_sp_stack[-1] @@ -1204,6 +1210,10 @@ "__builtins__.int.__ge__" : builtins_int_ge, "__builtins__.int.__eq__" : builtins_int_eq, "__builtins__.int.__ne__" : builtins_int_ne, + "__builtins__.int.__and__" : builtins_int_and, + "__builtins__.int.__rand__" : builtins_int_and, + "__builtins__.int.__or__" : builtins_int_or, + "__builtins__.int.__ror__" : builtins_int_or, "__builtins__.bool.__bool__" : builtins_bool_bool, "__builtins__.list.__getitem__" : builtins_list_getitem, "__builtins__.list.__len__" : builtins_list_len, diff -r f9de38187743 -r 11aaa493c628 tests/bitwise.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/bitwise.py Thu Sep 24 21:29:29 2009 +0200 @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +a = 1 +b = 2 +c = 3 + +result_0 = a & b +result_1 = a | a & b +result_2 = b & c +result_3 = a | b + +# vim: tabstop=4 expandtab shiftwidth=4