[pypy-commit] stmgc default: Merge
Raemi
noreply at buildbot.pypy.org
Fri Aug 29 11:24:13 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r1325:dbe9b14b252f
Date: 2014-08-29 11:24 +0200
http://bitbucket.org/pypy/stmgc/changeset/dbe9b14b252f/
Log: Merge
diff --git a/duhton/glob.c b/duhton/glob.c
--- a/duhton/glob.c
+++ b/duhton/glob.c
@@ -144,24 +144,13 @@
DuObject *du_xor(DuObject *cons, DuObject *locals)
{
int result = 0;
- /* _du_read1(cons); IMMUTABLE */
- DuObject *expr = _DuCons_CAR(cons);
- DuObject *next = _DuCons_NEXT(cons);
-
- _du_save2(next, locals);
- DuObject *obj = Du_Eval(expr, locals);
- result = DuInt_AsInt(obj);
- _du_restore2(next, locals);
-
- cons = next;
-
while (cons != Du_None) {
/* _du_read1(cons); IMMUTABLE */
- expr = _DuCons_CAR(cons);
- next = _DuCons_NEXT(cons);
+ DuObject *expr = _DuCons_CAR(cons);
+ DuObject *next = _DuCons_NEXT(cons);
_du_save2(next, locals);
- obj = Du_Eval(expr, locals);
+ DuObject *obj = Du_Eval(expr, locals);
result ^= DuInt_AsInt(obj);
_du_restore2(next, locals);
@@ -353,8 +342,6 @@
case 3: r = a != b; break;
case 4: r = a > b; break;
case 5: r = a >= b; break;
- case 6: r = a && b; break;
- case 7: r = a || b; break;
}
return DuInt_FromInt(r);
}
@@ -371,11 +358,48 @@
{ return _du_intcmp(cons, locals, 4); }
DuObject *du_ge(DuObject *cons, DuObject *locals)
{ return _du_intcmp(cons, locals, 5); }
+
DuObject *du_and(DuObject *cons, DuObject *locals)
-{ return _du_intcmp(cons, locals, 6); }
+{
+ while (cons != Du_None) {
+ /* _du_read1(cons); IMMUTABLE */
+ DuObject *expr = _DuCons_CAR(cons);
+ DuObject *next = _DuCons_NEXT(cons);
+
+ _du_save2(next, locals);
+ DuObject *obj = Du_Eval(expr, locals);
+ int result = DuObject_IsTrue(obj);
+ _du_restore2(next, locals);
+
+ if (!result)
+ return DuInt_FromInt(0);
+
+ cons = next;
+ }
+
+ return DuInt_FromInt(1);
+}
+
DuObject *du_or(DuObject *cons, DuObject *locals)
-{ return _du_intcmp(cons, locals, 7); }
+{
+ while (cons != Du_None) {
+ /* _du_read1(cons); IMMUTABLE */
+ DuObject *expr = _DuCons_CAR(cons);
+ DuObject *next = _DuCons_NEXT(cons);
+ _du_save2(next, locals);
+ DuObject *obj = Du_Eval(expr, locals);
+ int result = DuObject_IsTrue(obj);
+ _du_restore2(next, locals);
+
+ if (result)
+ return DuInt_FromInt(1);
+
+ cons = next;
+ }
+
+ return DuInt_FromInt(0);
+}
DuObject *du_type(DuObject *cons, DuObject *locals)
diff --git a/duhton/test/test_int.py b/duhton/test/test_int.py
--- a/duhton/test/test_int.py
+++ b/duhton/test/test_int.py
@@ -20,9 +20,11 @@
assert evaluate("(* 2 3 7)") == 42
assert evaluate("(* (+ 5 1) (+ 6 1))") == 42
-def test_div():
+def test_div_mod():
assert evaluate("(/ 11 2)") == 5
assert evaluate("(/ 29 2 3)") == 4
+ assert evaluate("(% 29 2)") == 1
+ assert evaluate("(% 29 10 3)") == 0
def test_cmp():
assert evaluate("(< 6 6)") == 0
@@ -47,3 +49,35 @@
assert evaluate("(>= 7 6)") == 1
#
assert evaluate("(< (+ 10 2) (+ 4 5))") == 0
+
+def test_and_or():
+ assert evaluate("(&& 1 1 1)") == 1
+ assert evaluate("(&& 1 0 1)") == 0
+ assert evaluate("(&& 0 sdfdsfsd)") == 0
+ assert evaluate("(&& None)") == 0
+ assert evaluate("(&& (quote bla))") == 1
+ assert evaluate("(&& )") == 1
+
+ assert evaluate("(|| 0 1)") == 1
+ assert evaluate("(|| 0 0 0 1)") == 1
+ assert evaluate("(|| 0 0 0)") == 0
+ assert evaluate("(|| 1 sdfdsfafds)") == 1
+ assert evaluate("(|| None)") == 0
+ assert evaluate("(|| (quote bla))") == 1
+ assert evaluate("(|| )") == 0
+
+
+def test_shifts_bitwise():
+ assert evaluate("(<< 1 1)") == 2
+ assert evaluate("(<< 12)") == 12
+ assert evaluate("(<< 1 1 1)") == 4
+ assert evaluate("(<< 0 1)") == 0
+
+ assert evaluate("(>> 4 1 1)") == 1
+ assert evaluate("(>> 4 3)") == 0
+ assert evaluate("(>> 4)") == 4
+
+ assert evaluate("(^ 1 4)") == 1 ^ 4
+ assert evaluate("(^ 1 4 122)") == 1 ^ 4 ^ 122
+ assert evaluate("(^ 1)") == 1
+ assert evaluate("(^)") == 0
More information about the pypy-commit
mailing list