1.1 --- a/lib/native/__init__.py Fri Mar 24 19:07:01 2017 +0100
1.2 +++ b/lib/native/__init__.py Fri Mar 24 22:08:50 2017 +0100
1.3 @@ -24,8 +24,9 @@
1.4 from native.identity import is_, is_not
1.5
1.6 from native.int import int_add, int_div, int_mod, int_mul, int_neg, int_pow, \
1.7 - int_sub, int_and, int_not, int_or, int_xor, int_lt, \
1.8 - int_gt, int_eq, int_ne, int_str
1.9 + int_sub, int_and, int_not, int_or, int_xor, \
1.10 + int_eq, int_ge, int_gt, int_le, int_lt, int_ne, \
1.11 + int_str, is_int
1.12
1.13 from native.introspection import object_getattr, isinstance, issubclass
1.14
2.1 --- a/lib/native/int.py Fri Mar 24 19:07:01 2017 +0100
2.2 +++ b/lib/native/int.py Fri Mar 24 22:08:50 2017 +0100
2.3 @@ -24,6 +24,8 @@
2.4 this program. If not, see <http://www.gnu.org/licenses/>.
2.5 """
2.6
2.7 +def is_int(obj): pass
2.8 +
2.9 def int_add(self, other): pass
2.10 def int_div(self, other): pass
2.11 def int_mod(self, other): pass
2.12 @@ -37,9 +39,11 @@
2.13 def int_or(self, other): pass
2.14 def int_xor(self, other): pass
2.15
2.16 -def int_lt(self, other): pass
2.17 +def int_eq(self, other): pass
2.18 +def int_ge(self, other): pass
2.19 def int_gt(self, other): pass
2.20 -def int_eq(self, other): pass
2.21 +def int_le(self, other): pass
2.22 +def int_lt(self, other): pass
2.23 def int_ne(self, other): pass
2.24
2.25 def int_str(self): pass
3.1 --- a/lib/operator/augmented.py Fri Mar 24 19:07:01 2017 +0100
3.2 +++ b/lib/operator/augmented.py Fri Mar 24 22:08:50 2017 +0100
3.3 @@ -3,7 +3,7 @@
3.4 """
3.5 Operator support.
3.6
3.7 -Copyright (C) 2010, 2013, 2015 Paul Boddie <paul@boddie.org.uk>
3.8 +Copyright (C) 2010, 2013, 2015, 2017 Paul Boddie <paul@boddie.org.uk>
3.9
3.10 This program is free software; you can redistribute it and/or modify it under
3.11 the terms of the GNU General Public License as published by the Free Software
3.12 @@ -20,6 +20,9 @@
3.13 """
3.14
3.15 from operator.core import augassign
3.16 +from native import int_add, int_div, int_mod, int_mul, int_pow, int_sub, \
3.17 + int_and, int_or, int_xor, \
3.18 + is_int
3.19
3.20 # These functions defer method lookup by wrapping the attribute access in
3.21 # lambda functions. Thus, the appropriate methods are defined locally, but no
3.22 @@ -31,12 +34,18 @@
3.23 # Augmented assignment functions.
3.24
3.25 def iadd(a, b):
3.26 + if is_int(a) and is_int(b):
3.27 + return int_add(a, b)
3.28 return augassign(a, b, lambda a: a.__iadd__, lambda a: a.__add__, lambda b: b.__radd__)
3.29
3.30 def iand_(a, b):
3.31 + if is_int(a) and is_int(b):
3.32 + return int_and(a, b)
3.33 return augassign(a, b, lambda a: a.__iand__, lambda a: a.__and__, lambda b: b.__rand__)
3.34
3.35 def idiv(a, b):
3.36 + if is_int(a) and is_int(b):
3.37 + return int_div(a, b)
3.38 return augassign(a, b, lambda a: a.__idiv__, lambda a: a.__div__, lambda b: b.__rdiv__)
3.39
3.40 def ifloordiv(a, b):
3.41 @@ -46,24 +55,36 @@
3.42 return augassign(a, b, lambda a: a.__ilshift__, lambda a: a.__lshift__, lambda b: b.__rlshift__)
3.43
3.44 def imod(a, b):
3.45 + if is_int(a) and is_int(b):
3.46 + return int_mod(a, b)
3.47 return augassign(a, b, lambda a: a.__imod__, lambda a: a.__mod__, lambda b: b.__rmod__)
3.48
3.49 def imul(a, b):
3.50 + if is_int(a) and is_int(b):
3.51 + return int_mul(a, b)
3.52 return augassign(a, b, lambda a: a.__imul__, lambda a: a.__mul__, lambda b: b.__rmul__)
3.53
3.54 def ior_(a, b):
3.55 + if is_int(a) and is_int(b):
3.56 + return int_or(a, b)
3.57 return augassign(a, b, lambda a: a.__ior__, lambda a: a.__or__, lambda b: b.__ror__)
3.58
3.59 def ipow(a, b):
3.60 + if is_int(a) and is_int(b):
3.61 + return int_pow(a, b)
3.62 return augassign(a, b, lambda a: a.__ipow__, lambda a: a.__pow__, lambda b: b.__rpow__)
3.63
3.64 def irshift(a, b):
3.65 return augassign(a, b, lambda a: a.__irshift__, lambda a: a.__rshift__, lambda b: b.__rrshift__)
3.66
3.67 def isub(a, b):
3.68 + if is_int(a) and is_int(b):
3.69 + return int_sub(a, b)
3.70 return augassign(a, b, lambda a: a.__isub__, lambda a: a.__sub__, lambda b: b.__rsub__)
3.71
3.72 def ixor(a, b):
3.73 + if is_int(a) and is_int(b):
3.74 + return int_xor(a, b)
3.75 return augassign(a, b, lambda a: a.__ixor__, lambda a: a.__xor__, lambda b: b.__rxor__)
3.76
3.77 # vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/lib/operator/binary.py Fri Mar 24 19:07:01 2017 +0100
4.2 +++ b/lib/operator/binary.py Fri Mar 24 22:08:50 2017 +0100
4.3 @@ -3,7 +3,7 @@
4.4 """
4.5 Operator support.
4.6
4.7 -Copyright (C) 2010, 2013, 2015, 2016 Paul Boddie <paul@boddie.org.uk>
4.8 +Copyright (C) 2010, 2013, 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
4.9
4.10 This program is free software; you can redistribute it and/or modify it under
4.11 the terms of the GNU General Public License as published by the Free Software
4.12 @@ -20,6 +20,9 @@
4.13 """
4.14
4.15 from operator.core import binary_op, is_, is_not
4.16 +from native import int_add, int_div, int_mod, int_mul, int_pow, int_sub, \
4.17 + int_and, int_not, int_or, int_xor, \
4.18 + is_int
4.19
4.20 # These functions defer method lookup by wrapping the attribute access in
4.21 # lambda functions. Thus, the appropriate methods are defined locally, but no
4.22 @@ -28,15 +31,21 @@
4.23 # Binary operator functions.
4.24
4.25 def add(a, b):
4.26 + if is_int(a) and is_int(b):
4.27 + return int_add(a, b)
4.28 return binary_op(a, b, lambda a: a.__add__, lambda b: b.__radd__)
4.29
4.30 def and_(a, b):
4.31 + if is_int(a) and is_int(b):
4.32 + return int_and(a, b)
4.33 return binary_op(a, b, lambda a: a.__and__, lambda b: b.__rand__)
4.34
4.35 def contains(a, b):
4.36 return in_(b, a)
4.37
4.38 def div(a, b):
4.39 + if is_int(a) and is_int(b):
4.40 + return int_div(a, b)
4.41 return binary_op(a, b, lambda a: a.__div__, lambda b: b.__rdiv__)
4.42
4.43 def floordiv(a, b):
4.44 @@ -52,24 +61,36 @@
4.45 return binary_op(a, b, lambda a: a.__lshift__, lambda b: b.__rlshift__)
4.46
4.47 def mod(a, b):
4.48 + if is_int(a) and is_int(b):
4.49 + return int_mod(a, b)
4.50 return binary_op(a, b, lambda a: a.__mod__, lambda b: b.__rmod__)
4.51
4.52 def mul(a, b):
4.53 + if is_int(a) and is_int(b):
4.54 + return int_mul(a, b)
4.55 return binary_op(a, b, lambda a: a.__mul__, lambda b: b.__rmul__)
4.56
4.57 def or_(a, b):
4.58 + if is_int(a) and is_int(b):
4.59 + return int_or(a, b)
4.60 return binary_op(a, b, lambda a: a.__or__, lambda b: b.__ror__)
4.61
4.62 def pow(a, b):
4.63 + if is_int(a) and is_int(b):
4.64 + return int_pow(a, b)
4.65 return binary_op(a, b, lambda a: a.__pow__, lambda b: b.__rpow__)
4.66
4.67 def rshift(a, b):
4.68 return binary_op(a, b, lambda a: a.__rshift__, lambda b: b.__rrshift__)
4.69
4.70 def sub(a, b):
4.71 + if is_int(a) and is_int(b):
4.72 + return int_sub(a, b)
4.73 return binary_op(a, b, lambda a: a.__sub__, lambda b: b.__rsub__)
4.74
4.75 def xor(a, b):
4.76 + if is_int(a) and is_int(b):
4.77 + return int_xor(a, b)
4.78 return binary_op(a, b, lambda a: a.__xor__, lambda b: b.__rxor__)
4.79
4.80 # vim: tabstop=4 expandtab shiftwidth=4
5.1 --- a/lib/operator/comparison.py Fri Mar 24 19:07:01 2017 +0100
5.2 +++ b/lib/operator/comparison.py Fri Mar 24 22:08:50 2017 +0100
5.3 @@ -3,7 +3,7 @@
5.4 """
5.5 Operator support.
5.6
5.7 -Copyright (C) 2010, 2013, 2015, 2016 Paul Boddie <paul@boddie.org.uk>
5.8 +Copyright (C) 2010, 2013, 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
5.9
5.10 This program is free software; you can redistribute it and/or modify it under
5.11 the terms of the GNU General Public License as published by the Free Software
5.12 @@ -20,6 +20,7 @@
5.13 """
5.14
5.15 from operator.core import binary_op
5.16 +from native import int_eq, int_ge, int_gt, int_le, int_lt, int_ne, is_int
5.17
5.18 # These functions defer method lookup by wrapping the attribute access in
5.19 # lambda functions. Thus, the appropriate methods are defined locally, but no
5.20 @@ -28,21 +29,33 @@
5.21 # Comparison functions.
5.22
5.23 def eq(a, b):
5.24 + if is_int(a) and is_int(b):
5.25 + return int_eq(a, b)
5.26 return binary_op(a, b, lambda a: a.__eq__, lambda b: b.__eq__, False)
5.27
5.28 def ge(a, b):
5.29 + if is_int(a) and is_int(b):
5.30 + return int_ge(a, b)
5.31 return binary_op(a, b, lambda a: a.__ge__, lambda b: b.__le__)
5.32
5.33 def gt(a, b):
5.34 + if is_int(a) and is_int(b):
5.35 + return int_gt(a, b)
5.36 return binary_op(a, b, lambda a: a.__gt__, lambda b: b.__lt__)
5.37
5.38 def le(a, b):
5.39 + if is_int(a) and is_int(b):
5.40 + return int_le(a, b)
5.41 return binary_op(a, b, lambda a: a.__le__, lambda b: b.__ge__)
5.42
5.43 def lt(a, b):
5.44 + if is_int(a) and is_int(b):
5.45 + return int_lt(a, b)
5.46 return binary_op(a, b, lambda a: a.__lt__, lambda b: b.__gt__)
5.47
5.48 def ne(a, b):
5.49 + if is_int(a) and is_int(b):
5.50 + return int_ne(a, b)
5.51 return binary_op(a, b, lambda a: a.__ne__, lambda b: b.__ne__, True)
5.52
5.53 # vim: tabstop=4 expandtab shiftwidth=4
6.1 --- a/lib/operator/unary.py Fri Mar 24 19:07:01 2017 +0100
6.2 +++ b/lib/operator/unary.py Fri Mar 24 22:08:50 2017 +0100
6.3 @@ -3,7 +3,7 @@
6.4 """
6.5 Operator support.
6.6
6.7 -Copyright (C) 2010, 2013, 2015, 2016 Paul Boddie <paul@boddie.org.uk>
6.8 +Copyright (C) 2010, 2013, 2015, 2016, 2017 Paul Boddie <paul@boddie.org.uk>
6.9
6.10 This program is free software; you can redistribute it and/or modify it under
6.11 the terms of the GNU General Public License as published by the Free Software
6.12 @@ -20,6 +20,7 @@
6.13 """
6.14
6.15 from operator.core import unary_op
6.16 +from native.int import int_neg, int_not, is_int
6.17
6.18 # These functions defer method lookup by wrapping the attribute access in
6.19 # lambda functions. Thus, the appropriate methods are defined locally, but no
6.20 @@ -31,12 +32,18 @@
6.21 return unary_op(a, lambda a: a.__invert__)
6.22
6.23 def neg(a):
6.24 + if is_int(a):
6.25 + return int_neg(a)
6.26 return unary_op(a, lambda a: a.__neg__)
6.27
6.28 def not_(a):
6.29 + if is_int(a):
6.30 + return int_not(a)
6.31 return not a
6.32
6.33 def pos(a):
6.34 + if is_int(a):
6.35 + return a
6.36 return unary_op(a, lambda a: a.__pos__)
6.37
6.38 # vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/templates/native/int.c Fri Mar 24 19:07:01 2017 +0100
7.2 +++ b/templates/native/int.c Fri Mar 24 22:08:50 2017 +0100
7.3 @@ -31,6 +31,13 @@
7.4
7.5 /* Integer operations. */
7.6
7.7 +__attr __fn_native_int_is_int(__attr __args[])
7.8 +{
7.9 + __attr * const obj = &__args[1];
7.10 +
7.11 + return __INTEGER(*obj) ? __builtins___boolean_True : __builtins___boolean_False;
7.12 +}
7.13 +
7.14 __attr __fn_native_int_int_add(__attr __args[])
7.15 {
7.16 __attr * const self = &__args[1];
7.17 @@ -207,6 +214,18 @@
7.18 return __new_int(i ^ j);
7.19 }
7.20
7.21 +__attr __fn_native_int_int_le(__attr __args[])
7.22 +{
7.23 + __attr * const self = &__args[1];
7.24 + __attr * const other = &__args[2];
7.25 + /* self and other interpreted as int */
7.26 + int i = __TOINT(*self);
7.27 + int j = __TOINT(*other);
7.28 +
7.29 + /* Return a boolean result. */
7.30 + return i <= j ? __builtins___boolean_True : __builtins___boolean_False;
7.31 +}
7.32 +
7.33 __attr __fn_native_int_int_lt(__attr __args[])
7.34 {
7.35 __attr * const self = &__args[1];
7.36 @@ -219,6 +238,18 @@
7.37 return i < j ? __builtins___boolean_True : __builtins___boolean_False;
7.38 }
7.39
7.40 +__attr __fn_native_int_int_ge(__attr __args[])
7.41 +{
7.42 + __attr * const self = &__args[1];
7.43 + __attr * const other = &__args[2];
7.44 + /* self and other interpreted as int */
7.45 + int i = __TOINT(*self);
7.46 + int j = __TOINT(*other);
7.47 +
7.48 + /* Return a boolean result. */
7.49 + return i >= j ? __builtins___boolean_True : __builtins___boolean_False;
7.50 +}
7.51 +
7.52 __attr __fn_native_int_int_gt(__attr __args[])
7.53 {
7.54 __attr * const self = &__args[1];
8.1 --- a/templates/native/int.h Fri Mar 24 19:07:01 2017 +0100
8.2 +++ b/templates/native/int.h Fri Mar 24 22:08:50 2017 +0100
8.3 @@ -23,6 +23,8 @@
8.4
8.5 /* Integer operations. */
8.6
8.7 +__attr __fn_native_int_is_int(__attr __args[]);
8.8 +
8.9 __attr __fn_native_int_int_add(__attr __args[]);
8.10 __attr __fn_native_int_int_div(__attr __args[]);
8.11 __attr __fn_native_int_int_mod(__attr __args[]);
8.12 @@ -41,9 +43,11 @@
8.13 __attr __fn_native_int_int_rpow(__attr __args[]);
8.14 __attr __fn_native_int_int_rsub(__attr __args[]);
8.15
8.16 -__attr __fn_native_int_int_lt(__attr __args[]);
8.17 +__attr __fn_native_int_int_eq(__attr __args[]);
8.18 +__attr __fn_native_int_int_ge(__attr __args[]);
8.19 __attr __fn_native_int_int_gt(__attr __args[]);
8.20 -__attr __fn_native_int_int_eq(__attr __args[]);
8.21 +__attr __fn_native_int_int_le(__attr __args[]);
8.22 +__attr __fn_native_int_int_lt(__attr __args[]);
8.23 __attr __fn_native_int_int_ne(__attr __args[]);
8.24
8.25 __attr __fn_native_int_int_str(__attr __args[]);